Mapas de calor espaciales en Python utilizando Leaflet.js a través del módulo Folium

En entradas anteriores he demostrado cómo se pueden geocodificar datos y trazar marcadores utilizando Geopy y Folium en Python. También he demostrado flujos de trabajo de mapas de calor en R, utilizando paquetes como Leaflet.

En este post quiero utilizar la biblioteca Leaflet.js para crear un mapa de calor a través del módulo Folium en Python.

A continuación proporciono un script para hacerlo. El script lee un archivo csv con nombres y direcciones de localidades. Usando Geopy y el servicio de geocodificación de Nominatim, esta lista de localizaciones se geocodifica, devolviendo coodinadas por latitud y longitud. El archivo csv contiene un valor métrico para cada ubicación. Esta métrica define la intensidad del color del mapa de calor.

Las siguientes líneas de código se utilizan para leer el archivo csv y geocodificar sus entradas de ubicación en latitudes y longitudes. Se proporciona un vistazo al DataFrame final de pandas:

importar paquetes / módulos relevantes
import pandas
import folium
from folium.plugins import HeatMap
# leer el archivo csv que contiene los datos de localización
data = pandas.read_csv("heatmap.csv")
# fusionar el país, la ciudad y la calle en una sola cadena de direcciones
data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "]
# importar el módulo geopy
import geopy
# crear un objeto de servicio
service = geopy.Nominatim(user_agent = "myGeocoder")
# geocodificar cada dirección, utilizando el método .apply() para pandas DataFrame
from geopy.extra.rate_limiter import RateLimiter
data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1))
# mostrar un vistazo a la tabla de pandas DataFrame geocodificada
data.head()
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…
3GermanyBerlinRosa-Luxemburg-Strasse 211Germany, Berlin, Rosa-Luxemburg-Strasse 2(2, Rosa-Luxemburg-Straße, Scheunenviertel, Mi…
4GermanyBerlinMemhardstrasse 88Germany, Berlin, Memhardstrasse 8(8, Memhardstraße, Scheunenviertel, Mitte, Ber…

Utilizando el DataFrame geocidado creo un mapa de calor de folio:

# extrayendo los valores de longitud y latitud a listas separadas
longs = [coord.longitude for coord in data["coordinates"]]
lats = [coord.latitude for coord in data["coordinates"]]
# calcular los valores medios de longitud y latitud
import statistics
meanLong = statistics.mean(longs)
meanLat = statistics.mean(lats)
# crear un objeto mapa base usando Map()
mapObj = folium.Map(location=[meanLat, meanLong], zoom_start = 14.5)
# crear capa de mapa de calor
heatmap = HeatMap( list(zip(lats, longs, data["metric "])),
                   min_opacity=0.2,
                   max_val=data["metric "].max(),
                   radius=50, blur=50, 
                   max_zoom=1)
# añadir capa de mapa de calor al mapa base
heatmap.add_to(mapObj)
mapObj

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Close

Meta