我对MongoDB有以下问题。我从我的祖国获得了一些地理数据,我必须将它们存储到mongodb中以建立一个简单的Web要素服务。此服务主要使用$within
运算符进行边界框查询。数据采用GeoJSON格式。因此,我首先导入了以这种格式表示为点([1,2]
)的村庄和城市。没问题。下一步是LineStrings和根据GeoJSON的河流和街道以这种方式表示[[1,2],[3,4]]
。但是当导入区域(实际上是多边形并且根据GeoJSON规范3 dim arrrays)时,我在创建索引时收到错误geo values have to be numbers
。
db.collection.ensureIndex({"geometry.coordinates" : "2d"});
所有数据都是有效的GeoJSON,并且在EPSG中的普通二维坐标:4326投影。
有人有想法吗?
答案 0 :(得分:13)
使用MongoDB 2.4,使用GeoJSON Points,LineStrings和Polygons的“2dsphere”索引。
例如,您可以创建此索引:
db.mycoll.ensureIndex( { loc : "2dsphere" } )
并存储此LineString:
{ loc : { type : "LineString" , coordinates : [ [ 1 , 2 ] , [ 3 , 4 ] ] } }
答案 1 :(得分:3)
似乎mongo 2.3.2开发版现在支持GeoJSON: Release Notes for MongoDB 2.4
答案 2 :(得分:2)
我必须自己做同样的事情来设置GeoFence功能。我所做的是将“多边形”数据存储为一系列坐标和一个中心。例如:
{
"_id" : ObjectId( "4f189d132ae5e92272000000" ),
"name" : "Alaska",
"points" : [
{ "coords" : [
-141.0205,
70.0187 ]
},
...
{ "coords" : [
-141.0205,
70.0187 ]
}
],
"center" : {
"coords" : [
-153.6370465116279,
61.42329302325581 ]
}
}
在我的应用程序中(在python中)我正在使用shapely library。我首先要做的是找到一个中心最接近我的点的对象列表。然后在客户端(python)我使用shapely将每个大坐标数组转换为多边形,然后测试区域以找出哪些包含我的点。
因此你可以将MongoDB中的多边形数据存储为数据,并使用其他一些预先计算的2d索引(如中心)。
答案 3 :(得分:2)
尝试一下mongo shell:
// Polygon in GeoJson format
var poly = {};
poly.name = 'GeoJson polygon';
poly.geo = {};
poly.geo.type = 'Polygon';
poly.geo.coordinates = [
[ [ -80.0, 30.0 ], [ -40.0, 30.0 ], [ -40.0, 60.0 ], [-80.0, 60.0 ], [ -80.0, 30.0 ] ]
];
db.foo.insert(poly);
db.foo.ensureIndex({geo: "2dsphere" });
答案 4 :(得分:1)
MongoDB的地理空间功能目前仅支持存储点,而不支持形状或线条。但是,您可以使用圆形,矩形或多边形查询点。
答案 5 :(得分:0)
基于MongoDB文档here,可以将多边形存储为GeoJSON多边形,例如:
{
type: "Polygon",
coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ]
}
这是一个带有简单环的简单多边形,但也可以存储具有多个环的多边形。