Pessoal,
Usando os dados fornecidos pelo Hermann Pfeifer, fiz um programa em Python pra encontrar ruas com nomes parecidos no CNEFE a partir dos nomes de rua no OSM. O objetivo é ter uma segunda fonte de dados com que comparar.
Mas só cuidado: CNEFE pode estar errado. A idéia é ajudar o mapeador a orientar o seu trabalho, começando por coisas que estão provavelmente erradas. Como é um algoritmo de comparação, ele acaba mostrando também onde o CNEFE está provavelmente errado.
Eu acabei fazendo o seguinte programa em Python:
import Levenshtein
import csv
import sys
filtro_cidades = False
cidades = set([4314902])
arq_saida = 'comparacao_ruas_osm_cnefe.txt'
ruas_cidade_cnefe = {}
comparacao = []
cnefe_file = open('municipio_cep_RUA_CNEFE.txt')
for cidade, cep, rua in csv.reader(cnefe_file, dialect="excel-tab"):
cidade = int(cidade)
if cidade not in ruas_cidade_cnefe:
ruas_cidade_cnefe[cidade] = set([rua])
else:
ruas_cidade_cnefe[cidade].add(rua)
print 'Comparando...'
osm_file = open('municipio_rua_RUA_OSM.txt')
for cidade, x, rua_osm in csv.reader(osm_file, dialect="excel-tab"):
cidade = int(cidade)
if not filtro_cidades or cidade in cidades:
menor_distancia = 100000
opcoes_cnefe = set([])
for rua_cnefe in ruas_cidade_cnefe[cidade]:
distancia = Levenshtein.distance(rua_osm, rua_cnefe)
if distancia < menor_distancia:
menor_distancia = distancia
opcoes_cnefe = set([ rua_cnefe ])
if distancia == menor_distancia:
opcoes_cnefe.add(rua_cnefe)
if menor_distancia > 0:
comparacao.append( (cidade, menor_distancia, len(opcoes_cnefe), rua_osm, sorted(opcoes_cnefe)) )
sys.stdout.write('!')
else:
sys.stdout.write('.')
print
comparacao.sort()
comparacao_file = open(arq_saida, 'w')
for item in comparacao:
saida = '\nCidade: {0}\nDist.: {1}\nOSM: {2}\n'.format(item[0], item[1], item[3])
comparacao_file.write(saida)
for opcao in item[4]:
saida = 'CNEFE: {0}\n'.format(opcao)
comparacao_file.write(saida)
comparacao_file.close()
Vou começar com uma autocrítica:
- foi feito às pressas, então nem pensei em parametrizações (era pra ver se a idéia daria certo e seria útil)
- o algoritmo é O(n²), o que quer dizer que tem o potencial pra ser muito lento; na prática, roda pros dados do RS em menos de 1 minuto no meu PC
Os dados são ordenados por:
- cidade; depois
- distância (do nome num cadastro para o nome no outro); depois
- número de opções com mesma distância; depois
- nome da rua
O resultado fica interessante para revisão dos erros. Eis o início do trecho da saída relativo a Porto Alegre:
Cidade: 4314902
Dist.: 1
OSM: ACESSO 3 A
CNEFE: ACESSO 3A
Cidade: 4314902
Dist.: 1
OSM: ACESSO B 4
CNEFE: ACESSO B4
Cidade: 4314902
Dist.: 1
OSM: ACESSO DOS FLAMBOYANT
CNEFE: ACESSO DOS FLAMBOYANS
Cidade: 4314902
Dist.: 1
OSM: ACESSO POYAMA
CNEFE: ACESSO TOYAMA
Cidade: 4314902
Dist.: 1
OSM: AVENIDA ALTOS DO SANTA RITA
CNEFE: AVENIDA ALTOS DE SANTA RITA
Nessa parte tem um looooongo trecho com pequenos erros ortográficos fáceis de corrigir. Um pouco mais adiante começam a aparecer coisas assim:
Cidade: 4314902
Dist.: 1
OSM: BECO 2 B
CNEFE: BECO 2B
CNEFE: BECO 4 B
Cidade: 4314902
Dist.: 1
OSM: RUA 2 DE FEVEREIRO
CNEFE: RUA 25 DE FEVEREIRO
CNEFE: RUA 6 DE FEVEREIRO
Cidade: 4314902
Dist.: 1
OSM: RUA 2066
CNEFE: RUA 2006
CNEFE: RUA 2096
Cidade: 4314902
Dist.: 1
OSM: RUA 2067
CNEFE: RUA 2007
CNEFE: RUA 2017
Cidade: 4314902
Dist.: 1
OSM: RUA 3 A
CNEFE: RUA 1 A
CNEFE: RUA 2 A
Cidade: 4314902
Dist.: 1
OSM: RUA 5029
CNEFE: RUA 5027
CNEFE: RUA 7029
Hm pelo visto o OSM tem coisas que o CNEFE não tem. Desnecessário desmerecer um ou outro, o CNEFE tem uma lista muito maior de nomes, mas potencialmente desatualizados, como aqui:
Cidade: 4314902
Dist.: 5
OSM: AVENIDA DA SERRARIA
CNEFE: ESTRADA DA SERRARIA
De fato, como moro perto, sei que o lugar deixou de se chamar “estrada” faz algum tempo, o que sugere que o CNEFE tem alguns anos de idade na minha região.
Quanto maior a distância do nome de um cadastro para o outro, maior a chance de encontrar coisas desse tipo:
Cidade: 4314902
Dist.: 8
OSM: ESTRADA MORRO AGUDO
CNEFE: ESTRADA ARACAJU
CNEFE: ESTRADA CAMPO NOVO
CNEFE: ESTRADA CANTA GALO
CNEFE: ESTRADA COSTA GAMA
CNEFE: ESTRADA DO ESPIGAO
CNEFE: ESTRADA DO RINCAO
CNEFE: ESTRADA DOS ALPES
CNEFE: ESTRADA JOAO ANTONIO
CNEFE: ESTRADA JOAO PASSUELO
CNEFE: ESTRADA MARIA ALTINA
CNEFE: ESTRADA SERRARIA
CNEFE: RUA MORRO ALTO
Aqui, o revisor teria que descobrir se o CNEFE simplesmente não conhece a estrada Morro Agudo, ou se é um erro no OSM. Não tem jeito, tem que buscar outras fontes, como dados da prefeitura, outros mapas, etc. Como isso dá muito trabalho, uma sugestão pra organizar o trabalho é:
- baixar o arquivo das diferenças
- extrair dele uma cópia da cidade com que se quer trabalhar (é um conjunto sequencial de registros, só precisa encontrar o primeiro e o último)
- ir removendo dele os problemas que já foram tratados (os casos fáceis) e ir deixando pra depois os difíceis
Dá até pra fazer isso diretamente com o wiki, caso tenha mais de uma pessoa trabalhando nessa informação.
Mesmo nos casos aparentemente mais simples, é bom usar informações confiáveis (não só um simples dicionário ou a intuição) pra confirmar qual dos nomes é o mais correto. Afinal, foi usando a intuição que os cadastros acabaram errados. Em último caso, o que vale é o nome na placa.
A comparação completa para o RS se encontra aqui.