Curso
Quando você trabalha com dados do mundo real, não dá para presumir que o conjunto de dados traga todas as informações indispensáveis para resolver seu projeto de ciência de dados. Na maioria das vezes, você tem informações parciais e precisa enriquecer os dados com atributos adicionais.
Pode acontecer de o dataset conter um endereço, mas, ao mesmo tempo, faltar a latitude e a longitude. Nesse caso, o primeiro passo do enriquecimento é adicionar esse par de coordenadas. Chamamos esse processo de converter um endereço em latitude e longitude de geocodificação.
A geocodificação é muito importante em várias áreas, como mercado imobiliário, finanças e logística. Sem essa técnica, você não consegue analisar e visualizar os dados em um mapa. Neste tutorial, vamos fazer geocodificação em Python usando uma biblioteca salvadora chamada Geopy. Vamos lá!
O que é geocodificação?
Geocodificação é o processo de converter endereços (como "1600 Amphitheatre Parkway, Mountain View, CA") em coordenadas geográficas (como latitude 37.423021 e longitude -122.083739), que você pode usar para posicionar marcadores em um mapa ou centralizar o mapa. Em termos simples, é o processo computacional de transformar a descrição de um endereço físico em um ponto na superfície da Terra.
O processo de geocodificação costuma envolver a interpolação de localizações espaciais, como ruas ou lotes, dentro da extensão geográfica de um mapa. As localizações resultantes são geradas como coordenadas numéricas, adequadas para análises espaciais ou visualização em mapas.
A geocodificação usa diversas fontes de dados para converter um endereço em uma localização geográfica. A principal fonte é um banco de referência de vias que contém nomes de ruas e faixas de numeração dentro de um determinado município ou área. Outras fontes incluem bases de CEP, bancos de nomes de cidades e bases de pontos de interesse (como parques ou marcos).
Geocodificar não é só obter coordenadas para um endereço. Também é usado em análise espacial, mineração de dados e saneamento de dados. Por exemplo, empresas usam geocodificação para analisar informações demográficas e impulsionar campanhas de marketing direcionadas ou otimizar rotas de entrega. Na área de segurança pública, a geocodificação ajuda a mapear ocorrências de emergência para despachar rapidamente o serviço mais próximo.
No contexto de ciência de dados, a geocodificação é uma etapa crucial para criar visualizações geoespaciais e pode ser aplicada em vários casos, como previsão de preços de imóveis, otimização de rotas de entrega e planejamento de resposta a desastres.
O que é a Geopy?

Geopy é uma biblioteca Python de código aberto especializada em adicionar localização aos dados por meio de uma grande variedade de serviços de geocodificação, como Google Maps, OpenStreetMap e ArcGIS.
Você pode se perguntar por que não usar o serviço de geocodificação diretamente em vez da biblioteca Python. A vantagem da Geopy é permitir explorar esses serviços com poucas linhas de código. A Geopy implementa uma classe para cada serviço, e você consegue alternar facilmente de uma API para outra.
Projeto prático de geocodificação
Neste artigo, vamos analisar o dataset Canada Museum do Kaggle. Ele traz informações sobre museus localizados no Canadá. Essa coleção de museus pode ser útil para prever o preço de acomodações no Airbnb em Toronto; por exemplo, você deve ter notado que o valor de um anúncio aumenta quanto mais perto ele está de pontos de interesse, como museus, restaurantes, cafés etc.
Vamos dar uma olhada no dataset:
import pandas as pd
import geopy
l_cols= ['Name','Street Address','City','State','Zipcode']
df = pd.read_csv('/kaggle/input/canada-museums/museums list CAN.csv', encoding = "ISO-8859-1",usecols=l_cols)
df = df[df.City=='Toronto']
df.head()

