공간 데이터를 변환하고 분석하기 위해 ArcToolbox 또는 QGIS Processing Toolbox를 이용하는 방법이 먼저 떠오릅니다. 가장 많이 사용했던 경험 때문에 그렇겠죠. Paul Ramsey는 원시적인 관점에서 생각하여 PostGIS에서도 다양한 방법으로 지오메트리를 다룰 수 있다는 것을 소개하고 있습니다. 그도 그 방법이 가장 익숙하니까 그렇겠죠?! 그의 블로그에 작성된 게시글을 바탕으로 아래 내용이 작성되었음을 밝히고, 사고의 다양성을 기반으로 생각하는 습관을 기르도록 해야겠네요.

 

아래의 예시는 Polygon을 동일한 면적의 다각형으로 분할할 수 있는 방법에 대한 소개로 사용자 정의 함수를 만들지 않고 PostGIS 함수만으로 폴리곤을 분할하는 방법에 대한 설명입니다.

 

 

1. 서울시 경계 Polygon을 이용하여 최대한 비슷한 크기의 20개의 조각으로 피처를 분할하고자 합니다.

SELECT geom FROM seoul_sig

 

2. 먼저 서울시 경계 영역 내 무작위로 배치된 Point를 생성합니다. Point 개수가 많을수록 동일한 조각으로 분할될 수 있습니다. 여기서는 10,000개의 포인트를 생성하겠습니다.

CREATE TABLE seoul_points AS
    SELECT (
        ST_Dump(
            ST_GeneratePoints(geom, 10000)
        )
    ).geom AS geom
    FROM seoul_sig;

 

3. Point가 만들어졌으면 그 다음으로 20개의 조각 영역을 만들기 위한 Point Clustering 작업을 합니다. 그룹화 개수는 20으로 설정하였습니다. cluster 번호는 0부터 시작합니다.

CREATE TABLE seoul_points_clustered AS
    SELECT
        geom, ST_ClusterKMeans(geom, 20) over () AS cluster
    FROM seoul_points;

 

 

4. 클러스터 그룹의 중심점을 생성합니다. voronoi diagram을 만들기 위해 필요한 Point 입니다. ST_Collect() 함수는 단일 Geometry를 모아 Geometry Collection으로 만들어줍니다. 

CREATE TABLE seoul_centers AS
    SELECT
        cluster, ST_Centroid(ST_Collect(geom)) AS geom
    FROM seoul_points_clustered
    GROUP BY cluster;

 

 

5. 중심점이 만들어졌으면 Voronoi Polygon을 생성합니다.

CREATE TABLE seoul_voronoi AS
    SELECT (
        ST_Dump(
            ST_VoronoiPolygons(ST_Collect(geom))
        )
    ).geom AS geom
    FROM seoul_centers;

 

6. Volonoi Polygon과 서울시 경계 Polygon을 교차시켜 경계 영역에 포함하고 있는 볼로노이 분할 영역의 폴리곤을 생성할 수 있습니다.

CREATE TABLE seoul_divided AS
    SELECT
        ST_Intersection(T1.geom, T2.geom) AS geom
    FROM seoul_sig T1 CROSS JOIN seoul_voronoi T2;

최종 결과물입니다. PostGIS 공간 함수만으로 범위가 넓은 폴리곤을 유사한 크기의 조각 폴리곤으로 분할하는 결과물을 얻을 수 있었습니다.

 

위에서 사용한 PostGIS의 공간 함수는 아래와 같습니다.


Reference



AND