분리 된 다각형에서 보로 노이 다이어그램과 같은 모자이크 만들기


12

아래 그림 은 문제를 보여줍니다 .

여기에 이미지 설명을 입력하십시오

같이 (A) 내가 가진 형상으로 분리 된 다각형의 집합, PostGIS와의를. 내가 좋아하는 뭔가가 필요 (나)"모자이크" 보로 노이 건설처럼 (에 의해 설명되어 ...는 "영향 지역"기준하여 건물 폴리곤의 집합을 ) C ( 사실, 다각형 경우 하였다) 영향 영역은 보로 노이입니다.

요약 : 일련의 분리 된 다각형의 "모자이크"를 생성 하는 SQL 알고리즘 (또는 PostGIS에 대한 특정 알고리즘)이 필요 합니다. (아마도 ST_Buffer 및 ST_Difference 연산이 적은 루프)

추신 : Voronoi와 마찬가지로 공간 구분 ( (b) 의 사각형 프레임 )은 무시됩니다.


이 문제는 줄에 대한 이것 과 비슷합니다 .

편집 (@FelixIP 주석 후)

나는 정확성을 잃지 않기 위해 벡터 우주 에 머무르는 것을 선호합니다 (예 : ST_DelaunayTriangles를 사용 하고 원래 다각형으로 인테리어를 추가 및 빼기, 이중 그래프 솔루션 적용 ) pprepair 와 같은 간단하고 자동적 인 패키지 ( QGIS 토폴로지 도구 처럼 지원됨) 자동이 아님). 그러나 래스터 는 아마도 더 간단하고 CPU 소모가 적습니다.

이 "GRID 프로세스"그림은 동일한 정밀도와 "유클리드 영향 영역 증가"를 허용한다고 가정 할 때 솔루션으로도 유효합니다.

여기에 이미지 설명을 입력하십시오

ARCGIS에는 Euclidean Allocation으로 알려진 공간 분석 도구가 있으므로 다각형 세트 (다각형 분류, 래스터 화 및 되감기)로 시작 하는 PostGIS 유사 솔루션 이있을 수 있습니다 .


감사합니다 @Nir, 점과의 혼동을 미안합니다. 점을 사용하지 않고 그림의 항목 (a)(b) 로 다각형 만 사용하고 있습니다 ... 솔루션에 대한 단서가 있습니까?
Peter Krauss

arcgis에는 유클리드 할당 또는 근접성이라는 래스터 솔루션이 있습니다.
FelixIP

덕분에 @FelixIP, 나는 ;-) "잘 래스터 솔루션을 제공"하는 편집
피터 크라우스에게

다각형을 extent.aspolygon에서 지우면 다각형이 남게됩니다. 그것의 해골 gis.stackexchange.com/questions/177/… 당신이 필요로하는 것입니다. 구현은 거물 생각입니다
FelixIP

1
@Cyril, 나는 당신의 스크립트를 검토 할 수 있습니다 ... 다음 주. 최신 PostGIS 기능을 갖춘 솔루션으로 보이는 것을 게시하는 것이 좋은 첫 단계입니다.
피터 크라우스

답변:


2

따라서, 귀하가 요청한대로 PostGIS 도구를 사용하여 과일 플래터를 준비 할 것입니다. 요청을 올바르게 이해하고 언급 한 바와 같이 PostGIS 오븐 작동에 대한 책임은 그녀의 크리에이티브 팀이 부담합니다.

나는 유머러스 한 스타일의 누군가에게 기분을 상하게하지 말고 그것을 게임으로 이해하도록 요청합니다!

원본 파일은 얇게 썬 과일과 단순한 모양 (이하 과일이라고 함)입니다 (아래 그림 1 참조).

여기에 이미지 설명을 입력하십시오

여기 내 레시피가 있으며, 나중에 배우게 될 소중한 프로그래머가 도움을 줄 것입니다. 시작합시다.이를 위해 과일을 넣을 반죽을 만들고 스크립트를 실행합니다.

create table poly_extent as SELECT ST_SetSRID(ST_Buffer(ST_Envelope(ST_Extent(geom)),0.05),4326) as geom FROM poly;

