MongoDB $ geoIntersects没有在多边形中找到一条完全包含的行,而是找到另一条

时间:2017-01-17 12:23:12

标签: c# mongodb mongodb-query geospatial geojson

我有一个MongoDB数据库,其中有一个名为/* |-------------------------------------------------------------------------- | Index File |-------------------------------------------------------------------------- | | Typically this will be your index.php file, unless you've renamed it to | something else. If you are using mod_rewrite to remove the page set this | variable so that it is blank. | */ $config['index_page'] = 'index.php'; 的集合。该集合中包含文档,其中包含边界多边形的地理空间数据。我在我的应用程序中使用C#MongoDB驱动程序。我注意到它没有查找具有某些空间查询的文档,尽管它适用于大多数文档。我删除了除了一个违规文档之外的集合,我试图通过直接执行查询来找到它。

我的文档如下:

fooCollection

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

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

如果你绘制这三个几何图形,我真的不明白为什么一个会工作而不是另一个。

  • 两条线完全位于多边形
  • 工作线更长
  • 工作线的轴承介于0°和90°之间,另一个介于90°和180°之间。

是否有人能够解释此行为?

编辑:我还单独测试了这些点,而不是使用LineStrings。唯一受欢迎的是db.getCollection('fooCollection').find( { "polygon": { $geoIntersects: { $geometry: { type: "LineString", coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]] }}}}) 。我确实需要LineStrings - 即使只有边与多边形相交并且没有任何点位于

内,查询也应该是一个命中

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

[24.7698287, -28.7353533]

1 个答案:

答案 0 :(得分:4)

  

有人能够解释这种行为吗?

这是因为地球不平坦,而是非常球形(弯曲)。地球表面不能在没有失真的平面上表示。所以这意味着每个地图投影都会以某种方式扭曲地球。另请参阅Map Projections

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

当你在http://geojson.io上映射坐标时,它并没有考虑到地球的球形特性。较短的LineString显示在" square"多边形。

geojson.io

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

geodndmap.mongodb.com

较短的LineString实际上在" square"之外。多边形。这就是执行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拖放到地图上,作为文件或编辑程序中的文本。