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()
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… |
3 | Germany | Berlin | Rosa-Luxemburg-Strasse 2 | 11 | Germany, Berlin, Rosa-Luxemburg-Strasse 2 | (2, Rosa-Luxemburg-Straße, Scheunenviertel, Mi… |
4 | Germany | Berlin | Memhardstrasse 8 | 8 | Germany, 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
Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply