1

我正在对 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 的视觉表示: 区域 观点

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

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/

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

4

1 回答 1

1

虽然您认为您的点在您的多边形内(并且在平面模型上),但它不在椭圆体模型上。

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

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

您可以执行以下操作:

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

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

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

多边形和点

于 2014-03-08T14:22:10.373 回答