SQL Server中如何查询位于任意多边形内的Locations记录Index
问题分析与解决方案
原代码的核心问题
- 变量
@borderpolygons仅会获取Districts表中最后一条记录的多边形数据,无法匹配其他区域内的点。 STContains返回bit类型值(0/1),判断逻辑应直接使用= 1,语义更清晰且符合SQL Server的类型规范。
正确SQL写法
场景1:Districts表存在多条多边形记录(通用方案)
通过EXISTS关联两张表,检查每个点是否落在任意一个多边形内:
SELECT l.Index FROM Locations l WHERE l.X IS NOT NULL AND l.Y IS NOT NULL AND EXISTS ( SELECT 1 FROM Districts d WHERE d.borders.STContains(geometry::Point(l.X, l.Y, 2056)) = 1 )
场景2:Districts表只有单条多边形,或需合并所有多边形优化查询
先将所有多边形合并为一个几何集合,再进行点包含判断:
-- 合并所有多边形为单个几何对象 DECLARE @allBorders geometry; SELECT @allBorders = geometry::UnionAggregate(borders) FROM Districts; SELECT l.Index FROM Locations l WHERE l.X IS NOT NULL AND l.Y IS NOT NULL AND @allBorders.STContains(geometry::Point(l.X, l.Y, 2056)) = 1
额外注意事项
- 确认
Locations表的X、Y坐标确实属于2056坐标系,坐标系不匹配会导致包含判断完全失效。 - 若
Districts的borders字段是MultiPolygon类型,STContains方法同样适用,无需额外修改。 - 数据量较大时,建议给
Districts.borders字段创建空间索引,大幅提升查询效率。
内容的提问来源于stack exchange,提问作者stonebe
相关产品推荐
相关产品推荐

