当预期为 0 时,MSSQL Geography STIntersects 返回 1

Mik*_*get 6 sql-server spatial

我遇到了一个无法解释的 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);
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此操作时,会得到以下结果:

POLYGON ((1 1, 5 5, 5 0, 1 1))  POINT (0 0) 1   1
Run Code Online (Sandbox Code Playgroud)

最后两列都是 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);
Run Code Online (Sandbox Code Playgroud)

我也试过 STGeomFromText()。

我敢肯定我一定是做错了什么,但我无法想象那可能是什么。

Mic*_*kyT 9

您遇到问题的原因是多边形以错误的方式缠绕,导致多边形覆盖整个世界,除了您感兴趣的区域。

尝试

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 0, 5 5, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);
Run Code Online (Sandbox Code Playgroud)

这有点奇怪,但鉴于我们正在处理一个球体的地理,需要有一种方法来确定边界的哪一边是多边形的内部。对于 SQL Server,这是通过将外部边界定义为逆时针来完成的。

几何图形不关心它们的缠绕方式,但更喜欢逆时针。有一个ReorientObject更改对象方​​向的地理功能。