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

锋利的PostGIS--面压盖权重统计分析

Spatial Data 2021-05-25
1062

一 问题

     GIS中常见的是有很多面彼此互相压盖,有时需要对压盖面的权重进行统计分析,如下图:


        本文主要介绍这种情况如何通过PostGIS快速完成数据分析功能。

二 解决方案

        言简意赅,假设有个面状图形表为Circles,需要快速实现彼此压盖区域的权重统计,这样的分析只需3步:

  • 一  ST_ExteriorRing函数提取面的边界,另存到临时表boundaries:

    Create table boundaries as  
    Select st_union(st_exteriorRing(geom)) as geom from circles;  


    面拆线

    • 二 ST_Polygonize函数自动构造面,首尾不闭合的线无法构面会舍弃,结果就是重叠区域面,另存到临时表polys:

      create table polys as 
      select nextval('polyseq') as id,
      (st_dump(st_polygonize(geom))).geom as geom from boundaries;

      线重组重叠区域面

      • 三 更新面的权重

          使用ST_PointOnSurface函数生成重叠区域面内一点,该点肯定位于面内,通过改点判断与其重叠的面Circles数量。面简化点判断关系是非常典型的一个空间抽象思维。

        --新增一个权重字段,权重测试设计为压盖数量,例如某区域是三个面的重叠区域,
        --则这个值为3
        alter table polys add column count integer default 0;
        --更新权重
        update polys set count = p.count from (
        select count(*) as count, p.id as id from polys p join circles c
        on ST_Contains(c.geom, ST_PointOnSurface(p.geom)) group by p.id
        AS p where p.id = polys.id;

        deletefrom POYS where cunt=0;

        权重更新,分级设色


        三 总结

                PostGIS极其灵活,熟练使用在快速进行空间数据统计分析时非常有效,本示例核心思想是,灵活获取重叠区域面,并用重叠区域面转点的抽象思维,判定这些点与原来的面的重叠数量n,即重叠区域面是n个circles中的面的交集,示例用到的函数说明如下:

        ST_ExteriorRing:提取面的外环边界线。

        ST_Polygonize首尾闭合的线能自动构造面,否则,构造失败。

        ST_PointOnSurface:生成面内一点,该点一定位于面内。


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

        评论