22 ottobre 2012

Accedere ed utilizzare i dati di OpenStreetMap: i rendering




Questa volta introduciamo qualche aspetto tecnico dell'infrastruttura di OSM, come recuperare i dati e come utilizzarli per generare da soli una cartina.

Accedere ai dati


All'inizio abbiamo detto che OSM permette di usufruire dei dati che noi utenti abbiamo contribuito a creare. Ma come si accede ai dati?
Senza entrare nei dettagli (per chi vuole sviluppare, possiamo approfondire o c'è sempre la wiki che è un ottimo punto di partenza) facciamo una breve panoramica su quello che sta dietro a tutto.
Quello che vediamo sul sito principale -il Rails Port- viene spesso confuso col progetto in sè, ma se vogliamo sottilizzare,  si compone di una parte di 'frontend' (ed è solo uno dei molteplici frontend possibili, ma ne parleremo più in là), ed una parte di backend, che comprende il database e le API.
Il database è basato su PostgreSQL -open source!-, ma non è possibile interrogarlo direttamente: per fare questo ci sono due metodi, uno è usare le API, l'altro è utilizzare degli estratti.

Anche qui, un utente 'tipico' probabilmente userà il secondo metodo, ma un programmatore vorrà sapere almeno che:
-le uniche API che permettono l'accesso in scrittura sono composte da chiamate RESTful e sono documentate;
-ci sono le xAPI (extended API) in sola lettura, che permettono interrogazioni anche abbastanza complesse, di cui attualmente forse la più facile da usare è l'Overpass API
-ci sono diverse implementazioni di interfacce alle API in diversi linguaggi (Perl, Python e così via).

In buona sostanza, quando si parla col database, lui ci risponde con un file xml. Questo file xml è anche la base di quelli che vengono chiamati estratti: il database viene periodicamente salvato e ogni settimana viene prodotto il planet (scaricabile qua, 23 GB compressi), un enorme file xml contenente tutti i dati nella loro versione corrente, e Geofabrik offre in download lo stesso suddiviso però per nazione (l'associazione Gfoss.it  offre l'estratto italiano anche suddiviso per regioni).
Il formato xml utilizzato viene salvato con estensione .osm, ed è leggibile da tutti i programmi dedicati, tra cui JOSM di cui abbiamo accennato la volta scorsa.
Un altro formato derivato è quello che usa i protocol buffer, una invenzione di Google che permette tempi di lettura molto accorciati e minore spazio occupato: questi ultimi hanno estensione pbf e sono meno compatibili perchè sono stati introdotti relativamente di recente.
A cascata, da questi due formati principali (.osm e .pbf) derivano tutti gli altri usati dalle più applicazioni più disparate.

C'è chi vuole però avere un database, come fa a copiarlo? Deve passare nuovamente dai file messi a disposizione, dal planet o da uno dei suoi derivati. Esistono numerosi tool che permettono la conversione di formati (osmosis ad esempio) e numerosi tool che permettono di popolare database con i dati OSM. Ovviamente il più compatibile è PostgreSQL (l'import è "banale" con strumenti come ImpoOSM e osm2pgsql). Ne accenniamo parlando di Tilemill più sotto.

Interludio: ortorettificazione, modelli del terreno

Prima di passare alla parte 'mani in pasta' di oggi, volevo citare brevemente due argomenti utili per eventuali approfondimenti.

1. Ortorettificazione

L'altra volta ho citato le ortofoto del PCN. Come si distinguono dalle immagini satellitari o aeree?
Le immagini prese dal mezzo (che sia aereo o satellite) devono venir processate per eliminare le distorsioni prodotte dai rilievi: considerate ad esempio un edificio e guardate una foto aerea normale, vi accorgerete che si vede la facciata, mentre ci si sarebbe aspettato di vedere solamente il tetto; idem vale per le montagne. Quando si parla di distorsioni si intende proprio questo, e per garantire che le misurazioni effettuate sulle foto siano corrette, esse devono venir ortorettificate applicando una trasformazione geometrica: a questo punto vedrete solo i tetti.

2. Modelli del terreno

La trasformazione geometrica del punto precedente viene di solito effettuata tramite modelli digitali dell'elevazione (DEM) o del terreno (DTM). Come dice il termine stesso, essi sono delle rappresentazioni della topografia di un territorio, e l'applicazione più evidente è ad esempio una cartina fisica.
L'unico modello del terreno "open" è al momento lo SRTM (Shuttle Radar Topography Mission) prodotto dalla NASA, che ha una risoluzione a 30 metri (1 arcosecondo) sugli Stati Uniti e 90 metri (3 arcosecondi) sul resto del globo. Copre l'area 56° Sud - 60° Nord, con alcune zone No data (nei deserti e sulle montagne). Questo è quello che passa il convento :)

Rendering su server


