¿Cómo agregar vértices a cadenas lineales existentes?

10

Si tengo

Linestring(1 2, 1 5, 1 9)

y un

Point(1 3)

¿Hay alguna función que pueda fusionar cadenas de líneas y puntos preservando el orden para que la salida sea:

Linestring(1 2, 1 3, 1 5, 1 9)
BorisT
fuente
¿Entonces solo agregarás vértices a las líneas existentes?
RK
sí, agregue vértice a la cadena lineal existente, lo que resulta en una cadena lineal.
BorisT
¿Por qué necesitas hacerlo por cierto?
RK

Respuestas:

8

Si LineString simplemente se subdivide en una posición más cercana al Punto dado, puede hacer lo que quiera con esto (divide LineString en el Punto más cercano al Punto dado y vuelve a combinar los dos segmentos después)

SELECT ST_AsText(
         ST_LineMerge(
           ST_Union(
             ST_Line_Substring(line, 0, ST_Line_Locate_Point(line, point)),
             ST_Line_Substring(line, ST_Line_Locate_Point(line, point), 1)
       )))
FROM  ST_GeomFromText('Linestring(1 2, 1 5, 1 9)') as line, 
      ST_GeomFromText('Point(1 3)') as point;

Sin embargo, si no se supone que su Punto se proyecte en LineString, esto no funcionará.

chriserik
fuente
2

PostGIS tiene ST_AddPoint que debería permitirle hacer esto, aunque tendría que especificar dónde agregar el punto.

ST_AddPoint: agrega un punto a un LineString antes del punto (índice basado en 0).

Ejemplos:

--guarantee all linestrings in a table are closed
        --by adding the start point of each linestring to the end of the line string
        --only for those that are not closed
        UPDATE sometable
        SET the_geom = ST_AddPoint(the_geom, ST_StartPoint(the_geom))
        FROM sometable
        WHERE ST_IsClosed(the_geom) = false;

        --Adding point to a 2-d line
        SELECT ST_AsEWKT(ST_AddPoint(ST_GeomFromEWKT('LINESTRING(1 2, 1 5, 1 9)'), ST_MakePoint(1, 3), 1));

        --result
        st_asewkt
        ----------
        LINESTRING(1 2, 1 3, 1 5, 1 9)
RK
fuente
Sí, sé para esta función, pero no sé dónde debo poner mi nuevo punto.
BorisT el