本文内容主要译自MongoDB官方文档。第一部分主要以一个简单的示例演示了如何使用MongoDB的2dsphere索引和相应的操作符来寻找附近的饭店,第二部分则主要介绍了GeoJSON对象的类型,及其代表的含义。
原文链接:小米的专栏
一个简单的示例:寻找附近的饭店
概述
MongoDB的地理空间索引可以帮助我们在包含地理空间形状和点集的结合上高效地执行空间查询。本章节将简单介绍地理空间索引的概念,然后展示$geoWithin、$geoIntersects 以及 $geoNear的使用。
为了展示地理空间功能的能力并且比较不同方法之间的区别,本章节将会指导大家如何写一系列为简单的地理空间应用的查询。
假定我们在设计一个移动应用来帮助用户寻找纽约的饭店。该应用必须:
使用 $geoIntersects 确定用户当前的邻近区域
使用 $geoWithin 显示在该邻近区域的饭店数目
使用 $nearSphere 找到距离用户一定距离范围内的饭店
本章节将使用 2dsphere 索引来查询球面几何上的数据。
平面和球面集合的差异
地理空间查询既可以使用平面几何,也可以使用球面几何,根据使用的查询和索引类型来决定。 2dsphere 索引只能支持球面几何,而 2d索引同时支持平面和球面几何。
然而,在 2dsphere索引上使用球面几何的查询将会更高效和准确,因此我们应该在地理空间字段上使用 2dsphere索引。
下面的表格展示了每个地理空间操作符将会使用什么类型的几何:
查询类型
几何类型
备注
$near(GeoJSON点,2dsphere索引)
球面
$near(传统坐标,2d索引)
平面
$nearSphere(GeoJSON点,2dsphere索引)
球面
$nearSphere(传统坐标,2d索引)
球面
使用GeoJSON点替换
$geoWithin:{$geometry:...}
球面
$geoWithin:{$box:...}
平面
$geoWithin:{$polygon:...}
平面
$geoWithin:{$center:...}
平面
$geoWithin:{$centerSphere:...}
球面
$geoIntersects
球面
$geoNear命令和 $geoNear聚合操作符在使用传统坐标时会以弧度进行操作,在使用GeoJSON点的时候则以米为单位进行操作。
变形
在一个地图上进行可视化时,由于映射三维空间的本质,球面几何将会变形,例如将地球映射到一个平面上。
例如,以经纬度点(0,0),(80,0),(80,80),(0,80)为例,下图展示了这个区域覆盖的范围:
查找饭店
准备活动
分别下载示例数据集:neighborhoods和restaurant。
wget https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/neighborhoods.json
wget https://raw.githubusercontent.com/mongodb/docs-assets/geospatial/restaurants.json
它们分别包括了邻居和饭店的集合