Creare una mappa personalizzata da OSM: lo script

Come prometto a vuoto da mesi, finalmente mi voglio mettere a scrivere un articolo per spiegare un sistema completamente automatico mediante script bash per generare una mappa a partire dai dati di OpenStreetMap. Lo script è un allegro guazzabuglio di utility da riga di comando destinate a scaricare i dati dal server OSM sotto forma di xml, “compilarli” per generare un file SVG, convertire tale file in un PNG e aggiungerci qualche particolare utile: un header, un footer con il copyright, un frame di contorno e una scala kilometrica. Questo articolo, come i miei fedeli lettori avranno già intuito, nasce da una fusione di precedenti post: questo, questo, questo, questo.

Per iniziare i requisiti:

  • Avremo bisogno di un computer linux connesso alla rete (e fin qui…); io uso Ubuntu, non posso garantire il funzionamento di tutte le utility richiamate da questo script su altre piattaforme, anche se probabilmente su Mac si può fare (se qualcuno ci prova mi faccia sapere che aggiornerò l’articolo). Ovviamente Windows non è neanche preso in considerazione.
  • Avremo bisogno di queste utility, scaricabili dal repository: xsltproc (nell’installazione di default, a quanto mi risulta), wget (idem), convert+composite (nella suite ImageMagick), bc.
  • Avremo bisogno del programma per calcolare la distanza in chilometri tra due punti espressi in coordinate GPS, di cui ho parlato in precedenza (in questo post, nella sezione “un programma in C”). Copiarlo in un editor di testo, compilarlo seguendo le istruzioni nel post e avere cura che l’eseguibile si chiami “calcola” (senza alcuna estensione), non “converti” come nell’esempio.
  • Per finire, avremo bisogno di una serie di files da scaricare dai repository di openstreetmap, che ci serviranno per compilare la mappa vera e propria.

In riferimento all’ultimo punto dell’elenco, avremo bisogno di un ambiente di lavoro costituito dalla seguente struttura di cartelle:

data
|– osm-map-features-z17.xml
|– calcola
|– renderizza (così chiameremo lo script che andremo a utilizzare)
|– osmarenderer.xsl

stylesheets
|– symbols
|– il contenuto di questa cartella

Uhm.. dovremmo avere tutto, spero di non aver dimenticato nulla.. Per semplificarvi la vita, ho provveduto a uppare su una condivisione box.net uno zip con tutto il necessario per cominciare a renderizzare (sempre se non mi sono dimenticato nulla); scaricate pure qui. A questo punto manca solo lo script, che come ho detto prima si chiamerà, con molta fantasia, “renderizza” (beh, potete anche cambiargli il nome).

Ecco dunque l’agognato script, pezzo per pezzo:

Impostiamo un pò di variabili che ci verranno buone per dopo. Le uniche da modificare sono ovviamente le coordinate GPS (latitudine e longitune) della zona che vogliamo inserire nella mappa

# coordinate gps zona
# nb: max 0.25 gradi sia latitudine che longitudine

MAXLAT=45.8239
MINLAT=45.8045
MAXLON=10.0841
MINLON=10.0584

# nomi file
OSM=”data.osm”     # nome del file dati OSM
SVG=”map.svg”    # nome dell’output in formato svg
PNG=”map.png”    # nome dell’output in formato png

Recuperiamo i dati aggiornati:

echo “recupero dati dal server OSM…”
wget -O ${OSM} http://api.openstreetmap.org/api/0.5/map?bbox=$MINLON,$MINLAT,$MAXLON,$MAXLAT

Eseguiamo il rendering:

# livello del rendering
livello=17

# identifica il livello di dettaglio del rendering;
# per aree piccole conviene usare il livello 17;
# per eseguire il rendering sarà richiesto il
# file osm-map-features-zXX.xml (XX = livello).

echo “rendering mappa..”
xsltproc osmarender.xsl osm-map-features-z${livello}.xml > ${SVG}

Convertiamo la mappa (in formato SVG) in un file grafico PNG, più facilmente utilizzabile:

# —- conversione mappa in png

density=600     # risoluzione del file grafico.
scale=1000         # dimensione in px del file grafico

