Haveria alguma ferramenta (lib) onde eu coloco o endereço completo e obtenho a latitude / longitude?
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!