[GIS] Counting self intersections of linestring using PostGIS

intersectionlinestringpostgispostgresql

Is there a way of using PostgreSQL + PostGIS for finding the number of self intersections in a linestring?

I have a linestring that goes forward but in circles, and I need to find the number of times it crosses itself.

Best Answer

I don't know for sure, but I think something like this might solve your problem (this wont work on multilines, but you could stdump them or squish them) :

SELECT  ID, 
        COUNT(*) AS theCOunt
FROM
(
  SELECT  id, 
          ST_Intersection(A.geom, B.geom) AS geom
  FROM
  (
    SELECT  xx.id,
            xx.id2,
            st_makeline(xx.l_start, xx.l_end) AS geom
     FROM 
     ( 
       SELECT  x.id,
               generate_series(1, st_npoints(x.geom) - 1) AS id2,
               st_pointn(x.geom, generate_series(1, st_npoints(x.geom) - 1)) AS l_start,
               st_pointn(x.geom, generate_series(2, st_npoints(x.geom))) AS l_end
       FROM 
       ( 
         SELECT  DATA_TABLE.id,
                 DATA_TABLE.geom 
         FROM DATA_TABLE
        ) AS X
     ) AS XX
 ) AS A
 INNER JOIN
 (
    SELECT  xx.id,
            xx.id2,
            st_makeline(xx.l_start, xx.l_end) AS geom
     FROM 
     ( 
       SELECT  x.id,
               generate_series(1, st_npoints(x.geom) - 1) AS id2,
               st_pointn(x.geom, generate_series(1, st_npoints(x.geom) - 1)) AS l_start,
               st_pointn(x.geom, generate_series(2, st_npoints(x.geom))) AS l_end
       FROM 
       ( 
         SELECT  DATA_TABLE.id,
                 DATA_TABLE.geom 
         FROM DATA_TABLE
        ) AS X
     ) AS XX
 ) AS B
ON A.ID = b.ID
   AND
   A.id2 <> B.id2
   AND
   A.id2 <> B.id2-1
   AND
   A.id2 < B.id2
   AND
   ST_INTERSECTS(A.geom, B.geom)