Da GPX a Heatmap

18 October, 2019

Ciao :)
Con questo tutorial vedremo come convertire tracce GPX in una Heatmap o Mappa di calore, usando Python ed alcune librerie!

heatmap

Dalle tracce GPX Strava alla Heatmap

Scarica tutti i tuoi tracciati da Strava

Come riportato nella pagina relativa di Strava Esportazione dell’intero archivio :

  • Accedi al tuo account su Strava.com da cui vuoi esportare l’archivio.
  • Passa il cursore sul tuo nome nell’angolo in alto a destra della pagina Strava. Seleziona “impostazioni” e vai alla scheda “Il mio account” dal menù sulla sinistra.
  • Seleziona “Per iniziare” sotto a “Scarica o cancella l’account.”
  • Seleziona “Richiedi l’archivio” nella pagina successiva.
  • Riceverai una email con un link da cui scaricare i dati (l’email può arrivare anche dopo qualche ora) e per questo motivo assicurati di poter accedere all’account email collegato al tuo profilo Strava.

Una volta che hai scaricato l’archivio, dovresti avere una cartella con all’interno un’altra chiamata “activities” e un csv “activities.csv”

Elaborazione dati

Per la successiva elaborazione useremo, python ed alcune librerie, come pandas , geopandas , togeojsontiles e matplotlib

import os
import pandas as pd
import geopandas as gpd
import togeojsontiles
import matplotlib.pyplot as plt

Selezione dei dati di interesse

os.chdir('YOUR PATH') # Move to the Strava directory
activities = pd.read_csv('./activities.csv')

Ora si possono visualizzare le prime righe di activities con activities.head()

activities.head()
tabella data

Qualora le abbreviazioni per il mese delle attività fossero in una lingua diversa dall’inglese, dovrai impostare la lingua locale

import locale
locale.setlocale(locale.LC_ALL, 'it_IT')

Ora è necessario convertire ‘Data dell’attività’ in un formato datatime

activities['Data dell’attività'] = pd.to_datetime(activities['Data dell’attività'], errors='coerce', format='%d %b %Y, %H:%M:%S')

Imposta i filtri a cui sei interessato, per esempio:

start_date = pd.to_datetime('10 giu 2018, 14:00:00', errors='coerce', format = '%d %b %Y, %H:%M:%S')
end_date = pd.to_datetime('20 lug 2018, 14:00:00', errors='coerce', format = '%d %b %Y, %H:%M:%S')

selected = activities[(activities['Data dell’attività'] > start_date) & (activities['Data dell’attività'] < end_date) & (activities['Tipo attività'] == 'Ciclismo')]

Convertire da gpx a geojson

I nuovi file geojson saranno creati in una nuova cartella ‘geojson’

rows = len(selected.index)
indice = selected.index

newpath = './geojson/'
if not os.path.exists(newpath):
    os.makedirs(newpath)

for i in range(rows):
    filename = './'+selected.loc[indice[i],'Nome del file']
    activity = filename.partition('s/')[-1].rpartition('.')[0] # Isolated activities name
    jsonname = './geojson/'+activity+'.geojson' #
    togeojsontiles.gpx_to_geojson(file_gpx=filename, file_geojson=jsonname)

Lista dei file geojson da aprire

list_gj = []
for (dirpath, dirnames, filenames) in os.walk('./geojson/'):
    list_gj.extend(filenames)
    break

Riproiezione

os.chdir('YOUR PATH TO GEOJSON FOLDER')
original = dict(ellps='WGS84', datum='WGS84', proj='longlat')
target = dict(ellps='WGS84', datum='WGS84', proj='utm', zone=32, units='km', no_defs=True) # edit zone if needed

Plotting

fig, ax = plt.subplots(1, figsize=(12, 12))
ax.axis('off')

for i in range(len(list_gj)):
    giro = gpd.read_file(list_gj[i])
    giro_series = gpd.GeoSeries(giro['geometry'])
    giro_series.crs = original
    track = giro_series.to_crs(crs=target).plot(ax=ax, alpha=0.5) # You can change colors, trasparency, etc. here


plt.show()
heatmap

Spero che questo tutorial possa essere stato utile!

Happy heatmapping ;)



Kerook