Ocitysmap | Creare mappe con Vie indicizzate

Ho provato a replicare in locale l’ottimo servizio offerto da maposmatic.org (un’applicazione per generare porzioni di mappa stampabili come file PDF, PNG, SVG,…. comprendente l’elenco dei nomi delle vie indicizzate in una griglia).

Ho seguito le istruzioni di installazione riportate nel pacchetto ocitysmap alle quali pero’ ho dovuto apportare alcune modifiche (la guida fa riferimento ad una installazione eseguita su ubuntu 14.04, mentre io ho provato su Debian testing ad oggi – ottobre 2016).

Per comodità operativa (potrebbe non essere il metodo migliore) e per dare chiarezza di lettura ai passaggi da eseguire ho strutturato l’ambiente di lavoro in questo modo:

– posizionandosi nella home dell’utente ho creato una directory in cui salvare i sorgenti chiamata “src”

$ mkdir src

– sempre all’interno della home ho creato un’altra directory chiamata “osm_data” al cui interno salveremo i dati scaricati dal server OSM e che saranno importati successivamente nel db PostGIS

$ mkdir osm_data

 

Ed ecco il procedimento globale:

1 Installazione di PostgreSQL e PostGIS

# apt-get install postgresql postgresql-contrib postgresql-9.4-postgis-2.2 (PostgreSQL 9.4.5)

2 Creazione di un nuovo utente di PostgreSQL

diventare root:

$ su

diventare superuser postgres:

# su postgres

Creare il nuovo utente di PostgreSQL:

# createuser -P -S -D -R maposmatic

(chiamiamo “maposmatic” il nuovo utente; inserire la password due volte per conferma)

3 Creazione del database

# createdb -E UTF8 -O maposmatic db_maposmatic

4 Abilitazione di PostGIS sul database

4.a Abilitare il linguaggio plpgsql sul database creato db_maposmatic (utente postgres)

# createlang plpgsql db_maposmatic

4.b Installazione del supporto PostGIS nel database

# psql -f /usr/share/postgresql/9.4/contrib/postgis-2.2/postgis.sql -d db_maposmatic

4.c Opzionalmente inseriamo anche i commenti

# psql -f /usr/share/postgresql/9.4/contrib/postgis-2.2/postgis_comments.sql -d db_maposmatic

4.d Aggiunta della lista dei sistemi di riferimento spaziale

# psql -f /usr/share/postgresql/9.4/contrib/postgis-2.2/spatial_ref_sys.sql -d db_maposmatic

4.e Cambiare il proprietario delle tabelle

# echo “ALTER TABLE geometry_columns OWNER TO maposmatic; ALTER TABLE spatial_ref_sys OWNER TO maposmatic;” | psql -d db_maposmatic

4.f Aggiungere l’estensione hstore

# echo “CREATE EXTENSION hstore;” | psql -d db_maposmatic

5 Installazione di osm2pgsql

osm2pgsql e’ lo strumento che consente di importare i dati OSM direttamente in un database PostGIS. La guida suggerisce di scaricare la versione da SVN in quanto quello pacchettizato Debian/Ubuntu non e’ abbastanza recente. Ho tentato comunque l’installazione via apt-get ed in realta’ tutto e’ andato bene, quindi:

# apt-get install osm2pgsql

6. Download dei dati dal server OSM

Il download dei dati si puo’ effettuare mediante il servizio offerto da geofabrik.de, per esempio cercando la zona di nostro interesse

In alternativa (nel caso volessimo un’area di dimensioni ridotte e/o comunque ben delimitate da una bounding box (bbox)) possiamo utilizzare il servzio offerto da overpass.osm.rambler.ru. In questo caso utilizziamo wget per scaricare una certa area geografica:

$ wget http://overpass.osm.rambler.ru/cgi/xapi_meta?*%5Bbbox=long_inf,lat_inf,long_sup,lat_sup%5D

tradotto con dati reali potrebbe essere:

