在 MongoDB 中存储 GeoJSON 多边形
Posted
技术标签:
【中文标题】在 MongoDB 中存储 GeoJSON 多边形【英文标题】:Store GeoJSON polygons in MongoDB 【发布时间】:2012-06-23 15:02:36 【问题描述】:我对 MongoDB 有以下问题。我从我的祖国获得了一些地理数据,我必须将它们存储到 mongodb 以建立一个简单的 Web 功能服务。该服务主要使用$within
运算符进行边界框查询。数据采用 GeoJSON 格式。因此,我首先导入了以这种格式表示为点 ([1,2]
) 的村庄和城市。没问题。下一步河流和街道是 LineStrings 并根据 GeoJSON 以这种方式表示 [[1,2],[3,4]]
。但是在导入区域(实际上是多边形并且根据 GeoJSON 规范 3 dim arrarrays)时,我在创建索引时收到错误geo values have to be numbers
。
db.collection.ensureIndex("geometry.coordinates" : "2d");
所有数据都是有效的 GeoJSON,并且在 EPSG:4326 投影中采用纯二维坐标。
有人有想法吗?
【问题讨论】:
【参考方案1】:在 MongoDB 2.4 中,对 GeoJSON 点、线串和多边形使用“2dsphere”索引。
例如,您可以创建这个索引:
db.mycoll.ensureIndex( loc : "2dsphere" )
并存储这个 LineString:
loc : type : "LineString" , coordinates : [ [ 1 , 2 ] , [ 3 , 4 ] ]
见http://docs.mongodb.org/manual/applications/2dsphere/。
【讨论】:
2.6 将支持 MultiPoint、MultiLineString、MultiPolygon 和 GeometryCollection docs.mongodb.org/manual/release-notes/2.6【参考方案2】:似乎 mongo 2.3.2 开发版本现在支持 GeoJSON: Release Notes for MongoDB 2.4
【讨论】:
【参考方案3】:我必须自己做同样的事情来设置 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)我使用将每个大坐标数组形状转换为多边形,然后测试这些区域以找出哪些区域包含我的观点。
所以您可以将多边形数据作为数据存储在 MongoDB 中,并使用其他一些预先计算的 2d 索引,例如中心。
【讨论】:
【参考方案4】:在 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" );
【讨论】:
我刚开始在 MongoDB 中使用多边形,但我发现多边形结构的形状很奇怪......如果一个形状是一组点,为什么这些点的数组在另一个数组中?poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ... ]
还不够吗?
@Loupax 多边形的坐标是线性环坐标数组的数组。数组中的第一个元素代表外环。任何后续元素都表示内环(或孔)。(geojson.org/geojson-spec.html#id4)【参考方案5】:
MongoDB 的地理空间功能目前仅支持存储点,不支持存储形状或线条。但是,您可以使用圆形、矩形或多边形来查询点。
【讨论】:
【参考方案6】:根据 MongoDB 文档 here,可以将多边形存储为 GeoJSON 多边形,如下所示:
type: "Polygon",
coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ]
这是一个简单的环,但也可以存储具有多个环的多边形。
【讨论】:
以上是关于在 MongoDB 中存储 GeoJSON 多边形的主要内容,如果未能解决你的问题,请参考以下文章
使用 geojson 和 mongoose 将多边形坐标插入 Mongo DB 时出错
查找给定的经纬度是不是位于 MongoDB 中的任何多边形中