Query para localizações dentro de um círculo em uma esfera
Você pode consultar dados de localização dentro de um círculo na superfície de uma esfera. Use essas queries para retornar dados dentro de um limite esférico de .
Para executar query de dados de localização dentro de um círculo em uma esfera, utilize $geoWithin
com o operador $centerSphere
. No operador $centerSphere
, especifique as coordenadas e o raio do círculo para a query:
db.<collection>.find( { <location field> : { $geoWithin : { $centerSphere: [ [ <longitude>, <latitude> ], <radius> ] } } } )
Sobre esta tarefa
Quando você especificar coordenadas de longitude e latitude, liste primeiro a longitude e depois a latitude.
Os valores de longitude válidos estão entre
-180
e180
, ambos inclusos.Os valores de latitude válidos estão entre
-90
e90
, ambos inclusos.
No operador
$centerSphere
, especifique o raio do círculo em radianos. Para converter outras unidades de e para radianos, consulte Converter distância para radianos para operadores esféricos.Este exemplo calcula a distância em quilômetros. Para converter quilômetros para radianos, divida o valor do quilômetro por
6378.1
.
$geoWithin
não exige um índice geoespacial. No entanto, um índice geoespacial melhora o desempenho da query. Somente o índice geoespacial 2dsphere suporta$geoWithin
. Para mais informações, consulte Criar um índice 2dsphere.
Antes de começar
Crie uma coleção places
que contenha estes documento:
db.places.insertMany( [ { loc: { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Park" }, { loc: { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category: "Airport" }, { loc: { type: "Point", coordinates: [ -1.83, 51.18 ] }, name: "Stonehenge", category : "Monument" } ] )
Procedimento
Para fazer query da collection, use $geoWithin
com o operador $centerSphere
:
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -1.76, 51.16 ], 10 / 6378.1 ] } } } )
A query retorna documentos onde o campo loc
está dentro de um raio de 10 quilômetros de um ponto na longitude -1.76
, latitude 51.16
.
Saída:
[ { _id: ObjectId("63fd205e4a08b5e248c03e32"), loc: { type: 'Point', coordinates: [ -1.83, 51.18 ] }, name: 'Stonehenge', category: 'Monument' } ]