아래 그림 2의 결과를 참조하십시오

여기에 이미지 설명을 입력하십시오

이제 그림과 같이 과일이 거의 없다면 과일에 외부 버퍼의 테두리를 만들거나 과일이 많은 경우 음수 버퍼의 테두리를 만들어 스크립트를 실행하십시오.

create table poly_buff_dump as SELECT ((ST_Dump(ST_Boundary(ST_Union(ST_Buffer((geom),0.01, 'join=mitre mitre_limit=5.0'))))).geom) geom FROM poly;

각 과일 주위에 버퍼 라인을 슬라이스

UPDATE poly_buff_dump SET geom=ST_RemovePoint(geom, ST_NPoints(geom)-1) WHERE ST_IsClosed(geom)=true; 아래 그림 3의 결과를 참조하십시오

여기에 이미지 설명을 입력하십시오

(실제로, 결과적으로 원과 같은 선이 끊어 질 것이라고 생각했지만 수치가 어려울 경우 때로는 끊기가 얻어지고 예를 들어 사각형의 한쪽이 빠지는 등의 잘못된 파단이 발생합니다. )

그런 다음 얻은 선을 편리한 방법으로 동일한 세그먼트로 나누고 점을 추출해야합니다.

create table poly_buff_dump_pt as SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;

결과, 아래 그림 4 참조

여기에 이미지 설명을 입력하십시오

이제 Voronoi 도구를 실행하십시오.이 위치에서 MickyT 링크 ( /gis//a/172246/120129) 에서 제안한 도구를 사용 했습니다. 그 결과 이름이 "voronoi"인 테이블을 만들었습니다. ”“최초의 조수”는 주방장의 도움 덕분에 주방장과 분리되어 있습니다! :-).

이 단계의 두 번째 방법은 ST_VoronoiPolygons 함수를 실행하는 것입니다.

결과, 아래 그림 5 참조

여기에 이미지 설명을 입력하십시오

이제 스크립트를 실행하여 추가 부분을 잘라내십시오.

create table poly_voronoi_cut as SELECT ST_Intersection(a.geom, b.geom) geom FROM voronoi a INNER JOIN poly_extent b ON ST_Intersects(a.geom, b.geom); 결과는 아래 그림 6을 참조하십시오.

여기에 이미지 설명을 입력하십시오

이제 LineString에서 지리 데이터 유형을 정렬하기 위해 스크립트를 실행하십시오.

create table poly_voronoi_dump as SELECT (ST_Dump(geom)).geom as geom FROM poly_voronoi_cut; 그리고 이제 저는 "두 번째 배우자"에게 내 의무를 맡기고 케이크 웰 (Jeff- https: //gis.stackexchange.com/a/785/120129)을 섞어 단일 층으로 수평을 맞추도록 요청합니다. 감사합니다.

CREATE TABLE poly_overlay_cut AS SELECT geom FROM ST_Dump(( SELECT ST_Polygonize(geom) AS geom FROM ( SELECT ST_Union(geom) AS geom FROM ( SELECT ST_ExteriorRing(geom) AS geom FROM poly_voronoi_dump) AS lines ) AS noded_lines ) ); 이제 스크립트를 실행할 때가되었습니다.

create table poly_voronoi_union as SELECT b.id, (ST_ConvexHull(ST_Union(a.geom, b.geom))) geom FROM poly_overlay_cut a INNER JOIN poly_buff_dump b ON ST_Intersects(a.geom, b.geom) GROUP BY b.id, a.geom, b.geom; 그리고 다른 스크립트 :

create table poly_voronoi_union_area as SELECT ST_Union(ST_ConvexHull(ST_BuildArea(geom))) as geom FROM poly_voronoi_union GROUP BY id; 아래의 그림 7 참조

여기에 이미지 설명을 입력하십시오

그림에서 볼 수 있듯이 컷에는 ST_SnapToGrid를 사용하거나 다른 방법으로 제거 할 수있는 작은 레이어가 있습니다.

그리고 마지막으로 파이에서 구운 과일을 잘라 내고 오븐에서 조금 피곤해했습니다. :-)

create table polygon_voronoi_result as SELECT (ST_Dump(ST_Difference(a.geom, b.geom))).geom as geom FROM poly_voronoi_union_area_snap as a JOIN poly b ON ST_Intersects(a.geom, b.geom); 결과는 그림 8 참조 여기에 이미지 설명을 입력하십시오

이 날부터 모든 사람들은 이제 맛있는 파이-과일 플래터를 굽는 법을 배웁니다. 모두 자신을 돕고 모든 사람에게 적합한 조각을 선택하십시오.

(전자 케이크가 아니라 실제 케이크로 모든 사람에게 음식을 먹을 수 없다는 것은 유감입니다. 아마 배고픔이 지구에서 끝날 것입니다 ...)

편집 : 파이의 체리는 다음과 같이 보일 수 있습니다 :-) :

