展望NoSQL的发展趋势,并考虑像MongoDB这样的数据库为GIS的灵活数据存储提供了新的视角。利用二维索引和空间函数在JSON文档中存储线和面的最佳方法是什么?

评论

MongoDB当前不支持对除点以外的任何东西进行索引,并且其空间功能仅限于在边界内查找。

#1 楼

这里是GeoJSON的SPEC。

这是线和面的示例:

#2 楼

需要注意的一件事是,MongoDB对空间数据类型的支持对于任何严肃的空间查找来说都是非常糟糕的,这在我上次检查时使用NoSQL都是普遍适用的。我不太喜欢GeoCouch,但仍然有一段路要走。

GeoJSON是一种很棒的格式,但是要利用Mongo中有限的(仅POINT)空间索引,需要一个空间索引的集合,该集合仅保存多边形的每个点的记录,并为生活在另一个集合中的空间记录的记录ID附加值,然后使用边界框查询从一个记录中获取记录ID,并从另一个中选择,有效地模拟了联接。模式,并不恰当地将各种责任推给了开发人员。

作为参考实现,您可能希望参考今年Esri开发者峰会上介绍的此代码。

我对各种各样的空间支持一点都不满意NoSQL数据库。它们仅够进行哑点云查找,考虑到大多数使用此功能的应用程序只是将图钉放到浏览器上的Google地图上,因此这才有意义。在可预见的将来,PostGIS仍将是管理空间信息的最佳开源工具。

#3 楼

这根本不是真的,

”要利用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上有很好的记录

评论


抱歉,MongoDB是否可以在线要素和面要素集合上创建空间索引?

–德里克·斯温利(Derek Swingley)
2011年7月28日在4:24

目前无法在线和面要素上创建空间索引。但是,如果您在查询中提供了多边形几何图形,则可以在其中有点的表上进行多边形点搜索。 mongodb.org/display/DOCS/…

–lagerratrobe
2011年7月28日在16:20



好的,所以这样的说法:“ GeoJSON是一种很棒的格式,但是要利用Mongo中有限的(仅POINT)空间索引”,实际上是正确的,因为Mongo只能在空间上索引点。

–德里克·斯温利(Derek Swingley)
11年7月28日在16:45

我向您保证,该句子的一部分是准确的,“有限(仅POINT)空间索引”。所以71个单词中有5个,即7%。剩下的93%是不正确的。我支持我的发言。

–lagerratrobe
11年7月28日在17:27

您可以编辑答案进行澄清吗?照原样,这令人困惑和误导。关于语句的其他部分,这基本上不是对非点数据实现空间索引的建议吗?这可能不是理想的或最佳的,但这只是一个建议。详细说明为什么您认为该陈述的大部分内容是错误的,这也会有所帮助。

–德里克·斯温利(Derek Swingley)
2011年7月28日在17:36