답변:
LineString을 단순히 주어진 Point에 가장 가까운 위치로 세분화하면 원하는 것을 수행 할 수 있습니다 (LinePoint를 주어진 Point에 가장 가까운 Point에서 분리하고 나중에 두 개의 segement를 병합합니다)
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;
그러나 포인트가 LineString에 투영되어 있지 않으면 작동하지 않습니다.
PostGIS에는 ST_AddPoint 가있어 포인트를 추가 할 위치를 지정해야하지만이를 수행 할 수 있습니다.
ST_AddPoint — 포인트 (0 기반 인덱스) 앞에 LineString에 포인트를 추가합니다.
예 :
--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)