如何在 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在二维中,我们有一个带有x
和y
坐标和一堆不同对象的笛卡尔平面。
文档需要使用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 中存储地理空间数据?