Pessoal, no artigo de hoje quero deixar uma dica de como podemos trabalhar com dados geoespaciais no MongoDB, podendo inserir e consultar localizações em todo globo terrestre.
Vamos criar nosso banco de dados e nossa collection para o exemplo. Nós teremos uma collection: restaurante, que armazenará informações sobre a localização geográfica de três restaurantes:
> use dbGeo switched to db dbGeo > > db.createCollection("restaurante") { "ok" : 1 } >
1 - Inserindo dados geoespaciais:
Vamos inserir agora três documentos com informações geoespaciais. Este documento deve conter um tipo(type) de objeto, seguido das coordenadas da longitude e da latitude, veja o exemplo abaixo:
Os types podem ser: Point, LineString ou Polygon. O tipo Point é usado para indicar que o restaurante está localizado exatamente no ponto dado, exigindo a longitude e latitude.
Vamos dar uma exemplo apenas deste tipo(Point) e inserir três restaurantes em coordenadas diferentes.
> db.restaurante.insert({name: "Dia e Sabor", loc: { type: "Point", coordinates: [52.370451, 5.217497]}}) WriteResult({ "nInserted" : 1 }) > db.restaurante.insert({name: "Sabor do Sul", loc: { type: "Point", coordinates: [51.915288, 4.472786]}}) WriteResult({ "nInserted" : 1 }) > db.restaurante.insert({name: "Café Brasil", loc: { type: "Point", coordinates: [52.368736, 4.890530]}}) WriteResult({ "nInserted" : 1 }) >
O MongoDB tem a opção de criação de indices geoespaciais que foram criados para funcionar de maneira otimizada em queries baseadas em localização.
Como já inserimos os dados, vamos agora criar um indice baseado em informações de localizações específicas:
2 - Criando indice para informações geoespaciais:
> db.restaurante.ensureIndex({loc: "2dsphere"}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } >
O parâmetro: 2dsphere informa que uma coordenada sobre uma esfera como a Terra está sendo indexada.
O indexação geoespacial do MongoDB permite que você execute eficientemente consultas espaciais em uma coleção que contenha formas geoespaciais e pontos.
3 - Fazendo Querys geoespaciais:
Agora para pesquisar estes documentos ou estas informações no MongoDB, podemos procurar pelo valor exato como mostrado abaixo, porém, não deve retornar nada porque o valor é específico demais:
> db.restaurante.find({loc: [52.5]}) >
O melhor seria procurar informações de localização que sejam próximas a um dado valor, utilizando o operador $near, como mostrado abaixo, veja:
GeoNear retorna documentos em ordem de proximidade a um ponto especificado, do mais próximo ao mais distante. GeoNear requer um índice geoespacial por isso criamos ele antes.
> db.restaurante.find({loc: {$geoNear : {$geometry: {type : "Point", coordinates: [52.338433, 5.5133629]}}}}) { "_id" : ObjectId("5a37d168ad263728c44f7cae"), "name" : "Dia e Sabor", "loc" : { "type" : "Point", "coordinates" : [ 52.370451, 5.217497 ] } } { "_id" : ObjectId("5a37d17bad263728c44f7cb0"), "name" : "Café Brasil", "loc" : { "type" : "Point", "coordinates" : [ 52.368736, 4.89053 ] } } { "_id" : ObjectId("5a37d172ad263728c44f7caf"), "name" : "Sabor do Sul", "loc" : { "type" : "Point", "coordinates" : [ 51.915288, 4.472786 ] } } >
Podemos também dizer ao MongoDB que retorne somente resultados que estiverem a uma distância máxima de um dado ponto. Por exemplo, a consulta abaixo retornará um restaurante localizado em um raio de 40 quilômetros:
> db.restaurante.find({loc: {$geoNear : {$geometry: {type : "Point", coordinates: [52.338433, 5.5133629]}, $maxDistance: 40000}}}) { "_id" : ObjectId("5a37d168ad263728c44f7cae"), "name" : "Dia e Sabor", "loc" : { "type" : "Point", "coordinates" : [ 52.370451, 5.217497 ] } } >
Bom pessoal, este foi apenas um pequeno exemplo.
Abraço,
Ronaldo.
Nenhum comentário:
Postar um comentário