在 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 时出错

为啥多边形 GeoJSON 对象的坐标存储在数组数组中?

查找给定的经纬度是不是位于 MongoDB 中的任何多边形中

城市 Geojson 多边形数据库/库或 API

如何在 MongoDB 中正确使用 $geoIntersects?

如何在 MongoDB 2.4.x 中存储附加数据以使其符合 geoJSON 格式