Você pode fazer uma query de dados de localização dentro do perímetro de um polígono especificado.
Para obter dados de localização dentro de um território, use o operador $geoWithin e especifique as coordenadas dos vértices do polígono:
db.<collection>.find( { <location field> : { $geoWithin : { $geometry : { type : "Polygon", coordinates : [ <coordinates> ] } } } } )
Sobre esta tarefa
Os valores no campo que você query com o operador
$geoWithindevem estar no formato GeoJSON.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
-180e180, ambos inclusos.Os valores de latitude válidos estão entre
-90e90, ambos inclusos.
Quando você especifica o polígono
coordinates, a primeira e a última coordenadas na array devem ser iguais. Isso fecha os limites do polígono.$geoWithinnã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
Use $geoWithin para fazer a query da collection. A seguinte query do $geoWithin especifica um polígono com quatro vér acessos (um retângulo) e retorna pontos dentro deste 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 ] ] ] } } } } )
Saída:
[ { _id: ObjectId("63a4a8d67348ebdcd0a061f0"), loc: { type: 'Point', coordinates: [ -73.97, 40.77 ] }, name: 'Central Park', category: 'Park' } ]