User:FranciscoDS/Importação da CAOP

From OpenStreetMap Wiki
Jump to navigation Jump to search

O objetivo é fazer a importação e a manutenção dos limites administrativos de Portugal (Portugal continental e as regiões autônomas). Os limites são disponibilizados em formato digital pelo IGP (Instituto Geográfico Português) em http://www.igeo.pt/ e são de uso livre o que foi confirmado em Dezembro de 2010. É importante tomar em conta o problema da manutenção para que ela seja feita de maneira automática (ou quase automática) dado que o IGP disponibiliza novos limites todos os anos com possível alterações.

Dados CAOP

Os ficheiros da CAOP (Carta Administrativa Oficial de Portugal) são disponibilizado pelo IGP em formato Shapefile :

  • 1 ficheiro para Portugal continental
  • 1 ficheiro para as ilhas da Madeira
  • 3 ficheiros para as ilhas dos Açores (1 ficheiro para cada grupo : ocidental, central, oriental)

Os ficheiros existem em 2 variantes :

  • polígono
  • linha

No OSM os limites administrativos são integrados na forma de linhas (way) agrupados em relações (relation). Mesmo se parece ser uma boa ideia usar os ficheiros linhas esses não possuem as mesmas informações que os ficheiros polígonos, tipicamente cada linha tem nos seus atributos o nome da freguesia do seu lado direito e do seu lado esquerdo más, ao contrario de um polígono, não tem nenhuma informação sobre os concelhos nem os distritos a que pertence.

O ficheiro polígono contem cada polígono de cada freguesias e vários atributos dos quais os mais importantes são os seguintes :

  • FREGUESIA : nome da freguesia
  • MUNICIPIO : nome do concelho incluindo a freguesia
  • DISTRITO : nome do distrito incluindo a freguesia (só para o continente)
  • ILHA : nome da ilha (só para as ilhas da Madeira e dos Açores)
  • DICOFRE : identificação própria da freguesia

Uma freguesia é representada por um ou mais polígonos, há freguesias territorialmente descontinua por exemplo a freguesia de Souto em Santa Maria da Feira (distrito de Aveiro), e há freguesias que incluíam pequenas ilhas por exemplo a freguesia de Ferragudo em Lagoa (distrito de Faro) :

A identificação DICOFRE permite o agrupamento de todos os polígonos nas diversas entidades administrativas, sendo que este código é composto por o ajuntamento de 3 informações :

  • DI = identifica o distrito (nas ilhas dos Açores e da Madeira a noção de distrito não exista, em vez temos a noção da ilha)
  • CO = identifica o concelho
  • FRE = identifica a freguesia

Assim a freguesia de Ferragudo tem 6 polígonos com a identificação DICOFRE="080602", um polígono para o território principal e 5 polígonos para as ilhas. A freguesia de Parchal situado também no conselho de Lagoa (distrito de Faro) tem um DICOFRE="080606" e assim todas as freguesias do conselho de Lagoa começam por "0806". Da mesma forma, todos os conselhos situados no distrito de Faro possuam um DICOFRE que começa por "08".

Todos os nomes (freguesia, concelho, distrito, ilha) estão codificados em ISO-8859 e sempre escritos com letras maiúscula.

Processo de integração

O processo implica a conversão para OSM mais também a manutenção dos dados OSM quando houver alterações nos limites administrativos. Isso quer dizer que o processo deve ser reutilizável, não basta fazer a primeira importação, o processo deve gerir as alterações na CAOP e por isso deve reutilizar os dados anteriores e já existente no OSM para só transmitir as diferencias.

Assim o processo está dividido em 3 fases :

  • converter os dados CAOP em dados OSM
  • comparar com os dados já presente no OSM
  • envio das mudanças para OSM

Cada fase corresponde a um programa Python desenvolvido especificamente para os dados CAOP.

Conversão para OSM

A conversão para OSM implica converter os pontos do Shapefile em node com sistema de referencia espacial WGS84. Cada polígono será divididos em linhas (uma linha é partilhada entre duas entidades administrativas) e transformado em way. Haverá uma relation para cada uma das entidades administrativas.

