Em um post anterior eu já demonstrei como usar o Nominatim em Python (usando o módulo Geopy) para geocodificar um nome de local em coordenadas de longitude e latitude.
Neste post eu quero mostrar como se pode geocodificar uma lista de locais usando o Geopy.
Para isso, começarei usando o módulo Pandas para leitura em um arquivo csv simples e breve contendo nomes de local conforme especificado por entradas em uma coluna de país, cidade e rua:
import pandas
data = pandas.read_csv("locations.csv")
data
| country | city | street | metric | |
|---|---|---|---|---|
| 0 | Germany | Berlin | Alexanderplatz 1 | 10 |
| 1 | Germany | Berlin | Dircksenstrasse 2 | 5 |
| 2 | Germany | Berlin | Rathausstrasse 1 | 16 |
Vamos verificar o tipo de dados dos dados tabulares:
type(data)
pandas.core.frame.DataFrame
Agora que li os dados, geocodificarei locais e atribuirei coordenadas geocodificadas a uma nova coluna. Como os dados são um DataFrame de pandas, posso usar o método apply() para aplicar o serviço de geocodificação Nominatim relevante a todos os endereços no dataframe.
Primeiro, preciso convergir todas as entradas de coluna em endereços, adicionando-as em uma nova coluna no DataFrame tabular. Então, posso criar um objeto de serviço referenciando o serviço Nominatim Geopy e aplicar esse serviço a cada local, retornando o resultado geocodificado em uma nova coluna adicional:
data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "] import geopy service = geopy.Nominatim(user_agent = "myGeocoder") from geopy.extra.rate_limiter import RateLimiter data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1)) data
| country | city | street | metric | addresses | coordinates | |
|---|---|---|---|---|---|---|
| 0 | Germany | Berlin | Alexanderplatz 1 | 10 | Germany, Berlin, Alexanderplatz 1 | (Alexanderstraße, Spandauer Vorstadt, Mitte, B… |
| 1 | Germany | Berlin | Dircksenstrasse 2 | 5 | Germany, Berlin, Dircksenstrasse 2 | (2, Dircksenstraße, Luisenstadt, Mitte, Berlin… |
| 2 | Germany | Berlin | Rathausstrasse 1 | 16 | Germany, Berlin, Rathausstrasse 1 | (1-14, Rathausstraße, Spandauer Vorstadt, Mitt… |
Vamos verificar o tipo de dados das entradas da coluna “coodinar”:
type(data["coordinates"][0])
geopy.location.Location
As localizações geocodificadas são do tipo Geopy Location. Objetos da classe Location possuem vários atributos. Um deles sendo latitude e outro sendo longitude:
data["coordinates"][0].longitude
13.4144809
data["coordinates"][0].latitude
52.5228654
Agora calculo as pontuações “médias” de longitude e latitude. Eu quero usá-los como ponto central do meu gráfico de mapa do marcador de localização Folium:
longs = [coord.longitude for coord in data["coordinates"]]
lats = [coord.latitude for coord in data["coordinates"]]
import statistics
meanLong = statistics.mean(longs)
meanLat = statistics.mean(lats)
print("meanLong = " + str(meanLong) + "; meanLat = " + str(meanLat))
meanLong = 13.412910038576356; meanLat = 52.52100943333333
[longs,lats]
[[13.4144809, 13.4136431, 13.410606115729072], [52.5228654, 52.5208149, 52.519348]]
Usando o módulo Folium, agora posso criar marcadores para os locais e plotá-los nos blocos do mapa:
import folium
mapObj = folium.Map(location = [meanLat,meanLong], zoom_start = 15)
for i in range(0,data.shape[0]):
markerObj = folium.Marker(location = [lats[i],longs[i]])
markerObj.add_to(mapObj)
mapObj


Cientista de dados com foco em simulação, otimização e modelagem em R, SQL, VBA e Python

Leave a Reply