기존 선 스트링에 정점을 추가하는 방법은 무엇입니까?


10

만약 내가 가지고 있다면

Linestring(1 2, 1 5, 1 9)

그리고

Point(1 3)

라인 문자열을 병합하고 순서를 유지하는 포인트를 병합 할 수있는 함수가 있습니까? 출력은 다음과 같습니다.

Linestring(1 2, 1 3, 1 5, 1 9)

기존 선에 정점을 추가하는 것입니까?
RK

예, 기존 선 스트링에 꼭짓점을 추가하면 선 스트링이 생성됩니다.
BorisT

왜 btw를해야합니까?
RK

답변:


8

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에 투영되어 있지 않으면 작동하지 않습니다.


2

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)

그래, 나는이 기능을 알고 있지만 내 새로운 포인트를 어디에 두어야할지 모르겠다.
BorisT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.