Creare delle tiles a partire dal db OSM? Si può fare in locale. Come? Basta installare Mapnik, Postgresql con estensione spaziale postgis e scaricare un planet di OSM.
Ecco come ho fatto i miei test. Molto probabilmente non è la strada più diretta e corretta, ma a volte “smazzarsi” un po’ di codice e un po’ di errori aiuta a comprendere un po’ di più le cose. In questo/i post faccio riferimento a operazioni svolte con Debian (Lenny).
Partiamo dall’inizio:-
– installare Postgresql con estensione spaziale postgis (per questo rimando alle pagine relative);
– installare mapnik con
# apt-get install mapnik (oppure tramite “synaptic”);
– reperiamo i dati del planet che ci interessa: io ho scaricato il planet italiano da qui. Si ottine il file italy.osm.bz2.
– creare il database che riceverà i dati. Diventare utente postgres e creare il db con:
# createdb -E UTF8 -O sit osm
dove “osm” è il nome del db e “sit” è il nome dell’utente
– creare il linguaggio per il db:
# createlang plpgsql osm
– aggiungere le tabelle per fare in modo che sia un geodb:
# psql -d osm -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql
– Fare in modo che le tabelle spaziali siano di proprietà dell’utente sit:
# echo “ALTER TABLE geometry_columns OWNER TO sit; ALTER TABLE spatial_ref_sys OWNER TO sit;” | psql -d osm
– popliamo il db creato tramite “osm2pgsql”
# osm2pgsql -m -d osm /home/sit/osm/data/italy.osm.bz2
– posizionarsi nella home directory e lanciare il comando:
$ svn checkout http://svn.openstreetmap.org/applications/rendering/mapnik
In questo modo reperiamo una serie di file e directory già strutturate per effettuare le operazioni di rendering. Viene creata una directory “mapnik”.
– Posizionarsi in “mapnik”
$ cd mapnik
– scaricare gli SHP di linee di costa e boundary:
$ wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
$ tar zxvf world_boundaries-spherical.tgz
$ wget http://hypercube.telascience.org/~kleptog/processed_p.zip
$ unzip processed_p.zip
$ mv coastlines/* world_boundaries/
$ rmdir coastlines
– spostarsi nella directory world_boundaries:
$ cd world_boundaries
$ wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
$ tar xvjf shoreline_300.tar.bz2
– fare una copia del file set-mapnik-env e chiamarla, per esempio, z0-set-mapnik-env.
$ cp set-mapnik-env z0-set-mapnik-env
– editare questo file indicando il nome corretto del database postgresql da usare ed il nome corretto dell’utente che ha accesso al db stesso. Nell’header del file c’è una chiara e semplice spiegazione dei settaggi.
– lanciare il comando:
$ source ./z0-set-mapnik-env
– poi:
$ ./customize-mapnik-map >$MAPNIK_MAP_FILE
– creare una copia del file generate_tiles.py (chiamarla i.e. “z0_generate_tiles.py”) e modificarla adattando la bbox alla zona di interesse. Nel mio caso, dovendo operare in un’area ristretta della Provinica di Vicenza ho editato nel modo seguente (riporto un estratto della parte finale del file, l’unica modificata). Basta commentare le parti da omettere con un “#” seguito da uno spazio ” “.
—————————————————————————————————
# Change the following for different bounding boxes and zoom levels
#
# Start with an overview
# World
# bbox = (-180.0,-90.0, 180.0,90.0)
# bbox = (11.0,45.0, 12.0,46.0)
# render_tiles(bbox, mapfile, tile_dir, 0, 0, “World”)
# minZoom = 10
# maxZoom = 16
# bbox = (-2, 50.0,1.0,52.0)
# render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom)
# Montecchio Maggiore
bbox = (11.37,45.47, 11.45,45.56)
render_tiles(bbox, mapfile, tile_dir, 1, 12 , “Montecchio”)
# Muenchen
# bbox = (11.4,48.07, 11.7,48.22)
# render_tiles(bbox, mapfile, tile_dir, 1, 12 , “Muenchen”)
—————————————————————————————
– infine lanciare il comando che genera la tiles
$ ./z0_generate_tiles.py
Nella directory “tiles” vengono generate le tiles (appunto :-)).
Le immagini così generate (PNG) possono essere usate in locale in caso di mancanza di connessione alla rete o solo per caricare dati locali invece di doverli scaricare dai server OSM. A titolo di esempio riportiamo il caso di un applicativo basato su Openlayers. In questo caso basta indicare un nuovo layer (nella pagina HTML che visualizzerò i dati) con la seguente sintassi:
———————————————————————————————————————————————————————
var newLayer = new OpenLayers.Layer.OSM(“Mapnik@home”, “http://localhost/openlayer/tiles/”, {numZoomLevels: 19});
map.addLayer(newLayer);
———————————————————————————————————————————————————————
dove “http://localhost/openlayer/tiles/” è il percorso locale per raggiungere le immagini PNG (questa direcotry deve essere accessibile all’utente www-data).
Sotto è riportato un esempio di render di dati OSM realizzato con mapnik; il tutto visualizzato con tramite Openlayers.