Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MongoDB中存储和查询GeoJson时出现奇怪的问题_Mongodb_Mongodb Query_Geospatial_Geojson - Fatal编程技术网

在MongoDB中存储和查询GeoJson时出现奇怪的问题

在MongoDB中存储和查询GeoJson时出现奇怪的问题,mongodb,mongodb-query,geospatial,geojson,Mongodb,Mongodb Query,Geospatial,Geojson,我想使用MongoDB为一个区域存储GeoJson数据。数据来自一个官方网站。每个区域都表示为多多边形。最后,我想使用$intersect查找包含lng/lat对的所有区域,如下所示: db.areas.find({ "location.geometry": { "$geoIntersects": { "$geometry": { "type": "Point", "coordinates": [

我想使用MongoDB为一个区域存储GeoJson数据。数据来自一个官方网站。每个区域都表示为多多边形。最后,我想使用$intersect查找包含lng/lat对的所有区域,如下所示:

db.areas.find({
  "location.geometry": {
    "$geoIntersects": {
         "$geometry": {
            "type": "Point",
            "coordinates": [ 
                <lng>, 
                <lat>
            ]
         }
     }
  }
}
原则上,它似乎工作得很好。然而,我遇到了一些似乎与多边形的多边形集有关的区域的问题。我可以把我的问题归结为一个个案:

一个多边形区域有六个多边形,例如[a、B、C、D、E、F]。另外,我查询的点位于多边形A内。现在,仅当该区域不包含多边形D和F A时,上面的查询才有效,当然,必须始终包含这些多边形-也就是说,我得到了预期的搜索结果。否则,查询为空,但没有错误。总之

工作原理:[A],[A,B],[A,B,C,[A,B,C,E],[A,C]。。。有A和无D&F的任何组合 什么不起作用:[A,D],[A,B,F]。。。任何包含D或F的组合
多边形D和F有什么问题?是否不允许它们与多多边形中的其他多边形重叠?它们可能太小了吗?我尝试了GeoJson定义,但没有发现任何问题。可能是因为MongoDB的GeoJson支持。

经过进一步挖掘,我发现导致问题的多边形除了第一个和最后一个坐标之外,还包含重复的坐标。在线GeoJson验证程序没有引发错误,但MongoDB似乎没有处理它


删除所有重复项后,一切正常-至少我希望删除重复项会过多地改变多边形的形状,但这对我的情况来说并不太重要。不幸的是,MongoDB没有引发错误,只是返回一个空结果。

您可以在没有任何特殊考虑的情况下,在MongoDB中插入一个变形了GeoJSON结构的多边形或多多边形。这是因为除非您在字段上专门创建一个geo索引,否则MongoDB根本不知道它是GeoJSON。geo引擎将悄悄地不匹配目标intersect几何体,就像将它指向一个简单的标量字段(如{name:buzz})一样。 如果这样添加索引:

db.geo.createIndex({loc:"2dsphere"}) 
然后,这将激活geo aware机械,如果您尝试插入或更新变形的GeoJSON形状,它将生成一个错误滚动,以查看回路非闭合部分:


换句话说,geo索引成为了门口的守卫,确保所有写入的形状都符合GeoJSON。这也是为什么确保在插入和更新之前创建索引非常有用的原因,因为尝试在可能有100或1000个变形形状的许多文档上创建地理索引将导致大量繁琐的工作,试图一次隔离和修复一个坏形状。

你说你……我查询多边形a中的谎言如何?您无法在多多边形中查询多边形A。多多边形的行为类似于简单的标量数组:如果您搜索相交点,则多多边形中匹配的任何多边形都将返回完整记录。@BuzzMoschetti,这可能是我的错误措辞。我不想查询多边形。对于我的测试查询,我选择了一个位于a中的点,因此MultiPolygon始终包含在列表a中以返回任何结果。我的问题是,向多多边形添加一些多边形会突然产生空结果。现在我已经解决了问题:有问题的多边形包含MongoDB不喜欢的重复坐标;见下面的答案。
{
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16755,
        "errmsg" : "Can't extract geo keys: { _id: 0.0, loc: { type: \"MultiPolygon\", coordinates: [ [ [ [ -83.0, 40.0 ], [ -83.0, 41.0 ], [ -82.0, 41.0 ], [ -82.0, 40.0 ], [ -83.0, 40.0 ] ] ], [ [ [ -93.0, 40.0 ], [ -93.0, 41.0 ], [ -92.0, 41.0 ], [ -92.0, 40.0 ], [ -93.0, 40.0 ] ] ], [ [ [ -73.0, 49.0 ], [ -72.0, 41.0 ], [ -72.0, 40.0 ], [ -73.0, 40.0 ], [ -73.0, 41.0 ] ] ] ] } }  Loop is not closed: [ [ -73.0, 49.0 ], [ -72.0, 41.0 ], [ -72.0, 40.0 ], [ -73.0, 40.0 ], [ -73.0, 41.0 ] ]"
    }
}