sql - SQL 中的空间查询未正确返回区域和点的交集

标签 sql sql-server-2012 spatial wkt

我正在 MS SQL 上进行空间查询,并检查给定点是否在某个区域内。我查询包含该点的区域,但查询返回 0(假):

declare @area geography;
declare @point geography;
set @area = geography::STGeomFromText('POLYGON((87.3924  76.73386,-61.67004 76.73386,-61.67004 27.12494,87.3924 27.12494,87.3924 76.73386))', 4326);
set @point = geography::STGeomFromText('POINT(-2.7933 56.3412)', 4326);
select @area.STIntersects(@point);
select @point.STIntersects(@area);

对于两个 SELECT 语句,返回值为 0,这意味着它们不相交。奇怪的是,当我将区域缩小一点时,查询返回 1

我知道多边形的顺序很重要,如果我在另一个方向指定它,它确实会返回 1。我有的问题:

  • 我如何知道以什么顺序指定它们? (我只有北、东、南、西值,可能跨越赤道)
  • 为什么稍小的区域(相同方向)会返回匹配项?

这些是这些 WKT 的视觉表示: Area Point

编辑:这是三个不同大小的多边形(从最大到最小):

1. POLYGON((-171.173863132129  82.6444755487971,-109.298863132129 82.6444755487971,-109.298863132129 -2.35770630179323,-171.173863132129 -2.35770630179323,-171.173863132129 82.6444755487971))

2. POLYGON((77.2050431178711  76.1254124064562,-71.8574568821289 76.1254124064562,-71.8574568821289 37.7996777961385,77.2050431178711 37.7996777961385,77.2050431178711 76.1254124064562))

3. POLYGON((38.8847306178711  68.43690689125,-35.6465193821289 68.43690689125,-35.6465193821289 48.1758722609095,38.8847306178711 48.1758722609095,38.8847306178711 68.43690689125))

这里奇怪的是,第一个多边形匹配英国的所有点。第二个查询与英国没有任何匹配,第三个查询仅与北部的几个点匹配。

如果您可视化查询,您会发现第二个和第三个包含完整的英国,而第一个则完全关闭 可视化工具:http://thisissammysaccount.github.io/VisualizeWellKnownText/

所以我想,问题实际上是,如何将谷歌地图边界映射到空间查询。 (基本上我想显示获取当前视口(viewport)中的所有位置)

最佳答案

虽然您认为您的点位于多边形内(在平面模型上确实如此),但它不在椭圆体模型上。

随着多边形尺寸的增大,您会遇到多边形缺乏坐标的问题。缺少坐标会导致沿着矩形经度(顶部和底部)的线绕地球曲率“弯曲”,因为它们没有额外的坐标(或 anchor )来保持“直”。随着多边形尺寸的增加,这种弯曲变得更加明显,这就是为什么当它们更小时,您看到的结果更像您所期望的。由于 Google map 使用的投影系统,您不会看到这一点(尽管如果我没记错的话,用 geodesic: true 绘制多边形可能会显示它)。

我在下面附上了一张图片,在墨卡托投影中说明了这一点。该点已经缓冲了200KM,以便您可以清楚地看到它。这是在如此大的缩放级别上使用 4326 的缺点。

您可以执行以下操作:

  1. 使用几何(尽管我通常不建议将其用于地理对象的主要用途)。平面模型将解决这个问题。

  2. 手动向边界框添加更多坐标,保持纬度值相同,但更改顶线和底线的经度。不过,这仍然不会是完美的,但会得到更好的结果。

  3. 考虑是否确实需要在一定程度的缩放后显示点 - 如果有很多,它可能就没那么有用。

Polygon and Point

关于sql - SQL 中的空间查询未正确返回区域和点的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76774855/

相关文章:

mysql - SQL返回最新记录

sql-server - 无法从另一个 SQL Server 连接到 SQL Server 命名实例

sql - 在 CTE 中设置一个变量

r - 模型中空间自相关的考虑

java - 选择数组元素 PostgreSQL

mysql - 如何获取此查询中重复项的大小?

mysql - 获取数据库中每年的记录数

sql - 使用 SUM 和 Group by 计算百分比

r - 将 SpatialPointsDataframe 转换为 R 中的 SpatialPolygons

r - idw为我崩溃了R