You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中如何查询位于任意多边形内的Locations记录Index

问题分析与解决方案

原代码的核心问题

  1. 变量@borderpolygons仅会获取Districts表中最后一条记录的多边形数据,无法匹配其他区域内的点。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:12:47