echo “conversione in PNG…”
convert -density ${density} -scale ${scale} ${SVG} ${PNG}

Aggiungiamo un header con un testo a scelta. In questo caso inserisco il mio nome e la data dell’aggiornamento (ovvero la data corrispondente al file dati).

# —- aggiunta header

echo “aggiunta della data alla cartina..”
convert xc:white -resize 1×15! blank.ppm
convert -append blank.ppm ${PNG} intermediate.ppm
convert intermediate.ppm -gravity “North” -draw “text 0,3 ‘Updated on: $(date -r ${OSM}) by PicciMario’” ${PNG}
rm blank.ppm intermediate.ppm

Aggiungo un footer con un copyright OSM.

# —- aggiunta footer

echo “aggiunta copyright alla cartina..”
convert xc:white -resize 1×20! blank.ppm
convert -append  ${PNG} blank.ppm intermediate.ppm
convert intermediate.ppm -gravity “South”
(continua) -draw “text 0,3 ‘Copyright 2008 OpenStreetMap (openstreetmap.org)’” ${PNG}
rm blank.ppm intermediate.ppm

La parte più incasinata: creo il simbolo della scala e lo inserisco nella mappa

# —- aggiunta scala

echo “aggiunta scala 1km”

# calcola larghezza in km della mappa
larghezza=$(./calcola $MINLON, $MAXLON, $MINLAT, $MINLAT )
# misura la larghezza in px della mappa
larghezzapixel=$(identify -format %w $PNG)
# calcola l’equivalenza px/km
pixel1km=$(echo “$larghezzapixel/$larghezza” | bc)

# creazione simbolo scala
framewidth=1
scalesymbol=scale.png
scaleheight=10
scalecolor1=xc:blue
scalecolor2=xc:white

pixel100m=$(echo “($pixel1km-(2*framewidth))/10″ | bc)
convert ${scalecolor1} -resize ${pixel100m}x${scaleheight}! block1.ppm
convert ${scalecolor2} -resize ${pixel100m}x${scaleheight}! block2.ppm
convert +append block1.ppm block2.ppm block1.ppm block2.ppm block1.ppm block2.ppm block1.ppm block2.ppm block1.ppm block2.ppm ${scalesymbol}
convert -mattecolor blue -frame ${framewidth}x${framewidth} ${scalesymbol} ${scalesymbol}
rm block1.ppm block2.ppm

# aggiunta del simbolo alla cartina
composite -geometry +10+30 -gravity southwest ${scalesymbol} ${PNG} ${PNG}

rm ${scalesymbol}

E per finire l’aggiunta di un bordino blu di rifinitura.

# —- aggiunta frame di contorno al file completo

echo “aggiunta frame…”
convert -mattecolor blue -frame 1×1 ${PNG} ${PNG}

echo “operazione completata.”

Facile, no? Si, lo so, è abbastanza contorto.. Ma ha l’innegabile vantaggio che, una volta pronto, non devo fare altro che andare nella cartella, scrivere ./renderizza e lui fa tutto e mi presenta la bellissima cartina completa.

map

Ad esempio, mi piacerebbe metterlo nel cron del mio server per mostrare su una pagina web la cartina del mio paese con aggiornamenti giornalieri (peccato che il mio server è un computer di 10 anni fa e per fare il rendering ci mette 20 minuti). Se poi pensiamo alla possibilità di modificare il file xml (osm-map-features ecc..), che descrive il modo in cui la mappa è creata, possiamo ottenere infinite potenzialità di personalizzazione della mappa da noi creata (modificare i simboli, le dimensioni e i colori delle strade, scegliere cosa inserire e cosa no, …).

Beh, per oggi mi accontento di questo.. Fatemi sapere se il sistema vi piace e in caso mandatemi un link delle vostre opere d’arte :-)

Ciao a tutti!

Mutant Chronicles

Questo post è dedicato alla memoria di Mutant Chronicles Doomtrooper, gioco di carte collezionabili contemporaneo a Magic The Gathering ma di cui non ha condiviso il successo, che da ormai anni non è più pubblicato ma ancora conserva un posto speciale nel nostro cuore, per il sistema di gioco innovativo e sempre interessante, per l’enorme varietà di tipologie di carte e strategie possibili (e colpi di scena), per l’ambientazione che tanto ha stimolato la nostra fantasia e ci ha insegnato il vero significato del temine Techno-Fantasy…

