mongodb地理空间查询多边形内的多边形

时间:2016-02-28 05:30:32

标签: mongodb maps geospatial mapbox geojson

我在mongoDB数据库中有一组geoJSON数据(v2.6.10 )。该数据由数千个多边形组成,大多数是代表500mx500m土地索赔的正方形。此数据用于在地图上显示数据的Web应用程序。

由于存在大量多边形,因此网络应用程序性能非常低。为了提高性能,我想将查询限制为当前地图窗口的边界。我们正在使用Mapbox API,我可以从API获取地图边界,以便在mongodb地理查询中使用。

到目前为止,我一直无法让mongo查询合作。

以下是存储在DB中的geoJSON数据的示例记录:

{
  "_id" : ObjectId("56ca94e0336aac299182442f"),
  "type" : "Feature",
  "properties" : {
    "TNRTPCD" : "P",
   ## some fields ommitted for privacy reasons ##
    "TRMNTNDT" : null,
    "RNHCTRS" : 20.3496,
    "TTLTPCD" : "PCX"
  },
  "geometry" : {
    "type" : "Polygon",
    "coordinates" : [
      [
        [
          [
            -121.88883540217063,
            50.97489195799901,
            0
          ],
          [
            -121.88883523174192,
            50.97072525131302,
            0
          ],
          [
            -121.8950854466247,
            50.97072527980969,
            0
          ],
          [
            -121.89508560169767,
            50.97489198254216,
            0
          ],
          [
            -121.88883540217063,
            50.97489195799901,
            0
          ]
        ]
      ]
    ]
  }
}

我尝试了以下查询,但没有返回任何记录,也没有错误:

db.docs.find(
   {
     'geometry.coordinates': {
       $geoWithin: {
          $geometry: {
             type : "Polygon" ,
             coordinates: [[
             [ -121.26571655273438, 49.56352444783811 ], 
             [ -121.26571655273438, 52.719152198289635 ], 
             [ -120.97492218017578, 52.719152198289635 ], 
             [ -120.9749221801757, 49.56352444783811 ],
             [ -121.26571655273438, 49.56352444783811 ]
              ]]
          }
       }
     }
   }
)

我知道在定义的边界内有数据,但注意到了回报。我试过玩目标列。我尝试过切换几何问题'只是坐标,我试着用引号而没有。我也弄乱了多边形AOI坐标。当第一个点没有重复时,我得到一个错误。

我也尝试将$ geoWithin换成$ near,$ box和$ geoIntersects。有类似的结果。

我猜这个问题与地理索引有关,但这只是一种预感。我尝试使用以下命令在几何列上放置一个2dsphere索引:

db.docs.ensureIndex( { "geometry" : "2dsphere" } );

失败并发出以下错误:

"createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "ok" : 0,
    "errmsg" : "Can't extract geo keys from object, malformed geometry?:

当我尝试仅在坐标上放置索引时,它似乎有效。我用了这个命令:

db.docs.ensureIndex( { "coordinates" : "2dsphere" } );

得到以下输出:

    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

老实说,我是mongodb的新手,所以这个反馈对我来说意义不大。我不是GIS和地图的新手,但我无法解决这个问题。请帮忙。总而言之,我尝试使用mongo的地理过滤功能来缩小查询结果。

2 个答案:

答案 0 :(得分:0)

好的,我现在就开始工作了。 Z坐标似乎是问题所在。感谢Blakes Seven抓住了这一点。我花了很多时间来试图弄清楚为什么查询不起作用。

这次我重新删除了Zo值的geoJSON。否则geoJSON文件是相同的。然后我将仅X,Y文件作为不同的集合导入mongo。

我仍然无法在几何列上创建2dsphere索引,但我可以使用以下命令直接在坐标上创建一个索引:

db.docs.ensureIndex( { "coordinates" : "2dsphere" } );

从在线示例看起来索引应该在几何列上,但查询可以使用此设置。

我现在使用此查询返回预期结果:

db.docs4.find(
   {
     "geometry": {
       $geoWithin: {
          $geometry: {
             type : "Polygon" ,
             coordinates: [[
             [-121.57814025878906, 49.651181832527826 ], 
             [ -121.57814025878906, 49.80652967700498 ], 
             [ 121.28734588623047, 49.80652967700498 ], 
             [ -121.28734588623047, 49.651181832527826],
             [ -121.57814025878906, 49.651181832527826 ]
              ]]
          }
       }
     }
   }
)

答案 1 :(得分:0)

此错误的原因是由交叉多边形引起的。 这将阻止您构建2D球体索引。

您可以通过将geojson文件上传到以下网站来测试是否有任何相交: mapshaper

如果有任何报告,您可以使用简化功能在网站上修复它们。这可以修复几个文件但如果你需要修复很多,那么你需要在 GDAL 工具集中使用 ogr2ogr