Consultas geoespaciais
Nesta página
Visão geral
Neste guia, você pode aprender como trabalhar com dados geoespaciais, formatos de dados, índices e queries.
Os dados geoespaciais representam uma localização geográfica na superfície da Terra.
Exemplos de dados geoespaciais incluem:
Localizações de cinemas
Fronteiras de países
Rotas de passeios de bicicleta
Áreas de exercícios para cães na cidade de Nova York
Pontos em um gráfico
Formatos de dados geoespaciais
Todos os dados geoespaciais no MongoDB são armazenados em um dos seguintes formatos:
GeoJSON, a format that represents geospatial data on an earth-like sphere
Legacy coordinate pairs, a format that represents geospatial data on a Euclidean plane
GeoJSON
Utilize GeoJSON para armazenar dados que representam informações geoespaciais em uma esfera semelhante à Terra. O GeoJSON é composto por uma ou mais posições e um tipo.
Posições
Uma posição representa um único local e existe no código como uma array contendo os seguintes valores:
Longitude na primeira posição (obrigatório)
Latitude na segunda posição (obrigatório)
Elevação na terceira posição (opcional)
A seguir, a posição da sede do MongoDB na cidade de Nova York, NY.
[-73.986805, 40.7620853]
Importante
Longitude e depois latitude
A GeoJSON ordena coordenadas com longitude primeiro e latitude segundo. Certifique-se de verificar qual formato qualquer outra ferramenta com a qual você está trabalhando usa, pois muitas ferramentas populares, como OpenStreetMap e Google Maps, listam coordenadas com latitude primeiro e longitude segundo.
Tipos
O tipo do seu objeto GeoJSON determina a forma geométrica que representa. Formas geométricas são compostas por posições.
Aqui estão alguns tipos de GeoJSON comuns e como você pode especificá-los com posições:
Point
: uma única posição. O seguintePoint
representa a localização da sede do MongoDB:{ "type": "Point", "coordinates": [-73.856077, 40.848447] } LineString
: uma matriz de duas ou mais posições que forma uma série de segmentos de linha. UmLineString
pode representar um caminho, rota, borda ou quaisquer outros dados geoespaciais lineares. OLineString
a seguir representa um segmento da Grande Muralha da China:{ "type": "LineString", "coordinates": [[116.572, 40.430], [116.570, 40.434], [116.567, 40.436], [116.566, 40.441]] } Polygon
: uma série de posições em que a primeira e última posição são as mesmas e incluem algum espaço. O a seguirPolygon
representa aproximadamente a terra dentro da Cidade do Vaticano:{ "type": "Polygon", "coordinates": [[[12.446086, 41.901977], [12.457952, 41.901559], [12.455375, 41.907351], [12.449863, 41.905186], [12.446086, 41.901977]]] }
Para saber mais sobre os tipos de GeoJSON que você pode utilizar no MongoDB, consulte a entrada manual do GeoJSON.
Para mais informações sobre o formato GeoJSON, consulte a especificação oficial do IETF.
Pares de coordenadas legados
Utilize legacy coordinate pairs para armazenar dados que representam informações geoespaciais em um plano bidimensional.
Legacy coordinate pairs are represented by an array of two values, in which the first value
represents the x
axis value and the second represents the y
axis value.
Para mais informações sobre legacy coordinate pairs, consulte a página manual do servidor MongoDB sobre legacy coordinate pairs.
Índices geoespaciais
Para habilitar a query em dados geoespaciais, você deve criar um índice que corresponda ao formato de dados. Os seguintes tipos de índice habilitam queries geoespaciais:
2dsphere
, usado para dados GeoJSON2d
, usado para legacy coordinate pairs
Para saber mais sobre como criar índices geoespaciais, consulte a seção Índices geoespaciais do guia Índices.
Operadores de Consulta
To query geospatial data using the find
operator, use one of the following query operators:
$near
$geoWithin
$nearSphere
$geoIntersects
(requer um índice dsphere 2)
Ao utilizar o operador $near
, você pode especificar os seguintes operadores de distância:
$minDistance
$maxDistance
Ao utilizar o operador $geoWithin
, você pode especificar os seguintes operadores de forma:
$box
$polygon
$center
$centerSphere
To query geospatial data using the aggregate
operator, you must use the $geoNear
pipeline stage.
Para mais informações sobre operadores de query geoespacial, consulte Operadores de Query Geoespacial no manual do servidor .
Exemplos
The following examples uses the MongoDB Atlas sample dataset. To obtain this sample dataset, see the Atlas sample datasets. To learn how to create a free MongoDB Atlas cluster and load the sample datasets, see Comece com o PyMongo.
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 exemplo a seguir faz query de documentos com um valor de campo location.geo
em um raio 1000 metros da sede do MongoDB na cidade de Nova York, NY. Ele retorna documentos do mais próximo para o mais distante.
# set query with point at MongoDB headquarters and a maxDistance of 1000 meters query = { "location.geo": { "$near": { "$geometry": { # Search around this location "type": "Point", "coordinates": [-73.986805, 40.7620853] }, "$maxDistance": 1000 # Distance in meters (1 km) } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = location.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 }
Query por polígono
O exemplo a seguir faz query de documentos com um valor de campo location.geo
que existe dentro dos limites de Manhattan.
# Polygon representation of Manhattan query = { "location.geo": { "$geoWithin": { "$geometry": { # Search around this location "type": "Polygon", "coordinates": [[[-73.925492, 40.877410], [-73.910372, 40.872366], [-73.935127, 40.834020], [-73.929049, 40.798569], [-73.976485, 40.711432], [-74.015747, 40.701229], [-74.018859, 40.708367], [-74.008007, 40.754307], [-73.925492, 40.877410]]] } } } } # fetches the _id and theaterId fields projection = { "theaterId": 1 } nearby_places = location.find(query, projection) for i in nearby_places: print(i)
{ "_id" : ObjectId("59a47287cfa9a3a73e51e8e2"), "theaterId" : 1908 } { "_id" : ObjectId("59a47287cfa9a3a73e51eccb"), "theaterId" : 835 } { "_id" : ObjectId("59a47286cfa9a3a73e51e838"), "theaterId" : 1448 } { "_id" : ObjectId("59a47286cfa9a3a73e51e744"), "theaterId" : 1028 } { "_id" : ObjectId("59a47287cfa9a3a73e51ebe1"), "theaterId" : 609 } { "_id" : ObjectId("59a47287cfa9a3a73e51e8ed"), "theaterId" : 1906 } { "_id" : ObjectId("59a47287cfa9a3a73e51e87d"), "theaterId" : 1531 } { "_id" : ObjectId("59a47287cfa9a3a73e51eb63"), "theaterId" : 482 }
Recursos adicionais
Para mais informações sobre trabalhar com dados geoespaciais, consulte a entrada manual para dados geoespaciais.
Para mais informações sobre tipos GeoJSON suportados, consulte a entrada manual GeoJSON.
Para mais informações sobre operadores de query geoespacial, consulte a entrada manual para queries geoespaciais.