Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / / /

$geoWithin

Nesta página

  • Definição
  • Comportamento
  • Exemplos
$geoWithin

Seleciona documentos com dados geoespaciais que existem inteiramente dentro de uma forma especificada.

A forma especificada pode ser um GeoJSON Polygon (com uma ou várias conexões), um GeoJSON MultiPolygon ou uma forma definida por legacy coordinate pairs. O operador $geoWithin utiliza o operador $geometry para especificar o objeto GeoJSON.

Para especificar um polígono ou vários polígonos GeoJSON utilizando o sistema de referência de coordenadas padrão (CRS), utilize a seguinte sintaxe:

{
<location field>: {
$geoWithin: {
$geometry: {
type: <"Polygon" or "MultiPolygon"> ,
coordinates: [ <coordinates> ]
}
}
}
}

Para queries do $geoWithin que especificam geometrias GeoJSON com áreas maiores que um único hemisfério, o uso do CRS padrão resulta em queries para as geometrias complementares.

Para especificar um polígono GeoJSON com um MongoDB CRS personalizado, utilize o seguinte protótipo que especifica o MongoDB CRS personalizado na expressão $geometry:

{
<location field>: {
$geoWithin: {
$geometry: {
type: "Polygon" ,
coordinates: [ <coordinates> ],
crs: {
type: "name",
properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" }
}
}
}
}
}

O CRS personalizado do MongoDB usa uma ordem de enrolamento no sentido anti-horário e permite que $geoWithin aceite queries com um polígono GeoJSON de anel único cuja área seja maior ou igual a um único hemisfério. Se o polígono especificado for menor que um único hemisfério, o comportamento do $geoWithin com o CRS do MongoDB será o mesmo que com o CRS padrão. Veja também Polígonos "big".

Se estiver consultando a inclusão em uma forma definida por pares de coordenadas legados em um plano, use a seguinte sintaxe:

{
<location field>: {
$geoWithin: { <shape operator>: <coordinates> }
}
}

Os operadores de formas disponíveis são:

  • $box,

  • $polygon,

  • $center (define um círculo) e

  • $centerSphere (define um círculo em uma esfera).

Importante

Se você utilizar longitude e latitude, especifique coordenadas em ordem de longitude, latitude.

$geoWithin não exige um índice geoespacial. No entanto, um índice geoespacial melhorará o desempenho da query. Ambos os índices geoespaciais 2dsphere e 2d suportam $geoWithin.

O operador $geoWithin não retorna resultados ordenados. Dessa forma, o MongoDB pode retornar consultas $geoWithin mais rapidamente do que as consultas geoespaciais $near ou $nearSphere, que ordenam os resultados.

$geoWithin não garante que considerará que uma geometria contém sua geometria componente ou outro polígono compartilhando sua geometria componente.

Por $geoWithin, se você especificar um polígono de anel único que tenha uma área maior que um único hemisfério, inclua o sistema de referência de coordenadas personalizado do MongoDB na expressão $geometry. Caso contrário, $geoWithin consultará a geometria complementar. Para todos os outros polígonos GeoJSON com áreas maiores que um hemisfério, $geoWithin consultará a geometria complementar.

O exemplo seguinte seleciona todos os dados loc que existem inteiramente dentro de um GeoJSON Polygon. A área do polígono é menor que a área de um único hemisfério:

db.places.find(
{
loc: {
$geoWithin: {
$geometry: {
type : "Polygon" ,
coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ]
}
}
}
}
)

Para polígonos anelares únicos com áreas maiores que um único hemisfério, consulte Dentro de um polígono "grande".

Para executar query com um polígono GeoJSON de anel único cuja área é maior que um único hemisfério, a expressão $geometry deve especificar o sistema de referência de coordenadas MongoDB personalizado. Por exemplo:

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

Voltar

$geoIntersects