如何在JSON文档中存储线和面?


Answers:


16

这里的GeoJSONSPEC

这是一条线和一个多边形的示例:

{ "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"}
         }
       }
     ]
   }

9

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

GeoJSON是一种很棒的格式,但是要利用Mongo中有限的(仅POINT)空间索引,您需要一个空间索引集合,该集合只保存每个多边形点的记录,并为您的记录ID附加值居住在另一个集合中的空间记录,然后使用边界框查询从一个记录中获取记录ID,并从另一个记录中进行选择,从而有效地模拟了联接。

您可能会变笨,只是将边界框的角作为记录的要点,但是边界框搜索可能会失败,并且所有这些都将迫使某些效率很低的设计模式,并不恰当地将各种责任推给开发人员。

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

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


9

这是不正确的,

“要利用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是否可以在线要素和面要素集合上创建空间索引?
德里克·斯温利

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

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

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

1
您可以编辑答案进行澄清吗?照原样,这令人困惑和误导。关于语句的其他部分,这基本上不是对非点数据实现空间索引的建议吗?这可能不是理想的或最佳的,但这只是一个建议。详细说明为什么您认为该声明的大部分内容是错误的,这也会有所帮助。
德里克·斯温利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.