【问题标题】:Store GeoJSON polygons in MongoDB在 MongoDB 中存储 GeoJSON 多边形
【发布时间】: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 投影中采用纯二维坐标。

有人有想法吗?

【问题讨论】:

    标签: mongodb indexing geo geojson


    【解决方案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】:

    似乎 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  ] ] ]
          }
          

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

          【讨论】:

            猜你喜欢
            • 2015-08-22
            • 1970-01-01
            • 2022-12-22
            • 1970-01-01
            • 2023-03-28
            • 2017-03-15
            • 1970-01-01
            • 1970-01-01
            • 2013-08-24
            相关资源
            最近更新 更多