Da Postgresql-8.4 e Postgis-1.5 a Posgresql-9.5 e Postgis-2.2

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

 

Postgis |unione di poligoni adiacenti

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.

buildingfig. 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

building_unionfig. 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 | configurazione xrandr per scheda grafica VGA e DVI

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.

 

Analisi del 2014

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.

Clicca qui per vedere il rapporto completo.

QGIS web client | a few tricks and notes

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.

QGIS web client | reference map

In QGIS web client la configurazione della mappa di riferimento per la “navigazione” (o panoramica) avviene editando il file GlobalOptions….js (nella directory “../site/js”). Alla voce:

……..
var OverviewMapSize = new OpenLayers.Size(200,150);
var overviewLayer = new OpenLayers.Layer.WMS(“Overview Map”,
  “/cgi-bin/qgis_mapserv.fcgi?map=/var/www/qgiswc/projects/nome_progetto.qgs”,
  {layers:”nome_layer01,nome_layer02,nome_layer03″,format:”image/jpeg”},
  {buffer:0,singleTile:true,transitionEffect:”resize”});
……..

La parte importante e’ “/cgi-bin/qgi…” che deve puntare al file di progetto corretto ed il nome del layer (uno o piu’ separati da virgola) da utilizzare.

NB: assicurarsi che il layer da utilizzare come overview non abbia limiti di scala di visualizzazione altrimenti (essendo la panoramica una vista a scala molto piccola) non compare.

QGIS | conditional labeling

QGIS si rivela (almeno per le mie necessita’) uno strumento sempre piu’ potente e versatile. A riguardo lascio un breve post su come impostare una etichettatura condizionale. Per spiegarsi: come fare per visualizzare le etichette (label) solamente di determinati oggetti di un layer (nel mio caso PostGIS)? Per questo devo ringraziare la lista qgis-users ed in particolare Andreas Neumann, Giuseppe Sucameli, Nathan Woodrow, Martin Dobias e Mayeul Kauffmann per avere sollevato la questione ed averne indicato la soluzione.

Nel mio caso specifico volevo “etichettare” soltanto alcune zone territoriali omogenee di PRG: in particolare le zone A, B, C, e D tralasciando quelle a servizi ed agricole (E ed F). Nella tabella attributi del layer vettoriale poligonale si trova un campo chiamato “AmbitoIdZona” che contiene le informazioni necessarie.

– Apriamo lo strumento “Layer Labeling Options” cliccando sull’icona relativa o tramite la finestra delle proprieta’ del layer interessato.

– Spuntiamo il tick “Etichetta questo vettore” e clicchiamo sul pulsante “Modifica espressione” (quello con il simbolo dell’espressione);

– Nel frame in basso scriviamo l’espressione:

CASE WHEN “AmbitoIdZona” IN (‘A’,’B’,’C’,’D’) THEN “AmbitoIdZona” || ‘;’ || “NumeroZona” END

Nota: nell’espressione l’etichetta comprende il valore di due campi “AmbitoIdZona” e “NumeroZona”. Il punto e virgola ‘;’ indica di andare a capo. Questa impostazione si configura nella sezione “Formattazione” ed in particolare valorizzando il campo “A capo con il carattere” nel quale si indica un carattere a piacere (nel mio caso il ‘;’ appunto).

 

Aggiornamento: come impostare etichette di colore diverso a seconda del valore contenuto nel campo da etichettare o in altro campo

Facciamo un esempio concreto: ho un layer poligonale che riporta gli ambiti di alcuni strumenti urbanistica attuativi. Uno dei tanti attributi si chiama “Stato” che puo’ contenere i due valori: ‘vigente’ o ‘decaduto’. Vogliamo fare in modo che l’etichetta riporti il nome dello strumento urbanistico (dato che risiede nel campo “Nome”) e sia di colore rosso se lo “Stato”=’decaduto’ e di colore verde se “Stato”=’vigente’.

Andiamo sulle proprietà del layer e ci posizioniamo sulla scheda “Etichette” quindi su “Testo”. Definiamo un colore di default (nel nostro caso il verde con RGB=0,255,0 e poi clicchiamo sull’icona riportata a destra “Sovrascrittura definita dai dati (espressione)”. Compare la finestra di configurazione dell’espressione e digitiamo quanto segue:

CASE WHEN nome_campo=’valore’ THEN color_rgb(255,0,0) END

che tradotto riportando i nostri dati diventa:

CASE WHEN “Stato”=’decaduto’ THEN color_rgb(255,0,0) END

In questo modo vedremo le etichette (il testo dell’etichetta) rosse nel caso in cui il campo “Stato” ha valore=’decaduto’ e verdi negli altri casi