在MongoDB中存储GeoJSON多边形

10

我在MongoDB中遇到了以下问题,我从我的家乡获取了一些地理数据,需要将它们存储到MongoDB中以建立一个简单的Web Feature Service。这个服务将主要使用$within操作符进行边界框查询。数据以GeoJSON格式表示。因此,我首先导入了村庄和城市,它们以点形式([1,2])表示。没有问题。下一步是河流和街道,它们是LineStrings,并按照GeoJSON的描述表示为[[1,2],[3,4]]。但是,当导入多边形地区时(实际上是多边形,根据GeoJSON规范为三维数组),在创建索引时出现了错误geo values have to be numbers

db.collection.ensureIndex({"geometry.coordinates" : "2d"});

所有数据均为有效的GeoJSON格式,并以EPSG:4326投影下的纯2D坐标表示。

有人有想法吗?

6个回答

13

使用MongoDB 2.4版本,可以使用"2dsphere"索引来处理GeoJSON中的点、线和多边形。

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

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

存储这个线字符串:

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

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


2.6版本将支持MultiPoint、MultiLineString、MultiPolygon和GeometryCollection。http://docs.mongodb.org/manual/release-notes/2.6/ - Gianfranco P.

3

2

我曾经为了设置地理围栏功能而自己做过同样的事情。我的做法是将“多边形”数据存储为一系列坐标和一个中心点。例如:

{ 
    "_id" : ObjectId( "4f189d132ae5e92272000000" ),
    "name" : "Alaska",
    "points" : [ 
        { "coords" : [ 
            -141.0205, 
            70.0187 ] 
        }, 

        ...

        { "coords" : [ 
            -141.0205, 
            70.0187 ] 
        } 
    ],
    "center" : { 
        "coords" : [ 
          -153.6370465116279, 
          61.42329302325581 ] 
    } 
}

在我的Python应用程序中,我正在使用shapely库。首先,我会找到一个对象列表,其中心最接近我的点。然后在客户端(Python)上,我使用shapely将每个大的坐标数组转换为多边形,然后测试区域以查找包含我的点的区域。
因此,您可以将多边形数据作为数据存储在MongoDB中,并使用其他预计算的2D索引,例如中心。

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" });

我刚开始在MongoDB中使用多边形,但是我发现多边形结构的形状很奇怪...如果一个形状是一组点,那么为什么这些点的数组会被放在另一个数组中呢?poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ... ]不应该已经足够了吗? - Loupax
1
@Loupax 多边形的坐标是一个由线性环坐标数组组成的数组。数组中的第一个元素代表外围环。任何后续元素都代表内部环(或孔)。(http://geojson.org/geojson-spec.html#id4) - Farhadi

1

MongoDB的地理空间功能目前仅支持存储点,不支持形状或线条。但是,您可以使用圆、矩形或多边形查询点。


0
根据MongoDB文档这里,多边形可以被存储为GeoJSON多边形,例如:
{
  type: "Polygon",
  coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] ]
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接