Relation

As entidades administrativas usam relation do tipo boundary com os tags :

Os membros da relation boundary utilizados são :

  • outer
  • inner

Os outros membros possíveis não serão utilizados e poderão ser acrescentados manualmente se for preciso, com exceção do membro subarea que pessoalmente, devido a controvérsia, não recomendo o seu uso.

Os níveis administrativos já foram definidos em Key:admin_level e, tomando em conta que as regiões ainda não são definidas para o continente, fiquemos assim com os níveis 6, 7, 8 para o continente e os níveis 4, 7, 8 para as regiões autônomas.

O caso das regiões de Portugal encontre-se explicado no wikipedia :

“A Constituição portuguesa de 1976, estabelece que Portugal se divide somente em regiões autônomas (Açores e Madeira) e em regiões administrativas (a serem criadas no continente).

Todas as entidades citadas no parágrafo anterior já foram instituídas em Portugal, à excepção das regiões administrativas, cuja criação está prevista desde a aprovação da Constituição, ou seja, desde 1976. Segundo este documento, enquanto as regiões administrativas não estiverem concretamente instituídas, subsistirá a divisão distrital no espaço por elas não abrangido...

As regiões autônomas dos Açores e da Madeira foram criadas ambas em 1978, o que provocou a abolição dos distritos na área abrangida pelas duas regiões.”

Para notar também que existam regiões no âmbito das entidades NUTS (Nomenclatura Comum das Unidades Territoriais Estatísticas) da União Europeia. Essas regiões só existam para fim estatística e não tem nada a ver com a estrutura administrativa.

O name contem o nome convertido no formato habitual no OSM ou seja :

  • recodificado em UTF8
  • primeira letra de cada palavra em maiúscula, as restantes em minúscula

Way

As linhas dividam duas entidades administrativas e serão convertidas em way com os atributos boundary=administrative e admin_level=* que recebe o valor do nível mais alto da entidade com que este way faz fronteira. Por exemplo um way que divida 2 freguesias e ao mesmo tempo também divida 2 concelhos terá o admin_level de concelho (admin_level 7).

Uma linha poderá vir a ser convertida em 2 ou mais ways, dado que o OSM impõe uma limita de 2000 nodes num só way (definição dos elementos OSM).

Existam duas técnicas diferentes para criar uma limita administrativa quando esta coincida com um elemento físico (como por exemplo uma estrada ou um rio) :

  1. usar na relation o way do elemento físico sem adicionar quaisquer tags administrativos, o way exista com a sua própria função e é só usado pela relation
  2. criar un novo way sobreposto ao elemento físico e partilhando os nodes, um way exista para a função administrativa e outro para a função física.

A primeira técnica implica dividir o elemento físico quando o limite administrativa só lhe correspondam em uma parte (tal como acontece quando uma estrada muda para sentido único). A segunda técnica, separando as funções em 2 ways distintos, parece ser mais fácil para a manutenção dos dados CAOP.

No entanto há um caso onde a primeira técnica seria aconselhável, a linha de costa. O problema é que a linha de costa existente, se calhar modificada por contribuidores baseado nas imagens Bing, tem pouca sorte de ter quaisquer parte em comum com os limites da CAOP. Outra dificuldade é que a linha de costa tem que ser bem orientada, a terra do lado esquerdo, o oceano do lado direito. Fica aqui um assunto para ser desenvolvido : se devemos ou não fazer coincidir a linha de costa com a limita administrativa.

Um ultimo caso para ser resolvidos é o caso da fronteira espanhol, devemos modificar esta fronteira para usar a fronteira definida pela CAOP com um admin_level=2. Mais para evitar quaisquer conflitos seria bom entrar em contacto com a comunidade espanhola antes de fazer alterações na fronteira em grande escala.

Node

Os nodes serão apenas reprojetados em WGS84 e não receberão quaisquer tags. A reprojeção será feita com uma precisão de 7 dígitos usado pelo OSM. Como não é habito ter nodes sobreposto, será reutilizados os nodes já existente no OSM que tiveram a mesma coordenadas (comparação com os dados OSM).

