/ Tecnologia / Integração do … / 8.6 Dados do …

8.6 Dados do NGA GEOnet Names Server (GNS)

MongoDB

Página do banco de dados geográficos NGA GEOnet Names Server (GNS)
Página do banco de dados geográficos 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. O GNS não contém nenhum dado para os Estados Unidos da América ou suas áreas dependentes.

8.6.1 – Download de dados do GNS

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 contendo os dados para o Brasil, br.zip, pode ser 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, ou se copiando o endereço do link e utilizando o programa wget.

$ wget https://geonames.nga.mil/gns/html/cntyfile/br.zip
--2020-11-05 07:44:10--  https://geonames.nga.mil/gns/html/cntyfile/br.zip
Resolvendo geonames.nga.mil (geonames.nga.mil)... 214.37.41.76
Conectando-se a geonames.nga.mil (geonames.nga.mil)|214.37.41.76|:443... conectado.
A requisição HTTP foi enviada, aguardando resposta... 200 OK
Tamanho: 14909263 (14M) [application/x-zip-compressed]
Salvando em: “br.zip”

br.zip              100%[===================>]  14,22M   603KB/s    em 29s     

2020-11-05 07:44:42 (501 KB/s) - “br.zip” salvo [14909263/14909263]

Ao se descompactar o arquivo br.zip são extraídos os arquivos mostrados abaixo:

$ 7z l br.zip 

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=pt_BR.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs AMD FX(tm)-4300 Quad-Core Processor             (600F20),ASM,AES-NI)

Scanning the drive for archives:
1 file, 14909263 bytes (15 MiB)

Listing archive: br.zip

--
Path = br.zip
Type = zip
Physical Size = 14909263

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2020-10-30 11:18:12 .....     33079378      7527151  br.txt
2020-10-30 11:18:36 .....      3142247       503905  br_administrative_a.txt
2020-10-30 11:18:40 .....      8563509      2024245  br_hydrographic_h.txt
2020-10-30 11:18:46 .....       855471       204592  br_localities_l.txt
2020-10-30 11:18:48 .....     13977403      3111801  br_populatedplaces_p.txt
2020-10-30 11:19:00 .....         6955         2205  br_transportation_r.txt
2020-10-30 11:19:00 .....      4058194       926639  br_spot_s.txt
2020-10-30 11:19:02 .....      2469229       605005  br_hypsographic_t.txt
2020-10-30 11:19:04 .....         8316         2227  br_vegetation_v.txt
2020-10-30 11:19:04 .....          297          179  br_disclaimer.txt
------------------- ----- ------------ ------------  ------------------------
2020-10-30 11:19:04           66160999     14907949  10 files
8.6.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 GDAL ogr2ogr, 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.6.3 – Criação de uma coleção no MongoDB para receber os dados do GNS

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

$ mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("357d649e-0b53-41ea-83fe-96761ec61706") }
MongoDB server version: 4.4.1
> // Usar o banco de dados reficio
> use reficio;
switched to db reficio
> // Se a coleção gnsbr tiver documentos estes serão apagados
> db.getCollection("gnsbr").drop();
false
> // Criar a coleção gnsbr
> db.createCollection("gnsbr", {}, { collation: { locale: "pt", strength: 1 } } );
{ "ok" : 1 }
> // Mostrar as informações sobre a coleção
> db.getCollectionInfos({ name: "gnsbr" })
[
	{
		"name" : "gnsbr",
		"type" : "collection",
		"options" : {
			
		},
		"info" : {
			"readOnly" : false,
			"uuid" : UUID("bc8b529a-123b-4ee5-a89c-7496ea181d51")
		},
		"idIndex" : {
			"v" : 2,
			"key" : {
				"_id" : 1
			},
			"name" : "_id_"
		}
	}
]
> 
8.6.4 – Importação dos dados

O arquivo br.geojson gerado pelo ogr2ogr tem o tamanho de 107MB, maior que os 16MB permitido pelo MongoDB para um documento. Então, ao tentar importar o arquivo ocorre um erro, como mostrado abaixo:

$ mongoimport \
>     --stopOnError \
>     --db reficio \
>     --collection gnsbr \
>     --file br.geojson
2020-10-22T11:28:11.923-0300    connected to: mongodb://localhost/
2020-10-22T11:28:14.923-0300    [########################] reficio.gnsbr        107MB/107MB (100.0%)
2020-10-22T11:28:17.923-0300    [########################] reficio.gnsbr        107MB/107MB (100.0%)
2020-10-22T11:28:20.923-0300    [########################] reficio.gnsbr        107MB/107MB (100.0%)
2020-10-22T11:28:23.923-0300    [########################] reficio.gnsbr        107MB/107MB (100.0%)
2020-10-22T11:28:26.923-0300    [########################] reficio.gnsbr        107MB/107MB (100.0%)
2020-10-22T11:28:28.394-0300    [########################] reficio.gnsbr        107MB/107MB (100.0%)
2020-10-22T11:28:28.394-0300    Failed: an inserted document is too large
2020-10-22T11:28:28.394-0300    0 document(s) imported successfully. 0 document(s) failed to import.

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

$ ruby split_geojson.rb br.geojson

Para importar os 138.844 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 brimport.sh mostrado abaixo:

#!/bin/bash
for filename in br/*;
do
mongoimport \
    --stopOnError \
    --db reficio \
    --collection gnsbr \
    --file $filename
done
8.6.5 – Exemplo de consulta a dados da coleção gnsbr
$ mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("0d88e0fb-4d95-4df2-ad04-34c003e7accc") }
MongoDB server version: 4.4.1
> // Usar o banco de dados reficio     
> use reficio;
switched to db reficio
> // Número de documentos na coleção gnsbr
> db.gnsbr.count();
138844
> // Dados do Aeroporto Santos Dumont
> db.gnsbr.find(
...     {'features.properties.FULL_NAME_RO' : RegExp("^Aeroporto Santos")}
... ).pretty();
{
        "_id" : ObjectId("5f91a2adc36727b3f872eda2"),
        "type" : "FeatureCollection",
        "features" : [
                {
                        "type" : "Feature",
                        "properties" : {
                                "RC" : "1",
                                "UFI" : "10873756",
                                "UNI" : "11856851",
                                "DMS_LAT" : "22:54:35S",
                                "DMS_LONG" : "43:09:53W",
                                "MGRS" : "23KPQ8823865286",
                                "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" : "AEROPORTOSANTOSDUMONT",
                                "FULL_NAME_RG" : "Aeroporto Santos Dumont",
                                "FULL_NAME_ND_RG" : "Aeroporto Santos Dumont",
                                "NOTE" : "",
                                "MODIFY_DATE" : "2018-10-30",
                                "DISPLAY" : "1,2",
                                "NAME_RANK" : "1",
                                "NAME_LINK" : "",
                                "TRANSL_CD" : "",
                                "NM_MODIFY_DATE" : "2018-10-30",
                                "F_EFCTV_DT" : "",
                                "F_TERM_DT" : ""
                        },
                        "geometry" : {
                                "type" : "Point",
                                "coordinates" : [
                                        -43.16464,
                                        -22.909852
                                ]
                        }
                }
        ]
}
> 
8.6.6 Mostrar os aeroportos do Brasil no mapa

Para mostrar os aeroportos brasileiros no mapa, desenvolvido o programa gnsbr_airports.py em Python. Este programa gerou o arquivo no formato GeoJSON usado para mostrar o mapa abaixo.