6 votos

¿Contar las auto-intersecciones de la cadena de líneas utilizando PostGIS?

¿Existe una manera de utilizar PostgreSQL + PostGIS para encontrar el número de auto-intersecciones en una cadena de líneas?

Tengo una cadena de líneas que avanza pero en círculos, y necesito encontrar el número de veces que se cruza.

2 votos

Por favor, añada más detalles a sus preguntas hay muchas maneras de encontrar líneas de auto intersección en postgis. ¿Qué está tratando de lograr?

0 votos

ST_IsValidReason probablemente ayuda, la documentación de ejemplo muestra sólo un error por geometría, así que tal vez usted necesita para ejecutarlo en bucle recursivo . ver postgis.net/docs/manual-dev/ST_IsValidReason.html

2voto

karen Puntos 11

No lo sé con certeza, pero creo que algo como esto podría resolver tu problema (esto no funcionará con las multilíneas, pero podrías vaciarlas o aplastarlas) :

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)

0 votos

O algo así

1voto

evojacking Puntos 21

¿Qué tal esto (suponiendo que test es su tabla de líneas):

En primer lugar, nodifica la cadena de líneas, es decir, crea vértices en cada intersección manteniendo los vértices originales intactos.

CREATE TABLE node AS SELECT id, ST_Node(wkb_geometry) as wkb_geometry FROM test;

Cuenta todos los puntos distintos en las nuevas líneas. Restando el número inicial de vértices del número de nodos se obtiene el número de intersecciones.

SELECT id, COUNT(id) FROM (SELECT DISTINCT (ST_DumpPoints(wkb_geometry)).geom, id FROM node) tmp  group by id;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X