首页 > 其他分享 >PostGIS之几何有效性

PostGIS之几何有效性

时间:2023-01-08 02:00:10浏览次数:74  
标签:几何图形 PostGIS ST geom 几何 有效性 SELECT

1. 概述

PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询

PostGIS官网:About PostGIS | PostGIS

PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS

PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)

本文基于官方教程描述PostGIS中的几何有效性

数据准备可参考:

数据介绍可参考:

2. 几何有效性

2.1 几何有效性的定义

几何图形可能是无效的,比如下面这种:

SELECT ST_GeometryFromText(
         'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
);

image-20230105171550106

这种几何图形能显示,但是查询其面积,面积为0:

image-20230105171656055

这显然是不合理的,因为这个几何图形是无效的,它存在自相交,对于无效的几何图形,PostGIS将无法正确进行运算

PostGIS所遵循的OGC SFSQL标准所定义的多边形有效性的规则有:

  • 多边形的环必须闭合
  • 内环必须位于外环的内部
  • 环不能自相交(它们不能相互接触,也不能交叉)
  • 除了在某个点接触,环不能与其他环接触

2.2 检测有效性

PostGIS提供了几何有效性检测函数:

  • ST_IsValid(g) Tests if a geometry is well-formed in 2D
  • ST_IsValidDetail (geom, flags) Returns a valid_detail row stating if a geometry is valid or if not a reason and a location
  • ST_IsValidReason(geomA) Returns text stating if a geometry is valid, or a reason for invalidity

检测是否有效:

SELECT ST_IsValid(ST_GeometryFromText(
         'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
));

结果为:false

检测无效原因:

SELECT ST_IsValidReason(ST_GeometryFromText(
         'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
));

image-20230105172632405

可以看到(1,1)点自相交

检测纽约社区表的有效性:

SELECT name, ST_IsValidReason(geom)
FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);

image-20230105173021776

2.3 修复无效几何图形

PostGIS提供了自动修复函数:

  • ST_MakeValid(input) Attempts to make an invalid geometry valid without losing vertices

尝试修复无效上面提到的无效图形:

SELECT ST_AsText(ST_MakeValid(ST_GeometryFromText(
         'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
)));

image-20230105173602749

可以看到PostGIS将这个无效的几何图形拆为了两个Polygon并合成了一个MultiPolygon

尝试修复纽约社区表中无效的图形:

SELECT name, ST_AsText(ST_MakeValid(geom))
FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);

image-20230105174019486

使用ST_Buffer(geometry, 0.0)也有时也可达到修复的效果:

image-20230105174208895

自动修复函数有时并不能起作用,需要手动将无效的几何图形导入临时表,然后使用GIS软件进行修改:

-- Side table of invalids
CREATE TABLE nyc_neighborhoods_invalid AS
SELECT * FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);
 
-- Remove them from the main table
DELETE FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);

3. 参考资料

[1]23. Validity — Introduction to PostGIS

[2]PostGIS教程十五:几何图形的有效性 - 知乎 (zhihu.com)

[3]PostGIS 3.3.3dev Manual

[4]PostGIS Cheat Sheet

标签:几何图形,PostGIS,ST,geom,几何,有效性,SELECT
From: https://www.cnblogs.com/jiujiubashiyi/p/17031735.html

相关文章

  • PostGIS之几何创建函数
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之地理坐标
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之空间投影
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之空间索引
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • 对极几何|Epipolar Geometry
    对立体视觉建模的一种方法(约束),使得立体匹配问题有一个最优解​​X​​​:三维空间点(研究对象)​​​C、C’​​​:两摄像机中心​​​x、x’​​​:​​X​​在两摄像......
  • GDAL中的几何类型
    /************************************************************************//*OGRFromOGCGeomType()*//********......
  • [概率论与数理统计]笔记:1.3 古典概型与几何概型
    1.3古典概型与几何概型古典概型特点基本事件有限等可能性计算\[P(A)=\frac{A中元素个数}{\Omega中元素个数}=\frac{使A发生的基本事件数}{\Omega中样本点总数}\]......
  • 【230101-1】正弦定理的几何意义
    ......
  • 欧氏几何:几何原本(卷二)
    定义1.矩形是指邻边夹角为直角的平行四边形2.拐尺形是指平行四边形中的补形以及形成的小的平行四边形(如图虚线部分)命题由于命题过多博主无法详细说明证明,卷2命题主要......
  • 几何建模(二)
    BREP和CSG  几何建模技术在很大程度上彻底改变了产品的设计和制造。尽管有多种表示对象的方法,但最常用的建模技术是实体建模。边界表示建模和构造实体几何建模是表达实......