Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Como transformar CEP para Latitude e Longitude?

Olá, tudo bem?

Tenho um banco de dados com inúmeros CEPs e gostaria de transformá-los em coordenadas (Latitude e Longitude). Como fazer isso com Python?

Desde já agradeço!

5 respostas
solução!

Olá Rodrigo, tudo bem!

Acredito que você vai ter que fazer isso em 2 passos, não conheço um serviço que faça a transformação diretamente:

  1. Transformar o CEP em um endereço com a API dos correios (a biblioteca pycep-correios pode ajudar)
  2. Utilizar o endereço obtido para descobrir as coordenadas (pode ser feito com a biblioteca geopy)

Um detalhe importante a considerar é que como estamos utilizando APIs (dos correios e do OpenStreetMap) o acesso pode ser lento e limitado, cada API vai permitir um certo número de acessos por hora então é melhor transformar grupos de CEPs e não tudo de uma vez, e depois ir salvando as coordenadas obtidas para evitar fazer a transformação novamente no futuro.

Segue um exemplo da transformação:

Espero ter ajudado, qualquer dúvida é só falar!

Lucas, funcionou perfeitamente!

Caso possa me ajudar com outra coisa, tenho outra dúvida:

Tenho um DataFrame com algumas informações em que uma das colunas é o CEP. Gostaria de adicionar uma nova coluna com as coordenadas. Sabe me dizer como faço isso automaticamente (utilizando o que você colocou na resposta anterior)? Imagino que seja a função def ou lambda, porém não sei exatamente como funciona.

Desde já, muito obrigado!

Opa Rodrigo, sem problemas!

Para aplicar em um DataFrame pode ser feito de várias maneiras, eu fiz assim baseado em um código do próprio geopy:

import pandas as pd
import pycep_correios
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter

# Função para transformar o CEP em um endereço 
def get_address(cep):
    endereco = pycep_correios.get_address_from_cep(cep)
    return endereco['logradouro'] + ", " + endereco['bairro'] + ", " + endereco['cidade'] + " - " + endereco['uf']

# DataFrame de teste
df = pd.DataFrame({'CEP': ['60060390', '70160900', '69095000']})

# Troque test_app pelo nome da sua aplicação/sistema
geolocator = Nominatim(user_agent="test_app")
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)

# Cria a coluna address com os endereços retornados a partir do CEP
df['address'] = df['CEP'].apply(get_address)

# Cria a coluna location com o local retornado a partir do endereço
df['location'] = df['address'].apply(geocode)

# Seleciona a latitude e longitude que está dentro do local
df['point'] = df['location'].apply(lambda loc: tuple(loc.point) if loc else None)
df

Resultado

DataFrame resultante

Agora você vai ter que adaptar para o seu caso, e como dá pra ver no exemplo nem sempre a transformação para coordenadas funciona, o cep 70160900 não foi encontrado.

Lucas, muitíssimo obrigado! Testei aqui e funciona para o que preciso.

Em complemento ao post, adiciono que caso não seja necessário usar o Python, é possível realizar a Geocodificação pelo Google Earth Pro! É possível inserir os CEPs no Google Earth Pro como um arquivo .CSV ou .TXT (por exemplo) e ele Geocodifica. Após isso, é possível exportar como .KML e então converter.

Mais uma vez, muito obrigado!

Bom saber que deu certo Rodrigo e obrigado também por compartilhar a dica extra!