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()
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… |
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
Wirtschaftsingenieur mit Interesse an Optimierung, Simulation und mathematischer Modellierung in R, SQL, VBA und Python
Leave a Reply