MongoDB的地理空间索引使您可以高效地对包含地理空间形状和点的集合执行空间查询。为了展示地理空间要素的功能并比较不同的方法,本教程将指导您完成为简单地理空间应用程序编写查询的过程。
本教程将简要介绍地理空间索引的概念,然后展示它们的使用$geoWithin
,
$geoIntersects
和$nearSphere
。
假设您正在设计一个移动应用程序,以帮助用户找到纽约市的餐馆。该应用程序必须:
$geoIntersects
,$geoWithin
和显示附近的餐厅数量
$nearSphere
。本教程将使用2dsphere
索引来查询有关球形几何的数据。
有关球面和平面几何的更多信息,请参见 地理空间模型。
由于将三维球体(例如地球)投影到平面上的性质,当在地图上可视化时,球形几何形状将显得失真。
例如,采取由经度纬度点限定的球形正方形的说明书(0,0)
,(80,0)
,(80,80)
,和
(0,80)
。下图描述了此区域覆盖的区域:
从https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json和
https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json下载示例数据集
。这些分别包含restaurants
和neighborhoods
。
下载数据集后,将它们导入数据库:
地理空间索引,几乎总是可以提高$geoWithin
和$geoIntersects
查询的性能。
由于此数据是地理数据,因此请2dsphere
使用mongo
Shell 在每个集合上创建索引:
restaurants
从mongo
外壳程序中检查新创建的集合中
的条目:
该查询返回如下文档:
该餐厅文档对应于下图所示的位置:
由于本教程使用2dsphere
索引,因此location
字段中的几何数据
必须遵循GeoJSON格式。
现在检查neighborhoods
集合中的条目:
该查询将返回如下文档:
该几何形状对应于下图所示的区域:
假设用户的移动设备可以为用户提供合理准确的位置,则使用即可轻松找到用户的当前邻居
$geoIntersects
。
假设用户位于经度-73.93414657和纬度40.82302903。要找到当前邻域,您将使用GeoJSON格式的特殊$geometry
字段指定一个点
:
该查询将返回以下结果:
您还可以查询以查找给定社区中包含的所有餐馆。在mongo
外壳程序中运行以下命令,找到包含用户的社区,然后计算该社区中的餐馆:
该查询将告诉您,所请求的社区中有127家餐厅,如下图所示:
要找到一个点的指定距离内的餐馆,您可以使用$geoWithin
与$centerSphere
在未排序的顺序返回结果,或nearSphere
与$maxDistance
如果需要排序结果按距离。
$geoWithin
排序为了一个圆形区域内找到餐馆,使用$geoWithin
与
$centerSphere
。$centerSphere
是MongoDB特定的语法,用于通过以弧度指定中心和半径来表示圆形区域。
$geoWithin
不会以任何特定顺序返回文档,因此它可能首先向用户显示最远的文档。
以下内容将查找距用户五英里范围内的所有餐馆:
$centerSphere
的第二个参数接受以弧度为单位的半径,因此必须将其除以以英里为单位的地球半径。有关
在距离单位之间进行转换的更多信息,请参见
使用球面几何计算距离。
$nearSphere
¶您也可以使用$nearSphere
并$maxDistance
以米为单位指定术语。这将以从近到远的排序顺序返回距离用户五英里以内的所有餐厅: