I tidligere indlæg har jeg demonstreret hvordan man kan geokode data og plotte markører ved hjælp af Geopy og Folium i Python. Jeg har også demonstreret arbejdsgange for oprettelsen af varmekort i R ved hjælp af pakker så som Leaflet.
I dette indlæg vil jeg bruge Leaflet.js-biblioteket til at oprette et varmekort via Folium-modulet i Python.
Hertil skriver jeg et skript til, som vist nedenfor. Skriptet læser en csv-fil med placeringsnavne og adresser. Ved hjælp af Geopy og Nominatim-geokodningstjenesten bliver denne liste med lokationer geokodet og returnerer koordinaterne i form af breddegrad og længdegrad. csv-filen indeholder en metrisk værdi for hver placering. Denne metriske måling definerer varmekortets farveintensitet og repræsenterer en relevant målstørrelse, f.eks. kundernes efterspørgsel efter bestemte varer.
Nedenstående kodelinjer bruges til læsning i csv-filen og geokodning af dens placeringsdata. Jeg afslutter kodestykket ved at udgive et uddrag af den resulterende dataramme.
# importer relevante pakker / moduler import pandas import folium from folium.plugins import HeatMap # læses i csv-fil, der indeholder placeringsdata data = pandas.read_csv("heatmap.csv") # fletning af land, by og gade i en enkelt adressestreng data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "] # import af geopy-modulet import geopy # opret et serviceobjekt service = geopy.Nominatim(user_agent = "myGeocoder") # geokode hver adresse ved hjælp af .apply () -metode til pandas DataFrame from geopy.extra.rate_limiter import RateLimiter data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1)) # vis glimt af geokodede pandas DataFrame-tabel 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… |
Ved hjælp af den geokodede DataFrame opretter jeg et folium-varmekort:
# udpakning af længde- og breddegradsværdier til separate lister longs = [coord.longitude for coord in data["coordinates"]] lats = [coord.latitude for coord in data["coordinates"]] # beregning af gennemsnitlige længde- og breddegradsværdier import statistics meanLong = statistics.mean(longs) meanLat = statistics.mean(lats) # opret grundkortobjekt ved hjælp af Map () mapObj = folium.Map(location=[meanLat, meanLong], zoom_start = 14.5) # opret varmekortlag heatmap = HeatMap( list(zip(lats, longs, data["metric "])), min_opacity=0.2, max_val=data["metric "].max(), radius=50, blur=50, max_zoom=1) # tilføj varmekortlag til basiskortet heatmap.add_to(mapObj) mapObj
Industriingeniør som gerne beskæftiger sig med optimering, simulation og matematisk modellering i R, SQL, VBA og Python
Leave a Reply