Räumliche Wärmekarten in Python mit Leaflet.js über das Folium-Modul

In früheren Beiträgen habe ich gezeigt wie man mit Geopy und Folium in Python Daten und Plotmarkierungen geocodieren kann. Ich habe auch Wärmekarten-Workflows in R mithilfe von Paketen wie Leaflet demonstriert.

In diesem Beitrag möchte ich die Leaflet.js-Bibliothek zum Erstellen einer Wärmekarte über das Folium-Modul in Python verwenden.

Ich stelle dazu unten ein Skript zur Verfügung. Das Skript liest eine CSV-Datei mit Standortnamen und Adressen ein. Mit Geopy und dem Nominatim-Geokodierungsdienst wird diese Liste von Standorten geokodiert, wobei die Koordinaten nach Breiten- und Längengrad zurückgegeben werden. Die CSV-Datei enthält einen Metrikwert für jeden Speicherort. Diese Metrik definiert die Farbintensität der Wärmekarte.

Die folgenden Codezeilen werden zum Einlesen der CSV-Datei und zum Geokodieren ihrer Standorteinträge in Breiten- und Längengrade verwendet. Ein Blick auf die endgültigen Pandas Datenrahmen bietet sich unten:

# relevante Pakete / Module importieren
import pandas
import folium
from folium.plugins import HeatMap
# CSV-Datei mit Standortdaten einlesen
data = pandas.read_csv("heatmap.csv")
# Zusammenführen von Land, Stadt und Straße zu einer einzigen Adresszeichenfolge
data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "]
# geopy Modul importieren
import geopy
# ein Serviceobjekt erstellen
service = geopy.Nominatim(user_agent = "myGeocoder")
# Geocodieren Sie jede Adresse mit der Methode .apply () für Pandas DataFrame
from geopy.extra.rate_limiter import RateLimiter
data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1))
# zeigt einen Blick auf die DataFrame-Tabelle der geokodierten Pandas
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…

Mit dem geocodierten Datenrahmen erstelle ich eine Folium-Wärmekarte:

# Extrahieren von Längen- und Breitengraden in separate Listen
longs = [coord.longitude for coord in data["coordinates"]]
lats = [coord.latitude for coord in data["coordinates"]]
# Berechnung der mittleren Längen- und Breitengrade
import statistics
meanLong = statistics.mean(longs)
meanLat = statistics.mean(lats)
# Basiskartenobjekt mit Map () erstellen
mapObj = folium.Map(location=[meanLat, meanLong], zoom_start = 14.5)
# Wärmekarten-Ebene erstellen
heatmap = HeatMap( list(zip(lats, longs, data["metric "])),
                   min_opacity=0.2,
                   max_val=data["metric "].max(),
                   radius=50, blur=50, 
                   max_zoom=1)
# Wärmekarten-Ebene der Basiskarte hinzufügen
heatmap.add_to(mapObj)
mapObj

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Close

Meta