【问题标题】:MongoDB $geoIntersects not finding one fully-contained line in polygon, but finding anotherMongoDB $geoIntersects 没有在多边形中找到一条完全包含的线,但找到了另一条
【发布时间】:2017-06-01 12:16:28
【问题描述】:

我有一个 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 - 即使只有边缘与多边形相交并且没有点位于其中,查询也应该是一个命中

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

{"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]]}]}

【问题讨论】:

  • 嘿 Ivan,我通过指定多边形在 $geoIntersects 上取得了一致的成功,Mongo 文档也回避了使用 LineStrings 的示例。正如您正确观察到的那样,查询应该可以工作,所以奇怪的是它不是。您是否尝试过其他地理运算符,看看您是否可以使用它们达到相同的结果?最后,您是在寻找完全落在边界框内的路线,还是与边界框“接触”或部分相交的路线?

标签: c# mongodb mongodb-query geospatial geojson


【解决方案1】:

有人能解释这种行为吗?

这是因为地球不是平的,而是相当球形(弯曲的)。地球表面无法在没有失真的情况下在平面上表示。所以这意味着每个地图投影都会以某种方式扭曲地球。另见Map Projections

MongoDB 2dsphere index,支持计算类地球球体上的几何形状的查询。

当您在http://geojson.io 上绘制坐标时,它没有考虑地球的球形性质。较短的 LineString 显示在“方形”多边形内。

如果您在https://geodndmap.mongodb.com 上映射 GeoJSON 几何图形,并考虑到存在球面失真这一事实,您将在下面看到:

较短的 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]]}]}

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

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多