MongoDB $geoIntersects无法在多边形中找到完全包含的一条线,但可以找到另一条。

9
我有一个MongoDB数据库,其中有一个名为fooCollection的集合。该集合中包含具有边界多边形形式的地理空间数据的文档。我在我的应用程序中使用C# MongoDB驱动程序。我注意到它不能找到某些空间查询的文档,尽管它可以处理大多数查询。我清空了集合,除了一个有问题的文档,我尝试通过直接执行查询来找到它。

我的文档看起来像这样:

{
"_id" : UUID("12345678-62d9-4024-86dc-123456789012"),
"polygon" : {
    "type" : "Polygon",
    "coordinates" : [ [ 
            [ 18.414846, -33.9699577 ], 
            [ 18.414846, -26.0991189 ], 
            [ 31.0330578, -26.0991189 ], 
            [ 31.0330578, -33.9699577 ], 
            [ 18.414846, -33.9699577 ]
    ] ]
},
"foo": "bar"
}

我在那个集合上也有这个索引:

[
    1,
    {
       "polygon" : "2dsphere"
    },
    "polygon_2dsphere",
    "data.fooCollection",
    3
]

以下查询正确返回此文档:
db.getCollection('fooCollection').find( { 
    "polygon": { 
        $geoIntersects: { 
            $geometry: { 
                type: "LineString", 
                coordinates: [[24.7698287, -28.7353533],[28.0423, -26.19793]]
}}}})

然而,此查询不包括:
db.getCollection('fooCollection').find( { 
    "polygon": { 
        $geoIntersects: { 
            $geometry: { 
                type: "LineString", 
                coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]]
}}}})

如果您绘制这三个几何图形,我无法看出为什么一个会起作用而另一个不会。

  • 两条线都完全位于多边形内
  • 有效线路要长得多
  • 有效线路的方位角在0°到90°之间,而另一条在90°到180°之间。

有人能解释这种行为吗?

编辑:我也测试了单独使用点而不是使用LineStrings。唯一的一个命中是[24.7698287,-28.7353533]。我确实需要LineStrings - 即使只有边缘与多边形相交,没有点位于其中,查询也应该命中

您可以在http://geojson.io/中粘贴以下行来查看geojson here或自己绘制三个几何图形:

{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},{"type":"LineString","coordinates":[[27.7706902,-26.1091189],[28.0423,-26.19793]]},{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[28.0423,-26.19793]]}]}

嗨伊万,我通过指定多边形在$geoIntersects中取得了一致的成功,Mongo文档也避免使用LineStrings的示例。正如你正确观察到的那样,查询应该可以工作,所以很奇怪它没有。你尝试过其他地理运算符吗?看看是否可以用它们来实现相同的结果?最后,你是找到完全落在边界框内的路线,还是那些与边界框部分“接触”或相交的路线? - nevi_me
1个回答

7

有人能解释这种行为吗?

这是因为地球不是平的,而是相当球形(曲线)。地球表面不能在没有扭曲的情况下表示在一个平面上。这意味着每个地图投影都会以某种方式扭曲地球。请参见地图投影

MongoDB 2dsphere索引支持在类似地球的球体上计算几何形状的查询。

当您在http://geojson.io上映射坐标时,它不考虑地球的球形特性。较短的LineString被显示为在“正方形”多边形内。

geojson.io

如果您在https://geodndmap.mongodb.com上映射考虑到球面扭曲的GeoJSON几何图形,您将看到以下内容:

geodndmap.mongodb.com

较短的LineString实际上在“正方形”多边形外面。这就是MongoDB 2dsphere索引/查询的执行方式。
扭曲效应的影响随着更长/更大的区域投影而增加。
例子:
{"type":"GeometryCollection","geometries":[
{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},
{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[88.0423,-26.19793]]}]}

geojson.io

geodndmap.mongodb.com

PS:要使用geodndmap.mongodb.com,请将GeoJSON拖放到地图上,可以作为文件或从编辑程序中作为文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接