Por essa visão geral, vemos que diferentes colunas trazem informações de endereço, como o nome do museu, o logradouro, a cidade, o estado e o CEP.
Para os próximos passos, precisamos de uma coluna única que una todas as informações dessas colunas. Como fazer isso? A forma mais eficiente de concatenar mais de duas colunas é usando pandas.series.str.cat(), que permite especificar o separador desejado entre uma coluna e outra:
df['Country'] = 'Canada'
l_cols_concat = ['Street Address','City','State','Zipcode','Country']
df['unique_address'] = df['Name'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
df.head()

Podemos criar uma variável string chamada ‘address1’ que contém o endereço único da primeira linha:
address1 = df['unique_address'].iloc[0]
print(address1)
# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,Canada
Vamos usá-la nos próximos passos para testar diferentes serviços de geocodificação em um único endereço. Quando ficar claro como a Geopy extrai a localização, podemos estender para toda uma coluna de um dataframe do pandas. Vamos testar os seguintes provedores principais:
- Google Maps
- OpenStreetMap
- ArcGIS
Geocodificação com a API do Google Maps
O método mais popular para converter endereços em coordenadas é usando a API do Google Maps.
Embora o Google Maps ofereça serviços pagos, você recebe US$ 200 em créditos gratuitos ao criar a conta pela primeira vez.
Para acessar o serviço, você precisa criar uma conta na Google Maps Platform. Há um ótimo tutorial que ajuda você a gerar a chave de API.
GM_API_KEY = 'your_api_key'
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)
GoogleV3 é a classe implementada para usar a API Google Maps v3. Primeiro, vamos tentar extrair a localização de um único endereço:
location = geolocator.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Depois, podemos estender essa operação para o campo unique_address que criamos anteriormente.
def service_geocode(g_locator, address):
location = g_locator.geocode(address)
if location!=None:
return (location.latitude, location.longitude)
else:
return np.NaN
Podemos usar apply() para aplicar a função em todas as linhas de unique_address:
df['LAT_LON'] = df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()

Geocodificação com a API do OpenStreetMap
Como o OpenStreetMap é o maior banco de dados geográfico gratuito e colaborativo, a API é gratuita. Para geolocalizar um único endereço, basta informar o e-mail da sua conta OSM como entrada para a classe Nominatim, em vez da chave de API:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)
print(location)
# None
Infelizmente, a localização retornada pela API do OpenStreetMap é None porque o endereço não foi reconhecido.
De fato, essa API tem dificuldade em localizar a maioria dos endereços do dataset porque não possui boa cobertura de endereços em todas as áreas.
Por isso, precisamos criar outro campo, unique_address_osm, com menos informações:
l_cols_concat = ['City','State','Country']
df['unique_address_osm'] = df['Street Address'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
address1_osm = df['unique_address_osm'].iloc[0]
Em seguida, passamos o novo endereço e tentamos novamente extrair a latitude e a longitude a partir do logradouro:
address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Como antes, aplicamos a função service_geocode() a toda a coluna unique_address_osm:
df['LAT_LON_osm'] = df['unique_address_osm'].apply(lambda x: service_geocode(geolocator,x))
df[['unique_address_osm','LAT_LON','LAT_LON_osm']].head()

Embora não tenhamos especificado o nome do museu, o OpenStreetMap retornou coordenadas muito próximas às da Google Maps API.
Geocodificação com a API do ArcGIS
ArcGIS é um software que permite analisar e visualizar dados geoespaciais. Ele também oferece serviços de localização, assim como Google Maps e OpenStreetMap.
from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Desta vez não houve problema para obter o par de coordenadas. Podemos prosseguir estendendo essa operação para todos os endereços:
df['LAT_LON_arcgis'] = df['unique_address'].apply(lambda x: service_geocode(geolocator_arcgis,x))
df[['unique_address','LAT_LON','LAT_LON_osm','LAT_LON_arcgis']].head()

Olhando as primeiras linhas do dataset, vemos que o par de coordenadas obtido com ArcGIS é semelhante aos anteriores, com uma pequena diferença.
Medir a distância entre dois lugares
Outra funcionalidade da Geopy é permitir calcular a distância entre dois pontos. Isso é possível usando a distância geodésica obtida entre dois pares (latitude, longitude).
from geopy.distance import geodesic
point1 = df.LAT_LON_arcgis.iloc[0]
point2 = df.LAT_LON_arcgis.iloc[1]
distance = geodesic(point1, point2)
print('The distance between {} and {} is {} meters'.format(df.Name.iloc[0],df.Name.iloc[1],distance.meters))

A distância entre esses dois museus é de aproximadamente 2 quilômetros.
Considerações finais
É isso! Você aprendeu três formas diferentes de converter um endereço em latitude e longitude usando a Geopy. Este é um ponto de partida para análises geoespaciais mais complexas e avançadas.
Se você quer começar com análise geoespacial sem código, a melhor forma é conferir o tutorial da DataCamp Working with Geospatial Data: A Guide to Analysis in Power BI.
Para criar visualizações e cálculos mais avançados, o Tableau pode ser a ferramenta ideal para você. O curso da DataCamp Introduction to Tableau vai permitir que você crie visualizações de dados dinâmicas e resolva qualquer problema analítico.
Se você é fã de R, este ótimo curso é para criar mapas interativos com leaflet. Se prefere Python, considere fazer Visualizing geospatial data in Python, que ajuda você a criar visualizações incríveis usando geopandas e folium.
