Script usado no spell check do mapa OSM

Como solicitado na lista talk-br e prometido por mim, segue abaixo o script que fiz para permitir rodar o spell check nos mapas OSM.

Primeiro lembro que este NÃO é um script de spell check automático.

O procedimento é o seguinte :

  1. De posse do arquivo brazil-latest, baixado do site download.geofabrik.de, roda-se o update com o osmupdate;

  2. Gera-se um arquivo “entrada.osm” com um subconjunto dos dados acima usando o osmosis. Faço isso porque o arquivo brasil.osm é muito grande, e um spell check demoraria dias, alem disso quanto mais tempo fico sem fazer o upload, maior a possibilidade de alguem ter alterado alguma das vias e na hora do upload aparecer um conflito;

    A cada vez que rodo o script eu altero o conteúdo da opção "–tf accept-ways highway=motorway_link,trunk_link,primary_link,secondary_link,tertiary_link ", no caso do exemplo, estou filtrando somente os highways do tipo *_link.
    Nas ocasiões anteriores setei o filtro para highway=primary, highway=residential, e por aí vai.

  3. Abro o arquivo gerado no aspell, um spell check para linux ( uso o Ubuntu ), no modo interativo.

    Aqui é que acontece o spell check, tenho o cuidado de não usar a opção “replace all”, exatamente para minimizar as possibilidades de alterações indiscriminadas e que comprometam os dados do mapa.

  4. Após o aspell, gero um arquivo de mudanças ( osc ) com o osmosis, utilizando os arquivos de entrada e de saída do aspell

  5. Agora é só fatiar o arquivo ( ./split.py ), e fazer o upload ( upload.py ).

O fatiamento ajuda no upload, ao dividir o trabalho em várias partes, até porque a API do osm limita a quantidade de elementos num upload, se não me engano no máximo 5000.
Fatio o arquivo em pedaços de 5 elementos cada.

  1. O último passo é fechar o changeset gerado, com o close.py

Obs.: o close.py que uso foi ligeiramente alterado para permitir receber como parâmetro o usuário e a senha, a versão original solicitava interativamente, o que inviabilizava o uso num script.

Espero que seja útil, e que ajude a dirimir as dúvidas.

Att,

Marcelo Pereira

#!/bin/bash

echo #########################################
echo  ... atualizando o brasil.osm ...
echo #########################################

./osmupdate ./mapa_brasil/brasil.osm ./mapa_brasil/new_brasil.osm  -B=./boundaries/brazil.poly

	if [ -a "./mapa_brasil/new_brasil.osm" ]; then 
		 rm ./mapa_brasil/old_brasil.osm
		 mv ./mapa_brasil/brasil.osm ./mapa_brasil/old_brasil.osm
		 mv ./mapa_brasil/new_brasil.osm ./mapa_brasil/brasil.osm
	fi

echo #########################################
echo  ... gerando o arquivo entrada ...
echo #########################################


osmosis \
--read-xml ./mapa_brasil/brasil.osm \
--tf accept-ways highway=motorway_link,trunk_link,primary_link,secondary_link,tertiary_link \
--tf accept-ways name=* \
--tf reject-relations \
--tf reject-nodes \
--write-xml ./fixing/entrada.osm

echo #########################################
echo  ... rodando o aspell ...
echo #########################################

aspell -d pt_BR -c ./fixing/entrada.osm

read -p "press [enter] to continue"

echo #########################################
echo  ... gerando o osc ...
echo #########################################

osmosis  \
--read-xml file="./fixing/entrada.osm" --buffer \
--read-xml file="./fixing/entrada.osm.bak" --buffer \
--derive-change  \
--write-xml-change file="./fixing/br_mudou.osc"


	input="./fixing/br_mudou"

	ident="-u trevorinserts -p *******"

	comment="rodando spell check nos mapas OSM"

	parts=$(echo "scale=0; (`tr -s ' ' '\n' < $input.osc | grep "changeset" | wc -l`/5)+1" | bc -l)

	echo "$comment" > $input.comment

echo #########################################
echo  ... dividindo o osc ...
echo #########################################


	./split.py "$input.osc" $parts || exit -1

	chgset=`./upload.py $ident -c yes -n -t "$input.osc"`
	[ -z "$chgset" ] && exit -1

	./set-changeset-tag.py $chgset $ident import yes reviewed yes source "Knowledge"

echo #########################################
echo  ... fazendo upload das parts  ...
echo #########################################

	for num in `seq 1 $parts`; do

		./upload.py $ident -c yes "$input-part$num.osc" -s $chgset -t || exit -1

		echo $chgset

	done
	
	rm $input-part*

echo #########################################
echo  ... fechando o changeset
echo #########################################

	./close.py $chgset $ident