Wie füge ich Scheitelpunkte zu vorhandenen Linestrings hinzu?

10

Wenn ich habe

Linestring(1 2, 1 5, 1 9)

und ein

Point(1 3)

Gibt es eine Funktion, die Linestring zusammenführen und die Reihenfolge beibehalten kann, sodass die Ausgabe wie folgt lautet:

Linestring(1 2, 1 3, 1 5, 1 9)
BorisT
quelle
Sie fügen also nur Scheitelpunkte zu vorhandenen Linien hinzu?
RK
Ja, fügen Sie dem vorhandenen Linestring einen Scheitelpunkt hinzu, was zu einem Linestring führt.
BorisT
Warum musst du es übrigens tun?
RK

Antworten:

8

Wenn der LineString einfach an einer Position unterteilt werden soll, die dem angegebenen Punkt am nächsten liegt, können Sie damit tun, was Sie möchten (teilt LineString am nächstgelegenen Punkt zum angegebenen Punkt auf und fügt die beiden Segmente anschließend erneut zusammen).

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;

Wenn Ihr Punkt jedoch nicht auf den LineString projiziert werden soll, funktioniert dies nicht.

chriserik
quelle
2

PostGIS verfügt über ST_AddPoint , mit dem Sie dies tun können, obwohl Sie angeben müssen, wo der Punkt hinzugefügt werden soll.

ST_AddPoint - Fügt einem LineString vor dem Punkt einen Punkt hinzu (0-basierter Index).

Beispiele:

--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
quelle
Ja, ich weiß für diese Funktion, aber ich weiß nicht, wo ich meinen neuen Punkt setzen soll.
BorisT