8.1 Dados do OpenStreetMap

Este texto mostra como exportar coordenadas geográficas do OpenStreetMap e importar para uma coleção do MongoDB.

8.1.1 – Exportação dos dados do OpenStreetMap

Com o OpenStreetMap aberto na aba do navegador mostrando o Centro da Cidade do Rio de Janeiro, foi dado um clique no botão Exportar na parte superior esquerda da página, e selecionado um retângulo com as latitudes -22.8916 e -22.9180 e longitudes -43.2110 e -43.1574 (veja a imagem destacada). Em seguida foi clicado o link API Overpass para baixar os dados deste retângulo através de um espelho do banco de dados do OpenStreetMap. O arquivo baixado tem o nome de map, sem extensão.

8.1.2 – Conversão dos dados do OpenStreetMap para GeoJSON

O arquivo map baixado do OpenStreetMap foi renomeado para map.osm

$ mv map map.osm

e, depois, foi feita a conversão para o formato GeoJSON através do GDAL ogr2ogr, que converte dados entre formatos de arquivo, usando o comando:

$ ogr2ogr -f GeoJSON map.geojson map.osm points

que produziu a saída:

Warning 1: Input datasource uses random layer reading, but output datasource does not support random layer writing
0...10...20...30...40...50...60...70...80...90...100 - done.

8.1.3 – Criação de uma coleção no MongoDB para receber os dados do OpenStreetMap

Para armazenar os dados exportados do OpenStreetMap foi criada a coleção osmexport usando os comandos:

$ mongo
use reficio;
db.osmexport.drop();
db.createCollection("osmexport");

8.1.4 – Importação dos dados

A importação dos dados do OpenStreetMap para a coleção osmexport do MongoDB foi feita através do utilitário mongoimport, conforme mostrado abaixo:

$ mongoimport \
    --db reficio \
    --collection osmexport \
    --file map.geojson

que produziu a saída:

2018-05-13T19:04:18.473-0300    connected to: localhost
2018-05-13T19:04:18.668-0300    imported 1 document

8.1.5 – Um documento para cada ponto

Como pode ser visto acima, todos os pontos foram importados para um único documento. Para colocar cada ponto em um documento, foi criada a coleção osmpoints conforme mostrado abaixo:

$ mongo
use reficio;
db.createCollection("osmpoints");

e executado o comando:

db.osmexport.find().forEach(function(data) {
    db.osmpoints.insert( data.features );
});

8.1.6 – Exemplo de consulta à coleção

Selecionar os pontos com a tag: “denomination=>catholic”

db.osmpoints.find( 
    { 'properties.other_tags' : RegExp('"denomination"=>"catholic"')},
    { 'properties.name' : 1, 'geometry' : 1, _id: 0}
).pretty();

produzindo a saída:

> db.osmpoints.find(
...     { 'properties.other_tags' : RegExp('"denomination"=>"catholic"')},
...     { 'properties.name' : 1, 'geometry' : 1, _id: 0}
... ).pretty();
{
        "properties" : {
                "name" : "Igreja de Nossa Senhora do Rosário e São Benedito dos Homens Pretos"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1803813,
                        -22.9041351
                ]
        }
}
{
        "properties" : {
                "name" : "Santuário Nossa Senhora de Fátima"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1921416,
                        -22.9126505
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja de Nossa Senhora do Parto"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1769091,
                        -22.9058593
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja de Nossa Senhora do Carmo da Lapa do Desterro"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1777432,
                        -22.914651
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja de Nossa Senhora do Terço e Senhor dos Passos"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.182868,
                        -22.905319
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja de Nossa Senhora da Conceição e Boa Morte"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1787691,
                        -22.9030222
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja Nossa Senhora Sallete"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.195651,
                        -22.9162055
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja de Nossa Senhora da Saúde"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1915095,
                        -22.8937347
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja de São Francisco da Prainha"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1836126,
                        -22.8978431
                ]
        }
}
{
        "properties" : {
                "name" : "Igreja Irmandade dos Mártires São Crispim e São Crispiniano"
        },
        "geometry" : {
                "type" : "Point",
                "coordinates" : [
                        -43.1884606,
                        -22.9134891
                ]
        }
}
>

8.1.7 Visualizar os pontos no mapa

Para visualizar os pontos do exemplo anterior no mapa foi criado o script osm_denomination_catholic.py em Python que gera o arquivo GPX (GPS eXchange Format) osm_denomination_catholic.gpx. O mapa é visto abaixo no OpenStreetMap.

Fontes

8. Dados externos