按地理空间搜索
Overview
在本指南中,您可以学习;了解如何使用地理空间数据、数据格式、索引和查询。
地理空间数据表示地球表面的位置。
地理空间数据的示例包括:
电影院位置
国家/地区边界
自行车骑行路线
纽约市的狗狗运动区
图表上的点
地理空间数据格式
MongoDB 中的所有地理空间数据都使用以下格式之一存储:
GeoJSON,一种表示类似地球的球体上的地理空间数据的格式。
legacy coordinate pairs ,一种表示欧几里得平面上的地理空间数据的格式。
GeoJSON
使用 GeoJSON 来存储表示类地球体上地理空间信息的数据。GeoJSON 由一个或多个位置和一个类型组成。
位置
位置表示单个位置,并在代码中作为包含以下值的大量存在:
第一个位置的经度(必需)
第二个位置的纬度(必需)
第三个位置的海拔高度(选填)
以下是 MongoDB 总部在纽约州纽约市的位置。
GeoJson.Position(-73.986805, 40.7620853)
或者,您可以使用 GeoJson.Geographic()
方法构造坐标对。
GeoJson.Geographic(-73.986805, 40.7620853)
重要
经度然后纬度
GeoJSON以经度在前、纬度在后的方式对坐标进行排序。 请务必检查您正在使用的任何其他工具使用的格式,因为许多流行的工具(例如 OpenStreetMap 和 Google Maps)都是以纬度在前、经度在后的方式列出坐标。
类型
GeoJSON对象的类型决定了它所表示的几何形状。 几何形状由多个位置组成。
下面是一些常见的 GeoJSON 类型以及如何使用位置指定这些类型:
Point
:单个位置。下面的Point
表示 MongoDB 总部的位置:GeoJson.Point(GeoJson.Position(-73.986805, 40.7620853)) LineString
:由两个或多个位置组成的大量,构成一系列线段。LineString
可以表示路径、路线、边界或任何其他线性地理空间数据。 以下LineString
代表中国长城的一段:GeoJson.LineString ( GeoJson.Position(116.572, 40.430), GeoJson.Position(116.570, 40.434), GeoJson.Position(116.567, 40.436), GeoJson.Position(116.566, 40.441) ) Polygon
:位置大量,其中第一个和最后一个位置相同,并包含一些空格。 以下Polygon
大致代表梵蒂冈城内的土地:GeoJson.Polygon ( GeoJson.Position(12.446086, 41.901977), GeoJson.Position(12.457952, 41.901559), GeoJson.Position(12.455375, 41.907351), GeoJson.Position(12.449863, 41.905186), GeoJson.Position(12.446086, 41.901977) }
要学习;了解有关可在MongoDB中使用的GeoJSON类型的详情,请参阅 GeoJSON手册条目。
有关GeoJSON格式的更多信息,请参阅 官方 IETF 规范。
传统坐标对
使用legacy coordinate pairs存储表示二维平面上的地理空间信息的数据。
legacy coordinate pairs由包含两个值的大量表示,其中第一个表示 x
轴值,第二个表示 y
轴值。
有关旧版坐标对的更多信息,请参阅 MongoDB 服务器手册中有关旧版坐标对的页面。
地理空间索引
要启用对地理空间数据的查询,必须创建与数据格式相对应的索引。以下索引类型支持地理空间查询:
2dsphere
,用于GeoJSON数据2d
,用于legacy coordinate pairs
要详细学习;了解如何创建地理空间索引,请参阅 索引指南的地理空间索引部分。
查询运算符
要查询地理空间数据,请使用以下查询运算符之一:
$near
$geoWithin
$nearSphere
$geoIntersects
(需要2 dsphere索引)
使用 $near
操作符时,可以指定以下距离操作符:
$minDistance
$maxDistance
使用 $geoWithin
操作符时,可以指定以下形状操作符:
$box
$polygon
$center
$centerSphere
有关地理空间查询操作符的更多信息,请参阅服务器手册中的地理空间查询操作符。
示例
以下示例使用MongoDB Atlas示例数据集。 要获取此示例数据集,请参阅快速入门。
示例使用了样本数据集 sample_mflix
数据库中的 theaters
集合。theaters
集合包含 location.geo
字段上的 2dsphere
索引。
按距离查询
以下示例查询具有location.geo
字段值在距离纽约市MongoDB总部1000米范围内的文档。 它按从最近到最远的顺序返回文档。
// Point representation of the MongoDB Headquarters var point = GeoJson.Point(GeoJson.Position(-73.986805, 40.7620853)); // Specifies a maxDistance of 1000 meters and a minDistance of 0 meters var filter = Builders<Theater>.Filter.Near(m => m.Location.Geo, point, 1000.0, 0.0); // Only fetches the _id and theaterId fields var projection = Builders<Theater>.Projection.Include("theaterId"); var results = collection.Find(filter).Project(projection);
上述示例的结果包含以下文档:
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
按多边形查询
以下示例查询位于曼哈顿范围内且字段值为location.geo
的文档。
// Polygon representation of Manhattan var polygon = GeoJson.Polygon ( GeoJson.Position(-73.925492, 40.877410), GeoJson.Position(-73.910372, 40.872366), GeoJson.Position(-73.935127, 40.834020), GeoJson.Position(-73.929049, 40.798569), GeoJson.Position(-73.976485, 40.711432), GeoJson.Position(-74.015747, 40.701229), GeoJson.Position(-74.018859, 40.708367), GeoJson.Position(-74.008007, 40.754307), GeoJson.Position(-73.925492, 40.877410) ); var filter = Builders<Theater>.Filter.GeoWithin(m => m.Location.Geo, polygon); // Only fetches the _id and theaterId fields var projection = Builders<Theater>.Projection.Include("theaterId"); var results = collection.Find(filter).Project(projection);
上述示例的结果包含以下文档:
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
其他资源
有关使用地理空间数据的更多信息,请参阅地理空间数据的对应手册条目。
有关受支持的 GeoJSON 类型的详细信息,请参阅 GeoJSON 手册条目。
有关地理空间查询操作符的更多信息,请参阅地理空间查询手册条目。