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 two 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
Example: LINE CROSS LEFT and LINE CROSS RIGHT
    Blue: Line A; Green: Line B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
       ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
  ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA,
  ST_GeomFromText('LINESTRING (20 140, 71 74, 161 53)') As lineB
  ) As foo;
 A_cross_B | B_cross_A
-----------+-----------
        -1 |         1
  Example: LINE MULTICROSS END SAME FIRST LEFT and LINE MULTICROSS END SAME FIRST RIGHT
    Blue: Line A; Green: Line B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
       ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
 ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA,
 ST_GeomFromText('LINESTRING(171 154,20 140,71 74,161 53)') As lineB
  ) As foo;
 A_cross_B | B_cross_A
-----------+-----------
         3 |        -3
  Example: LINE MULTICROSS END LEFT and LINE MULTICROSS END RIGHT
    Blue: Line A; Green: Line B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
       ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
  ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA,
  ST_GeomFromText('LINESTRING(5 90, 71 74, 20 140, 171 154)') As lineB
  ) As foo;
 A_cross_B | B_cross_A
-----------+-----------
        -2 |         2
  Example: LINE MULTICROSS END LEFT and LINE MULTICROSS END RIGHT
    Blue: Line A; Green: Line B
SELECT ST_LineCrossingDirection(lineA, lineB) As A_cross_B,
       ST_LineCrossingDirection(lineB, lineA) As B_cross_A
FROM (SELECT
  ST_GeomFromText('LINESTRING(25 169,89 114,40 70,86 43)') As lineA,
  ST_GeomFromText('LINESTRING (171 154, 20 140, 71 74, 2.99 90.16)') As lineB
) As foo;
 A_cross_B | B_cross_A
-----------+-----------
         2 |        -2
  
SELECT s1.gid, s2.gid, ST_LineCrossingDirection(s1.geom, s2.geom)
  FROM streets s1 CROSS JOIN streets s2
         ON (s1.gid != s2.gid AND s1.geom && s2.geom )
WHERE ST_LineCrossingDirection(s1.geom, s2.geom) > 0;