Importar moradas no INE
Posted by Jorge Gustavo Rocha on 7 March 2021 in Portuguese (Português). Last updated on 8 March 2021.O INE disponibiliza um conjunto de moradas relativas a alojamentos, no formato ATOM
O serviço é apenas um índice. O serviço em si divide-se em partes:
Dentro de cada índice, há dois links para cada município com a mesma informação: um no sistema de coordenadas Portuguesas EPSG:3763 e outro em Europeias ETRS:4258.
Por exemplo, para o meu município, Ílhavo, terei que usar o índice da zona centro e descarregar:
wget http://inspire.ine.pt/AD/atom/gml/Addresses_0110_EPSG3763.zip
Não é fácil ler e transformar o GML em algo usável num editor de OSM. Mas como é um processo automatizável, aqui fica a descrição do processo. O que aqui fiz para Ílhavo, pode ser feito para qualquer outro concelho. Pode ser feito na linha de comandos. Vou usar o QGIS só para visualizar os dados.
Estou a utilizar o GDAL e uma base de dados PostgreSQL com Postgis.
Descompactar.
unzip Addresses_0110_EPSG3763.zip
Inserir o GML em base de dados (num schema ilhavo)
https://wiki.openstreetmap.org/wiki/Tag:GML_ATTRIBUTES_TO_OGR_FIELDS=YES https://wiki.openstreetmap.org/wiki/Tag:GML_SKIP_RESOLVE_ELEMS=NONE ogr2ogr -f PostgreSQL https://wiki.openstreetmap.org/wiki/Tag:PG:'service=osm https://wiki.openstreetmap.org/wiki/Tag:schemas=ilhavo' GMLAS:Addresses_0110_EPSG3763.gml -nlt CONVERT_TO_LINEAR
Na base de dados, transformar as inúmeros tabelas numa única com as moradas e respetivos atributos.
create table ilhavo.moradas as
with designator as (
select al.parent_ogr_pkid, json_object_agg(regexp_replace(ld.locatordesignator_type_href, 'http://inspire.ec.europa.eu/codelist/LocatorDesignatorTypeValue/(.*)Identifier', '\1'), ld.locatordesignator_designator) as designator
from ilhavo.address_locator al, ilhavo.address_locator_addresslocator_designator ld
where al.ogr_pkid = ld.parent_ogr_pkid
group by al.parent_ogr_pkid, ld.parent_ogr_pkid),
position as (select ap.parent_ogr_pkid, ap.geographicposition_geometry
from ilhavo.address_position ap),
postcode as (select parent_ogr_pkid, pd.postcode
from ilhavo.address_component ac
left join ilhavo.postaldescriptor pd on ac.href_postaldescriptor_pkid = pd.ogr_pkid
where href_postaldescriptor_pkid is not null),
toponimo as ( with tfnp as (select parent_ogr_pkid, json_object_agg( regexp_replace(partofname_type_href , 'http://inspire.ec.europa.eu/codelist/PartTypeValue/(.*)', '\1'), partofname_part) as partofname
from ilhavo.thoroughfarename_ad_name_thoroughfarenamevalue_nameparts
group by parent_ogr_pkid)
select ac.parent_ogr_pkid, tfnp.partofname
from ilhavo.address_component ac
left join ilhavo.thoroughfarename tf on ac.href_thoroughfarename_pkid = tf.ogr_pkid
left join ilhavo.thoroughfarename_ad_name tfn on tf.ogr_pkid = tfn.parent_ogr_pkid
left join tfnp on tfnp.parent_ogr_pkid = tfn.ogr_pkid
where href_thoroughfarename_pkid is not null)
select a.ogr_pkid, p.geographicposition_geometry, d.designator->>'building' as numero, d.designator->>'floor' as piso, d.designator->>'unit' as fracao, t.partofname->>'name' as toponimo, t.partofname->>'type' as tipo, pc.postcode
from ilhavo.address a, position p, designator d, toponimo t, postcode pc
where a.ogr_pkid = p.parent_ogr_pkid
and a.ogr_pkid = d.parent_ogr_pkid
and a.ogr_pkid = pc.parent_ogr_pkid
and a.ogr_pkid = t.parent_ogr_pkid;
ALTER TABLE ilhavo.moradas ADD CONSTRAINT moradas_pk PRIMARY KEY (ogr_pkid);
Depois de criada a tabela, exportar a mesma para uma shapefile.
ogr2ogr -f "ESRI Shapefile" ilhavo.shp PG:"https://wiki.openstreetmap.org/wiki/Tag:service=osm" "ilhavo.moradas"
E já temos uma shapefile de endereços de alojamentos pronta a usar!
Se for uma moradia (um ponto de entrega corresponde a um endereço):
Se for um prédio (um ponto de entrega corresponde a múltiplos alojamentos e há pisos e frações nos endereços):
No QGIS pode-se trabalhar a simbologia para as moradas aparecem claras (e com o número de moradas para cada ponto de entrega do correio).
No JOSM, basta arrastar para lá shapefile e fica-se com as mesmas à disposição para editar.
Deixo três exemplos:
- Ílhavo, com cerca de 22k alojamentos
- Águeda, com cerca de 22k alojamentos
- Braga, com cerca de 86k alojamentos
Discussion
Comment from luisforte on 8 March 2021 at 00:55
Uma ajuda excelente que permite rapidamente converter a confusão do gml numa tabela sumária! As instruções, mesmo estando sumárias, executam na perfeição. Ajustando depois detalhes, como DISTINCT ON (tipo,toponimo,numero) que eliminará diversas repetições, aplicar initcap nos nomes, conversão do tipo e correção de nomes abreviados e ficam os dados preparados para conflação.
Comment from apires on 8 March 2021 at 08:54
Uma boa ajuda! (no início o link “Norte” está a apontar para o “Centro”).
Comment from Jorge Gustavo Rocha on 8 March 2021 at 09:25
Obrigado, Aurélio. Link corrigido!
Comment from Jorge Gustavo Rocha on 8 March 2021 at 10:51
Obrigado pelos comentários. Editei a entrada e acrescentei três concelhos para testarem. O de Braga já é grandinho… tem 86008 endereços.