Azure SQL空间数据查询:多边形内点未被检出问题排查
问题原因与解决方案
这不是Azure SQL的多边形尺寸限制,而是SQL Server geography 类型的球面空间规则导致的问题:
核心原理
geography 类型(针对WGS84/SRID 4326坐标系)遵循右手定则判断多边形的"内部"区域:
- 当多边形环以逆时针定义时,若覆盖范围超过地球表面积的一半,实际代表的是地球表面除该多边形外的所有区域(相当于"反选"了你的预期范围)。
- 只有当逆时针定义的多边形范围较小(小于半球)时,才会被解析为你预期的内部区域。
你的案例分析
- 第一个查询中的多边形:
POLYGON((-170 35, -170 30, -30 30, -30 35, -170 35))- 逆时针定义,且覆盖了从经度-170到-30的大范围(跨140个经度),超过了半球范围。此时该多边形实际代表的是地球表面除这个矩形外的区域,而你的点(经度-96.4489,纬度32.7466)在矩形内部,因此
STIntersects返回false。
- 逆时针定义,且覆盖了从经度-170到-30的大范围(跨140个经度),超过了半球范围。此时该多边形实际代表的是地球表面除这个矩形外的区域,而你的点(经度-96.4489,纬度32.7466)在矩形内部,因此
- 第二个查询中的小矩形:
POLYGON((-100 35, -100 30, -90 30, -90 35, -100 35))- 逆时针定义但范围很小(仅10个经度),小于半球,因此被解析为矩形内部区域,点在其中,返回
true。
- 逆时针定义但范围很小(仅10个经度),小于半球,因此被解析为矩形内部区域,点在其中,返回
解决方法
有两种方式修正这个问题:
- 调整多边形环的方向为顺时针
对于大范围多边形,顺时针定义的环会被geography类型识别为预期的内部区域:declare @shape geography set @shape = geography::STPolyFromText('POLYGON((-170 35, -30 35, -30 30, -170 30, -170 35))', 4326) select * from Person where GeoLocation.STIntersects(@shape) = 1 - 使用
MakeValid()方法自动修正环方向
该方法会自动调整多边形的环方向,确保其代表的是你预期的内部区域:declare @shape geography set @shape = geography::STPolyFromText('POLYGON((-170 35, -170 30, -30 30, -30 35, -170 35))', 4326).MakeValid() select * from Person where GeoLocation.STIntersects(@shape) = 1
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