mario-mutantch

Questo post è anche dedicato ai coraggiosi che, nonostante il gioco sia stato abbandonato dal suo produttore, continuano a disegnare espansioni e a giocarci.. Non è che per caso tra i lettori del mio blog c’è qualche superstite con un mazzo da combattimento coperto di polvere, disponibile per qualche partita in onore dei vecchi tempi?

Il mio deck è sempre pronto!

XCircuit: disegnare facilmente circuiti (e non solo)

Ieri stavo tentanto di disegnare alcuni schemi elettrici da inserire in una relazione scolastica, e mi sono accorto che non è semplicissimo farlo con i normali strumenti di disegno.

Certo, potrei sempre disegnare, ad esempio, in Eagle (il programma che uso per progettare circuiti e layout) ma si tratterebbe di una complicazione inutile: dovrei stare lì a cercare resistori e capacitori nelle librerie (con tanto di scelta del package), incasinarmi per fare modifiche anche minime ai simboli, faticare per aggiungere informazioni aggiuntive (frecce per indicare il senso delle correnti, note) e così via: si può fare, ma se voglio solo disegnare uno schema di principio vorrei un’alternativa più immediata. Viceversa, i normali programmi di disegno sono scomodi ed eccessivi: Inkscape, Gimp, powerpoint (!!!!)… fatica nel disegnare i simboli, fastidi nel creare delle linee parallele e perpendicolari ben ordinate, nulla di sufficientemente comodo..

Così, cercando in giro, ho trovato una soluzione: l’ottimo XCircuit. Open Source e disponibile per qualunqe piattaforma: Linux (nativamente), Winzoz e MacOsX (con X11).

Per l’installazione sotto MacOsX conviene usare Fink, il sistema di installazione pacchetti mutuato dal mondo Unix. Fink si installa semplicemente scaricando il dmg dal sito ed eseguendo il pacchetto installante contenuto. Sulla stessa pagina trovate le istruzioni per completare l’installazione. Grazie a Fink, in poco tempo possiamo installare XCircuit.

Una volta installato, possiamo lanciarlo da X11 (se l’abbiamo installato è in Applicazioni/Utilities, se non l’abbiamo ancora fatto lo possiamo installare dal DVD di installazione di MacOsX). Apriamo il terminale interno di X11, e avviamo:

/sw/bin/xcircuit

et voilà! Vale la pena giocherellarci un pò..

esercizio_x2

Offre funzionalità interessanti, a discapito di una non immediata disposizione dei tasti che può trarre in inganno. Ulteriori dettagli sul sito del progetto. Sciaou!

Matematici al bar…

Un numero infinito di matematici entra in un bar.
Il primo ordina una birra.
Il secondo ordina mezza birra.
Il terzo ordina un quarto di birra.
Il barista dice: “siete degli idioti”, e serve due birre.

Se non l’avete capita, meglio per voi…

Etichettato .

Appunti, Scoperte e Invenzioni: da oggi nella vostra dashboard!

Orsù, gioite, utenti Mac (per gli altri oggi purtroppo non c’è niente di interessante, mi spiace…)! La vostra dashboard, si, proprio quella dashboard che gli utenti Win e Linux ci invidiano (e copiano) tanto da oggi sarà ancora più bella e utile, grazie alla mia ultima creatura: la widget per leggere in diretta il feed di Appunti, Scoperte e Invenzioni…

Scherzi a parte, mi sono messo a sperimentare la programmazione di widget per Dashboard, e vi assicuro che è molto meno complicato di quanto possa sembrare. In fin dei conti, si tratta semplicemente di un’immagine di sfondo, un pò di html e css per scrivere l’interfaccia e un pò di javascript per far funzionare il tutto. I risultati sono sorprendenti!

