Skip to content

Suavização de traçados sem perda de histórico

2013/10/17

Frequentemente, encontramos regiões em que o traçado das coisas no mapa está feito de maneira grosseira. Isso acontece por vários motivos, mas o mais comum é a fonte dos dados não ser detalhada. Por exemplo, pode ser uma imagem de satélite muito velha, de antes da época que o Bing permitia usar as imagens deles para os traçados, ou fontes primordiais importadas pelos primeiros usuários.

Nosso primeiro impulso freqüentemente é simplesmente deletar o traçado antigo e fazer um novo. No entanto, isso traz vários problemas:

  • – O histórico de alterações é perdido (isso é um desrespeito com os outros contribuidores);
  • – Informações contidas em nós específicos serão perdidas.
  • – Alta probabilidade de quebrar uma relation ou mais, especialmente em traçados muito longos.

Depois de trabalhar bastantes casos desse tipo, cheguei a um procedimento que considero bom (se discorda, deixa um comentário…), e que elimina esses problemas. Descrevo adiante os passos, que usei como exemplo no retraçado de uma pequena parte do reservatório da Usina Hidroelétrica de São Simão, em Goiás, no Brasil (só desenho coisas no Brasil, diga-se de passagem). Neste caso, o traçado era obsoleto porque foi traçado a partir de uma imagem muito, muito velha (LandSat de baixa resolução). Eis o contorno original, grosseiro, da parte que será trabalhada.

Contorno grosseiro

Contorno grosseiro

Notem que os poucos nós existentes estão ou dentro de terra firme, ou no meio da água, pela imprecisão original. O primeiro passo é ajustar esses nós para um ponto exatamente sobre a margem do reservatório (mas poderia ser “para dentro da via” no caso de uma rodovia, etc.). Abaixo, um exemplo do antes e do depois do ajuste:

Antes do Ajuste

Antes do Ajuste

Depois do ajuste

Depois do ajuste

Depois de ajustar todos os nós, vai ficar mais ou menos assim:

Todos os nós ajustados

Todos os nós ajustados

O segundo passo é traçar, a partir de qualquer uma das extremidades do trecho que queremos trabalhar, o novo traçado, detalhado. O detalhe mais importante é reaproveitar os nós antigos, especialmente o inicial e o final do traçado antigo. Se em algum ponto do traçado novo ele cruzar o antigo, você pode ou não criar um nó lá, especialmente se for um ponto de inflexão da curva.

Margem detalhada

Margem detalhada

Reutilizando nós antigos

Reutilizando nós antigos

No final, vão ficar dois traçados, o antigo e o novo.

Traçado detalhado completo

Traçado detalhado completo

Agora, o terceiro passo é executar a quebra e a combinação da via antiga sem perder os dados históricos. O JOSM trabalha no esquema de que quando particionamos uma via, o ID original dela é mantido no segmento que está no início da seqüencia de nós até o ponto do primeiro particionamento. Se notar, todas as vias tem umas flechinhas minúsculas apontando o próximo nó. O que nos interessa, portanto, é manter o ponto inicial da via fora ou no início da área que estamos retrabalhando.

Sentido da margem

Sentido da margem

O quarto passo é particionar a via antiga no ponto em que a via retrabalhada inicia-se e termina, isolando o trecho antigo na parte retrabalhada. Na imagem acima, notamos que o trecho trabalhado está dentro da parte inicial da via, portanto, se particionarmos aqui, a parte que manterá o histórico será justamente a que deletaremos no final, e isso não é desejado. Entra aí um pequeno truque, que é reverter a via, particionar ela e reverter novamente só o pedaço na área trabalhada. Note também que neste exemplo, a via retrabalhada começa no final de um outro particionamento do multipolygon, por isso apenas um corte terá que ser feito. Depois de cortar, verifique o histórico do trecho que ficou fora da parte trabalhada. Se não houver histórico (e havia antes), o corte foi feito com a via no sentido errado e basta desfazer e tentar novamente. Confirmado isso, delete o trecho antigo na parte retrabalhada.

Margem grosseira cortada

Margem grosseira cortada

No momento que o trecho antigo for deletado, se houver uma relation na via, um aviso será emitido. Você pode remover confirmar a remoção (ela será re-adicionada na combinação final).

Exclusão de item

Exclusão de item

Depois de deletado vai ficar assim:

Somente o novo traçado

Somente o novo traçado

O quinto passo é recombinar a via retrabalhada com o que sobrou da antiga via. Para isso basta selecionar as partes e pressionar “C” para Combinar as vias. Novamente, um aviso de relation será emitido.

Relation na combinação

Relation na combinação

Notar que se eram três pedaços a combinar (dois antigos e um novo), haverá uma linha com “Keep” e outra com “Remove”. É assim mesmo, porque no final nestes casos a via somente pode participar uma vez na relação.

O resultado final ficará como abaixo:

Resultado final

Resultado final

Daí é só começar tudo de novo com outro trecho…

Finalmente, só um pequeno adendo sobre o tagueamento da relação e das vias. Diz a documentação que os tagueamentos que pertencem a todos os membros de uma relation devem estar na relation e não nos itens. Isso não é obrigatório, mas recomendado. Tem vantagens e desvantagens.

  • – Desvantagem: Uma via sem tagueamento porque suas propriedades estão na relation vai falhar no validador do JOSM com “untagged way”;
  • – Vantagem: Uma via aberta, parte de multipolygon, tagueada com chaves de área (por exemplo, natural=water) vai falhar no validador com “area style way is not closed”;
  • – Desvantagem: Uma via destagueada pode ficar “esquisita” em alguns editores, mesmo estando totalmente correta;
  • – Vantagem: Menor possibilidade de conflitos entre as tags de partes da relation e da relation em si.
  • – Desvantagem: Chave layer não é validada dentro da relação, somente nos membros. A chave “layer” deve ser usada o menos possível, mas ainda assim isso significa “muitas vezes” no caso de hidrografia.

Prevendo que usuários desavisados podem querer “corrigir” problemas inexistentes desse tipo, especialmente os que usam editores menos avançados como o Potlatch 2, eu mantenho tags como o nome nos membros e na relation em si, e tags específicas da relation, na relation mesmo. Assim, neste caso, as vias ficaram com o tagueamento:

Tags das vias

Tags das vias

  • – layer=-1 para evitar problemas de cruzamento com vias e para evitar o problema de validação desses cruzamentos quando a layer está na relation.
  • – name=* para haver uma tag não específica de área e evitar o problema de validação de vias sem chaves
  • – source=Bing para reconhecer a contribuição que é emprestar zilhões de imagens de satélite que certamente custaram bem caro, sem cobrar nada. E porque a fonte pode (e é) diferente em partes diferentes (era LandSat na parte antiga).

Bom, é isso. Se alguém tem alguma forma mais interessante ou problema, peço que deixe um comentário.

 

 

 

From → Mapeamento

Leave a Comment

Leave a comment