$geoWithin
定义
$geoWithin
选择完全位于指定形状内的地理空间数据的文档。
指定的形状可以是GeoJSON
多边形
(单环或多环),GeoJSONMultiPolygon
,或由旧坐标对定义的形状。The$geoWithin
运算符使用$geometry
运算符来指定GeoJSON对象。要使用默认的坐标参考系统(CRS)指定GeoJSON多边形或多边形,请使用以下语法
{ <location field>: { $geoWithin: { $geometry: { type: <"Polygon" or "MultiPolygon"> , coordinates: [ <coordinates> ] } } } } 对于指定GeoJSON几何形状的
$geoWithin
查询,这些几何形状的面积大于一个半球,使用默认CRS会导致查询互补几何形状。要使用自定义MongoDB CRS指定单环GeoJSON 多边形,请使用以下原型,该原型在
$geometry
表达式中指定自定义MongoDB CRS{ <location field>: { $geoWithin: { $geometry: { type: "Polygon" , coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } 自定义MongoDB CRS使用逆时针方向,并允许
$geoWithin
支持查询单环GeoJSON 多边形,其面积大于或等于一个半球。如果指定的多边形小于一个半球,则使用MongoDB CRS的$geoWithin
的行为与默认CRS相同。另请参阅"大"多边形。如果要查询在平面上由旧坐标对定义的形状,请使用以下语法
{ <location field>: { $geoWithin: { <shape operator>: <coordinates> } } } 可用的形状运算符有
$center
(定义一个圆),以及$centerSphere
(在球面上定义一个圆)。
重要
如果您使用经纬度,请按照
经度,纬度
的顺序指定坐标。
行为
地理空间索引
$geoWithin
不需要地理空间索引。然而,地理空间索引将提高查询性能。2dsphere 和 2d 地理空间索引都支持 $geoWithin
。
未排序的结果
$geoWithin
操作符不会返回排序后的结果。因此,MongoDB 可以比排序结果的空间查询(如 $near
或 $nearSphere
)更快地返回 $geoWithin
查询。
退化几何体
$geoWithin
不保证它会考虑一个几何体包含其组成部分几何体,或者另一个共享其组成部分几何体的多边形。
“大”多边形
对于 $geoWithin
,如果您指定一个面积大于单个半球的单环多边形,请在 $geometry
表达式中包含自定义 MongoDB 坐标参考系统。否则,$geoWithin
查询将针对互补几何体。对于所有其他面积大于半球的 GeoJSON 多边形,$geoWithin
查询将针对互补几何体。
示例
在多边形内部
以下示例选择所有完全位于GeoJSON Polygon
内部的 loc
数据。该多边形的面积小于单个半球的面积
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } } } )
对于面积大于单个半球的单一环多边形,请参阅 “大”多边形内部。
在“大”多边形内部
要查询面积大于单个半球的单一环GeoJSON多边形,必须指定自定义MongoDB坐标参考系统。例如
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ -100, 60 ], [ -100, 0 ], [ -100, -60 ], [ 100, -60 ], [ 100, 60 ], [ -100, 60 ] ] ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } )