暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

锋利的PostGIS--快速实现一个面的“等分”

Spatial Data 2021-05-25
1284

一 问题

        PostGIS是否有方法能将一个Polygon面切割成若干份小的Polygon面,且每一份的面积差不多大?

       其实并没有现成的方法,但是通过灵活运用postgis函数可以快速实现这样的功能,总共只要简单的5步就可以了,下文具体说明。

二 步骤分解

2.1 准备测试数据

    本文选择南京市行政区边界作为测试数据。

    create table nanjing as 
    select name,geom from city where name='南京市';

    2.2 面内生成任意数量点

    本文在南京区域内生成2000测试点。

      CREATE TABLE nanjing_points AS 
      SELECT (ST_Dump(ST_GeneratePoints(geom, 2000))).geom
      AS geom FROM nanjing;

      2.3 点聚合成簇

      使用ST_ClusterKMeans均值中心聚类分析,把散点聚簇分类。

        CREATE TABLE nanjing_pts_clustered AS 
        SELECT geom, ST_ClusterKMeans(geom, 10) over () AS cluster
        FROM nanjing_points;


        2.4 提取簇的中心

          CREATE TABLE nanjing_centers AS 
          SELECT cluster, ST_Centroid(ST_collect(geom)) AS geom
          FROM nanjing_pts_clustered GROUP BY cluster;

          2.5 使用voronoi算法生成面

             CREATE TABLE nanjing_voronoi AS
            SELECT (ST_Dump(ST_VoronoiPolygons(ST_collect(geom)))).geom AS geom
            FROM nanjing_centers;


            2.6 使用ST_Intersection方法切割

            用voronoi算法构成的面,去切割原始的南京行政区边界:

            CREATE TABLE nanjing_divided AS
            SELECT ST_Intersection(a.geom, b.geom) AS geom
            FROM nanjing a
            CROSS JOIN nanjing_voronoi b;


            三 总结

                    Postgis中造数据是非常方便的,可以快速造很多点,同时,提供了统计学上的空间聚类分析,强GIS算法上的韦恩图等等,在快速做数据分析和处理时灵活组织,能做很多有趣的事情。


            文章转载自Spatial Data,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论