PostGIS : 라인 스트링의 한쪽 ST_Buffer가 이상한 출력을 생성 함

Aug 18 2020

아래 예에는 선 스트링 PostGIS 테이블 (검은 색과 노란색)과 단면 ST_Buffer 출력 다각형 (빨간색)이 있습니다. 버퍼 거리는 선 스트링 테이블에 저장된 속성 값을 기반으로합니다.

보시다시피 버퍼 중 하나가 잘못되어 특정 양만큼 자체 섹션을 잘라냅니다. 왜 이런 일이 발생 했습니까? 고칠 수 있습니까? 선 스트링 섹션이 오목 해지는 문제인 것 같습니다.

비슷한 쿼리를 사용하여 직접 시도해보십시오.

SELECT ST_BUFFER('LineString (638327 331059, 638337 331048, 638337 331037, 638343 331023, 638358 331014, 638380 330991, 638382 330978, 638391 330966, 638410 330959, 638420 330953)',50,'side=right')

다른 예에서 이런 일이 발생하는 것을보고 있습니다 (검은 색 선은 버퍼 다각형과 마찬가지로 1 개의 기능입니다).

그리고 이것으로 이것을 시도하십시오.

SELECT ST_BUFFER('LineString (600296 172961, 600304 172962, 600307 172965, 600307 172969, 600307 172971, 600309 172974, 600308 172976, 600307 172979, 600306 172981, 600307 172982, 600311 172980, 600313 172979, 600317 172979, 600321 172982, 600325 172982, 600327 172979, 600328 172976, 600331 172974, 600338 172974)',10,'side=right')

낯선 결과를 얻으려면 버퍼 거리를 늘리십시오. EPSG : 두 경우 모두 27700.

답변

7 dr_jts Aug 18 2020 at 05:53

이는 단면 버퍼 알고리즘의 결함으로 인해 발생합니다 (버그가 아니라 알고리즘 설계의 알려진 한계 임).

이것은 GEOS 문제 로 기록됩니다 . 그래도 수정을위한 ETA는 없습니다.

TheoF Aug 20 2020 at 01:04

이 문제를 해결하는 해결 방법 파이프 라인을 만들었습니다. 도중에 몇 개의 임시 중간 테이블을 만드는 작업이 포함되지만 즉시 삭제할 수 있습니다.

  1. ST_BUFFER정상적으로 사용하여 라인을 버퍼링 하면 혼란스러운 출력이 발생하지 않습니다. (즉, 'side=left/right'매개 변수를 사용하지 마십시오 ).
  2. 사용 ST_Split회선을 이용하여 중심을 따라 반으로 1 단계의 완충액을 분할. ST_UNION인접한 연결선이있는 선! 이 절단 선을 통해 연장되도록한다 너머 버퍼. 그렇지 않으면 아무것도 자르지 않습니다.
  3. 라인을 다시 버퍼링하지만 이번에는 한쪽 만 버퍼링하십시오. 이것은 당신 원하지 않는 편임에 틀림 없다 .
  4. ST_PointOnSurface각 '잘못된'측면 버퍼 모양에 대해 사용하여 포인트 테이블을 만듭니다 .
  5. 이 새로운 점 테이블을 사용하여 점을 교차하는 것으로 발견 된 분할 다각형 버퍼 (2 단계에서)에서 모든 다각형을 삭제합니다.
  6. 이제 '잘못된'면이 제거 된 전체 버퍼 모양이 남습니다. 즉. 원하는 올바른면이 남습니다.

나는 이것을 엄청나게 요약하고 각 선분에 대해 절단을 돕기 위해 인접한 연결선을 가지고 있다고 가정했습니다. 나는 또한 1000 개의 세그먼트가있는 해안선을 위해 이것을했다. 그래서 호스트 테이블을 사용하여 위 단계의 각 반복을 삽입했습니다. 각 선분을 반복하기 위해 선 테이블에 자동 증가 ID 열이 있는지 확인했습니다 (따라서 각 선분에 대해 선분 앞뒤의 세그먼트와 병합 할 수 있습니다 : 즉, n-1, n, n + 1). 더 명확하게하기 위해 곧이 답변을 업데이트하겠습니다.