我在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的地理过滤功能来缩小查询结果。
答案 0 :(得分:0)
这次我重新删除了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 。