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)
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)
Antworten:
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.
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)