Se volete provarci, vi consiglio di prendere un’applet già fatta (le trovate in /Libreria/Widget) e aprirla, per cominciare a vedere come gira: il file .wdgt altro non è che un package, ovvero una cartella, basta farci click col pulsante destro e selezionare “mostra contenuto pacchetto”. Dentro, tra le altre cose, troverete un file html: probabilmente è lì che si svolge il grosso del lavoro. Se avete dimestichezza con javascript e html non dovreste avere difficoltà a capirci qualcosa. Fate una copia di backup della widget sulla quale state lavorando, e poi sperimentate! Io l’ho fatto, ed ecco i risultati:

appscopinv01appscopinv02

La piccola altro non fa che prelevare il feed rss del blog (ogni volta che la dashboard viene aperta) e mostrarlo in modo ordinato; c’è anche la possibilità, cliccando sulla freccia grigia a fianco del titolo del post, di visualizzare un piccolo riassunto del post stesso.

Se la volete, potete scaricarla da qui. Come sempre, basta scompattare il file zip e fare doppio click sull’applet per posizionarla sulla dashboard. Buon divertimento! Vi sarò grato se vorrete farmi l’onore di dedicare al mio timido blog un pò di spazio sulla vostra dashboard :-) . E se trovate errori o avete suggerimenti di qualunque natura, fatemi un fischio!

Confronto tra OpenStreetMap e Google Maps

Il passante di Mestre è stato inaugurato ieri.. ieri sera era già di OpenStreetMap, mentre su Google Maps non c’è ancora.. Un’altra dimostrazione della potenza della comunità, e delle potenzialità di uno strumento aperto e di tutti…

Ps: vi consiglio un’interessante pagina in cui si possono mettere a confronto i dati di Google Maps e OSM.

osmconfrontomestre2

Mica male, considerando il fatto che i primi sono pagati fior di quattrini e realizzati da società specializzatissime, mentre i secondi sono raccolti da appassionati e sostenitori che lo fanno per passione e nel tempo libero..

Ps: come nota personale, questo è il permalink per il confronto tra le mappe del mio paesello (quelle di OSM le ho fatte tutte io :-) ); si, non ho ancora concluso, però quello che c’è non è male, no?

osmconfrontomestre

TrekBuddy: ancora sul mobile gps tracking

Dopo il mio precedente articolo (che tanto è piaciuto, a giudicare dal numero di visite) sul gps tracking, ho scoperto un altro software molto carino allo scopo e vi vorrei raccontare qualcosa al riguardo. Il software in questione si chiama TrekBuddy, e già dal nome (in italiano “Compagno di Passeggiate”) chiarisce la sua funzione principale: fornire strumenti (legati ovviamente alla localizzazione gps) utili agli escursionisti (ma non solo). In particolare, è possibile visualizzare la posizione attuale su una mappa e registrare il percorso compiuto; in più esistono funzionalità particolari come ad esempio la possibilità di memorizzare waypoints.

trekbuddy_184

Per iniziare i dettagli tecnici: si tratta di un’applicazione Java (J2ME), e quindi dovrebbe essere compatibile con la maggior parte dei telefoni cellulari oggi in commercio. Richiede ovviamente una connessione GPS, che nella maggior parte dei casi si ottiene mediante bluetooth e ricevitore esterno. E’ inoltre consigliabile avere una buona quantità di spazio di archiviazione sul cellulare, non tanto per i 280 kilobyte dell’applicazione quanto per la richiesta di spazio per archiviare le mappe e i log di navigazione; molto consigliata una memoria esterna, che ormai tutti i cellulari moderni posseggono.

L’installazione avviene molto semplicemente copiando i files (scaricabili dal sito, sezione) .jad e .jar sul telefono, ad esempio copiandoli sulla memoria esterna. A questo punto è possibile lanciare (mediante il file manager del telefono) il file .jad, che avvierà l’installazione. Mi raccomando di non installare a partire dal .jar, che installerà si l’applicazione ma in modalità non firmata, il che porterà ad ottenere una serie di grattacapi durante l’uso. Non usiamo quindi il sistema di installazione applicazioni java previsto da software nokia (tipo il Phone Manager), ma installiamo a mano come sopra specificato.

