Puedes consultar datos de ubicación dentro de un círculo en la superficie de una esfera. Usa estas consultas para obtener datos dentro de un casquete esférico.
Para consultar datos de ubicación dentro de un círculo en una esfera, utilice
$geoWithin con el $centerSphere operador. En el $centerSphere operador, especifica las coordenadas y el radio del círculo dentro del cual deseas query:
db.<collection>.find( { <location field> : { $geoWithin : { $centerSphere: [ [ <longitude>, <latitude> ], <radius> ] } } } )
Acerca de esta tarea
Al especificar las coordenadas de longitud y latitud, enumere primero la longitud y luego la latitud.
Los valores de longitud válidos están entre
-180y180, ambos inclusive.Los valores de latitud válidos están entre
-90y90, ambos inclusive.
En el operador
$centerSphere, especifica el radio del círculo en radianes. Para convertir otras unidades a y desde radianes, consulta Convertir distancia a radianes para operadores esféricos.Este ejemplo calcula la distancia en kilómetros. Para convertir kilómetros a radianes, divide el valor en kilómetros por
6378.1.
$geoWithinno requiere un índice geoespacial. Sin embargo, un índice geoespacial mejora el rendimiento de las query. Solo el índice geoespacial 2dsphere admite$geoWithin. Para obtener más información, consulta Crea un índice 2dsphere.
Antes de comenzar
Crea una colección places que contenga estos documentos:
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" } ] )
Procedimiento
Para consultar la colección, use $geoWithin con el operador $centerSphere:
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -1.76, 51.16 ], 10 / 6378.1 ] } } } )
La consulta devuelve documentos donde el campo loc está dentro de un radio de 10 kilómetros de un punto en la longitud -1.76 y latitud 51.16.
Salida:
[ { _id: ObjectId("63fd205e4a08b5e248c03e32"), loc: { type: 'Point', coordinates: [ -1.83, 51.18 ] }, name: 'Stonehenge', category: 'Monument' } ]