SQL Server判定两地理多边形相交但可视化无交集,求原因
SQL Server地理多边形判定相交但渲染无交集的原因及解决方法
核心原因:SQL Server的
geography类型对多边形顶点顺序有严格规则
当使用geography::Parse创建多边形时,如果顶点按顺时针顺序排列,SQL Server会将其解析为「整个地球表面减去该小多边形区域」的巨型多边形,而非你预期的小范围区域。这种情况下,巨型区域自然会和任何小范围地理对象(比如你的3000米缓冲圆)产生相交关系,但渲染时只会显示你定义的小多边形,从而出现视觉上无交集的矛盾。验证问题:
执行以下代码可确认多边形的实际范围:declare @polygon2 geography = geography::Parse('POLYGON ((-0.582275 51.770529, 0.601501 51.739921, 0.4422 51.264558, -0.741577 51.266276, -0.582275 51.770529))'); select @polygon2.STArea() -- 结果接近地球表面积(约5.1亿平方公里),而非小区域面积解决方法:
有两种方式修正该问题:- 反转多边形顶点顺序(改为逆时针):
declare @polygon2 geography = geography::Parse('POLYGON ((-0.582275 51.770529, -0.741577 51.266276, 0.4422 51.264558, 0.601501 51.739921, -0.582275 51.770529))'); - 使用
MakeValid()方法自动修正多边形环方向:declare @polygon2 geography = geography::Parse('POLYGON ((-0.582275 51.770529, 0.601501 51.739921, 0.4422 51.264558, -0.741577 51.266276, -0.582275 51.770529))').MakeValid();
修正后再执行
STIntersection,会返回空值,符合你预期的“无交集”结果。- 反转多边形顶点顺序(改为逆时针):
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

