ST_LineCrossingDirection
Name
ST_LineCrossingDirection — Returns a number indicating the crossing behavior of two LineStrings.
Synopsis
    
     integer
     
      ST_LineCrossingDirection
     
     (
    
    geometry
    
     linestringA
    
    , geometry
    
     linestringB
    
    
     )
    
    ;
   
Description
   Given 2 linestrings, returns an integer between -3 and 3
      indicating what kind of crossing behavior exists between them.
      0 indicates no crossing.
      This is only supported for
   
    LINESTRING
   
   s.
  
The crossing number has the following meaning:
- 
     
0: LINE NO CROSS
 - 
     
-1: LINE CROSS LEFT
 - 
     
1: LINE CROSS RIGHT
 - 
     
-2: LINE MULTICROSS END LEFT
 - 
     
2: LINE MULTICROSS END RIGHT
 - 
     
-3: LINE MULTICROSS END SAME FIRST LEFT
 - 
     
3: LINE MULTICROSS END SAME FIRST RIGHT
 
Availability: 1.4
Examples
        
         Line 1 (green), Line 2 ball is start point, triangle are end points. Query below. 
 
SELECT ST_LineCrossingDirection(foo.line1, foo.line2) As l1_cross_l2 ,
	  ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1
FROM (
SELECT
 ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1,
 ST_GeomFromText('LINESTRING(171 154,20 140,71 74,161 53)') As line2
	) As foo;
 l1_cross_l2 | l2_cross_l1
-------------+-------------
           3 |          -3
				
       
  | 
      
        
         Line 1 (green), Line 2 (blue) ball is start point, triangle are end points. Query below. 
 
SELECT ST_LineCrossingDirection(foo.line1, foo.line2) As l1_cross_l2 ,
	  ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1
FROM (
 SELECT
  ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1,
  ST_GeomFromText('LINESTRING (171 154, 20 140, 71 74, 2.99 90.16)') As line2
) As foo;
 l1_cross_l2 | l2_cross_l1
-------------+-------------
           2 |          -2
				
       
  | 
     
        
         Line 1 (green), Line 2 (blue) ball is start point, triangle are end points. Query below. 
 
SELECT
	ST_LineCrossingDirection(foo.line1, foo.line2) As l1_cross_l2 ,
	ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1
FROM (
 SELECT
  ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1,
  ST_GeomFromText('LINESTRING (20 140, 71 74, 161 53)') As line2
  ) As foo;
 l1_cross_l2 | l2_cross_l1
-------------+-------------
          -1 |          1
				
       
  | 
      
        
         Line 1 (green), Line 2 (blue) ball is start point, triangle are end points. Query below. 
 
SELECT ST_LineCrossingDirection(foo.line1, foo.line2) As l1_cross_l2 ,
	  ST_LineCrossingDirection(foo.line2, foo.line1) As l2_cross_l1
FROM (SELECT
	ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As line1,
	ST_GeomFromText('LINESTRING(2.99 90.16,71 74,20 140,171 154)') As line2
	) As foo;
 l1_cross_l2 | l2_cross_l1
-------------+-------------
          -2 |          2
				
       
  | 
     
SELECT s1.gid, s2.gid, ST_LineCrossingDirection(s1.the_geom, s2.the_geom) FROM streets s1 CROSS JOIN streets s2 ON (s1.gid != s2.gid AND s1.the_geom && s2.the_geom ) WHERE ST_CrossingDirection(s1.the_geom, s2.the_geom) > 0;