Dada una tabla con geometría de línea, y uno o más puntos que se ajustan a esta línea en una tabla separada, me gustaría dividir cada línea con uno o más puntos de intersección en cada una de las ubicaciones donde la línea intersecta un punto.
Por ejemplo, hay una línea, L, con tres puntos de intersección, A, B y C en orden a lo largo de la geometría de la línea. Me gustaría devolver L como cuatro geometrías distintas: desde el comienzo de L a A, de A a B a lo largo de L, de B a C a lo largo de L, y de C al final de L.
En el pasado, he utilizado bien para esta tarea, que es un problema de referencia lineal ( http://sgillies.net/blog/1040/shapely-recipes/ ). Sin embargo, esto no sería factible en este caso, que tiene muchos millones de líneas y puntos. En cambio, estoy buscando una solución usando PostgreSQL / PostGIS.
Tenga en cuenta que los puntos están restringidos a estar en una línea. Además, un punto puede estar válidamente en el inicio o el final de una línea, en cuyo caso la línea no necesita dividirse (a menos que haya otros puntos que no coincidan con los puntos de inicio o finalización de la misma línea). Las líneas de subconjunto necesitan conservar su dirección y sus atributos, pero los atributos de las entidades de puntos no importan.
fuente
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
. Lo he editado.ST_Split
admite múltiples * cuchillas en postgis.net/docs/ST_Split.htmlpostgis 2.2
y posterioresActualice a PostGIS 2.2 , donde ST_Split se expandió para admitir la división por un límite multilínea, multipunto o (multi) polígono.
fuente
No tengo toda la respuesta para usted, pero ST_Line_Locate_Point toma una línea y un punto como argumentos, y devuelve un número entre 0 y 1 que representa la distancia a lo largo de la línea hasta la posición más cercana al punto.
ST_Line_Substring toma una línea y dos números, cada uno entre 0 y 1, como argumentos. Los números representan posiciones en la línea como distancias fraccionarias. La función devuelve el segmento de línea que se ejecuta entre esas dos posiciones.
Al trabajar con estas dos funciones, debería poder lograr lo que quiere hacer.
fuente
Me han pedido esto dos veces, perdón por el retraso. Es poco probable que esto se considere una solución concisa; Lo escribí cuando estaba un poco más abajo de la curva de aprendizaje de lo que estoy actualmente. Cualquier consejo es bienvenido, incluso los estilísticos.
fuente
Quiero ampliar las respuestas anteriores desde la perspectiva de un principiante. En este escenario, tiene una serie de puntos y observa cómo usarlos como una "cuchilla" para cortar una línea en segmentos. Todo este ejemplo supone que primero ajustó sus puntos a la línea y que los puntos tienen el atributo de ID único de su línea ajustada. Yo uso 'column_id "para representar la identificación única de la línea.
Primero , desea agrupar sus puntos en multipuntos cuando más de una cuchilla cae en una línea. De lo contrario, la función split_line_multipoint actúa como la función ST_Split, que no es el resultado que desea.
Luego , desea dividir su red en base a estos multipuntos.
Repita los pasos 1 y 2 con sus líneas que solo tienen un punto de intersección. Para hacer esto, debe actualizar el código del paso 1 a 'TENER CUENTA (*) = 1'. Cambiar el nombre de las tablas en consecuencia.
Luego , haga una tabla de líneas duplicadas y elimine las entradas con puntos en ellas.
Por último , une tus tres tablas usando
UNION ALL
:BAM!
fuente