我遇到了无法解释的 MSSQL 地理问题。假设我受到数学挑战,但似乎以下点不应与以下多边形相交:
DECLARE @t_point geography;
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);
select
@t_polygon.STAsText(),
@t_point.STAsText(),
@t_point.STIntersects(@t_polygon),
@t_polygon.STIntersects(@t_point);
但是,当我执行此操作时,我得到以下结果:
POLYGON ((1 1, 5 5, 5 0, 1 1)) POINT (0 0) 1 1
最后两列都是 1,我期望 0。空间中 0,0 的点如何与不接触或不包含 0,0 的多边形相交?
-1, -1 与 100, 100 具有相同的行为。
即使我将点更改为完全不同空间中的多边形,MSSQL 也会说它们相交。
set @t_polygon = geography::STPolyFromText('POLYGON((10 10, 50 50, 50 10, 10 10))', 4326);
set @t_point = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);
我也试过 STGeomFromText()。
我确定我一定做错了什么,但我无法想象那可能是什么。
您遇到问题的原因是多边形以错误的方式缠绕,导致多边形覆盖整个世界,但您感兴趣的区域除外。
尝试
这有点奇怪,但考虑到我们正在处理一个球体的地理,需要有一种方法来确定边界的哪一侧是多边形的内部。对于 SQL Server,这是通过将外部边界定义为逆时针方向来完成的。
几何图形不关心它们以哪种方式缠绕,但更喜欢逆时针方向。有一个用于
ReorientObject
改变对象方向的地理功能。