Dopo l’avventurosa e faticosissima biciclettata di sabato scorso sulla strada che porta a Castel del Monte (foto), che ovviamente abbiamo mappato (permalink osm), mi sono chiesto quale fosse la variazione di pendenza che le nostre povere gambe hanno dovuto sopportare e mi sono subito messo all’opera per scrivere un rudimentale parser in Python sfruttando il modulo BeautifulSoup (installabile dai repository di Ubuntu)
Avendo più tempo a disposizione mi piacerebbe scrivere l’interfaccia grafica del programmino e far disegnare il grafico ad uno dei potenti widget di wxPython, ma purtroppo adesso devo accontentarmi di questo script molto semplice ma al tempo stesso efficace.
Clic qui per scaricare lo script.
Anche se lo script è semplicissimo aggiungo qualche commento:
Controlla che il nome del file sia stato passato come argomento. Tenta di aprire il file gpx passato come argomento. Il file viene letto e il suo contenuto, salvato nella variabile xml, viene passato al parser xml di BeautifulSoup, a questo punto viene invocata la funzione findAll che restituisce una lista contenente tutti i tag <ele> (compreso il contenuto dei tag). L'istanza string, richiamata sui singoli elementi della lista, restituisce solo il contenuto dei tag <ele> senza il tag stesso, infine i contenuti vengono salvati su un file txt separati da un carriage return. Per eseguire correttamente lo script è sufficiente eseguire lo script digitando da terminale: e poi ricopiare i valori del file dati.txt in un foglio di calcolo e far elaborare il grafico dal software (ovviamente consiglio sempre di utilizzare OpenOffice.org - Calc).
Questo è il grafico elaborato dai gpx del percorso verso Castel del Monte (clic per ingrandire):
</code>
try:
NomeFile = sys.argv[1]
except:
print "Argomento mancante o non valido"
exit()
</code>
try:
gpx = open(NomeFile,'r')
except:
print "Impossibile leggere il file, controllare che lo stesso esista e che sia leggibile"
exit()
</code>
xml = gpx.read()
gpx.close()
soup = BeautifulStoneSoup(xml)
dati = open('dati.txt','w')
n = 0
for i in soup.findAll('ele'):
dati.write(i.string + '\n')
n = n + 1
dati.close()
$: python altitudine.py nomefile.gpx
