$geoWithin
Nesta página
Definição
$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 GeoJSONMultiPolygon
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:
$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
.
Comportamento
Índices geoespaciais
$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
.
Resultados não ordenados
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.
Degeneração geométrica
$geoWithin
não garante que considerará que uma geometria contém sua geometria componente ou outro polígono compartilhando sua geometria componente.
Polígonos "big"
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.
Exemplos
Dentro de um polígono
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".
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" } } } } } } )