如何在 mongoDB 中存储地理空间信息

Posted

技术标签:

【中文标题】如何在 mongoDB 中存储地理空间信息【英文标题】:How to store geospatial information in mongoDB 【发布时间】:2013-03-07 15:18:57 【问题描述】:

根据 mongoDB 文档 (link) 如果要在文档字段中存储地理空间信息,则有两个选项,数组或嵌入文档,顺序应始终为经度、纬度。

如果我想使用嵌入文档,如何保证字段的顺序?

或者嵌入文档中的字段必须有一个特定的名称?

【问题讨论】:

【参考方案1】:

对于嵌入文档,无论嵌入文档中的字段名称如何,第一个字段应包含经度值,第二个字段应包含纬度值。例如:

 db.zips2.insert(  _id: 1, city: "b", loc:  x: -73.974, y: 40.764   )
 db.zips2.insert(  _id: 2, city: "b", loc:  x: -73.981, y: 40.768   )

这里的 x 字段是经度; y 字段将是纬度。

问候

【讨论】:

The values of the array may be either arrays, as in [ 55.5, 42.3 ], or embedded documents, as in lng : 55.5 , lat : 42.3 . --docs.mongodb.org/manual/core/geospatial-indexes/… 基于 MongoDB 文档,优先使用数组格式而不是嵌入文档。 docs.mongodb.com/manual/geospatial-queries/#geospatial-legacy【参考方案2】:

2D Geospatial Index, Store Location Data

"所有文档必须以相同的顺序存储位置数据。如果使用纬度和经度作为坐标系,总是先存储经度。MongoDB 的二维球面索引运算符只识别[经度,纬度]订购。”

Here's a good post about Geospatial Queries in MongoDB 以备不时之需。

【讨论】:

这让我免于数小时的头痛。我正在按照教程进行操作,但他们忽略了这些信息。 Mongo 在 ensureIndex 期间不断抛出错误:“Can't extract geo keys from object, malformed geometry?”【参考方案3】:

我建议你将你的字段命名为:x and y,而不是longitude/latitude,因为在更新后,经度和纬度将按字母顺序重新排序,因此颠倒了。

【讨论】:

【参考方案4】:

MongoDB 文档说如下:

一个名为坐标的字段,用于指定对象的坐标。 如果指定经纬度坐标,请先列出经度然后列出纬度

有效的经度值介于 -180 和 180 之间,包括两个值。 有效的纬度值介于 -90 和 90(包括两者)之间。

MongoDB 官方文档:https://docs.mongodb.com/manual/geospatial-queries/#geospatial-indexes

【讨论】:

【参考方案5】:

地理空间索引允许我们根据地理位置查找事物。

我们有两个选择:

2D 3D

在二维中,我们有一个带有xy 坐标和一堆不同对象的笛卡尔平面。



文档需要使用ensureIndex('location':'2d', 'type':1) 存储某种x,y 位置。

type(可选)选项指定索引的方向,即升序或降序。它可以是复合索引。

使用示例:

要查找附近的位置,请使用命令:

db.collectionName.find(location: $near:[x,y])

在实践中,经常使用的方式是通过limit。将结果限制为例如 20 附加 .limit(20)

db.collectionName.find(location: $near:[x,y]).limit(20)

【讨论】:

令人敬畏的 mspaint 技能

以上是关于如何在 mongoDB 中存储地理空间信息的主要内容,如果未能解决你的问题,请参考以下文章

地理信息系统功能的数据处理与存储管理

如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?

如何在 MongoDB Java 中编写地理空间查询

如何计算具有 lat+long 信息的集合的地理空间距离?

通过 GeoServer 在 MongoDB 中提供地理空间数据

地理空间云怎么找矢量图