$ wget http://overpass.osm.rambler.ru/cgi/xapi_meta?*%5Bbbox=11.3640,45.4650,11.4660,45.5780%5D

Si ottiene un file denominato “xapi_meta?*[bbox=11.4740,45.4150,11.5160,45.4650]” che potremo rinominare in “dati_osm.osm” (per esempio mediante il comando “mv”).

7 Importazione dei dati OSM all’interno del database PostGIS

L’importazione avviene mediante il seguente comando:

$ osm2pgsql -s -c -d db_maposmatic -m -U maposmatic -W -H localhost -k dati_osm.osm

A seconda della dimensione del file .osm il processo puo’ durare qualche secondo, minuto o ora (l’importazione di tutto il nord-est d’Italia, circa 750 MB, e’ durata circa 1 ora e mezza) e dipende molto dalle caratteristiche hardware del computer.

8 Installazione di Mapnik

8.a Installare python-mapnik

Via synaptic o apt-get o compilarlo da sorgente mediante “python setup.py install

8.b Installazione dipendenze

# apt-get build-dep python-mapnik

e installare altre librerie necessarie (in particolare e’ opportuno installare le librerie libboost piu’ recenti. Ad momento della stesura del presente articolo su Debian Testing si trovano le libboost-1.61):

# apt-get install libboost1.61-dev libboost-date-time1.61-dev libboost-filesystem1.61-dev libboost-iostreams1.61-dev libboost-program-options1.61-dev libboost-python1.61-dev libboost-regex1.61-dev libboost-serialization1.61-dev libboost-system1.61-dev libboost-thread1.61-dev libharfbuzz-dev

8.c Download Mapnik

Download dell’ultima versione di Mapnik dal repository git (dopo esseresi posizionati nella directory /home/nome_utente/src/):

$ cd src

Lanciare il download:

$ git clone git://github.com/mapnik/mapnik.git

Spostarsi nella directory creata durante il download “mapnik”:

$ cd mapnik

8.d Compilazione ed installazione

Prima di eseguire il config assicurarsi di fare un update dei submodule di mapnik:

$ git submodule update –init

$ git submodule update –init deps/mapbox/variant

Eseguire il config:

$ python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/ PYCAIRO=true XMLPARSER=libxml2

Compilare:

$ python scons/scons.py

Installare (dopo essersi loggati come root):

# python scons/scon.py install

8.e Controllo dell’installazione

Lanciare un interprete python ed invocare “import mapnik”:

$ python

dovremmo ottenere una cosa del tipo:

Python 2.7.12+ (default, Sep  1 2016, 20:27:38)
[GCC 6.2.0 20160927] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>>

quindi importiamo il modulo mapnik appena compilato:

>>> import mapnik
>>>

Se tutto e’ ok dovremmo ottenere il prompt in attesa di comandi; in tal caso significa che mapnik e’ stato compilato  ed installato correttamente.

9. Installazione di Mapnik-OSM

Mapnik-OSM e’ un set di file che indicano a Mapnik come renderizzare le mappe di OpenStreetMap.

9.a Download

Dopo essersi posizionati nella directory /home/nome_utente/src/ scarichiamo il sorgente mediante svn (nel caso svn non fosse presente installarlo via “apt-get install subversion”)

$ svn co http://svn.openstreetmap.org/applications/rendering/mapnik mapnik2-osm

Questo creera’ una nuova directory in /home/nome_utente/src chiamata “mapnik2-osm”

9.b Installazione dei dati statici generali

In aggiunta ai dati OSM sono necessari altri dati statici (world boundaries, ecc…)

$ cd mapnik2-osm

Invochiamo da shell il comando get-coastlines.sh che scarichera’ una serie di SHP delle linee di costa ed altri dati.

$ sh ./get-coastlines.sh

9.c Abilitazione degli unifont

Per un render corretto dei caratteri Coreano, Cinese o Giapponese si deve usare il font unifont. Per abilitarlo (da root):

# apt-get install ttf-unifont

E’ consigliato eseguire anche un reconfigure del locales:

# dpkg-reconfigure locales