Se volete costruirvi un server per mostrare mappe, vi consiglio di guardare in giro (ad esempio http://switch2osm.org/serving-tiles/), perchè qui introduco solo il concetto di tile -da cui poi viene anche il nome tileserver-.

Come funzionano le mappe sul web?
Il workflow è semplice, almeno nel caso di OSM: l'utente inquadra un'area sullo schermo, la libreria integrata nel sito calcola le coordinate e le converte nelle rispettive tile, quadratini di 256x256 pixel, richiedendole al server. Il server ovviamente non se le genera tutte subito (specialmente per gli zoom grandi): se non ha una tile pronta -o è vecchia- la genera tramite il programma -in questo caso Mapnik- e la serve all'utente. Quest'ultimo se le trova appiccicate una all'altra e ha l'impressione di vedere una mappa completa.

Sul sito principale ci sono disponibili 18 livelli di zoom (lo zoom 1 è una tile che comprende tutto il globo, lo zoom 2 comprende il globo in 4 tile e così via), tralascio tutta la matematica e altri concetti, e se dovesse generare tutte le possibili tile occuperebbe circa 54 TeraByte di spazio!

Rendering: Maperitive

Ho già parlato di rendering, ma non ho detto che è! Come per la grafica 3D, fare il rendering di un'area è prendere i dati grezzi e 'convertirli' in una immagine. Esistono diversi programmi che compiono quest'azione.

Il più user-friendly, Maperitive è pensato per Windows, non è open-source e scritto in C# (che cavolo ve lo presento a fare allora? :D), ma è possibile eseguirlo tramite Mono (bisogna installare il metapackage mono-complete).
Probabilmente ne avete già visto una applicazione, se seguite il ciclismo: da due anni il Giro d'Italia produce le mappe delle tappe usando i dati OSM e Maperitive. Un'altra applicazione sportiva la vediamo nel circuito PSArally.
Scaricato l'archivio dal sito, lo scompattiamo e da terminale entriamo nella cartella, eseguendo "sh Maperitive.sh". Si apre l'interfaccia del programma ed in teoria appare un livello di mappe web (a me non si apre perchè da un errore).
L'interfaccia ha tre riquadri: nel principale appare la mappa come dovrebbe apparire nel prodotto finale, in basso a destra abbiamo i livelli, a sinistra il "command prompt".
Dal menù ad esempio andiamo su File->Open Map sources ed apriamo un file .osm (scaricato da un servizio tra quelli elencati nella prima parte), vediamo che il programma ci riflette un po' ed appare la mappa! Dal menu Map possiamo scaricare dalle API read only o cambiare il ruleset (un elenco di regole che definiscono come deve apparire la mappa); da Tools possiamo aggiungere per esempio l'ombreggiatura o le curve di livello basate su SRTM.
Sul sito c'è anche una estensiva documentazione che spiega anche tutti i comandi che possono essere usati nel prompt.
Si può scegliere se esportare una mappa 'raster' (ovvero una bitmap), una mappa vettoriale (in SVG o nel formato di Illustrator, per ulteriori tweak con programmi di grafica) o ancora come tiles da caricare su un webserver (nel caso non voleste creare un sistema che generi al volo le tiles, questa è una soluzione che ha come difetto la necessità di generare tutte le possibili tile per ogni livello che scegliamo. un servizio che usa questo metodo è Mapefurlane).

Rendering: Tilemill

Abbiamo accennato nel primo articolo a Mapbox, una delle società che fanno business su OSM: questa offre la possibilità di applicare il proprio stile personalizzato ad una mappa web, generata come spiegato due sezioni fa, ovviamente facendosi pagare in base al traffico che uno ci si aspetta. Oltre ad aver ricevuto un finanziamento per migliorare OSM, ha rilasciato TileMill, una applicazione open source (https://github.com/mapbox/tilemill) costruita intorno a Mapnik, che permette ad ognuno di personalizzare facilmente l'aspetto di una mappa; il prodotto finale può essere salvato in locale o caricato sui server Mapbox, ricollegandosi al business dell'azienda.
Dal sito è possibile scaricare il pacchetto di installazione per Windows, Mac e Ubuntu (o derivate) -per inciso ci sono anche delle spiegazioni più chiare delle mie-.

Come sorgente di dati Tilemill non accetta gli estratti come nel caso precedente, ma mostra tutta la sua potenzialità con i database. L'aspetto della mappa è comandato invece da un linguaggio simile al CSS, Carto. Esistono stili già preconfezionati che si trovano su Github, come MapBoxStreets (che è lo stile di default dell'offerta Mapbox, lo potete vedere in questa pagina) e OSMBright; per questi ci sono delle guide che permettono di installare progetti configurati tramite semplici script Python.
Il passo preliminare è la preparazione del database, posto che abbiate installato postgresql (9.1, lo trovate nei repository) e osm2pgsql (idem, è nei repo):
-sudo passwd postgres (cambiamo la password di default)
-su - postgres (passiamo all'user che è admin del database)
-createdb gis (creiamo un database che useremo per mettere i dati)
-psql -s gis (accediamo alla console)
#create user <username> password '<una password>';
#GRANT ALL PRIVILEGES ON DATABASE gis TO <username>;

Torniamo al nostro user usando di nuovo su ed eseguiamo:
-psql -d gis -f /usr/share/postgresql/9.1/contrib/postgis-2.0/postgis.sql
-echo "ALTER TABLE geometry_columns OWNER TO <username>; ALTER TABLE spatial_ref_sys OWNER TO <username>;" | psql -d gis
-psql -f /usr/share/osm2pgsql/900913.sql -d gis

Adesso il database è configurato, e possiamo buttarci dentro i dati:
osm2pgsql -S /usr/share/osm2pgsql/default.style -d gis [estratto.osm]

UPDATE 5/12/12: Se avete ricevuto l'update di postgis alla versione 2.0, installate questo ppa e fate l'upgrade di osm2pgsql https://launchpad.net/~kakrueger/+archive/openstreetmap

Scegliendo ad esempio OSMBright, scarichiamo lo zip, lo scompattiamo, copiamo configure.py.sample in configure.py, cambiamo i dati all'interno per farlo corrispondere alla nostra configurazione ed eseguiamo make.py (scaricherà circa 400MB di dati che comprendono le linee di costa).
In Tilemill avrete un progetto già pronto e configurato che potrete esportare facilmente come immagine.

Se volete partire da zero, create un nuovo progetto da Tilemill, inserite due livelli contenenti gli shapefile delle linee di costa (Add Layer, compilate la scheda File), e poi inserite livelli corrispondenti alle query che prendono gli oggetti che volete rappresentare (Add Layer, scheda Postgis, il campo Connection sarà tipo 'dbname=gis host=localhost port=5432 user=<username> password=<password>', in table ci andrà la tabella che volete interrogare (o una sottoquery se volete prendere solo certi oggetti), ad esempio 'planet_osm_roads' che contiene le strade; inserendo l'id o la classe, potrete scrivere del css per dare uno stile a certe cose, ad esempio scegliendo 'strade' un esempio di regola potrebbe essere
#strade[highway='primary']
{
line-color:#fff;
}

Ecco un esempio: ho installato un progetto OSM Bright, e volevo evidenziare i Palazzi dei Rolli a Genova, patrimonio Unesco e mappati tutti con il tag che rappresenta proprio i Patrimoni dell'Umanità (historic=unesco_world_heritage).
Ho creato un nuovo Layer e inserito in id 'rolli', la connessione e in 'Table or subquery'
(SELECT *
FROM public.planet_osm_polygon
WHERE planet_osm_polygon.historic='unesco_world_heritage') AS rolli

Sono passato ad aggiungere un nuovo file sulla destra, e ho inserito un semplice
#rolli
{
polygon-fill:#7f0000;
}

Questo è il risultato:


Rendering: gli altri

Ce ne sono molti altri, ho preferito esporre i due più user friendly e conosciuti.
Altri che possono essere citati:
- quelli che sfruttano HTML5: KothicJS
- Mapweaver, un set di script perl
MapOSMatic, un servizio per generare atlanti
- Mapsforge, in realtà una libreria per Android, su cui si basano diverse applicazioni, che fa il rendering al volo.

Conclusione

Ho saltato tutte le parti tecniche a parte il secondo mini-tutorial, poichè questa serie di articoli vuole fornire una panoramica più generale per invogliarvi a cercare e fare da voi), ma se volete maggiori informazioni o se avete domande, mi trovate nei commenti o su Google+.

Riportando una discussione su Google+, esiste anche un editor abbastanza completo per Android. Si chiama Vespucci, http://code.google.com/p/osmeditor4android/ questo è il sito, e lo trovate anche su Google Play. E' ripreso lo sviluppo grazie al Google Summer Of Code, e se avete un tablet potrebbe essere una alternativa per inserire dati sul campo.

Nessun commento:

Posta un commento

Licenza
Licenza Creative Commons

Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 3.0 Unported. Questo blog non rappresenta una testata giornalistica, in quanto viene aggiornato senza alcuna periodicità. Non può, pertanto, considerarsi un prodotto editoriale, ai sensi della legge n. 62 del 7/03/2001

Disclaimer immagini

Le immagini utilizzate in questo blog appartengono ai loro rispettivi autori e sono utilizzati per scopi educativi, personali e senza scopo di lucro. Ogni eventuale violazione del copyright non è intenzionale, ma se si riconosce un'immagine protetta da copyright, fatemelo sapere qui, e sarò lieto di aggiungere i credits o modificarla o rimuoverla.

Disclaimer images

Images used on this blog belong to their respective authors and are used for educational, personal and no profit purposes. Any eventual copyright infringement is not intentional, but if you recognize a copyrighted image, please let me know here, and I'll happily provide to add the right credits or modify or remove it.