Logo OpenStreetMap OpenStreetMap

Introdução

A Prefeitura de Belo Horizonte possui um portal de dados georreferenciados aberto ao público, disponível sob a licença ODbL. O portal possui diversos dados que seriam interessantes se fossem importados para o OSM, aumentando a cobertura do mapa na cidade de Belo Horizonte (atualmente apenas 2% dos prédios existentes em BH foram mapeados).

Como parte do meu projeto de importação destes dados, uma camada crucial para aumentar a quantidade de dados disponíveis na cidade é a de endereçamento, onde cada ponto representa um endereço diferente. Acredito que o OpenStreetMap poderá se beneficiar com a importação destes endereços, que, conforme observado acima, estão em falta em BH, devido à ausência de dados mapeados.

O problema

O grande problema deste projeto de importação é que os dados do portal da prefeitura não possuem as etiquetas utilizadas pelo OpenStreetMap, ou seja, se os dados fossem importados do jeito que estão, não haveria informação útil que pudesse ser extraída dos dados recém-importados. Portanto, o processo de importação requer uma intervenção para adequar a camada da prefeitura ao OpenStreetMap. Isso pode ser feito manualmente através do QGIS ou com o uso de scripts.

Para a camada de endereços, resolvi baixar em formato GeoJSON, por ser mais fácil modificar e extrair informações usando um script. A camada, em GeoJSON, possui diversos campos úteis para endereçamento e numeração predial. O objetivo do script é justamente converter estes campos para que possam ser utilizados pelo OSM.

Falando assim, parece até simples, mas o problema é que cada informação do endereço está dividida em diversos campos. Quando vemos o nome de uma rua em uma placa, por exemplo, “Avenida Raja Gabáglia”, automaticamente associamos que o nome da rua é o que está escrito na placa. No entanto, o “nome” que estamos acostumados a ler e ver é composto por duas partes: tipo de logradouro e nome. A camada da prefeitura faz essa distinção, porém o tipo do logradouro está abreviado, então um dos objetivos do script é justamente criar um nome legível-para-humanos com base nas informações do ponto de endereço, para que possa ser utilizado na etiqueta addr:street do OpenStreetMap.

Dados desatualizados

Fazendo uma conferência dos resultados produzidos pelo script, percebi que havia várias ruas com nomes sem pontuação e com as iniciais de cada palavra que compõe o nome da rua em maiúsculas. Descobri que o naoliv já tinha feito um script que corrige o nome de ruas, e resolvi adaptá-lo para o meu uso.

O script adaptado separa cada palavra do endereço, compara com uma tabela, e substitui cada palavra sem acentuação pela palavra com a grafia correta, caso esteja na tabela. Não me lembro muito bem a quantidade certa, mas sei que era um número na casa dos 10 mil, por aí, de endereços únicos, e adicionar a correção para cada palavra seria um trabalho imenso.

Procurando no Google, consegui achar um estudo que classificava os logradouros brasileiros por gênero. Os autores obtiveram acesso a um banco de dados que relaciona CEP com logradouros, separado por cidade e unidade federativa. Pelo que entendi, eles tiveram que formatar os dados para facilitar o seu uso no estudo, e disponibilizaram os dados formatados numa pasta do Google Drive. Resolvi baixar, conferi alguns arquivos e consegui obter um arquivo CSV que possuía a relação de cada logradouro com seu CEP.

Então, resolvi modificar o script, e adicionei uma nova função: a leitura deste arquivo CSV relacionando cada logradouro com um CEP. O script faz a leitura do arquivo CSV, depois a leitura da camada de endereços do BHMap, e faz uma comparação entre eles. Resolvi priorizar os dados da prefeitura, pois estes são mais atualizados (última atualização em 2018, salve engano) que a base do estudo, que foi produzida em 2017.

Basicamente, o script faz uma lista de CEPs, e os logradouros sem CEP são incluídos numa chave contendo todos os endereços do arquivo CSV que não possuem CEP (segue abaixo parte do código que realiza esta função). Depois, ele lê o arquivo GeoJSON da camada da prefeitura, e faz uma comparação com essa lista de CEPs, retirando a acentuação dos nomes. Então, ele faz uma lista em arquivo de texto simples com os nomes de logradouros que diferem entre as duas base de dados. Resta apenas fazer a leitura desta lista e transformar o nome antigo (da base de CEPs) no nome novo (da base da prefeitura), e então os endereços estarão prontos para serem utilizados no projeto de importação. Graças a isso, a quantidade de correções a serem feitas caiu de, entre 10 mil, para, aproximadamente, 600.

Segue abaixo a criação da lista de logradouros com e sem CEP da lista de CEPs; para cada logradouro, um objeto é criado contendo o nome do logradouro e a regional a qual pertence (que será modificada na leitura dos dados do BHMap), e a lista é separada por CEP, ou seja, cada CEP possuirá um objeto contendo as informações do logradouro, e caso o logradouro não possua CEP, ele será incluído dentro da chave SEM_CEP, que nada mais é que uma lista de objetos de logradouros sem CEP associado.

with open(ARQUIVO_LISTA_CEP_ENDERECO, 'r') as f:
    reader = csv.DictReader(f, delimiter='|')
    for row in reader:
        if row['id_cidade'] == ID_CIDADE:
            nome_logra = row['logradouro']
            tipo_logra = row['tipo_logradouro']
            cep = int(row['cep'])

            nome_logra = re.sub('^((Rua)|(Avenida)|(Praça)|(Alameda))', '', nome_logra).strip()
            nome_logra = re.sub('(\s\d.*)', '', nome_logra).strip()
            
            if tipo_logra:
                nome_logra = f'{tipo_logra} {nome_logra}'

                #if nome_logra in trocas_ruas.keys():
                #    nome_logra = trocas_ruas[nome_logra]

                if not cep in logradouros.keys():
                    logradouros[cep] = {'nome': nome_logra, 'regional': 0}

Resolvi escrever um diário porque acredito que este tipo de informação não cabe na página do projeto. Desculpe pela parede de texto, mas busquei explicar todo o meu processo de pensamento por trás do script.

Ah, e caso esteja se perguntando, sim, eu publicarei o script no GitHub ou similar, ainda não consegui achar tempo para terminá-lo, resta apenas a parte de correção dos dados da base de CEPs.

Ikona e-mailu Ikona Bluesky Ikona Facebooku Ikona LinkedIn Ikona Mastodonu Ikona Telegramu Ikona X

Diskuse

Přihlaste se k zanechání komentáře