Consultar dados geoespaciais com o Amazon DocumentDB
Esta seção aborda como você pode consultar dados geoespaciais com o Amazon DocumentDB. Depois de ler esta seção, você poderá responder como armazenar, consultar e indexar dados geoespaciais no Amazon DocumentDB.
Visão geral
Casos de uso comuns do Geospatial envolvem análise de proximidade de seus dados. Por exemplo, “encontrar todos os aeroportos em um raio de 50 milhas de Seattle” ou “encontrar os restaurantes mais próximos de um determinado local”. O Amazon DocumentDB usa a especificação GeoJSON para representar dados geoespaciais
Indexar e armazenar dados geoespaciais
O Amazon DocumentDB usa o tipo GeoJSON “Point” para armazenar dados geoespaciais. Cada documento GeoJSON (ou subdocumento) geralmente é composto por dois campos:
-
tipo - a forma que está sendo representada, que informa ao Amazon DocumentDB como interpretar o campo “coordenadas”. No momento, o Amazon DocumentDB só oferece suporte a pontos
-
coordenadas — um par de latitude e longitude representado como um objeto em uma matriz — [longitude, latitude]
O Amazon DocumentDB também usa índices 2dsphere para indexar dados geoespaciais. O Amazon DocumentDB oferece suporte a pontos de indexação. O Amazon DocumentDB suporta consultas de proximidade com indexação 2dsphere.
Vamos considerar um cenário em que você está criando um aplicativo para serviço de entrega de comida. Você deseja armazenar o par de latitudes e longitude de vários restaurantes no Amazon DocumentDB. Para fazer isso, primeiro recomendamos que você crie um índice no campo Geoespacial que contenha o par de latitude e longitude.
use restaurantsdb db.usarestaurants.createIndex({location:"2dsphere"})
A saída desse comando será semelhante a esta:
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Depois de criar um índice, você pode começar a inserir dados em sua coleção do Amazon DocumentDB.
db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Thai Palace", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3264, 47.6009 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Noodle House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3517, 47.6159 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Curry House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -121.4517, 47.6229 ] } });
Consultar dados geoespaciais
O Amazon DocumentDB suporta consultas de proximidade, inclusão e interseção de dados geoespaciais. Um bom exemplo de consulta de proximidade é encontrar todos os pontos (todos os aeroportos) que estão a menos de uma certa distância e a mais do que uma distância de outro ponto (cidade). Um bom exemplo de consulta de inclusão é encontrar todos os pontos (todos os aeroportos) localizados em uma área/polígono especificado (estado de Nova York). Um bom exemplo de consulta de interseção é encontrar um polígono (estado) que cruza com um ponto (cidade). Você pode usar os seguintes operadores geoespaciais para obter informações sobre seus dados.
-
$nearSphere
-$nearSphere
é um operador de busca que suporta encontrar pontos do mais próximo ao mais distante de um ponto GeoJSON. -
$geoNear
-$geoNear
é um operador de agregação que suporta o cálculo da distância em metros a partir de um ponto GeoJSON. -
$minDistance
-$minDistance
é um operador de busca usado em conjunto com$nearSphere
ou$geoNear
para filtrar documentos que estejam pelo menos na distância mínima especificada do ponto central. -
$maxDistance
-$maxDistance
é um operador de busca usado em conjunto com$nearSphere
ou$geoNear
para filtrar documentos que estejam no máximo na distância máxima especificada do ponto central. -
$geoWithin
-$geoWithin
é um operador de busca que suporta a localização de documentos com dados geoespaciais que existem inteiramente dentro de uma forma especificada, como um polígono. -
$geoIntersects
-$geoIntersects
é um operador de busca que suporta a localização de documentos cujos dados geoespaciais se cruzam com um objeto GeoJSON especificado.
nota
$geoNear
e $nearSphere
exija um índice 2dsphere no campo GeoJSON que você usa em sua consulta de proximidade.
Exemplo 1
Neste exemplo, você aprenderá como encontrar todos os restaurantes (pontos) classificados pela distância mais próxima de um endereço (ponto).
Para realizar essa consulta, você pode usar $geoNear
para calcular a distância do conjunto de pontos de outro ponto. Você também pode adicionar o distanceMultiplier
para medir a distância em quilômetros.
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001 } } ])
O comando acima retornaria os restaurantes ordenados pela distância (mais próxima para a mais distante) do ponto especificado. A saída desse comando será semelhante a esta
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 } { "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 } { "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }
Para limitar o número de resultados em uma consulta, use a opção limit
ou num
.
limit
:
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "limit": 10 } } ])
num
:
db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "num": 10 } } ])
nota
O estágio $geoNear
suporta as opções limit
e num
para especificar o número máximo de documentos a serem devolvidos. $geoNear
retorna no máximo 100 documentos por padrão se as opções limit
ou num
não forem especificadas. Isso é substituído pelo valor do estágio $limit
, se presente, e o valor é menor que 100.
Exemplo 2
Neste exemplo, você aprenderá como encontrar todos os restaurantes (pontos) dentro de 2 quilômetros de um endereço específico (ponto). Para realizar tal consulta, você pode usar $nearSphere
dentro de um mínimo $minDistance
e máximo $maxDistance
de um ponto GeoJSON
db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })
O comando acima retornaria restaurantes a uma distância máxima de 2 quilômetros do ponto especificado. A saída desse comando será semelhante a esta
{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }
Limitações
O Amazon DocumentDB não oferece suporte à consulta ou indexação de Polygons, LineString, MultiPoint, MultiPolygon, MultiLineString e GeometryCollection.