在MongoDB中存储GeoJSON多边形

时间:2012-06-21 11:26:22

标签: mongodb indexing geo geojson

我对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投影。

有人有想法吗?

6 个答案:

答案 0 :(得分:13)

使用MongoDB 2.4,使用GeoJSON Points,LineStrings和Polygons的“2dsphere”索引。

例如,您可以创建此索引:

db.mycoll.ensureIndex( { loc : "2dsphere" } )

并存储此LineString:

{ loc : { type : "LineString" , coordinates : [ [ 1 , 2 ] , [ 3 , 4 ] ] } }

请参阅http://docs.mongodb.org/manual/applications/2dsphere/

答案 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  ] ] ]
}

这是一个带有简单环的简单多边形,但也可以存储具有多个环的多边形。