PostGIS中ST_Intersection处理多点与多边形交集结果不符
PostGIS中ST_Intersection处理重复多点的结果解释
核心原因:OGC几何规范与GEOS的去重逻辑
PostGIS依赖的GEOS库遵循OGC简单要素规范,其中MultiPoint类型被定义为空间位置的集合,而非数学中的多重集合——完全重合的点会被视为同一个空间实体,在几何运算中会自动去重。
你的查询中,输入的MULTIPOINT(1 1, 1 1)在GEOS内部会先被简化为单个POINT(1 1),再执行相交操作,因此最终返回POINT(1 1),而非保留重复点的MultiPoint。所有基于GEOS的GIS库(如QGIS、GeoTools)都会遵循这一逻辑。
数学集合与空间几何的差异
你提到的多重集合交集({1,1} ∩ {1,2,3,4} = {1,1})是数学上的多重集合运算,但GIS中的几何对象模型对应的是普通集合(元素具有唯一性),空间位置完全相同的点不被视为不同元素,因此相交结果只会保留唯一的空间位置。
如何保留重复点?
如果业务逻辑需要保留重复的点(比如每个点代表独立的实体),可以通过以下方式实现:
- 拆分多点为单个点:用
ST_Dump将MultiPoint拆分为单个Point记录 - 逐个判断点是否在多边形内:用
ST_Within或ST_Intersects筛选落在多边形内的点 - 重新聚合为MultiPoint(保留重复):用
ST_Collect聚合筛选后的点,即使位置重复也会保留
示例SQL:
SELECT ST_AsText(ST_Collect(d.geom)) FROM ST_Dump(ST_GeomFromText('MULTIPOINT(1 1, 1 1)')) AS d WHERE ST_Within(d.geom, ST_GeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))'));
该查询会返回MULTIPOINT(1 1, 1 1),符合你的预期。
内容的提问来源于stack exchange,提问作者Elec
相关产品推荐
相关产品推荐

