Answers:
这是一条线和一个多边形的示例:
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
},
{ "type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
},
"properties": {
"prop0": "value0",
"prop1": 0.0
}
},
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
[100.0, 1.0], [100.0, 0.0] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
需要注意的一件事是,MongoDB对空间数据类型的支持对于任何严肃的空间查找都非常糟糕,这在我上次检查时使用NoSQL都是普遍适用的。我不太喜欢GeoCouch,但还有一段路要走。
GeoJSON是一种很棒的格式,但是要利用Mongo中有限的(仅POINT)空间索引,您需要一个空间索引集合,该集合只保存每个多边形点的记录,并为您的记录ID附加值居住在另一个集合中的空间记录,然后使用边界框查询从一个记录中获取记录ID,并从另一个记录中进行选择,从而有效地模拟了联接。
您可能会变笨,只是将边界框的角作为记录的要点,但是边界框搜索可能会失败,并且所有这些都将迫使某些效率很低的设计模式,并不恰当地将各种责任推给开发人员。
作为参考实现,您可能希望参考今年Esri开发者峰会上介绍的代码。
我对各种NoSQL数据库的空间支持都不满意。它们只够进行哑点云查找,考虑到大多数使用此功能的应用程序只是将图钉放在浏览器上的Google地图上,因此这是有意义的。在可预见的将来,PostGIS仍将是管理空间信息的最佳开源工具。
这是不正确的,
“要利用Mongo中的空间索引,您需要一个空间索引的集合,该集合只保存多边形的每个点的记录,并为居住在另一个集合中的空间记录的记录ID附加值,然后使用边界框查询,以从一个[集合]获取记录ID,并从另一个[集合]选择[记录数据],从而有效地模拟联接。”
我将USGS点数据存储在单个Mongo集合中,其记录如下所示:
> db.names.find({FEATURE_NAME: 'Mount Saint Helens', STATE_ALPHA: 'WA'})
{ "_id" : ObjectId("4e262106d7a99b7db41a4919"),
"_ID" : 1525360,
"FEATURE_NAME" : "Mount Saint Helens",
"FEATURE_CLASS" : "Summit",
"STATE_ALPHA" : "WA",
"STATE_FIPS" : 53,
"COUNTY_NAME" : "Skamania",
"COUNTY_FIPS" : "059",
"COORDS" : [ -122.1944, 46.1912 ],
"ELEV_IN_FT" : "8356" }
我可以对此数据进行边界框查询,以返回整个记录(无需其他集合)就可以了。
查询:
> box = [[-126.562500,45.089036], [-123.750000,47.040182]]
[ [ -126.5625, 45.089036 ], [ -123.75, 47.040182 ] ]
> db.names.find({"COORDS" : {"$within" : {"$box" : box}}, FEATURE_CLASS: "Summit"}, {FEATURE_NAME: true, COUNTY_NAME: true, STATE_ALPHA: true, ELEV_IN_FEET: true}).limit(5);
响应:
{ "_id" : ObjectId("4e2620f8d7a99b7db4146cec"), "FEATURE_NAME" : "Harlocker Hill", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Coos" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a349"), "FEATURE_NAME" : "Neskowin Crest", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a105"), "FEATURE_NAME" : "Miles Mountain", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414934a"), "FEATURE_NAME" : "Mount Gauldy", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db4149d06"), "FEATURE_NAME" : "Little Hebo", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Yamhill" }
Mongo还提供了进行最近邻搜索以及多边形搜索中的点的功能。这在mongodb.org上有详细记录