Tag Archives: Python

OSMQuake

OSMQuake è un software Open Source, scritto in python, che permette di mostrare gli eventi sismici dell’Istituto Nazionale di Geofisica e Vulcanologia sulle mappe del progetto OpenStreetMap.
Gli eventi possono essere filtrati in base a parametri personalizzati come profondità, magnitudo, distanza da un punto e regione italiana.
Il software inoltre permette di selezionare il tipo di mappa e lo zoom da applicare.

Attualmente è in stato di (lento) sviluppo e qualsiasi tipo contributo è ben accetto.

Il codice sorgente si trova qui, mentre qui c’è la pagina di presentazione.

OSMQuake

A quasi tre mesi dalla presentazione ufficiale ad OSMit, pubblico finalmente il codice di OSMQuake purtroppo ancora incompleto e con il codice ancora molto sporco e incasinato (l’ho scritto in tre ritagli di tempo la sera tardi).

Ho aspettato così tanto perché mi sarebbe piaciuto completare alcune parti del software che avevo implementato soltanto in parte purtroppo però in questo periodo non ho molto tempo e preferisco pubblicare il codice in modo che chiunque voglia contribuire (anche per disegnare un logo ad esempio) possa farlo.

Il codice sorgente si trova attualmente qui, se qualcuno volesse collaborare posso metterlo su google code e usare svn per la gestione della versione.

Questo è il risultato dell’elaborazione di stamattina sull’Italia centrale.

mappa terremoti luglio 2009 Italia centrale

mappa terremoti luglio 2009 Italia centrale

Già dalla mappa è possibile vedere cosa manca:

  • Il raggio del marker è direttamente proporzionale alla magnitudo ma il colore dovrebbe essere inversamente proporzionale al tempo, cosicchè i terremoti più recenti siano di un rosos più intenso.
  • Sarebbe bello avere una didascalia con qualche indicazione riguardo i range di dimensioni e di colori e delle statistiche generate automaticamente

Per generare la mappa precedente basta avviare OSMQuake e poi premere sul tasto “Scarica” per effettuare il parsing della pagina e salvare gli eventi in un database sqlite (notare in basso a sinistra il numero degli eventi scaricati):

Interfaccia grafica OSMQuake

Interfaccia grafica OSMQuake

A questo punto si possono scegliere i parametri di filtraggio, lo zoom della mappa e il tipo di mappa (Mapnik, Osmarender e OpenArial) e si clicca su Genera mappa. A questo punto il software mostra le tile da scaricare e le dimensioni della mappa in pixel e inizia a scaricare le tile necessarie. Dopo di che le unisce e disegna sopra la mappa i marker calcolando dinamicamente il raggio.

Il risultato finale è una nuova finestra con la mappa:

Mappa finale

Mappa finale

Mappa finale2

Mappa finale2

Cosa funziona in OSMQuake:

  • Parsing della pagina
  • Riempimento del database con gli eventi
  • Filtraggio per magnitudo
  • Filtraggio per profondità
  • Scelta dello zoom
  • Scelta del server
  • Calcolo delle tile da scaricare
  • Calcolo delle dimensioni della mappa in pixel

Cosa non funziona (ancora!) in OSMQuake:

  • Filtraggio degli eventi in base alla distanza da un punto geografico
  • Calcolo dell’area coperta dalla mappa
  • Filtraggio in base alla regione (ho già i bbox delle regioni italiane che mi ha dato Niccolò Rigacci ma non ho avuto il tempo di creare un dizionario con i bbox)
  • Per generare una nuova mappa con la stessa istanza è necessario cancellare a mano le tile (io uso uno script in bash)
  • Prima di scaricare di nuovo gli eventi è necessario cancellare il file del database (il file prova)

Cosa sarebbe mi piacerebbe implementare in OSMQuake:

  • Riscrivere il codice ad oggetti
  • Implementare il threading per lo scaricamento delle tile (la policy del tile server di OpenStreetMap permette solo due thread)
  • Permettere di mantenere un database storico degli eventi e di filtrarli anche per periodo per creare delle mappe mensili o settimanali di una determinata zona
  • Permettere l’esportazione deglio eventi sismici in KML

