Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Haveria alguma ferramenta (lib) onde eu coloco o endereço e obtenho a latitude / longitude?

Haveria alguma ferramenta (lib) onde eu coloco o endereço completo e obtenho a latitude / longitude?

1 resposta
solução!

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.

  • Primeiro precisamos instalar essa biblioteca. Abra o terminal na pasta do seu projeto, ative o ambiente virtual se houver e digite:
pip install geopy
  • Agora, veja como fica o código para retornar as coordenadas do endeço da sede da Nubank: R. Capote Valente, 39 - Pinheiros, São Paulo - SP, 05409-000.
>>> 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)
  • Se jogarmos as coordenadas retornadas no Nominatim teremos o endereço no qual queríamos obter as coordenadas, como mostro abaixo:

image

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.

  • Instale a biblioteca:
pip install pycep-correios
  • Veja como fica o código para obter o endereço através do CEP:
>>> 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:

image

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!