PostGIS 多面(MultiPolygon)挖洞

2023-10-28 14:00

本文主要是介绍PostGIS 多面(MultiPolygon)挖洞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现象

在应用过程中,“我认为的”,1个点明明落在了2个多面上,结果却不同。其实你会发现,坐标点的数据是一样的,但是定义的方法不同,导致结果不同。

--基础数据--
CREATE TABLE public.test_geometry_4490 (id serial4 NOT NULL PRIMARY KEY,geom public.geometry(geometry, 4490) NULL
);
--线行环(挖洞)
insert into test_geometry_4490 values (2,'MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5), (2 3,2 4,4 4,4 3,2 3)))')
--多面
insert into test_geometry_4490 values (1,'MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((2 3,2 4,4 4,4 3,2 3)))')--查询--
select ST_Intersects(geom,ST_GeomFromText('POINT(3.5 3.5)',4490)) from test_geometry_4490

结果是:第一行不相交(挖洞了),第二行相交(多面以最大为主)。请继续往下看

1f
2t

可能只看坐标点不够直观,大家看下图

 其实使用web呈现来看,2个图是一样的,因为多面不管如何定义,转成web的geojson都一样,所以这也不怪web端。但是在数据库中的拓扑关系容不得一点马虎。

名词解释

postgis官方文档

4.1.1.4. 多边形(Polygon)

多边形是二维平面区域,它有一个外部边界(壳)和零个或多个内部边界(孔)分隔,每个边界都是线性环

POLYGON ((0 0 ,4 0 ,4 4 ,0 4 ,0 0 ),--多边形外环(1 1 ,2 1 ,2 2 ,1 2 ,1 1) --多边形内环
)

 通俗来说,这种多边形定义方式就是2个环,前面大,后面小,后面在前面的中间“挖洞”,“洞”里的空间不属于这个多边形。

如图所示,像这种“挖洞”的双环,大环是A边界,小环是B的边界,挖出的洞就是B边界内的空间。

所以说B空间内的区域,和这个多边形“不相交” 

这个多边形的面积就是A边界和B边界内的空间。

4.1.1.7. 多面(MultiPolygon)

多面是非重叠、不相邻多边形的集合。集合中的多边形只能在有限数量的点处接触。

注意,多面的定义有2种,

第1种是“挖洞”,就是上面Polygon多边形定义。

第2种定义是都个面。

他们的区别就是括号的位置。出现2对(())是一个图形。1对()就是“挖洞”多边形。

“挖洞”定义:

MULTIPOLYGON (((0 0 ,4 0 ,4 4 ,0 4 ,0 0 ),--第一个多边形环(1 1 ,2 1 ,2 2 ,1 2 ,1 1)  --第二个多边形环
))

多面定义

MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), --这是第一个多边形((6 5, 9 1, 6 1, 6 5))     --这是第二个多边形
)

 多面定义意义在于,每个(())里面都是一个完整的多边形,这里定义了2个多边形。

如果定义的2个多边形存在包含,那么以做大的为主。

总结

引用chatgpt的回答,我觉得很准确。

所以这也解释了为什么,我的POINT落在2条“数据一样”的多面上,结果却不同。

这篇关于PostGIS 多面(MultiPolygon)挖洞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293701

相关文章

PostgreSQL + PostGIS:空间数据存储及管理解决方案

在数据库领域,PostgreSQL 已成为最强大、最通用的选项之一。它管理大量数据的能力、对 SQL 标准的遵守以及可扩展的架构使其受到学术界和工业界的喜爱。然而,真正让 PostgreSQL 脱颖而出的原因之一是它与PostGIS的集成,这是一个允许您有效处理空间数据的扩展。在本文中,我们将探讨什么是 PostgreSQL、什么是 PostGIS,以及它们如何共同为地理空间数据管理提供强大的解决

postgis

1、增加POSTGIS扩展插件 CREATE EXTENSION postgis; 2、增加一个三维数据表 CREATE TABLE threed_points (     id SERIAL PRIMARY KEY,     name TEXT,     location GEOMETRY(PointZ, 4326)  -- 使用PointZ类型表示三维点,并指定EPSG:4326坐标系 )

使用pgdump、pgrestore迁移数据表到docker部署的postgis

将本地数据同步到内网服务器,使用的postgis,表含空间字段 备份 本地使用pgadmin 4进行备份,pgrestore的命令参数找起来麻烦,这个可以界面操作,比较方便 说明 说明的截图来自pgadmin,点击这个打开 步骤 因为是整表备份,这里其他都没动,只把owner和privilege去掉了 然后点击backup按钮,开始备份 迁移/恢复 目

“探索机器学习的多面世界:从理论到应用与未来展望“

博客主页:誓则盟约系列专栏:机器学习 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍  目录 一、机器学习基础理论         1.机器学习的定义与分类 监督学习  无监督学习 强化学习: 2.数据预处理 数据清洗 特征工程 数据归一化与标准化 3.评估指标  准确率、召回率、F1 值 均方误差

postgis 随记

1.ST_BdPolyFromText  从一组文本数据中 得到一个多边形 2.ST_BdMPolyFromText   给定一组闭合线集合 得到多边形 3. ST_GeogFromText 、 ST_GeographyFromText  、, ST_AsText   把wkt文件转化为特定的地理数据 4.ST_GeogFromWKB      创建一个地理实例从著名的二进制几何表示法(WK

下载OSM数据,使用 osm2pgsql 导入至PostgreSQL(PostGIS),安装GeoServer并绑定数据(一)

前提: 1、已安装 PostgreSQL PostgreSQL 10 安装详细步骤 https://blog.csdn.net/antma/article/details/83579920 2、已安装PostGIS 2.5.0 安装详细步骤 PostGIS 2.5.0 安装详细步骤 https://blog.csdn.net/antma/article/details/83580859

GeoServer + PostGIS 进行图层文件数据导入并发布

一.数据导入 1.新建数据库         打开pgAdmin管理工具,登录后右键Databases新建数据库 2.添加空间数据库扩展         建立完成数据库后,点击该数据库下的Schemas->public->Table,使用SQL语句添加空间数据库管理插件PostGIS:CREATE EXTENSION PostGIS,成功后刷新,数据表中会出现spatial

在PostGIS中一个面要素表中的缝隙(Find gaps among polygons in PostGIS)

场景 在PostGIS中有一张面要素表,需要检查该表中的哪些地方有缝隙。 其中缝隙定义为这些多边形的并集中的环。 There is a surface feature table in PostGIS, and it is necessary to check which areas in the table have gaps. The gaps are defined as the ring

基于PostGIS的mvt动态矢量切片的后台地图服务和前端调用

目录 一、背景 二、矢量切片 三、Mapbox的矢量切片格式 四、PostGIS生成矢量切片 ST_AsMVT: ST_AsMVTGeom: 五、导入试验数据 六、编写PostGIS函数 七:Java后端实现 八、Openlayers前端调用 一、背景 矢量切片技术目前已成为互联网地图的主流技术,无论是Mapbox还是高德地图、百度地图,如今打开F12看到的数据

PostGIS 13.5 主从搭建

PostGIS 主从搭建 适用版本 postgresql 13.5PostGIS 3.1.4 服务器规划 服务器IP用途postgis01172.88.0.181主库postgis02172.88.0.182从库 主库 PostGIS 数据库安装 安装 postgresql [root@postgis01 ~]# yum install -y https://download.pos