Qualsiasi contributo è benaccetto!

OSMit 2009

Che dire di OSMit 2009? Semplicemente un’esperienza fantastica che ha riunito buona parte delle persone che gravitano intorno al progetto.

Guest star è stato il fondatore stesso di OpenStreetMap – Steve Coast – con cui non poteva mancare una foto che è stato così gentile sa spiegarmi personalmente come funziona il tile cache server personalizzato di Cloudmade. :D

dscf31111

dscf3125

Durante i due giorni della conferenza si sono discussi temi importanti e ci sono state dimostrazioni reali di possobili applicazioni di mappe e dati messi a disposizione dal progetto OpenStreetMap.

Io ho presentato il software OSMQuake, di cui a breve rilascerò il codice, per visualizzare gli ultimi eventi sismici dell’Istituto Nazionale di Geofisica sulle mappe di OpenStreetMap.

pres

Di seguito poteve visualizzare le slide con slideshare e da scaricarle da qui.



Visualizzare gli ultimi eventi sismici dal sito INGV (usando OpenStreetMap)

Stamattina un amico (TheDom), studente dell’Università dell’Aquila fortunatamente scampato al terremoto, mi ha chiesto di aiutarlo a creare uno script che si interfacciasse con il sito dell’Istituto Nazionale di Geofisica e Vulcanologia e che visualizzasse i dati degli ultimi eventi sismici e restituisse un link ad OpenStreetMap per visualizzare la cartina.

Guardando il codice dell’homepage del sito mi sono accorto che i singoli eventi erano racchiusi nel tag <tr class=”print_light”> e i dati dell’evento erano racchiusi nei tag figli <td class=”td_events”>.

<tr class="print_light"  [...]>
<td class="td_events">1206577780</td>
<td class="td_events">&nbsp;</td>
<td class="td_events">2009/04/11</td>
<td class="td_events">16:18:34</td>
<td class="td_events">42.264</td>
<td class="td_events" width="45px">13.486</td>
<td class="td_events">9</td>
<td class="td_events">Ml:2.8</td>
<td class="td_events">&nbsp;</td>
<td class="td_events">Valle_dell'Aterno</td>
</tr>


Considerata la regolarità del codice, ho sfruttato le potenti funzionalità del modulo di parsing BeautifulSoup, per raccogliere facilmente i dati dal sito.

Il cuore dello script è costituito dalla funzione DataCollect che, preso il codice della pagina in input, trova tutti i tag che corrispondono a <tr class=”print_light”>. In seguito, cercando all’interno dei singoli tag <tr>, restituisce, sotto forma di lista, il testo contenuto nei tag figli <td>.

def DataCollect(pagina,id):
     """Restituisce una lista con i dati desiderati"""
     lista = []
     dati = pagina.findAll('tr',attrs={"class":"print_light"})[id]
     dati = dati.findAll('td',attrs={"class":"td_events"})
     for i in dati:
     lista.append(i.string)
     return lista


La riga di codice numero 4 trova tutti i tag tr avente gli attributi definiti nel dizionario {“class”:”print_light”} passato come variabile. Considerando che l’istanza findAll dell’oggetto pagina restituisce, sotto forma di tupla, il contenuto dei singoli tag tr, è possibile accedere al contenuto di un solo tag tr usando gli indici della tupla (il numero tra parentesi quadre). Dopodiché è possibile rieseguire una seconda istanza findAll sull’oggetto dati (riga 5), che come abbiamo visto in precedenza contiene solo il contenuto di un solo tag, cercando questa volta tutti i tag td. A questo punto l’oggetto dati è una tupla contenente tutti i tag td, figli del tag tr (quelli mostrati nel codice html precedente). Infine basta iterare all’interno di questa tupla (riga 6), assegnando ad una lista (inizializzata alla riga 3) il contenuto dei signoli tag td ottenuti attraverso l’istanza string (riga 7).

