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.