Mapas de calor espaciais em Python usando Leaflet.js via módulo Folium

Em posts anteriores, demonstrei como se pode geocodificar dados e marcadores de plotagem usando Geopy e Folium em Python. Também demonstrei fluxos de trabalho de mapeamento de calor em R, usando pacotes como Leaflet.

Neste post eu quero usar a biblioteca Leaflet.js para criar um mapa de calor através do módulo Folium em Python.

Eu forneço um script para fazer isso abaixo. O script lê em um arquivo csv com nomes e endereços de local. Usando o Geopy e o serviço de geocodificação Nominatim, essa lista de locais é geocodificada, retornando coordenadas por latitude e longitude. O arquivo csv contém um valor de métrica para cada local. Essa métrica define a intensidade da cor do mapa de calor.

As linhas de código abaixo são usadas para ler o arquivo csv e geocodificar suas entradas de localização em latitudes e longitudes. Um vislumbre do DataFrame final do pandas é fornecido:

import pandas
import folium
from folium.plugins import HeatMap

data = pandas.read_csv("heatmap.csv")
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.head()
paíscidaderuamétricaendereçoscoordenadas
0AlemanhaBerlimAlexanderplatz 110Alemanha, Berlim, Alexanderplatz 1(Alexanderstraße, Spandauer Vorstadt, Mitte, B…
1AlemanhaBerlimDircksenstrasse 25Alemanha, Berlim, Dircksenstrasse 2(2, Dircksenstraße, Luisenstadt, Mitte, Berlim…
2AlemanhaBerlimRathausstrasse 116Alemanha, Berlim, Rathausstrasse 1(1-14, Rathausstraße, Spandauer Vorstadt, Mitt…
3AlemanhaBerlimRosa-Luxemburg-Strasse 211Alemanha, Berlim, Rosa-Luxemburg-Strasse 2(2, Rosa-Luxemburg-Straße, Scheunenviertel, Mi…
4AlemanhaBerlimMemhardstrasse 88Alemanha, Berlim, Memhardstrasse 8(8, Memhardstraße, Scheunenviertel, Mitte, Ber…

Usando o DataFrame geocida, crio um mapa de calor de fólio:

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)

mapObj = folium.Map(location=[meanLat, meanLong], zoom_start = 14.5)
heatmap = HeatMap( list(zip(lats, longs, data["metric "])),
                   min_opacity=0.2,
                   max_val=data["metric "].max(),
                   radius=50, blur=50, 
                   max_zoom=1)

heatmap.add_to(mapObj)
mapObj

Leave a Reply

Deixe um comentário

O seu endereço de e-mail não será publicado.

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

Close

Meta