文档菜单
文档首页
/ / /
C#/.NET
/

地理空间搜索

在本页

  • 概述
  • 地理空间数据格式
  • GeoJSON
  • 旧坐标对
  • 地理空间索引
  • 查询运算符
  • 示例
  • 根据邻近度查询
  • 根据多边形查询
  • 其他资源

在本指南中,您可以学习如何使用地理空间数据、数据格式、索引和查询。

地理空间数据表示地球表面上的地理位置。

地理空间数据的例子包括

  • 电影院的位置

  • 国家的边界

  • 自行车骑行路线

  • 纽约市的狗运动区域

  • 图上的点

MongoDB 中的所有地理空间数据均存储在以下格式之一

  • GeoJSON,一种表示地球类球体上地理空间数据的格式。

  • 旧坐标对,一种表示欧几里得平面上地理空间数据的格式。

使用 GeoJSON 存储表示地球类球体上地理空间信息的数据。GeoJSON 由一个或多个位置和一个类型组成。

位置表示单个位置,在代码中以包含以下值的数组形式存在

  • 第一个位置为经度(必需)

  • 第二个位置为纬度(必需)

  • 第三个位置为海拔(可选)

以下为纽约市纽约的MongoDB总部位置

GeoJson.Position(-73.986805, 40.7620853)

或者,您可以使用GeoJson.Geographic()方法构建坐标对。

GeoJson.Geographic(-73.986805, 40.7620853)

重要

经度后跟纬度

GeoJSON以经度在前、纬度在后的顺序排列坐标。请确保检查您正在使用的任何其他工具使用的格式,因为许多流行的工具(如OpenStreetMap和Google Maps)的坐标顺序是纬度在前、经度在后。

您的GeoJSON对象类型决定了它所表示的几何形状。几何形状由位置组成。

以下是一些常见的GeoJSON类型以及如何使用位置指定它们

  • :单个位置。以下代表MongoDB总部的位置

    GeoJson.Point(GeoJson.Position(-73.986805, 40.7620853))
  • 线字符串:由两个或更多位置组成的数组,形成一系列线段。一个线字符串可以表示路径、路线、边界或任何其他线性地理空间数据。以下线字符串代表中国长城的一段

    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)
    )
  • 多边形:由位置组成的数组,其中第一个和最后一个位置相同,并包围一些空间。以下多边形大致代表梵蒂冈城内的土地

    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规范。

使用旧版坐标对存储表示二维平面上地理空间信息的数据。

旧版坐标对由一个包含两个值的数组表示,其中第一个值表示x轴值,第二个值表示y轴值。

有关旧版坐标对的更多信息,请参阅MongoDB服务器手册中关于旧版坐标对的页面。

要启用对地理空间数据的查询,您必须创建与数据格式相对应的索引。以下索引类型可启用地理空间查询

  • 2dsphere,用于GeoJSON数据

  • 2d,用于旧版坐标对

有关如何创建地理空间索引的更多信息,请参阅索引指南中的地理空间索引部分。

要查询地理空间数据,请使用以下查询运算符之一

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects(需要2dsphere索引)

当使用$near运算符时,您可以指定以下距离运算符

  • $minDistance

  • $maxDistance

当使用$geoWithin运算符时,您可以指定以下形状运算符

  • $box

  • $polygon

  • $center

  • $centerSphere

有关地理空间查询运算符的更多信息,请参阅服务器手册中的地理空间查询运算符

以下示例使用MongoDB Atlas样本数据集。要获取此样本数据集,请参阅快速入门。

示例使用样本数据集中的theaters集合中的sample_mflix数据库。该theaters集合在location.geo字段上具有2dsphere索引。

以下示例查询具有位于纽约市纽约州MongoDB总部1000米范围内的location.geo字段值的文档。结果按从近到远返回。

// 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 }

返回

使用中加密