Importação da CAOP/Transformação dos dados

From OpenStreetMap Wiki
Jump to navigation Jump to search

O programa caop_build.py faz a conversão do shapefile em objetos compatível OSM. O resultado da conversão é guardada numa base de dados local.

Funcionamento

A conversão no formato OSM implica as operações seguintes :

  • transformar os pontos para ser node compatível
  • converter os polígonos em linhas e identificar as linhas em comum
  • simplificar e fazer que essas linhas sejam way compatível
  • converter os nomes
  • construir os diferentes níveis administrativos
  • salvaguardar os objetos criados numa base de dados local

Transformação dos pontos

Os pontos são reprojetados em WGS84 e arredondado a 9 decimais. O programa usa 9 decimais mais os pontos ficaram salvaguardados na base de dados final com 7 decimais (OSM compatível).

Cada ponte receba uma identificação única, dois pontos são iguais se eles tem as mesmas coordenadas WGS84.

Identificar as linhas em comum

Para identificar as partes comuns dos polígonos o programa usa a seguinte técnica : cada segmento (ligando 2 pontos) vê-se atribuído uma identificação única, 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

Simplificação das linhas

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 por exemplo) com os editores OSM. Foi escolhido um limite de 1950 nodes por way.

Na simplificação os vários pontos a mais e os pontos não significativos serão removidos 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 é baseado num Douglas-Peucker com uma pequena diferença : os pontos que introduzam uma diferença de ângulo >40° são considerados significativos e são de facto guardados. Foi considerado que um ponto não é significativo se, quando removido, fica a menos de dois metros da linha traçado sem ele. Qualquer que seja o ângulo, um ponto é sempre removido se ele fica situado a menos de 30cm da linha traçado sem ele.

Esta simplificação permite ignorar mais de 60% dos pontos, e podemos simplificar ainda mais aumentando os parâmetros, por exemplo com os dados 2012 :

Dados 2012 Pontos Após simplificação
Portugal Continental 1 866 234 681 512 -63,5 %
Açores 230 507 71 707 -68,9 %
Madeira 175 786 46 426 -73,6 %

Com o facto de preservar os pontos que participam de maneira significativa na curva da forma geométrica (grande ângulos), ficam algumas situações para corrigir : pontos formando um Z e pontos formando um V.

Um Z é simplificado quando as pernas ficam a menos de 6 metros. CAOP simplificação pontos em Z.png

Um V é simplificado quando o bico não é muito alto (inferior a 1.9 metros). CAOP simplificação pontos em V.png

Cada linha simplificada também passe um teste de coerência : uma linha nunca deve cruzar-se.

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).

Normalização dos nomes

Os nomes são recodificados em UTF8 e transformado com o seguinte algoritmo :

  • identificação de cada 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)

No caso dos arquipélagos guardamos só a parte do nome entre ( ) do atributo ILHA, não precisemos do nome da ilha, só guardamos o nome da região autônoma nos limites administrativos. Por exemplo quando 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.

Criação hierarquia administrativa

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 (com ajuda do atributo DICOFRE), as linhas que aparecem duas vezes são removidas dos limites da entidade :

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


A seguir as diversas linhas de cada entidade são verificadas, elas devem formar vários anéis fechados. Fazemos a ligação das linhas tal e qual o jogo de domino até encontrar todos os anéis, depois detetamos os anéis interiores e exteriores (inner ring = um anel inteiramente incluído noutro), acabando assim a construção de um multi-polígono.

Integração na base de dados local

No final os pontos (nodes), as linhas (ways) e as entidades administrativas (relations) com todos os tags são salvaguardados numa base de dados PostgreSQL num schema muito parecido com o schema osmosis (pgsimpl).

Todos os objetos recebam nesta base de dados um id único e negativo. Os tags obrigatórios boundary=administrative, admin_level=*, etc... são definidos no processo de envio a base de dados, os ways recebam assim o admin_level da entidade administrativa mais alta na qual eles pertencem.

A bounding box das entidades administrativas também fica guardada na tabela das relations.

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 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 :