Algoritmo

Para identificar as partes comuns dos polígonos o programa caop_build.py usa a seguinte técnica : cada ponte e cada segmento (ligando 2 pontos) vem-se atribuído uma identificação única, dois pontos são iguais se eles tem as mesmas coordenadas e dois segmentos são iguais se eles usam os mesmo dois pontos. Quando todos os polígonos foram decompostos em segmentos, as linhas são criadas ajuntando todos os segmentos que se seguem e que só tem uma conexão :

CAOP decomposição em segmentos e ajuntamento em linhas.png


A seguir as linhas vão ser simplificadas e cortadas para respeitar os limites da quantidades de node num way. Uma pequena margem foi introduzida para garantir que podemos sempre alterar (adicionando alguns nodes) com os editores OSM.

Uma vez o trabalho com a geometria acabado, o Shapefile vai ser lido uma segunda vez para tratar os atributos : transformação dos nomes e criação das entidades administrativas (freguesia, concelho, distrito ou região).

Cada entidade administrativa vê-se atribuídos as linhas (mais concretamente a identificação numérica das linhas) que fazem parte da sua geometria. As entidades superior (concelhos, distritos, regiões) são construídos por agrupamento de freguesias, as linhas que aparecem duas vezes são removidas dos limites da entidade :

CAOP criação entidade administrativa superior por agrupamento.png


O ultimo trabalho que resta a fazer é verificar as entidades administrativas. As diversas linhas de cada entidade devem formar vários anéis fechados (multi-polígono).

Aqui fazemos a ligação das linhas tal e qual o jogo de domino. Para as entidades superior os vários anéis também tem que ser analisados para detetar os anéis interiores (inner ring = um anel inteiramente incluído noutro), para as freguesias a informação sobre os anéis interiores já esta presente nos polígonos do Shapefile.

No final resta salvaguardar numa base de dados PostgreSQL os pontos (nodes), as linhas (ways) e as entidades administrativas (relations) com todos os tags.

Simplificação das linhas

Nos polígonos há vários pontos a mais como podem ver nas imagens seguintes :

CAOP pontes inúteis numa linha direita.png

CAOP ponto que não participa de maneira significativa.png


Tomando em conta o facto que o OSM usa coordenadas arredondadas a 7 dígitos e possua fontes (Bing, GPS) que tem uma precisão de vários metros, podemos remover alguns pontos da CAOP sem perca notável (assim a base de dados agradece).

O método de simplificação foi escolhido para ser simples e eficaz : numa linha com os pontos que se seguem ABC, se a diferença de ângulo introduzido pelo ponto B é inferior a 10° e se traçando uma linha AC o ponto B fica a menos de 1 metro, o ponto B é removido. Assim ficam protegido os pontos que contribuam uma mudança de direção significativa e os pontos muito distantes das linhas que poderiam os substituir.

Esta simplificação permite ignorar mais ou menos 50% dos pontos, e podemos simplificar ainda mais aumentando os parâmetros, por exemplo com os dados 2011 :

Dados Nodes Simplificado 1m Simplificado 1,5m Simplificado 2m Simplificado 3m Simplificado 4m
Portugal Continental 1 861 650 926 279 -50,2 % 834 977 -55,1 % 783 639 -57,9 % 732 146 -60,7 % 709 148 -61,9 %
Açores 230 507 120 052 -47,9 % 115 644 -49,8 % 113 471 -50,8 % 111 672 -51,6 % 110 972 -51,9 %
Madeira 175 786 87 840 -50,0 % 85 970 -51,1 % 85 216 -51,5 % 84 641 -51,8 % 84 373 -52,0 %

Normalizar os nomes

Os nomes são recodificados em UTF8 e transformado para respeitar o costume no OSM com o seguinte algoritmo :

  • identificação das palavras, as palavras são separadas por : espaço ( ) - /
  • a primeira letra de cada palavra em maiúscula todas as outras em minúscula
  • as preposições ficam sempre em minúscula : de, da, do, das, dos, e, a, o, os, ao, à, d'
  • a preposição d' é colado a palavra seguinte (o espaço depois do d' é removido)

