Rumlige varmekort i Python ved hjælp af Leaflet.js og Folium-modulet

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()
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…

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

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Close

Meta