WITH
tbla AS (SELECT (ST_DumpPoints(geom)).geom geom FROM poly),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT ST_Intersection(a.geom, b.geom) geom FROM tblb a JOIN poly_extent b ON ST_Intersects(a.geom,b.geom)),
tbld AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM poly GROUP BY id, geom)
SELECT id, ST_Union(a.geom) as geom FROM tblc a JOIN tbld b ON ST_Intersects(a.geom, b.geom) GROUP BY id;

또는

WITH
tbla AS (SELECT (ST_DumpPoints(geom)).geom geom FROM polygons),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM polygons GROUP BY id, geom)
SELECT id, ST_Union(a.geom) geom FROM tblb a JOIN tblc b ON ST_Intersects(a.geom, b.geom) GROUP BY id;

스크립트 01.04.2020 수정 :

WITH tbla AS (
WITH atbl AS (SELECT id, (ST_ExteriorRing(((ST_Dump(geom)).geom))) geom FROM polygons),
intervals AS (SELECT generate_series (0, 501) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM atbl, intervals GROUP BY id, intervals.steps, geom),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM polygons GROUP BY id, geom)
SELECT id, ST_Union(a.geom) geom FROM tblb a JOIN tblc b ON ST_Intersects(a.geom, b.geom) GROUP BY id;

당신이 훌륭하고 공정한 Mr.Baker와 함께, 모든 행운을 빌어 주셔서 감사합니다 :-) ...

독창적 인 솔루션.

이 스크립트는 ST_VoronoiDiagramsFromPolygons라고합니다.


1
안녕, 좋은 일러스트, 좋은 결과 (!) 것 같습니다. 간단한 토론을 제안, @geogeek 솔루션을 참조 QGIS의 단계는 여기 PostGIS와의 주요 단계를 보인다 ... 왜 전자의 필요 ST_BufferST_ConvexHull? 대체 알고리즘이 있습니까?
Peter Krauss

1) Voronoi 함수를 적용하는 동안 원래 그림 사이의 분리선을 줄이기 위해 ST_Buffer 및 다각형이 생성되므로 지정할 수있는 버퍼 크기가 클수록 분리선이 더 매끄럽게 만들어집니다. Voronoi 함수 ... 2) ST_ConvexHull 각 다각형의 수많은 그림, 필요한 다각형 ... 3) 오늘, 이것은 당신의 질문을 해결하는 나의 비전입니다. 저는 우리 모두에게 어떤 일이 일어날 지 모르겠습니다. 그리고 미래에 우리의 결정은 ...
Cyril Mikhalchenko

버퍼 라인의 또 다른 중요한 가치는 그것들이 보로 노이 함수의 결과에서 조각을 선택하여 각 모양에 대해 결합 된 다각형을 만드는 데 도움이된다는 것입니다.
Cyril Mikhalchenko

그건 그렇고, 코드와 접근 방식의 개선을 환영하여 결과를 악화시키지 않습니다 ...
Cyril Mikhalchenko

