文档菜单
文档首页
/
MongoDB 手册
/ / / /

$geoWithin

本页内容

  • 定义
  • 行为
  • 示例
$geoWithin

选择完全位于指定形状内的地理空间数据的文档。

指定的形状可以是GeoJSON多边形(单环或多环),GeoJSON MultiPolygon,或由旧坐标对定义的形状。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> }
}
}

可用的形状运算符有

  • $box,

  • $polygon,

  • $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" }
}
}
}
}
}
)

返回

$geoIntersects

本页内容