使用GeoSpark的ST_Intersects关联点与面为何返回重复行?
为什么GeoSpark ST_Intersects查询会出现重复行?
这种重复行的问题我之前处理过好几次,大概率是你的源数据存在重复记录导致的,咱们一步步拆解原因和解决办法:
可能的原因
- zoneShapes表存在重复的多边形:同一个
COUNTYNS对应的几何图形被存储了多次,当你的GPS点和这个多边形匹配时,每一条重复的多边形记录都会生成一条关联结果,最终导致行重复。 - gpsPingTable表本身有重复的GPS点:同一个ID、时间戳、坐标的GPS记录被多次存储,和多边形关联后自然会输出重复行。
- (小概率)点刚好落在两个完全相同的多边形边界上,但从你的输出看重复行的
zone完全一致,这个可能性很低。
排查步骤
1. 检查zoneShapes的重复多边形
先执行这条SQL,看看是否存在重复的区县多边形:
SELECT COUNTYNS, geometry, COUNT(*) AS duplicate_count FROM zoneShapes GROUP BY COUNTYNS, geometry HAVING duplicate_count > 1
如果返回结果,说明确实有重复的多边形记录。
2. 检查gpsPingTable的重复GPS点
再执行这条SQL排查GPS点的重复:
SELECT ID, date, timestamp, point, COUNT(*) AS duplicate_count FROM gpsPingTable GROUP BY ID, date, timestamp, point HAVING duplicate_count > 1
如果有结果,说明源GPS数据存在重复。
解决办法
方法1:在查询中直接去重
最简单的方式是在SELECT语句后加上DISTINCT关键字,过滤掉完全重复的结果行:
SELECT DISTINCT p.ID, z.COUNTYNS as zone, p.date, timestamp, p.point FROM gpsPingTable as p, zoneShapes as z WHERE ST_Intersects(p.point, z.geometry)
方法2:先清理重复的源数据再关联
如果是zoneShapes存在重复,建议先对区县表去重后再做关联,这样能提升查询效率:
WITH distinct_zones AS ( SELECT DISTINCT COUNTYNS, geometry FROM zoneShapes ) SELECT p.ID, z.COUNTYNS as zone, p.date, timestamp, p.point FROM gpsPingTable as p JOIN distinct_zones as z ON ST_Intersects(p.point, z.geometry)
如果是gpsPingTable存在重复,建议先清理源数据中的重复记录(比如用DROP DUPLICATES),避免后续查询都出现重复问题。
内容的提问来源于stack exchange,提问作者emax
相关产品推荐
相关产品推荐

