为什么 Sql 服务器 returns 1 对于 STIntersects 应该 return 0?

Why Sql server returns 1 for STIntersects where it should return 0?

我有一堆多面体记录。长话短说,我有一个点只属于一个多边形。当您使用 QGis 或类似的正确软件将其可视化时。但是 sql 服务器 returns STIntersects = 1 不仅用于此 post 中的多边形,而且还用于大约 65% 的多边形。从 26 条记录中,有 17 条表示 STIntersects = 1 而实际上应该为 1 的一条表示 0.

这是要点:

DECLARE @point geography;
set @point = (select geography::STPointFromText('POINT(7.6027101675492395 46.549656011507068)', 4326)

这是多面体,不应包含 个渗透点,但它是:

DECLARE @m geography;

set @m = https://pastebin.pl/view/70e8a7d6 (file is to big)

print @m.STIntersects(@point) --says 1 (it should say 0)

我不知道该怎么办。我使用 GeoJSON.Net.Contrib.MsSqlSpatial 将地理 json 数据转换为 sql 地理。

我不太熟悉这些东西,我的意思是 Sql 服务器地理知识或它背后的数学知识。

我所能做的就是猜测,我最好的猜测是多面体以某种方式搞砸了(我不知道如何证明这一点)或 sql 服务器问题或类似问题。

这是 sql 服务器版本:

Microsoft SQL Azure (RTM) - 12.0.2000.8 
    Feb 23 2022 11:32:53 
    Copyright (C) 2021 Microsoft Corporation

有什么想法吗?

更新 从我在微软网站上看到的:https://docs.microsoft.com/en-us/sql/relational-databases/spatial/multipolygon?view=sql-server-ver15

多边形是这样的:

MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 3, 1 1)))

是否有任何 c# 库可以将 geojson 转换为正确的 multipolygion?

每个多边形都用括号括起来,其中我的 MULTIPOLYGON 是一个多边形。

使用Sql服务器时需要注意两点。

  1. 地理和几何类型之间的差异。您正在使用适用于 Earth sphere 的 geography。顶点之间的边是球面测地线。 QGIS 主要适用于具有平面边缘的平面地图,对应于 Sql 服务器的 几何 类型。

  2. 在处理地理时,需要注意多边形方向

我找不到任何微软的文档,但这里有一个合理的解释: https://alastaira.wordpress.com/2012/01/27/ring-orientation-bigger-than-a-hemisphere-polygons-and-the-reorientobject-method-in-sql-server-2012/

BigQuery也有类似的定向规则和规则说明:https://cloud.google.com/bigquery/docs/geospatial-data#polygon_orientation

你可以