Vários marcadores de mapa geocodificados com Geopy e Folium em Python

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
countrycitystreetmetric
0GermanyBerlinAlexanderplatz 110
1GermanyBerlinDircksenstrasse 25
2GermanyBerlinRathausstrasse 116

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
countrycitystreetmetricaddressescoordinates
0GermanyBerlinAlexanderplatz 110Germany, Berlin, Alexanderplatz 1(Alexanderstraße, Spandauer Vorstadt, Mitte, B…
1GermanyBerlinDircksenstrasse 25Germany, Berlin, Dircksenstrasse 2(2, Dircksenstraße, Luisenstadt, Mitte, Berlin…
2GermanyBerlinRathausstrasse 116Germany, 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

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.