In previous posts I have demonstrated how one can geocode data and plot markers using Geopy and Folium in Python. I have also demonstrated heatmapping workflows in R, using packages such as Leaflet.
In this post I want to use the Leaflet.js library for creating a heatmap via the Folium module in Python.
I provide a script for doing so below. The script reads in a csv file with location names and addresses. Using Geopy and the Nominatim geocoding service this list of locations gets geocoded, returning coodinates by latitude and longitude. The csv-file contains a metric value for each location. This metric defines the color intensity of the heatmap.
Below lines of code are used for reading in the csv file and geocoding its location entries into latitudes and longitudes. A glimpse of the final pandas DataFrame is provided:
# import relevant packages / modules
import pandas
import folium
from folium.plugins import HeatMap
# read in csv file containing location data
data = pandas.read_csv("heatmap.csv")
# merging country, city and street into a single address string
data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "]
# import the geopy module
import geopy
# create a service object
service = geopy.Nominatim(user_agent = "myGeocoder")
# geocode every address, using .apply() methode for pandas DataFrame
from geopy.extra.rate_limiter import RateLimiter
data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1))
# display glimpse of geocoded pandas DataFrame table
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… |
Using the geocided DataFrame I create a folium heatmap:
# extracting longitude and latitude values to separate lists
longs = [coord.longitude for coord in data["coordinates"]]
lats = [coord.latitude for coord in data["coordinates"]]
# calculating mean longitude and latitude values
import statistics
meanLong = statistics.mean(longs)
meanLat = statistics.mean(lats)
# create base map object using Map()
mapObj = folium.Map(location=[meanLat, meanLong], zoom_start = 14.5)
# create heatmap layer
heatmap = HeatMap( list(zip(lats, longs, data["metric "])),
min_opacity=0.2,
max_val=data["metric "].max(),
radius=50, blur=50,
max_zoom=1)
# add heatmap layer to base map
heatmap.add_to(mapObj)
mapObj


Data scientist focusing on simulation, optimization and modeling in R, SQL, VBA and Python

Leave a Reply