8.5 Dados do NGA GEOnet Names Server (GNS)

Este texto mostra como baixar dados de NGA GEOnet Names Server (GNS) e importar para uma coleção do MongoDB.

O GEOnet Names Server (GNS) é o repositório oficial de grafias padrão de todos os nomes geográficos estrangeiros, sancionado pelo Conselho dos Estados Unidos sobre Nomes Geográficos (US BGN). O banco de dados também contém grafias variantes (referências cruzadas), que são úteis para finalidades de consulta, bem como grafias de escrita não romana de muitos desses nomes. Todas as feições geográficas no banco de dados contêm informações sobre localização, divisão administrativa e qualidade. O banco de dados pode ser usado para uma variedade de propósitos, incluindo o estabelecimento de grafias oficiais de nomes de lugares estrangeiros, cartografia, GIS, GEOINT e localização de lugares.

8.5.1 – Download de dados do GNS

O arquivo contendo os dados para o Brasil, br.zip, foi baixado clicando no link Download Country Files na aba da esquerda da página, para abrir a página Country Files (GNS) e, então, clicando no link BRAZIL.

A página Country Files (GNS) contém arquivos completos de Nomes Geográficos para Áreas Geopolíticas do GNS (em conformidade com a norma ISO/IEC 10646 [Unicode UTF-8] de 18 de julho de 2002).

O arquivo baixado br.zip tem o tamanho de 12,2 MB e um total de 117,403 registros. Ao se descompactar o arquivo br.zip na pasta br, os seguintes arquivos foram extraídos:

br_administrative_a.txt
br_hypsographic_t.txt
br_spot_s.txt
br_vegetation_v.txt
br_disclaimer.txt
br_localities_l.txt
br_transportation_r.txt
br_hydrographic_h.txt
br_populatedplaces_p.txt
br.txt (27,402,741 bytes)

8.5.2 – Conversão de dados do GNS para o formato GeoJSON

O arquivo br.txt, extraído de br.zip, após ter o nome mudado para br.csv, foi convertido para o formato GeoJSON usando o programa utilitário ogr2ogr da GDAL, que converte dados entre formatos de arquivo, conforme mostrado abaixo::

mv br.txt br.csv
ogr2ogr -f GeoJSON br.geojson br.csv -oo X_POSSIBLE_NAMES=LONG -oo Y_POSSIBLE_NAMES=LAT -oo KEEP_GEOM_COLUMNS=NO

8.5.3 – Criação de uma coleção no MongoDB para importar os dados do GNS

Para importar os dados do arquivo br.geojson, foi criada a coleção gnsbr usando os comandos:

mongo
use reficio;
// Apagar a coleção, se existir
db.gnsbr.drop();
// Criar a coleção
db.createCollection("gnsbr");

8.5.4 – Importação dos dados

O arquivo br.geojson gerado pelo ogr2ogr tem o tamanho de 94.093.669 bytes, maior que os 16 MB permitidos pelo mongoimport. Então, ao tentar importar o arquivo para o MongoDB usando o comando

mongoimport \
    --stopOnError \
    --db reficio \
    --collection gnsbr \
    --file br.geojson

a seguinte saída foi produzida:

2018-05-20T07:45:05.301-0300    connected to: localhost
2018-05-20T07:45:08.265-0300    [########################] reficio.gnsbr        87.7MB/87.7MB (100.0%)
2018-05-20T07:45:11.265-0300    [########################] reficio.gnsbr        87.7MB/87.7MB (100.0%)
2018-05-20T07:45:13.676-0300    num failures: 1
2018-05-20T07:45:13.676-0300    [########################] reficio.gnsbr        87.7MB/87.7MB (100.0%)
2018-05-20T07:45:13.676-0300    Failed: write tcp 127.0.0.1:35476->127.0.0.1:27017: write: broken pipe
2018-05-20T07:45:13.676-0300    imported 0 documents

Para contornar esse erro, foi usado o script Ruby split_geojson.rb para dividir o arquivo br.geojson em vários arquivos, um para cada feição, na pasta br, usando o comando:

ruby split_geojson.rb br.geojson

Para importar os 117.403 arquivos, um para cada linha do arquivo original br.txt (exceto o título), criados na pasta br pelo programa split_geojson.rb, foi executado o script mongoimport.sh mostrado abaixo:

#!/bin/bash
for filename in br/*;
do
mongoimport \
    --stopOnError \
    --db reficio \
    --collection gnsbr \
    --file $filename
done

8.5.5 – Exemplo de consulta a dados da coleção gnsbr

> use reficio;
switched to db reficio
> db.gnsbr.count();
117403
> db.gnsbr.find(
...     {'features.properties.FULL_NAME_RO' : RegExp("^Aeroporto Santos")}
... ).pretty();
{
        "_id" : ObjectId("5b016fc95bdefb0ac3e42d08"),
        "type" : "FeatureCollection",
        "features" : [
                {
                        "type" : "Feature",
                        "properties" : {
                                "RC" : "1",
                                "UFI" : "10873756",
                                "UNI" : "11856851",
                                "DMS_LAT" : "22:54:22S",
                                "DMS_LONG" : "43:09:56W",
                                "MGRS" : "23KPQ8813865690",
                                "JOG" : "SF23-12",
                                "FC" : "S",
                                "DSG" : "AIRP",
                                "PC" : "",
                                "CC1" : "BR",
                                "ADM1" : "21",
                                "POP" : "",
                                "ELEV" : "",
                                "CC2" : "",
                                "NT" : "D",
                                "LC" : "por",
                                "SHORT_FORM" : "",
                                "GENERIC" : "Aeroporto",
                                "SORT_NAME_RO" : "AEROPORTOSANTOSDUMONT",
                                "FULL_NAME_RO" : "Aeroporto Santos Dumont",
                                "FULL_NAME_ND_RO" : "Aeroporto Santos Dumont",
                                "SORT_NAME_RG" : "SANTOSDUMONT AEROPORTO",
                                "FULL_NAME_RG" : "Santos Dumont, Aeroporto",
                                "FULL_NAME_ND_RG" : "Santos Dumont, Aeroporto",
                                "NOTE" : "",
                                "MODIFY_DATE" : "2010-08-25",
                                "DISPLAY" : "1,2",
                                "NAME_RANK" : "1",
                                "NAME_LINK" : "",
                                "TRANSL_CD" : "",
                                "NM_MODIFY_DATE" : "2012-11-07",
                                "F_EFCTV_DT" : "",
                                "F_TERM_DT" : ""
                        },
                        "geometry" : {
                                "type" : "Point",
                                "coordinates" : [
                                        -43.165664,
                                        -22.90621
                                ]
                        }
                }
        ]
}
>

8.5.6 Vendo os aeroportos do Brasil no mapa

Para ver os aeroportos brasileiros no mapa, foi criado o script gnsbr_airports.py em Python, que gera o arquvo GPX (GPS eXchange Format) gnsbr_airports.gpx. O mapa está mostrado abaixo no OpenStreetMap.

8. Dados externos