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

mongodb地理空间查询多边形内的多边形,mongodb,maps,geospatial,mapbox,geojson,Mongodb,Maps,Geospatial,Mapbox,Geojson,我在mongoDB数据库(v2.6.10)中收集了geoJSON数据 ).数据由数千个多边形组成,其中大部分为正方形,代表500×500米的土地所有权。此数据正在地图上显示数据的web应用程序上使用 由于多边形数量巨大,web应用程序的性能非常慢。为了提高性能,我想将查询限制在当前映射窗口的范围内。我们正在使用Mapbox API,我能够从API中获取地图边界,以便在mongodb地理查询中使用 到目前为止,我无法让mongo的查询进行合作 以下是存储在数据库中的geoJSON数据的示例记录:

我在mongoDB数据库(v2.6.10)中收集了geoJSON数据 ).数据由数千个多边形组成,其中大部分为正方形,代表500×500米的土地所有权。此数据正在地图上显示数据的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坐标。当第一点不重复时,我得到一个错误

我还尝试将$geoinsin转换为$near、$box和$geocursects。结果相似

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

db.docs.ensureIndex( { "geometry" : "2dsphere" } );
db.docs.ensureIndex( { "coordinates" : "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的新手,所以这个反馈对我来说意义不大。我对地理信息系统和地图并不陌生,但我无法理解这一点。请帮忙。总而言之,我正试图通过使用mongo的地理过滤功能来缩小查询结果的范围。

好的,我现在可以使用了。Z坐标似乎是问题所在。谢谢Blakes Seven抓住了这个机会。我花了好几个小时沮丧地试图弄明白为什么这些查询不起作用

这次我重新创建了geoJSON,去掉了Z值。否则,geoJSON文件是相同的。然后,我将X,Y-only文件作为另一个集合导入mongo

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

db.docs.ensureIndex( { "geometry" : "2dsphere" } );
db.docs.ensureIndex( { "coordinates" : "2dsphere" } );
从联机示例来看,索引似乎应该位于geometry列上,但查询可以使用此设置

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

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 ]
              ]]
          }
       }
     }
   }
)

好的,我现在开始工作了。Z坐标似乎是问题所在。谢谢Blakes Seven抓住了这个机会。我花了好几个小时沮丧地试图弄明白为什么这些查询不起作用

这次我重新创建了geoJSON,去掉了Z值。否则,geoJSON文件是相同的。然后,我将X,Y-only文件作为另一个集合导入mongo

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

db.docs.ensureIndex( { "geometry" : "2dsphere" } );
db.docs.ensureIndex( { "coordinates" : "2dsphere" } );
从联机示例来看,索引似乎应该位于geometry列上,但查询可以使用此设置

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

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 ]
              ]]
          }
       }
     }
   }
)

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

您可以通过将geojson文件上载到以下站点来测试是否存在任何交叉:


如果有报告,您可以使用simplify功能在站点上修复它们。修复几个文件是可以的,但如果需要修复很多文件,则需要在GDAL工具集中使用ogr2ogr

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

您可以通过将geojson文件上载到以下站点来测试是否存在任何交叉:


如果有报告,您可以使用simplify功能在站点上修复它们。修复几个文件是可以的,但如果需要修复很多文件,则需要在GDAL工具集中使用ogr2ogr

是的,这就是它的意思。您的GeoJSON无效,至少对于MongoDB是如此。问题是您有
x/y/z
值,并且只能有
x/y
值。因此,删除您无论如何都不会使用的
z
0
值。仅供参考,即使更正了问题中所示的多边形,该多边形也不在查询中的多边形范围内。因此,今后提问的另一个技巧是确保您提供的样本与您所能提出的任何此类查询都是匹配的。即使删除了所有z索引,此文档也不匹配。嗨,Blakes,感谢您抽出时间提供帮助。不需要Z坐标。它们可能无法与“2D球体”一起正常工作,这是有道理的。我已经删除了z坐标,重新创建了geoJSON文件。然后作为单独的集合导入mongo。我在尝试添加2d索引时遇到了相同的错误:>db.docs4.ensureIndex({“geometry”:“2dsphere”});{“createdCollectionAutomatically”:false,“numIndexesBefore”:1,“ok”:0,“errmsg”:"无法从对象提取地理键,几何体格式不正确?另外,我知道样本记录不在测试AOI中。它只是数据库的随机样本。但我知道存在位于该AOI中的多边形。在以后的问题中,我将选择一个更相关的样本记录。再看一看多边形定义。两个我看到错误的地方是1.要删除z索引项。2.坐标上有额外的大括号,目前是三个,而不是两个。修复这些问题后,您可以创建一个2dsphere索引,甚至只需使用