Pesquisar geoespacialmente
Nesta página
Visão geral
Você pode executar query de dados baseado em localização geográfica utilizando operadores de consulta geoespacial. Você pode formatar queries geoespaciais utilizando um dos seguintes sistemas de coordenadas:
Esta seção contém exemplos de queries geoespaciais utilizando diferentes operadores de consulta que você pode executar no seu conjunto de dados de amostra do Atlas.
Coordenadas em uma esfera semelhante à Terra
Para queries geoespaciais utilizando coordenadas de latitude e longitude em uma esfera semelhante à Terra, utilize o formato de consulta GeoJSON. Embora o GeoJSON tenha vários tipos, todos os tipos de dados GeoJSON usam alguma forma da estrutura a seguir:
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
O tipo de objeto determina o número de coordenadas. Por exemplo, um Point
requer apenas uma coordenada: uma longitude e uma latitude. Um Line
utiliza duas coordenadas: uma longitude e uma latitude para cada extremidade. Um Polygon
consiste em uma lista de coordenadas nas quais a primeira e a última coordenadas são iguais, fechando efetivamente o polígono. Para saber mais sobre as formas GeoJSON que você pode usar no MongoDB, consulte a entrada do manual GeoJSON.
Para habilitar a consulta de dados GeoJSON, você deve adicionar o campo em um índice do 2dsphere
. O seguinte trecho cria um índice no campo location.geo
na coleção theaters
utilizando o método createIndex()
:
db.theaters.createIndex({location.geo: "2dsphere"});
Coordenadas em um plano 2D
Você também pode expressar queries geoespaciais utilizando coordenadas do x
e y
em um plano Euclidiano bidimensional. Até MongoDB, este era o único formato compatível com queries geoespaciais, e agora são referidos como "pares de coordenadas legadas".
Os pares de coordenadas legadas utilizam a seguinte estrutura:
<field> : [ x, y ]
O campo contém uma array de dois valores em que o primeiro representa o valor do eixo x
e o segundo representa o valor do eixo y
.
Para habilitar a consulta utilizando pares de coordenadas legadas, crie um índice 2d
no campo na coleção. O seguinte trecho cria um índice no campo coordinates
na coleção shipwrecks
utilizando o método createIndex()
:
db.shipwrecks({coordinates: "2d"});
Consulte a página do manual do servidor MongoDB em legacy coordinate pairs para obter mais informações.
Observação
Os índices esféricos (2dsphere
) e planos (2d
) suportam alguns, mas não todos, dos mesmos operadores de query. Para uma lista completa de operadores e sua compatibilidade de índice, consulte a entrada manual para queries geoespaciais.
Exemplos
Os exemplos seguintes utilizam o conjunto de dados de amostra do MongoDB Atlas . Você pode aprender como configurar seu próprio Atlas cluster de camada grátis e como carregar o conjunto de dados de exemplo em nossoguia de início rápidodo .
Os exemplos utilizam a coleção do theaters
no banco de dados do sample_mflix
a partir do conjunto de dados de amostra. A coleção theaters
contém um índice 2dsphere
no campo location.geo
.
Query por proximidade
O operador $near aceita um conjunto de coordenadas de longitude-latitude e retorna documentos ordenados do mais próximo para o mais distante. Para limitar os resultados a uma distância máxima em metros, utilize a opção $maxDistance
. Para obter uma lista completa de opções, consulte a documentação de referência do $near
. O exemplo a seguir consulta cinemas dentro de 10,000
metros de [ -73.9667, 40.78 ]
.
const query = { "location.geo": { $near: { $geometry: { type: "Point", coordinates: [-73.9667, 40.78] }, $maxDistance: 10000, }, }, }; // find documents based on our query const cursor = theaters.find(query);
Query dentro de um intervalo
O operador $geoWithin seleciona documentos com dados geoespaciais que existem dentro de uma forma especificada. O exemplo a seguir pesquisa cinemas na área de Nova Inglaterra:
const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // find documents based on our query const cursor = theaters.find(query);
Consulte a página manual do servidor do MongoDB em operadores de consulta geoespacial para mais informações sobre os operadores que você pode utilizar em sua consulta.