PostGIS MultiPolygon挖洞

编程入门 行业动态 更新时间:2024-10-11 11:17:10

<a href=https://www.elefans.com/category/jswz/34/1770811.html style=PostGIS MultiPolygon挖洞"/>

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挖洞

本文发布于:2023-12-06 22:07:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1669103.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:PostGIS   MultiPolygon

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!