• postgis ST_CoverageInvalidEdges用法


    官方文档

    概要

    geometry ST_CoverageInvalidEdges(geometry winset geom, float8 tolerance = 0);

    描述

    一个窗口函数,用于检查窗口分区中的多边形是否形成有效的多边形覆盖范围。 它返回线性指示器,显示每个多边形中无效边(如果有)的位置。

    如果满足以下条件,则一组有效多边形是有效的覆盖范围:

    • Non-overlapping-多边形不重叠(它们的内部不相交)

    • Edge-Matched-沿共享边的顶点相同

    作为窗口函数,为每个输入多边形返回一个值。 对于违反一个或多个有效性条件的多边形,返回值是包含有问题边的 MULTILINESTRING。 覆盖范围有效的面返回值 NULL。 非多边形或空几何图形也会产生 NULL 值。

    只要周围的多边形边缘匹配,这些条件就允许有效的覆盖范围包含孔(多边形之间的间隙)。 然而,非常窄的间隙通常是不希望的。 如果使用非零距离指定公差参数,则形成较窄间隙的边缘也将被返回为无效。

    正在检查覆盖范围有效性的多边形也必须是有效的几何图形。 这可以使用ST_IsValid 进行检查。

    可用性:3.4.0

    需要GEOS >= 3.12.0

    由重叠和不匹配顶点引起的无效边

    1. WITH coverage(id, geom) AS (VALUES
    2. (1, 'POLYGON ((10 190, 30 160, 40 110, 100 70, 120 10, 10 10, 10 190))'::geometry),
    3. (2, 'POLYGON ((100 190, 10 190, 30 160, 40 110, 50 80, 74 110.5, 100 130, 140 120, 140 160, 100 190))'::geometry),
    4. (3, 'POLYGON ((140 190, 190 190, 190 80, 140 80, 140 190))'::geometry),
    5. (4, 'POLYGON ((180 40, 120 10, 100 70, 140 80, 190 80, 180 40))'::geometry)
    6. )
    7. SELECT id, ST_AsText(ST_CoverageInvalidEdges(geom) OVER ())
    8. FROM coverage;
    9. id | st_astext
    10. ----+---------------------------------------
    11. 1 | LINESTRING (40 110, 100 70)
    12. 2 | MULTILINESTRING ((100 130, 140 120, 140 160, 100 190), (40 110, 50 80, 74 110.5))
    13. 3 | LINESTRING (140 80, 140 190)
    14. 4 | null

    解析:

    这个方法有2个功能。

    • 1、检测多边形集合是否有效。
    • 2、把多边形集合无效(例如相交、重叠)的部分给依次列举出来。

    返回值

    • 1、返回几何对象
    • 2、返回NULL(没有相交) 

    我把数据插入到表中。因为最终使用都会在表中使用。

    1. --新建表
    2. create table t2(
    3. id serial primary key,
    4. geom geometry(POLYGON,4326)
    5. )
    6. --插入数据
    7. insert into t2 values
    8. (1, 'POLYGON ((10 190, 30 160, 40 110, 100 70, 120 10, 10 10, 10 190))'::geometry),
    9. (2, 'POLYGON ((100 190, 10 190, 30 160, 40 110, 50 80, 74 110.5, 100 130, 140 120, 140 160, 100 190))'::geometry),
    10. (3, 'POLYGON ((140 190, 190 190, 190 80, 140 80, 140 190))'::geometry),
    11. (4, 'POLYGON ((180 40, 120 10, 100 70, 140 80, 190 80, 180 40))'::geometry)

    我把示例中的4条数据插入到了数据库,下图是4条数据的集合。

    举例说明

    数据可视化

    你会发现,有些多边形有重叠的部分,我们把数据在详细展开。拿id=1和id=2为例。

    数据分析

    通过数据可视化我们发现,id=1和id=2的数据有相交的,对于多边形数组来说是无效的。

    则一组有效多边形是有效的覆盖范围:

    • Non-overlapping-多边形不重叠(它们的内部不相交)

    • Edge-Matched-沿共享边的顶点相同

     相交抛分

    通过查询,我们可以得到id=1和id=2相交的部分。

    1. select id,geom,ST_AsText(ST_CoverageInvalidEdges(geom) OVER ()),
    2. ST_GeomFromText(ST_AsText(ST_CoverageInvalidEdges(geom) OVER ()),4326)
    3. from t2 where id=1 or id=2

    • 图1是第1条数据相交部分
    • 图2是第2条数据相交部分

     如果数据集合没有相交,则会返回NULL。见下图。

     id=4的数据与前面2条数据不相交,所以通过函数返回NULL。

    场景

    本函数适用于校验多边形是否有效,并返回错误的几何的位置,有助于去辨别修改。

    ST_IsValid函数只是判定是否有效,且不能鉴别定位。

  • 相关阅读:
    Automatic differentiation package - torch.autograd
    【web前端期末大作业】基于HTML+CSS+JavaScript实现代理商销售管理系统后台(8页)
    Python教程——最后一波来喽
    如何记录分析你的炼丹流程—可视化神器Wandb使用笔记【1】
    基于JavaSwing开发的坦克大战游戏 课程设计 大作业 毕业设计
    CentOS7.9+Kubernetes1.28.3+Docker24.0.6高可用集群二进制部署
    LeetCode(C++)-贪心算法(用最少数量的箭引爆气球、无重叠区间、划分字母区间、合并区间、买卖股票的最佳时机含手续费、单调递增的数字、监控二叉树)
    C++ 补充之常用遍历算法
    Redis之五大基础数据结构深入、应用场景
    昇腾CANN 7.0 黑科技:大模型训练性能优化之道
  • 原文地址:https://blog.csdn.net/w345731923/article/details/134060548