La funziona Parsing legge semplicemente il contenuto della pagina html e lo passa a BeautifulSoup per l’elaborazione.

def Parsing(link):
     """Restituisce il parsing della pagina"""
     try:
         socket = urlopen(link)
         testo = BeautifulSoup(socket.read())
         socket.close()
     except:
         return ("""Si è riscontrato un errore durante l'apertura del link, prima \
         di procedere:\t
         1) controllare la connessione ad internet\t
         2) assicurarsi che il link esista\t
         3) assicurarsi che il link sia scritto correttamente (ricordarsi di scrivere \
         anche http://)\t
         4) controllare i permessi per accedere alla rete.""")
 return testo


Alla riga 5 la funzione apre il link dell’home page dell INGV e alla riga 6 l’istanza read(), che restituisce il contenuto html della pagina, viene passata all’elaboratore BeautifulSoup.

Infine l’ultima funzione, formatta l’output in maniera colorata e più “umana” sfruttando il modulo scritto da Checkm.

def HeartquakePrint(lista):
     """Formatta e stampa i dati dell'evento sismico"""
     print cms.color("<red>Dati riepilogativi evento sismico</red>")
     print cms.color("<green>Link diretto:</green>   <yellow>http://cnt.rm.ingv.it/~earthquake/data_id/%s/event.php</yellow>") % lista[0]
     print cms.color("<green>Data:</green> <yellow>%s</yellow>") % lista[2]
     print cms.color("<green>Ora:</green> <yellow>%s</yellow>") % lista[3]
     print cms.color("<green>Latitudine:</green> <yellow>%s N</yellow>") % lista[4]
     print cms.color("<green>Longitudine:</green> <yellow>%s E</yellow>") % lista[5]
     print cms.color("<green>Link OpenStreetMap:</green> <yellow>http://www.openstreetmap.org/?lat=%s&lon=%s&zoom=17&layers=B000FTF</yellow>") % (lista[4],lista[5])
     print cms.color("<green>Magnitudo:</green> <yellow>%s</yellow>") % lista[7]
     print cms.color("<green>Distretto sismico:</green> <yellow>%s</yellow>\n") % lista[9]

Il modo più semplice per eseguire lo script (sia su windows che su linux) è quello di scaricare l’archivio contenente tutti i file necessari all’esecuzione da qui. Scompattarlo ed eseguirlo digitando in un terminale:

$: python script.py

Questo è il risultato finale:

ingv_screen

Pycp: usare cp con una progress bar

Per quanti usano ancora il comando del terminale cp per copiare i file risuslterà comodo installare pycp, un wrapper di cp scritto in python che implementa una progress bar tetstuale per ogni singolo file trasferito.

E’ molto comondo nel caso di trasferimento di grosse cartelle, in cui il cursore rimane immobile (sembra quasi bloccato) fino a trasferimento completato. Con pycp è possibile vedere, oltre alla progress bar, anche la velocità di trasferimento e l’ETA (estimated time of arrival) di ogni singolo file!

Per installarlo è necessario scaricare ed installare prima il modulo python-progressbar:

$: wget http://pypi.python.org/packages/source/p/progressbar/progressbar-2.2.tar.gz

$:  tar xvf progressbar-2.2.tar.gz

$:  cd tar xvf progressbar-2.2.tar.gz

$: sudo python setup.py install

A questo punto scarichiamo ed installiamo pycp:

$: wget http://yannick-lm.dyndns.org/soft/pycp/pycp-3.2.tar.gz

$: tar xvf pycp-3.2.tar.gz

$: cd tar xvf pycp-3.2.tar.gz

$: sudo python setup.py install

Per evitare di ricordarsi di digitare pycp al posto di cp è possibile creare un alias per la nostra shell, editando il file ~/.bashrc:

$: vim .bashrc

Inserendo la riga:

alias cp=’pycp’

Carichiamo le modifiche:

$: source .bashrc

In questo modo al comando cp verrà automaticamente sostituito pycp.

OpenMoko FreeRunner: guida completa passo-passo (parte 2)

