Jeżeli mam
Linestring(1 2, 1 5, 1 9)
i a
Point(1 3)
Czy jest jakaś funkcja, która może scalać znakowanie linii i wskazywać zachowanie kolejności, więc wynik będzie:
Linestring(1 2, 1 3, 1 5, 1 9)
Jeżeli mam
Linestring(1 2, 1 5, 1 9)
i a
Point(1 3)
Czy jest jakaś funkcja, która może scalać znakowanie linii i wskazywać zachowanie kolejności, więc wynik będzie:
Linestring(1 2, 1 3, 1 5, 1 9)
Odpowiedzi:
Jeśli LineString ma być po prostu podzielony na pozycję najbliższą danemu punktowi, możesz zrobić z tym, co chcesz (dzieli LineString na najbliższy punkt od danego punktu i ponownie łączy dwa segmenty)
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;
Jednak jeśli twój punkt nie ma być rzutowany na LineString, to nie zadziała.
PostGIS ma ST_AddPoint, który powinien ci na to pozwolić, choć musisz określić, gdzie dodać punkt.
ST_AddPoint - Dodaje punkt do LineString przed punktem (indeks oparty na 0).
Przykłady:
--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)