Para ser resolvido, o caso das parentesas nos nomes, o que não é costume no OSM mais são usadas na CAOP com os nomes de algumas das freguesias.

Por exemplo no distrito de Évora, concelho de Vila Viçosa temos as freguesias com nomes de :

  • Vila Viçosa (São Bartolomeu)
  • Vila Viçosa (Conceição)

O wikipedia uso a sintaxe inverso :

Se calhar podemos tirar fora toda a parte "Vila Viçosa" que é implícita (a freguesia faz parte do seu concelho) ou pelo menos usar o nome inteiro sem as parentesas.

Para os arquipélagos usa-se só a parte do nome entre parentesas no atributo ILHA, permitido assim identificar a região autônoma (não precisemos do nome da ilha nos limites administrativos). Por exemplo encontremos no atributo ILHA : Ilha de Porto Santo (Madeira) ou Ilha Terceira (Açores), o nível 4 será criado só com o nome Madeira ou Açores.

Resultado da conversão

Alguns resultados da conversão feito pelo programa caop_build.py com os diversos casos que podemos encontrar em Portugal.

Um exemplo de freguesias com enclave e exclave : a freguesia de Souto e a freguesia de Travanca ambos no concelho de Santa Maria da Feira, distrito de Aveiro :

CAOP freguesia Travanca e Souto.png


A freguesia de Vila Viçosa (São Bartolomeu) no município de Vila Viçosa (distrito de Évora) é um enclave de Vila Viçosa (Conceição) :

CAOP freguesia São Bartolomeu e Conceição.png


A freguesia de Bordeira no concelho de Aljezur distrito de Faro tem um numero elevado de nodes na parte costeira resultando em dois ways :

CAOP freguesia Bordeira com muitos nodes.png


A freguesia de Estremoz (Santa Maria) no concelho de Estremoz distrito de Évora, caso único em Portugal, esta freguesia tem um enclave a freguesia de Estremoz (Santo André) que tem ele mesmo um enclave que funciona como exclave da freguesia de Estremoz (Santa Maria) :

CAOP freguesia Santa Maria e Santo André enclave contra-enclave em Estremoz.png Santa Maria (Estremoz)


O concelho de Soure distrito de Coimbra tem dois exclave :

CAOP município de Soure.png Soure


O concelho de Montemor-o-velho distrito de Coimbra, único município com um enclave :

CAOP município de Montemor-o-Velho tem um enclave.png Montemor-o-Velho


O distrito de Viseu, caso único em Portugal de um distrito com um enclave :

CAOP distrito de Viseu com um enclave.png Distrito Viseu


Ainda há mais casos de freguesias, municípios, distrito discontínuos, vejam no wikipedia :

Anomalias

Os dados CAOP também podem ter erros, aqui fica umas interrogações que precisam ser verificadas ou discutidas.

Freguesia de Cumeeira no concelho de Penela (distrito de Coimbra) parece ter um erro no nome, o nome certo seria Cumieira :

No distrito de Aveiro, concelho de Santa Maria da Feira, a freguesia de Louredo tem 2 polígonos na CAOP e 3 na carta IGEOE encanto a freguesia de Vale tem 3 polígonos na CAOP e 2 na carta IGEOE :

Na ilha do Corvo o concelho de Corvo é o único concelho sem freguesia, a conversão dos dados CAOP cria sempre uma freguesia (na CAOP esta ilha é apresentada como uma freguesia), será que devemos apaga-la ?

Comparação com os dados OSM

Esta parte está para ser desenvolvido.

Descarregamento para OSM

O programa caop_upload.py permite o envio ao servidor OSM com a conta CAOPbot.

Este programa uso o resultado da comparação com os dados OSM e envia cada criação ou alteração de objetos de maneira automática. Os changesets são criados com um máximo de 20000 objetos, muita abaixo do limite de 50000 imposto pelo API. Para não saturar o servidor, o envio é feito a medida de 1 objeto por segundo.

A importação completa dos dados de Portugal, Madeira e Açores (baseado nos números com a simplificação de 1 metro), deve assim demorar no mínimo 13 dias.