Con estremo ritardo :-( continuo la guida passo-passo per OpenMoko su FreeRunner, potete trovare la prima parte qui.

Dopo TangoGps, continuiamo l’installazione di software gps utile al mapping.

Per avere un po’ di informazioni utili durante il mapping come la disposizione dei satelliti, la qualità del segnale e altro possiamo installare agpsgui, semplicemente digitando:

#: opkg install openmoko-agpsui

Tra i browser disponibili per OpenMoko c’è n’è anche uno basato su Mozilla Firefox: Minimo.

Per installare Minimo abbiamo bisogno della libreria libfreetype6 versione 2.3.6, sfortunatamente la versione fornita da OM è inferiore ed è necessario installare la libreria dai repository Angstrom:

N.B. Aggiungere i repository di Angstrom alla lista di quelli usati da Assassin potrebbe rendere molto instabile il sistema, per cui scarichiamo solo la libreria che ci interessa.

#: wget http://www.angstrom-distribution.org/feeds/2008/ipk/glibc/armv4t/base/libfreetype6_2.3.6-r0.1_armv4t.ipk

#: opkg install libfreetype6_2.3.6-r0_armv4t.ipk

A questo punto ci basta installare Minimo:

#: wget http://www.ginguppin.de/files/minimo.tar.bz2

#: tar -xjf minimo.tar.bz2

#: opkg install minimo_*

I repository di OpenMoko sono ricchi di software installabile con pochi comandi (o click se usate Assassin), tra i tanti meritano di essere segnalati:

Terminale (non esiste distribuzione senza terminale :-D )

#: opkg install openmoko-terminal2

Screenshot catcher

#: opkg install gpe-scap

Per usare il programma  è necessario creare uno script per avviare il programma con un ritardo di qualche secondo sufficiente a far apparire a schermo la finestra da fotografare:

#: cd /usr/share/bin

#: vi gper

Premiamo i per entrare in modalità editing e scriviamo queste due righe ne file:

sleep 8
gpe-scap

Premiamo esc e poi :wq per salvare ed uscire da vi.

Rendiamo il file eseguibile:

#: chmod gper chmod +x

Adesso apriamo il file /usr/share/applications/gpe-scap.desktop

#: vi /usr/share/applications/gpe-scap.desktop

e modifichiamo la righe Exec=gpe-scap in Exec=gper salviamo e chiudiamo vi.

Adesso alla pressione dell’icona lo screenshot sarà scattato dopo 8 secondi.

Per avviare il programma da ssh invece basta digitare:

#: DISPLAY=:0 gpe-scap

File-manager

#: opkg install gpe-filemanager

Visualizzatore di immagini

#: opkg install omview

Planetario

Orrery è una specie di astrolabio virtuale che fa vedere il cielo come lo vedremmo veramente nella posizione in cui ci troviamo (si basa sul gps)

#: opkg install orrery

Giochi

OpenMoko mette a disposizione anche qualche gioco per divertirsi con la propria saponetta (attenti alla batteria), vediamo come installarne qualcuno:

Numptyphysics

Lo scopo del gioco è quello di far rotolare un sasso su di una stella, seguendo un certo percorso e disegnando degli oggetti sullo schermo che si comporteranno seguendo le regole della fisica! Per installarlo digitiamo:

#: opkg install libsdl-1.2-0 libsdl-image-1.2-0

#: opkg install -force-depends http://wwwpub.zih.tu-dresden.de/~mkluge/numptyphysics_0.2_armv4t.ipk

Per giocare basta disegnare sullo schermo, usando lo stylus, delle linee che “convoglino” il masso verso la stella. Con la tastiera è possibile accedere alle funzioni avanzate del gioco, in particolare:

Spazio: elimina/avvia la pausa

Esc (in basso a destra sulla tastiera Terminal di Illume): elimina l’ultima linea

Freccia a destra e freccia a sinistra: permettono rispettivamente di avanzare o retrocedere di livello

Freccia in alto: resetta il livello corrente

Duke Nukem 3D

Agli appassionati del genere sparatutto farà piacere sapere che da qualche giorno è disponibile il porting su OpenMoko del gioco Duke Nukem 3D e che si gioca sfruttando gli accelerometri!
In questi casi un video è migliore delle parole:

Per installarlo basta digitare:

#: wget http://alasal.be/openmoko/repo/duke3d_0.1.1_armv4t.ipk

#: opkg install duke3d_0.1.1_armv4t.ipk

A questo indirizzo potete vedere lo schema per giocarci e… buon divertimento.

Il progetto OpenMoko e la sua comunità sono in rapido cambiamento per cui la guida non può essere esaustiva e puo’ darsi che molte cose, benché le abbia controllate al momento della stesura della guida, siano già datate tra pochi giorni.

Per informazioni aggiornate potete rifarvi ai due siti da cui ho preso le informazioni per la guida:

Se volete seguire gli sviluppi in real time potete iscrivervi ad una delle mailing list di OpenMoko.

Pythonizzare gedit

In attesa di imparare (e pythonizzare) per bene Vim, scrivo i miei script in Python con Gedit, l’editor di testi standard di Gnome, che se adattatto alla scrittura di codice Python attraverso alcuni utili plugin (i plugin di Gedit sono scritti in Python!) può diventare davvero un ottimo IDE.

Plugin standard

Per installare il pacchetto dei plugin standard è sufficiente installare il pacchetto gedit-plugins da synaptic oppure da terminale digitando:

$: sudo apt-get install gedit-plugins

Tra i molteplici plugin standard installati, i più interessanti sono:

  • Commento codice
  • Console Python
  • Terminale incorporato
  • Traccia gli spazi

Per abilitarli basta avviare Gedit e dal menù selezionare Modifica–>Preferenze–>Plugin e poi spuntare la casella del plugin relativo.

Plugin aggiuntivi

Esistono alcuni plugin aggiuntivi molto utili, i più interessanti sono:

  • Auto completition per l’autocompletamento del codice
  • Class Browser per navigare tra le classi

Per installare il primo è necessario prelevare il plugin da questo indirizzo e poi copiare i file nella cartella ~/.gnome2/gedit/plugins, volendo usare il terminale :-D

$: wget http://elias.hiex.at/gedit-plugins/auto_completion.gedit-plugin

$: wget http://elias.hiex.at/gedit-plugins/auto_completion.py

$: mv auto_completion.* ~/.gnome2/gedit/plugins

Per installare il plugin Class Browser invece, disponibile a questo indirizzo, è necessario installare prima il pacchetto exuberant-ctags e solo successivamente scaricare il pacchetto contenente i file e copiarlo nella cartella ~/.gnome2/gedit/plugins

$: sudo apt-get install exuberant-ctags

$: wget http://www.stambouliote.de/download/gedit_classbrowser-0.2.1.tar.gz

$: tar zxvf gedit_classbrowser-0.2.1.tar.gz

$: cd gedit_classbrowser-0.2.1

$: mv * ~/.gnome2/gedit/plugins

Per abilitare i due plugin è sufficiente avviare Gedit e dal menù selezionare Modifica–>Preferenze–>Plugin e poi spuntare le due relative caselle.

Per visualizzare i plugin è necessario avere la barra inferiore e la barra laterale attiva, digitando rispettivamente CTRL+F9 e F9, ed ecco come si presenta il mio Gedit:

Utilizzare sul proprio pc TangoGPS e le mappe di OpenStreetMap

Se inserire le mappe di OpenStreetMap nel proprio sito/blog è una grande soddisfazione, soddisfazione ancora più grande è vedere le mappe di OpenStreetMap funzionanti su un navigatore GPS.

Nella mailinglist italiana di OpenStreetMap si parlava di OpenMoko e di TangoGPS, il navigatore per palmari scritto in python :-D che utilizza le mappe di OSM, e ovviamente io non potevo resistere alla tentazione di provare il navigatore sul mio pc utilizzando l’antenna esterna che uso per raccogliere le tracce e una penna bluetooth da due soldi.

Se usate Ubuntu (o Debian) è possibile scaricare il pacchetto .deb direttamente dal sito (link diretto) e poi da terminale digitare:

$: sudo dpkg -i tangogps_0.9.2_i386.deb

Una volta installato il software dobbiamo solo collegare l’antenna al demone che gestisce il gps (gpsd), per farlo ho seguito pedissequamente l’ottima guida del blog di michelem.

Una volta configurato il tutto (basta seguire la guida che non riporterò qui) ho avviato TangoGps e mentre iniziavo a cercare il pulsante per scaricare le mappe il software si è agganciato all’antenna e ha scaricato automaticamente le mappe di OpenStreetMap, fenomenale!

Ecco uno screenshot (click sull’immagine per ingrandire), il cerchietto blu è dove si trova la finestra della mia stanza… precisissimo!

casa mia da tangogps

Forza che aspettate, correte fuori di casa e mappate tutto quello che vi capita a tiro per avere la soddisfazione di utilizzare le mappe che avrete contribuito a creare.

Trasformare in massa tracce igc e nmea in tracce gpx

Durante l’openstreecamping2008 abbiamo avuto la necessità di trasformare, con gpsbable, le decine di tracce igc, il formato di tracking che utilizza il cellulare di Fradeve, raccolte durante i giri in bici in formato gpx che è il formato utilizzato da josm.

Dopo qualche giorno ci siamo resi conto che era noioso ridigitare ogni volta il comando dal terminale (ovviamente non tutto, ma modificando semplicemente il nome del file nel comando precedente) e potevamo perdere tempo prezioso in questo modo? Ovviamente no!

Mentre Fradeve leggeva la biografia di Torvalds (ve la consiglio) e il caldo era insopportabile, ho scritto un piccolo script in python per convertire in massa file igc e nmea in file gpx.

Credo sia possibile farlo anche in bash, ma non conoscendo il bash ho preferito usare il python e in particolare il modulo os, contenuto nella libreria standard, che permette al programma di interfacciarsi con il sistema operativo.

Clic qui per scaricare lo script

Qualche commento al codice:


if formato in ListaFormati :
    ListaFile = CercaFile(os.listdir('.') , formato)
else :
    print "Formato inesistente o non ancora implementato, esco dal programma."
exit()

Controlla il formato passato come argomento al programma e, se corretto (i formati accettati sono igc e nmea), restituisce una lista, attraverso la funzione os.listdir(cartella), con tutti i file contenuti nella cartella passata come argomento.


def CercaFile(lista, flag):
    for i in lista:
        if flag in i:
            gpx.append(i)
return gpx

La funzione CercaFile restituisce una nuova lista contenente soltanto i file con l’estensione interessata (igc o nmea), eliminando tutti gli altri file inutili.


if ListaFile != []:
    c = 0
    for i in ListaFile:
        stringa = "gpsbabel -i " + formato + " -f '" + i + "' -o gpx -F '" + i[0:-3] + "'gpx"
        os.system(stringa)
        c = c + 1
    print "Ho trasformato " +str(c)+ " file in gpx ed ho cancellato i file " + formato + ""
else:
    print "Non ci sono file da convertire, ciao!"

Controlla che ci siano file da convertire, in caso positivo passa al sistema, attraverso il la funzione os.system, il comando gpsbabel necessario alla conversione dei file. La stringa che può sembrare complicata serve a trasformare i file mantenendo il nome originale.

Per eseguire lo script basta copiare i file da trasformare nella stessa cartella dove è presente lo script e poi da terminale digitare:

$: python trasforma.py formato

dove formato deve essere sostituito con igc o con nmea a seconda del formato di partenza dei file.

Semplice, veloce ed efficace a patto di aver gpsbabel installato, ovviamente!

Python

In questa pagina (in continuo aggiornamento) , ci sono i link ai miei script e programmi open source scritti in python, non sono nulla di eccezionale ma svolgono egregiamente il loro lavoro e a volte sono anche carini.

Ultimo aggiornamento: 04 maggio 2009