1
안녕 Cyril, 나는 ST_Buffer가 등고선을 정규화하는 완벽한 옵션이라는 것에 동의합니다. 에 대해 ST_ConvexHull, 우리는 그림 6 후 얻을 수있는 결과의 종류 것만 호기심이다 poly_voronoi_unionST_ConvexHull없이.
피터 크라우스

8

Postgis에는 voronoi 전용 기능이 없지만 Qgis에는 포인트에서 voronoi 다각형을 만들 수있는 vornoi 함수가 포함되어 있으므로 qgis를 사용하여 다음 단계를 수행하여 이러한 결과를 얻었습니다.

extract nodes함수를 사용하여 다각형에서 점을 만듭니다.

Qgi에서 voroi 함수를 사용하여 vornoi 다각형을 만듭니다.

Qgis에서 공간 조인을 만듭니다.

-디졸브 결과.

여기에 이미지 설명을 입력하십시오


1
좋은 해결책 (!), 일러스트레이션 감사합니다. 당신은 그것을 향상시킬 수 있습니까? 아래 왼쪽 사각형을 보시면, 보로 노이에서 4 포인트였으며 사각형의 중심에는 표현이 없으며, 그 영역이 왜곡됩니다 (삼각형에 잃어 버림) ... 아마도 각 다각형을 정기적으로 샘플링 하여 향상시킬 수 있습니다 ... 아마도 일부 내부 지점.
Peter Krauss

ArcGIS에서 densify 도구를 사용합니다. 이것은 근접 다각형을 크게 향상시킵니다. +1
FelixIP

3

OK-이것에 대해 조금 생각하고 최근에보고있는 것과 같은 것을 발견했습니다.

출발 폴리곤을 가져 가라 :

여기에 이미지 설명을 입력하십시오

숫자가있는 새 속성 생성 (제 경우 100) 벡터-> 조사 도구-> 다각형 내의 임의의 점 도구를 사용하면 각 다각형 안에 (100) 개의 점이 생성됩니다. 여기에 이미지 설명을 입력하십시오

그런 다음 Vector-> Geometry tools-> Voronoi를 사용하여 해당 점 레이어를 기반으로 폴리를 생성하십시오.

여기에 이미지 설명을 입력하십시오

이제 벡터-> 공간 쿼리 도구를 사용할 수 있습니다. 하나의 다각형 (또는 다각형 중 하나)에 속하는 점 선택 공간 쿼리 도구를 사용하여 해당 다각형에 적용 할 보로 노이 다각형을 선택하십시오. 관심 폴리곤에 해당하는 보 로니 폴리곤에 속성을 추가하십시오. (방금 1,2,3,4를 사용했습니다)

이제 새 속성을 기반으로 벡터-> 지오 프로세싱 도구-> 디졸브 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


@AAmes (!)에게 감사합니다. 일러스트레이션은 훌륭하고이 방법은 좋은 대안입니다.하지만 문제는 "SQL 알고리즘 (또는 PostGIS에 특정한 것)" 에 관한 것입니다. 이제 함수 사용에 대한 현상금 ST_VoronoiPolygons () , 아마도 한 번의 클릭으로 모든 문제를 해결할 수 있습니다 ;-)
Peter Krauss

@AAmes 빠른 검색은 PostGIS에서도이 방법을 사용할 수 있음을 보여줍니다. postgis에서 다각형에 임의의 점을 만드는 방법은 다각형에서 점을 만드는 방법을 설명하며 그 점에서 매우 간단합니다.
Phil G

내 바운티는 인센티브 (여러분을 환영합니다!)로 귀하에게 제공되었지만 질문에 대한 답은 바운티와 바운티 요건에 대한 것입니다.
Peter Krauss

고마워 피터, 나는 당신의 노트를 보았지만 불행히도 돌아와서 그것을 해결할 기회가 없었습니다. PostGIS에 대한 경험이 없지만 좋은 응답을 제공 할 수있는 시간보다 더 많은 시간이 걸렸습니다. 이 공간에 대한 우리의 탐구가 미래 사람들에게 도움이 되길 바랍니다. PostGIS에서 금이 간다면 다시 돌아와서 연습을 위해 또 다른 충격을 가할 것입니다!
AA

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.