Una piccola nota per i possessori di Nokia 6630 (e forse altri modelli), che potrebbero avere un fastidioso problema di permessi di installazione (ovvero un qualche errore di protezione durante l’installazione). L’applicazione richiede accesso a connettività bluetooth, filesystem, e altre parti delicate del telefono, e quindi è stata firmata digitalmente da un ente certificatore che ne attesta la sicurezza di funzionamento. Il certificato è stato emesso da un’azienda di nome Thawte; questo certificato è ricnosciuto dal cellulare (è presente nel suo elenco di certificati noti) ma per qualche ragione sconosciuta di default non è utilizzabile per dare fiducia ad applicazioni in fase di installazione. Per rimediare dobbiamo andare in:

Tools -> Settings -> Security -> Certif. Management

cercare il certificato di nome “Thawte Premium Server CA”, e premere Options -> Trust Settings. A questo punto verifichiamo che la voce “App. Installation” sia “yes”, e siamo a posto!

Ora l’installazione può terminare con successo.

Per quanto riguarda le mappe, queste non sono disponibili immediatamente o scaricate dalla rete al momento del bisogno: debbono essere create in precedenza su un computer e copiate sul cellulare (o meglio, sulla scheda di memoria). Suggerisco di utilizzare le mappe del progetto OpenStreetMap: esiste un sito da cui è possibile eseguire la creazione di una mappa per TrekBuddy, semplicemente selezionando l’area da prelevare e scegliendo il livello di zoom (consiglio livello 16 per girare in città, 14 o 15 per gite fuori porta). Una volta creata la mappa (ci vorrà un pò di tempo, portate pazienza) verrà proposto di scaricare un file compresso; decomprimiamolo e copiamo la cartella corrispondente sulla scheda di memoria del cellulare. Ultima raccomandazione: consiglio di creare più mappe piccole (delle dimensioni di una città, per dire) invece che una mappa sola enorme.

Ultima cosa: i permessi. Il programma fa uso massiccio di funzionalità che richiedono il consenso dell’utente (accesso al filesystem, accesso al bluetooth, e così via). Il certificato dovrebbe essere installato correttamente (vedi il corsivo sopra) ma questo non basta: bisogna specificare che il software ha questi privilegi sempre, altrimenti verranno richiesti ogni volta durante l’utilizzo. Per questo è sufficiente andare su:

Menu -> Strumenti -> Gestione Applicazioni -> TrekBuddy -> Impostazioni Gruppo

E impostare le voci “Leggi dati utente” e “Modifica dati utente” su “Sempre contentito”.

Adesso passiamo all’interfaccia del software: il tasto di selezione sinistro apre un menu di impostazione:

  • Start: avvia il posizionamento; verrà richiesto di selezionare l’antenna GPS bluetooth. Se è già stato eseguito in precedenza, ci sarà un’altra voce “Start [nomeperiferica]“, per avviare il tracciamento con il ricevitore utilizzato in precedenza.
  • Load map: la voce che ci occorre per caricare la mappa creata in precedenza.
  • Settings: una serie di impostazioni, troppe perchè le descriva qui. Le più importanti sono in:
    • Basic -> Data Dir: la directory di default in cui verranno salvati i dati; per i Symbian è qualcosa del tipo:
      file:///E:/TrekBuddy/ (E: corrisponde alla scheda di memoria).
    • Location -> Tracklog: specifica se ogni volta che verrà avviato il tracciamento con Start sarà anche memorizzato il percorso svolto.
    • Location -> TrackLog Format: formato di salvataggio dei tracklog (consiglio GPX).

Esistono moltissime altre voci di impostazione, consiglio di darci un’occhiata.

Una volta avviato il tracciamento, il pulsante 3 apre un ulteriore menu, stavolta di navigazione. In questo menu sono racchiuse le funzionalità di navigazione quali il salvataggio di waypoint, la visualizzazione e l’inseguimento degli stessi, e così via. Consiglio di giocherellarci, è qui che si nascondono le funzionalità più interessanti di questo programma (di cui magari un giorno parlerò in modo più approfondito).

Ps: pulsante “#” per visualizzare la bussola!

trekbuddy-3

