【问题标题】:mongodb geospatial queries polygon inside polygonmongodb地理空间查询多边形内的多边形
【发布时间】:2016-06-11 06:49:52
【问题描述】:

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

由于多边形数量众多,Web 应用程序的性能确实很慢。为了提高性能,我想将查询限制在当前地图窗口的范围内。我们正在使用 Mapbox API,我能够从 API 获取地图边界以用于 mongodb 地理查询。

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

这是存储在数据库中的 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 ]
              ]]
          }
       }
     }
   }
)

我知道在定义的边界内有数据,但注意到返回。我尝试过使用目标列。我尝试将“geometry.coordinates”切换为坐标,我尝试使用引号和不使用引号。我还弄乱了多边形 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 的地理过滤功能来缩小查询结果的范围。

【问题讨论】:

  • 是的,这就是它所说的。您的 GeoJSON 无效,至少对于 MongoDB 而言。问题是你有x/y/z 值,而你只能有x/y 值。所以删除z0 值,你无论如何都不会使用。
  • 仅供参考,即使更正了问题中作为示例显示的多边形 位于查询中的多边形范围内。因此,未来提出问题的另一个技巧是确保您提供的样本与您可以进行的任何此类查询相匹配。即使删除了所有 z-index,此文档也不匹配。
  • 嗨,Blakes,感谢您抽出宝贵时间提供帮助。不需要 Z 坐标。它们可能无法与“2D Sphere”一起正常工作,这是有道理的。我重新创建了删除 z 坐标的 geoJSON 文件。然后作为单独的集合导入 mongo。尝试添加 2d 索引时出现同样的错误: > db.docs4.ensureIndex( { "geometry" : "2dsphere" } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "ok" : 0, "errmsg" : "无法从对象中提取地理键,几何形状错误?
  • 我也知道样本记录不在测试 AOI 中。这只是数据库的一个随机样本。我知道虽然该 AOI 中有多边形。在以后的问题中,我将选择更相关的示例记录。
  • 再看一下多边形定义。我看到的两件事是 1. 要删除的 z-index 条目。 2. 坐标上的额外大括号,目前是三个而不是两个。修复这些东西,你就会得到一个 2dshpere 索引,或者甚至只是没有索引的 $geoWithin,尽管索引确实有助于加快搜索速度。

标签: mongodb maps geospatial mapbox geojson


【解决方案1】:

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

这次我重新创建了 geoJSON,去掉了 Z 值。否则,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 ]
              ]]
          }
       }
     }
   }
)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 2012-06-19
      • 2020-08-09
      • 2014-09-17
      • 2015-02-25
      • 2020-09-17
      • 2017-02-18
      • 2015-09-06
      • 2016-12-08
      相关资源
      最近更新 更多