따라서, 귀하가 요청한대로 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라고합니다.