Beh, per ora mi fermo qui che mi sono dilungato molto più del previsto. Ciao a tutti! Se avete problemi scrivete nei commenti, vedrò cosa posso fare :-) .

Smultron: editor di testo per programmatori su MacOsX

Ieri cercavo un editor di testo per programmare sotto MacOsX, e ho scoperto l’ottimo Smultron: open source (quindi gratuito), compatibile con Leopard (disponibile la versione precedente all’ultima, per Tiger), offre una serie di interessanti funzionalità per programmatori sotto MacOsX:

  • apertura contemporanea di più files, con visualizzazione Quicklook o a tab;
  • colorazione sintassi (supportati numerosi linguaggi); numerazione righe;
  • possibilità di utilizzare sul testo comandi (anche veri e propri script bash) personalizzabili mediante menu (ad esempio, per validare uno script o compilare un programma java);
  • possibilità di creare frammenti di testo da inserire comodamente mediante menu;
  • visualizzazione full screen;
  • finestra anteprima per l’html; e altro ancora.

Ottimo strumento per chiunque scriva codice. Consigliato.

smultronshot

Questione di Coscienza

Lasciate che quella povera ragazza smetta di essere un appiglio per i perbenisti ipocriti e il clero ignorante.

Non dico “lasciatela morire”, poichè è evidente a tutti che è già morta da anni: la morte è quando si smette di vivere, non quando si smette di respirare.

E lasciate che la sua famiglia ricominci a vivere: sono le loro esistenze che meritano di essere tutelate, non la pseudo-vita di qualcuno che ci ha già lasciati da tanto tempo.

Se oggi il clero e i perbenisti vincono sul buonsenso (e sulla legge, non dimentichiamolo), avremo un ennesimo pericoloso precedente in questo paese già abbastanza idiota e ignorante. Un paese disposto a ignorare il buonsenso, i fatti, le evidenze mediche, la volontà della famiglia e una sentenza definitiva del nostro più alto organo giudiziario, in favore di un falso perbenismo e di valori etici di comodo che non gli faranno comunque dormire sonni tranquilli.

Che schifo.

Abbraccia, Estendi ed Estingui

(tratto da Wikipedia, articolo completo qui.)

Abbraccia, estendi ed estingui” (in inglese EEE, Embrace, Extend and Extinguish) è un’espressione comunemente usata dai critici di Microsoft come sdegnosa caricatura di quanto affermato dalla stessa Microsoft in una dichiarazione pubblica. La dichiarazione affermava che Microsoft mira a “abbracciare ed estendere” gli standard e i progetti già esistenti. L’espressione Abbraccia, estendi ed estingui suggerisce che le prime due fasi sono solo il preambolo del processo di estinzione dei progetti esistenti, che alla fine vengono soppiantati dalle alternative Microsoft.

La strategia EEE consiste nelle seguenti fasi:

  1. Abbraccia: L’azienda annuncia pubblicamente che intende supportare uno standard. Assegna a un dipendente o a dei dipendenti il compito di lavorare con organizzazioni per le standardizzazioni, come il W3C o l’IETF.
  2. Estendi: Supporta lo standard, almeno parzialmente, ma inizia ad aggiungere estensioni proprietarie dello standard ai suoi prodotti. Afferma che sta solo cercando di aggiungere valore per i suoi clienti, e che sono proprio i clienti a volere queste caratteristiche.
  3. Estingui: Con vari mezzi spinge gli utenti ad usare i propri standard estesi – per esempio con i propri prodotti server e strumenti di sviluppo – incrementando così l’uso delle estensioni proprietarie al punto che i concorrenti che non seguono quella versione dello standard non possono competere. Lo standard dell’azienda quindi diventa l’unico standard che conta in termini pratici (standard de facto), e permette ad essa di controllare il mercato tramite il controllo dello standard.

E dopo questo c’è ancora un sacco di gente al mondo abbastanza miope da sprecare tempo a sviluppare una professionalità su strumenti come .NET, J# o C#, invece di collaborare alla diffusione e alla crescita delle alternative libere. E intanto gli sviluppatori web devono scrivere il proprio codice due volte, una volta nel modo giusto e una volta nel modo che va bene a MsExplorer.

Riflettete, gente.