Processing math: 100%

4 votos

Encontrar LineStrings con segmentos comunes en PostGIS 2.3

Me gustaría encontrar LineStrings con común segmentos ('colineal', es decir, LineStrings que comparten 2 o más puntos consecutivos) con PostGIS.

Yo no soy shure si me falta algo, pero como parecen volver para 2 geometrías que ya comparten un único punto común.

¿Hay alguna función de PostGIS falto o cualquier otra solución a esto?

5voto

DBM Puntos 51

En el PostGIS documentación, en el Capítulo 4., 4.3.6. Dimensiones Extendida 9 Intersección Modelo (DE-9IM) (https://postgis.net/docs/manual-2.3/using_postgis_dbmanagement.html#DE-9IM) leemos la siguiente introducción:

"Es a veces el caso de que el espacial típica de los predicados (ST_Contains, ST_Crosses, ST_Intersects, ST_Touches, ...) no son suficientes en sí mismos para proveer adecuadamente que desee filtro espacial."

Esto es exactamente lo que se aplica aquí. Simplemente hablado, tiene que examinar la dimensionalidad de la intersección resultado de sus dos geometrías. El artículo de la Wikipedia que se refiere en el PostGIS docs se explica esto en detalle: https://en.wikipedia.org/wiki/DE-9IMque me recomiendan para leer más.

El OVERLAPS patrón dim(a) == dim(b) == 1 (dos LineStrings) serían '1*T***T**' [(11) en el artículo de la Wikipedia], por lo tanto, una consulta como

... WHERE ST_Relate(a.geom, b.geom, '1*T***T**')

debe dar el resultado deseado.

4voto

noob source Puntos 305

ST_Touches sólo devuelve true para las líneas que se intersecan los puntos inicial o final, no el espacio a lo largo de la línea, de modo que no debe trabajar en su caso, como se esperaba. ST_Overlaps, sin embargo, debería funcionar exactamente como usted se propone:

SELECT ST_Overlaps('LINESTRING(0 0, 2 0)'::geometry,
                   'LINESTRING(1 0, 3 0)'::geometry)

>>> t

SELECT ST_Overlaps('LINESTRING(0 0, 2 0)'::geometry,
                   'LINESTRING(1 0, 2 1, 2 0, 3 0)'::geometry)

>>> f

Acabo de probar tanto en PotGIS 2.2.0 y 2.3.2, por lo que debe estar trabajando en la tuya también. Independientemente, usted puede ir un paso más y trabajar con ST_Relate. Esto pruebas de la función de DE-9IM topología, entonces usted debería ser capaz de controlar exactamente lo que usted desea.

Específicamente, usted quiere interior-interior de interacción, por lo que su matriz debería ser algo como '1********' (las otras células dependerá de lo que otros topológico restricciones que pueda tener). Aviso que esto también acepta las líneas de estar completamente dentro de otra, un caso especial de la colinealidad, donde ST_Overlaps no.

SELECT ST_Overlaps('LINESTRING(0 0, 2 0)'::geometry,
                   'LINESTRING(1 0, 2 0)'::geometry)

>>> f

SELECT ST_Relate('LINESTRING(0 0, 2 0)'::geometry,
                 'LINESTRING(1 0, 2 0)'::geometry,
                 '1********')

>>> t

Si no incluso ST_Relate está trabajando, entonces usted podría tener problemas topológicos con sus datos.

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