Come da titolo, per ottenere soltanto l’anno da un campo “date” (nella forma “aaaa-mm-gg”, per esempio: “2018-01-03”) eseguire la seguente istruzione:
nomedb=# SELECT date_part(‘year’, nome_colonna_date) FROM nome_tabella;
Come da titolo, per ottenere soltanto l’anno da un campo “date” (nella forma “aaaa-mm-gg”, per esempio: “2018-01-03”) eseguire la seguente istruzione:
nomedb=# SELECT date_part(‘year’, nome_colonna_date) FROM nome_tabella;
In Gnome 3 le icone non sono visibili sul desktop (per impostazione predefinita). Per visualizzarle installare il pacchetto “gnome-tweak-tools” e avviarlo. Cliccare sulla sezione “Desktop” e posizionare su “On” la voce “Icone sulla scrivania“.
Quando si sviluppano applicazioni con django si ha a disposizione un server web “temporaneo” che si avvia con il comando:
$ python manage.py runserver
ed e’ raggiungibile all’indirizzo:
Se vogliamo accedervi da remoto bisogna lanciare prima il comando (sulla macchina client):
$ ssh -L 8888:127.0.0.1:8000 nome_utente@indirizzo_ip_server
per esempio:
$ ssh -L 8888:127.0.0.1:8000 sit@192.168.168.1
A questo punto possiamo collegarci mediante il browser puntando a:
PS: E’ necessario avere avviato in precedenza il servizio con:
$ python manage.py runserver
sulla macchina host
Lavorando con il plugin “Qgis2leaflet” che consente la visualizzazione animata di un percorso GPX e’ necessario che venga popolato il tag (campo) “Time”. In genere se il file GPX deriva da un rilievo non ci sono problemi; il campo e’ correttamente popolato. Se deriva invece da un sistema di routing che consente l’esportazion in GPX o da una conversione in formato GPX da altro vettoriale (Es. SHP, Postgis,…), è necessario popolare questo valore altrimenti vuoto.
Per farlo ci viene in aiuto “gpsbabel” utilizzando la seguente sintassi:
$ gpsbabel -i gpx -f nome_file_gpx_in_entrata -x track,faketime=f20100705200000+10 -o gpx -F nome_file_gpx_in_uscita.gpx
In questo caso viene inserito un incremento di 10″ (10 secondi) tra un punto e l’altro (utile per il “motore” di visualizzazione animata di leaflet)
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:
# apt-get install postgresql postgresql-contrib postgresql-9.4-postgis-2.2 (PostgreSQL 9.4.5)
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)
# createdb -E UTF8 -O maposmatic db_maposmatic
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
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
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”).
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.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.
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.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.
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
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.
Riporto le operazioni effettuate per migrare alcuni database da Postgresq-8.4 con estensione spaziale Postgis-1.5 a Postgresql-9.5 con Postgis-2.2.
Eseguire un dump dei dati con:
$ PGUSER=postgres pg_dump -Fc nome_db > nome_db.dmp
Questa operazione va fatta per ogni db presente nel cluster; si ottengono i relativi dump in formato compresso (.dmp) da utilizzare poi per l’importazione della nuova architettura.
Stoppare Postgresql-8.4 con (da root):
# /etc/init.d/postgresql stop 8.4
Installare la versione 9.5 di Postgresql e la versione 2.2 di Postgis (e dipendenze collegate) con:
# apt-get install postgresql-9.5 postgis postgis-2.2
A questo punto si potrebbe droppare il cluster della versione 8.4 con “pg_dropcluster –stop 8.4 main“. Nel mio caso ho invece preferito rimuovere Postgresql-8.4 e Postgis 1.5 con “apt-get purge postgresql-8.4*”
Creare gli utenti dei db (nel nostro caso abbiamo ricreato gli utenti che avevamo prima di effettuare la migrazione):
$ su
# su postgres
Entrare in un db (es: template1):
# psql template1
e creare gli utenti necessari:
#= CREATE USER nome_utente WITH PASSWORD ‘password_segreta’ CREATEDB CREATEUSER;
(nel nostro caso l’utente creato avra’ la facolta’ di creare database e utenti)
Creare un template apposito per i db spaziali che chiameremo “template_gis”:
#= CREATE DATABASE template_gis template=template0;
Uscire dal database template1 e (sempre come utente postgres) importare le funzioni spaziali nel database appena creato:
# psql -d template_gis -f /usr/share/postgresql/9.5/contrib/postgis2.2/postgis.sql
# psql -d template_gis -f /usr/share/postgresql/9.5/contrib/postgis2.2/spatial_ref_sys.sql
# psql -d template_gis -f /usr/share/postgresql/9.5/contrib/postgis2.2/rtpostgis.sql
In questo modo abbiamo popolato il template_gis con tutti i sistemi di riferimento spaziali e tutte le funzioni dedicate alla manipolazione di dati vettoriali (“postgis.sql” e raster “rtpostgis.sql”)
Ritornare all’interno del database template1:
# psql template1
e facciamo in mdo che il database template_gis sia un template:
#= UPDATE pg_database SET datistemplate=’t’ WHERE datname=’template_gis’;
Creare i database (uno alla volta)
#= CREATE DATABASE nome_db template=template_gis OWNER nome_utente;
Uscire dal template1 e popolare i nuovi database con l’aiuto dello script “postgis_restore.pl”:
$ /usr/share/postgresql/9.5/contrib/postgis-2.2/postgis_restore.sql nome_db.dmp | psql nome_db
A partire da un layer multipolygon contenente edifici di una porzione di territorio (circa 1300 entità) avevo la necessità ci creare un nuovo layer (tabella) contenente i poligoni ottenuti dalla fusione di elementi adiacenti. La situazione di partenza è quella rappresentata in fig. 1.
fig. 1
Utilizzando le funzioni di Postgis ho ottenuto il risultato mediante la seguente istruzione (viene creata una nuova tabella):
# CREATE TABLE nuova_tabella AS SELECT(ST_Dump(ST_Union(ST_Buffer(the_geom, 0.01)))).geom AS the_geom FROM tabella_origine;
Il risultato è quello di fig. 2
fig. 2
Se volessimo aggregare i poligoni anche in base al valore di un determinato attributo il comando diventa:
# CREATE TABLE nuova_tabella AS SELECT nome_campo, (ST_Dump(ST_Union(ST_Buffer(the_geom, 0.01)))).geom AS the_geom FROM tabella_origine GROUP BY nome_campo;
Wiildos e’ un sistema operativo basato su Lubuntu (interfaccia LXDE) che incompora una serie di applicazioni e servizi che consentono di creare una lavagna interattiva multimediale utilizzando qualsiasi superficie (muro, foglio, parete, supporto in legno,….), un videoproiettore, un telecomando della Wii ed un computer. Per i dettagli sul funzionamento di tutto il sistema rimando alla pagina ufficiale del progetto.
Ho dato una mano per l’installazione di questo sistema nella scuola di mie figlie ed ho toccato con mano un po’ tutte le fasi, dall’applicazione dei supporti per i videoproiettori, alla configurazione del software. Riporto in questo post (e spero anche in altri che seguiranno) alcuni appunti che magari possono tornare utili ad altri.
I pc sono dotati di scheda grafica con doppia uscita VGA/DVI. I proiettori sono collegati alla porta VGA (si tratta di videoproiettori Epson EB-X03 con risoluzione 1024×768), alla porta DVI sono collegati i monitor. Questo consente di gestire il pc anche da monitor nel caso ci fossero problemi con il videoproiettore.
Inizialmente si sono presentati alcune difficoltà: l’immagine non veniva “aggiustata” in maniera corretta su monitor e proiettore (una parte della videata veniva “mangiata” e si era costretti a spostare il mouse a destra e a sinistra per visualizzare tutto lo schermo).
Armeggiando con xrandr alla fine ho visto che poteva andare bene una impostazione del genere:
$ xrandr –output DVI-I-0 –mode 1024×768 –pos 0x0 –same-as VGA-0
dove DVI-I-0 e’ il nome della porta DVI e VGA-0 il nome della porta VGA (i nomi delle porte si recuperano lanciando il comando: $ xrandr -q)
Per fare in modo che all’avvio vengano prese queste impostazioni modificare il file “autostart” che si trova in “/etc/xdg/lxsession/Wiildos/”.
$ sudo leafpad /etc/xdg/lxsession/Wiildos/autostart
e inserire alla fine la seguete stringa:
@xrandr –output DVI-I-0 –mode 1024×768 –pos 0x0 –same-as VGA-0
Riavviando il sistema tutto sembrava sistemato. Tuttavia, dovendo sistemate 4 postazioni, succedeva che in un paio di queste (l’hardware dei 4 sistemi e’ pressochè identico, ma evidentemente qualcosa non torna) l’avvio andava liscio 2 volte su 3. Per queste postazioni sono state creati dei lanciatori per “Aggiustare” monitor e proiettore. Di seguito riporto i passi seguiti.
– Andare alla sezione “Preferenze” -> “Editor del menu”
– Posizionarsi su “Preferiti” (icona a forma di stella)
– Fare click su “Aggiungi lanciatore”. Nella scheda “Impostazioni generali”, vicino all’icona a forma di ingranaggio, inserire un nome per il lanciatore (nel nostro caso “Giustifica monitor”) e nella riga sottostante inserire una descrizione (nel nostro esempio: “imposta la risoluzione dello schermo a 1024×768”).
– Nella voce “Comando” inserire la seguente stringa:
xrandr –output DVI-I-0 –mode 1024×768 –pos 0x0 –same-as VGA-0
– Lasciare il resto inalterato
– Click sull’icona “Salva tutte le modifiche” che si trova in alto a sinistra
– A questo punto troveremo una nuova icona a forma di ingranaggio nella scheda “Preferiti” di Wiildos; e’ possibile personalizzarla tramite click destro su di essa e modificando le proprietà.
In questo modo, nel caso in cui il settaggio automatico del monitor non dovesse funzionare e’ sufficiente fare click sull’icona del lanciatore appena creato per giustificare l’immagine.
I folletti delle statistiche di WordPress.com hanno preparato un rapporto annuale 2014 per questo blog.
Ecco un estratto:
La sala concerti del teatro dell’opera di Sydney contiene 2.700 spettatori. Questo blog è stato visitato circa 13.000 volte in 2014. Se fosse un concerto al teatro dell’opera di Sydney, servirebbero circa 5 spettacoli con tutto esaurito per permettere a così tante persone di vederlo.
ricerca e zoom sugli oggetti
Affinche’ il sistema di ricerca degli oggetti funzioni correttamente (ottenere lo zoom corretto sull’oggetto identificato) controllare il file “search.wsgi” (in “/wsgi/”) alle linee 59, 60 e 61. Per default viene abilitato un codice che funziona per Postgresql versione >9.0. Per Postgresql < 9.0 commentare la linea 59 e de-commentare la linea 61.
linea 59 # sql += “‘[‘||replace(regexp_replace(BOX2D(the_geom)::text,’BOX\(|\)’,”,’g’),’ ‘,’,’)||’]’::text AS bbox “
linea 60 # if the above line does not work for you, deactivate it and uncomment the next line
linea 61 sql += “‘[‘||replace(regexp_replace(BOX2D(the_geom)::text,’BOX[(]|[)]’,”,’g’),’ ‘,’,’)||’]’::text AS bbox “
Controllare inoltre i parametri di connessione al DB (nel nostro caso Postgresql-Postgis) all’interno del file “/wsgi/search.wsgi” alla riga 86 e all’interno del file “/wsgi/getsearchgeom.wsgi” alla riga 27.
Identify
modificare il file “WebgisInit.js” che si torva in “/site/js/” alle righe 325 e 326.
Per fare in modo che per default (nel menu’ a tendina che compare nell’interfaccia grafica del client) venga interrogato il layer attivo impostare a “activeLayer” il valore del parametro “ObjectIdentificationModeCombobox.setValue” e “identificationMode” come da esempio:
ObjectIdentificationModeCombobox.setValue(“activeLayers”);
identificationMode = “activeLayers”;
impostare invece il valore “allLayers” per interrogare tutti i layer
ObjectIdentificationModeCombobox.setValue(“allLayers”);
identificationMode = “allLayers”;
oppure “topMostFit” per interrogare il layer piu’ in alto (nella TOC)
ObjectIdentificationModeCombobox.setValue(“topMostFit”);
identificationMode = “topMostFit“;
Theme switcher
Modificare il file GISProject Listing.js (in “/site/js/”) per configurare il passaggio da una mappa all’altra. E’ necessario prima di tutto impostare a “true” il valore del parametro
var mapthemeswitcherActive=true;
nel file “GlobaOptions.js”
Per visualizzare una miniatura dei progetti (o temi) sullo switcher creare una immagine (PNG) di dimensioni 300×200 pixel e denominarla “nome_progetto_qgis.png”. Salvarla in “../site/thumbnails/”
Stampa in PDF
Puo’ succedere che nella fase di stampa venga restituito un errore (sul server): per evitarlo nel layout di stampa del progetto “.qgs” impostare “Stampa come raster”.
Se viene configurato il “theme switcher” e’ necessario fare in modo che tutti i layout di stampa abbiamo lo stesso nome (es: A4, A3,..) nei vari progetti altrimenti compare il messaggio:
“Composer template not found”
e la mappa non viene stampata.