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