ST_LineCrossingDirection
Prev | 8.11.1. Topological Relationships | Next

## 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;

## See Also

ST_Crosses

Prev | Up | Next
ST_Intersects | Home | ST_OrderingEquals