Haveria alguma ferramenta (lib) onde eu coloco o endereço completo e obtenho a latitude / longitude?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Haveria alguma ferramenta (lib) onde eu coloco o endereço completo e obtenho a latitude / longitude?
Oii Manoel, como você está?
Peço perdão pela demora em obter um retorno.
Para isso você pode utilizar a biblioteca geopy. Essa biblioteca, receberá um endereço e a partir desse endereço retornará- a latitude e longitude. A geopy utiliza o serviço de localização Nominatim que é uma ferramenta de busca por nome e endereço (geocodificação) e este serviço funciona por trás do OpenStreetMap, um serviço similar ao Google Maps, porém, utilizando o Nominatim conseguiremos utilizar o serviço gratuitamente e sem problemas de autenticação de usuário, diferentemente do Google Maps, que te limitará a um número de solicitações gratuitas e solicitará diversos passos para conseguir uma chave de acesso a API do Google Maps.
pip install geopy>>> from geopy.geocoders import Nominatim
>>> geolocator = Nominatim(user_agent="geolocalização")
>>> location = geolocator.geocode("R. Capote Valente, 39 - Pinheiros, São Paulo - SP, 05409-000")
>>> print((location.latitude, location.longitude))
>>> (-23.5524219, -46.6788067)
Mas e se eu quiser encontrar a latitude e longitude apenas pelo CEP sem utilizar o endereço completo?
Agora que já conhecemos como a biblioteca geopy funciona, iremos utilizar outra biblioteca para nos retornar o endereço através do CEP: pycep-correios.
pip install pycep-correios>>> import pycep_correios
>>> # R. Capote Valente, 39 - Pinheiros, São Paulo - SP, 05409-000
>>> endereco = pycep_correios.get_address_from_cep('05409000')
>>> print(endereco)
>>> {'bairro': 'Pinheiros', 'cep': '05409-000', 'cidade': 'São Paulo', 'logradouro': 'Rua Capote Valente', 'uf': 'SP', 'complemento': ''}Observe que é nos retornado um dicionário com as informações do endereço daquele CEP. Sabendo disso, agora podemos aliar as duas bibliotecas, a geopy e a pycep-correios. Veja como fica:
from geopy.geocoders import Nominatim
import pycep_correios
# R. Capote Valente, Pinheiros - São Paulo
endereco = pycep_correios.get_address_from_cep('05409000')
geolocator = Nominatim(user_agent="geolocalização") # coloque o nome do seu projeto em "user_agent"
print(f"{endereco['logradouro'][0]}., {endereco['bairro']} - {endereco['cidade']}")
# Formato: R. Capote Valente
rua = f"{endereco['logradouro'][0]}. {endereco['logradouro'][3:]}"
# Pinheiros
bairro = endereco['bairro']
# São Paulo
cidade = endereco['cidade']
localizacao = geolocator.geocode(f"{rua}, {bairro}-{cidade}")
print((localizacao.latitude, localizacao.longitude))Resultado: (-23.5524219, -46.6788067)
Se jogarmos o endereço no mapa do Nominatim, veja que será retornado a rua que estamos procurando:

OBS: Geralmente em cidades pequenas o CEP não retorna bairro e nem rua, pois é apenas um CEP para a cidade toda. E para esses casos podemos buscar a latitude e longitude apenas pelo endereço da cidade. Veja como fica as alterações:
from geopy.geocoders import Nominatim
import pycep_correios
# São Sebastião do Rio Preto - MG
endereco = pycep_correios.get_address_from_cep('35815000')
geolocator = Nominatim(user_agent="geolocalização")
rua = endereco['logradouro']
bairro = endereco['bairro']
cidade = endereco['cidade']
if rua and bairro:
rua = f"{rua[0]}. {rua[3:]}"
localizacao = geolocator.geocode(f"{rua}, {bairro}-{cidade}")
else:
localizacao = geolocator.geocode(f"{cidade}")
print((localizacao.latitude, localizacao.longitude))Qualquer dúvida estou por aqui, tá bom?
Grande abraço!