9.d Configurazione

La configurazione avviene invocando lo script in python chiamato “generate_xml.py” che si trova in /home/nome_utente/src/mapnik2-osm/; spostarsi quindi nella directory interessata:

$ cd /home/sit/src/mapnik2-osm/

e lanciare il comando

$ python ./generate_xml.py –dbname db_maposmatic –host ‘localhost’ –user maposmatic –port 5432 –password ‘password_utente_maposmatic’

In risposta dovremmo ottenere un messaggio simile a questo:

Include files written successfully! Pass the osm.xml file as an argument if you want to serialize a new version or test reading the XML

10 Installazione di OCitySMap

10.a Recuperare i sorgenti

Posizionarsi sempre nella directory /home/sit/src/

$ git clone git://git.savannah.nongnu.org/maposmatic/ocitysmap.git

10.b Installazione delle dipendenze

# apt-get install python-psycopg2 python-gdal python-gtk2 python-cairo python-shapely

10.c Modifica di alcuni file di configurazione di OCitySMap

Editare il file /home/nome_utente/src/ocitysmap/ocitysmap/maplib/map_canvas.py alle righe 176 e 177. In particolare modificare la riga 176 nel modo seguente:

r.symbols.append(mapnik.PolygonSymbolizer())

e la riga 177 nel modo seguente:

r.symbols.append(mapnik.LineSymbolizer())

altrimenti durante il processo compariranno degli errori sull’impossibilita’ di eseguire alcuni render.

11 File di configurazione di OcitySMap

copiare il file /home/nome_utente/src/ocitysmap/ocitysmap.conf.dist nella home directory dell’utente e rinominarlo in “.ocitysmap.conf”. Da notare il punto davanti al nome del file: indica che il file e’ nascosto. Editarlo poi inserendo i dati corretti del database da utilizzare. Ecco il file .ocitysmap.conf usato in questa guida:

[datasource]
host=localhost
user=maposmatic
password=password
dbname=db_maposmatic
# Optional database port, defaults to 5432
# port=5432

[rendering]
# List of available stylesheets, each needs to be described by an eponymous
# configuration section in this file.
available_stylesheets: stylesheet_osm1, stylesheet_osm2

# The default Mapnik stylesheet.
[stylesheet_osm1]
name: Default
description: The default OSM style
path: /home/sit/src/mapnik2-osm/osm.xml

# Another stylesheet
[stylesheet_osm2]
name: AnotherOne
description: Another OSM Stylesheet
path: /home/sit/src/ocitysmap/stylesheet/maposmatic-printable/osm.xml

12 Lanciare OCitySMap

Spostarsi nella directory /home/nome_utente/src/ocitysmap/ e lanciare il comando per l’esecuzione del render:

$ ./render.py -t “titole della mappa” -f pdf -p nome_file_generato –osmid=-44831

nel caso si conoscesse l’osmid della relazione (in questo caso identifica un confine comunale) che intendiamo usare. Per ricavare l’osmid consultare l’ottimo servizio fornito da nominatim

lanciando il comando ./render.py –help si ottiene un elenco dettagliato dei comandi opzionali del modulo.

Se invece si volesse effettuare il render di una determinata area geografica e’ possibile indicarla con i valori del bbox, per esempio:

$ ./render.py -t “titolo della mappa” -f pdf -p nome_file_generato -b lat_inf,long_inf lat_sup,long_sup

dove lat_inf e long_inf sono rispettivamente la latitudine e la longitudine dell’estremo inferiore sinistro (o ovest) e lat_sup e long_sup sono rispettivamente la latitudine e longitudine dell’estremo superiore destro (o est). Tradotto don dati reali:

$ ./render.py -t “titolo della mappa” -f pdf -p nome_file_generato -b 45.3330,11.3280 45.4400,11.4595

Verranno generati due file: “nome_file_generato.pdf” contenente la mappa ed un file “nome_file_generato.csv” con l’elengo indicizzato della strade e dei luoghi di interesse trovati.

 

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...