Come aggiungere i vertici alle stringhe di linea esistenti?


10

Se ho

Linestring(1 2, 1 5, 1 9)

e a

Point(1 3)

Esiste una funzione che può unire il linestring e puntare a preservare l'ordine in modo che l'output sia:

Linestring(1 2, 1 3, 1 5, 1 9)

Quindi aggiungerai solo vertici alle linee esistenti?
RK,

Sì, aggiungi vertici alla stringa di linea esistente, risultante in una stringa di linea.
BorisT

Perché hai bisogno di farlo tra l'altro?
RK,

Risposte:


8

Se LineString deve essere semplicemente suddiviso in una posizione più vicina a un determinato Punto, puoi fare ciò che vuoi con questo (divide LineString nel Punto più vicino a un determinato Punto e rimuove successivamente i due segmenti)

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;

Tuttavia, se il punto non deve essere proiettato su LineString, questo non funzionerà.


2

PostGIS ha ST_AddPoint che dovrebbe permetterti di farlo anche se dovresti specificare dove aggiungere il punto.

ST_AddPoint - Aggiunge un punto a un LineString prima del punto (indice basato su 0).

Esempi:

--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)

sì, lo so per questa funzione, ma non so dove dovrei mettere il mio nuovo punto.
BorisT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.