Puedes query los datos de ubicación dentro del perímetro de un polígono especificado.
Para query datos de ubicación dentro de un perímetro, utiliza el
$geoWithin operador y especifica las coordenadas de los vértices del polígono:
db.<collection>.find( { <location field> : { $geoWithin : { $geometry : { type : "Polygon", coordinates : [ <coordinates> ] } } } } )
Acerca de esta tarea
Los valores en el campo que consultas con el operador
$geoWithindeben estar en formato GeoJSON.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.
Cuando especificas el Polígono
coordinates, la primera y la última coordenada del arreglo deben ser iguales. Esto cierra los límites del polígono.$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
Utiliza $geoWithin para query la colección. La siguiente $geoWithin query especifica un polígono con cuatro vértices (un rectángulo) y devuelve puntos dentro de ese polígono:
db.places.find( { loc: { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [ -73.95, 40.80 ], [ -73.94, 40.79 ], [ -73.97, 40.76 ], [ -73.98, 40.76 ], [ -73.95, 40.80 ] ] ] } } } } )
Salida:
[ { _id: ObjectId("63a4a8d67348ebdcd0a061f0"), loc: { type: 'Point', coordinates: [ -73.97, 40.77 ] }, name: 'Central Park', category: 'Park' } ]