====== Oltre MapServer ======
===== TinyOWS =====
Server WFS-T, legge e scrive dati geometrici da un database PostgreSQL/PostGIS.
* [[http://www.tinyows.org/]]
Installazione versione 1.0.0:
./configure
make && make install
Viene creata la directory **''/usr/local/share/tinyows/''**, l'eseguibile **''tinyows''** deve essere copiato a mano in **''/usr/lib/cgi-bin/''**. Pare che la patch per risolvere il [[http://www.tinyows.org/trac/wiki/LibxmlSchemaGmlBug|bug di Libxml con GML 3.1.1]] sia già applicata nei sorgenti, contrariamente a quanto scritto nella pagina wiki.
Il file di configurazione predefinito è **''/etc/tinyows.xml''**, ma conviene creare una directory **''/etc/tinyows/''** in modo da poterne avere più di uno. Per indicare il file di configurazione da usare bisogna impostare la variabile d'ambiente **''TINYOWS_CONFIG_FILE''**. Un metodo per impostare la variabile è quello di creare uno script shell, ad esempio **''/usr/lib/cgi-bin/tinyows-demo''** che contiene:
#!/bin/sh
TINYOWS_CONFIG_FILE="/etc/tinyows/demo/config.xml" exec /usr/lib/cgi-bin/tinyows $@
Questo però comporta l'esecuzione di una shell per ogni richiesta cgi-bin. Un metodo alternativo è creare un link simbolico al cgi-bin:
ls -s tinyows /usr/lib/cgi-bin/tinyows-demo
ed aggiungere questo snippet alla configurazione di Apache:
SetEnvIf Request_URI "/cgi-bin/tinyows-demo" TINYOWS_CONFIG_FILE=/etc/tinyows/demo/config.xml
Per testarne il funzionamento si può richiedere una ''GetCapabilities'':
%%http://localhost/cgi-bin/tinyows?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities%%
==== Debug ====
Per avere un po' di logging da TinyOWS dovrebbe essere sufficiente aggiungere qualcosa del genere nel file di configurazione:
===== QGIS Server =====
Modulo CGI allegato al programma QGIS, fornisce un server WMS a partire da un progetto QGIS. Si installa con il pacchetto Debian **qgis-mapserver**.
* [[http://www.qgis.org/wiki/Web_server]]
* [[http://www.qgis.org/wiki/QGIS_mapserver_tutorial]]
* [[http://linfiniti.com/2010/08/qgis-mapserver-a-wms-server-for-the-masses/]]
Per ogni progetto QGIS da esporre come WMS si crea una directory in **''/usr/lib/cgi-bin/progetto/''**, in questa directory si crea un link simbolico al CGI-BIN **''qgis_mapserv.fcgi''** e si copia il **''progetto.qgs''**.
**ATTENZIONE 1:** :!: Viene servito il primo progetto **''.qgs''** presente nella diretcory. Per evitare ambiguità è possibile aggiungere il parametro **''map=/path/progetto.qgs''** all'URL WMS. Il percorso può essere assoluto o relativo all'eseguibile fcgi.
**ATTENZIONE 2:** :!: Ciascuna istanza fcgi (identificata dallo specifico path **''/cgi-bin/*/qgis_mapserv.fcgi''**) carica il file progetto (quello predefinito o quello specificato dal parametro ''map'') solo alla prima invocazione. Pertanto se si cambia il parametro map nell'URL è necessario fare il reload di Apache.
**ATTENZIONE 3:** :!: Se il server Postgres viene riavviato, è necessario killare l'istanza di **''qgis_mapserv.fcgi''**, altrimenti la sessione con il database non viene riaperta? Bug? FIXME
Informazioni aggiuntive sul WMS posso essere messe in un file **''wms_metadata.xml''**.
L'URL per una richiesta GetCapabilities avrà la forma:
http://localhost/cgi-bin/progetto/qgis_mapserv.fcgi?SERVICE=WMS&REQUEST=GetCapabilities
Per limitare i SRS annunciati:
4326
32632
3003
Nella GetCapabilities vengono mostrati i nomi dei vari layer raggruppati sotto il nome del progetto. Questi sono i tag XML del progetto.qgs che contengono tali stringhe:
^ Nome del progetto QGIS | ''qgis.title'' |
^ Nome del layer | ''qgis.projectlayers.maplayer.layername'' |
In alternativa al meccanismo della sottodirectory per ogni progetto QGIS, è possibile servire **uno specifico progetto QGIS indicandone il path nel parametro ''map''**:
http://localhost/cgi-bin/qgis_mapserv.fcgi?map=/path/progetto.qgs&SERVICE=WMS&REQUEST=GetCapabilities
**NOTA:** viene usato il file ''wms_metadata.xml'' che si trova **nella stessa directory del CGI-BIN**, non in quella del progetto QGIS.
**NOTA:** Alla prima invocazione il programma fcgi legge il file progetto e lo tiene in RAM, pertanto non è possibile modificare il parametro ''map'' in modo dinamico durante l'uso dell'applicativo.
==== Debug ====
Se ci sono errori nel progetto o errori di connessione al database, il modulo Fast CGI non produce messaggi di log adeguati né nell'output né nei log. Può essere utile lanciare il programma da riga di comando con il seguente trucco:
cd /usr/lib/cgi-bin/qgis-server-demo/
QUERY_STRING="SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities" ./qgis_mapserv.fcgi
===== Autenticazione WMS e WFS con Geoprisma =====
* [[http://geoprisma.org/site/index.php|Home page]]
Pacchetti necessari:
* **php5-xsl**
* **php5-curl**
===== QGIS Web Client =====
* Readme e download: [[https://github.com/qgis/qgis-web-client/]]
* Demo: [[http://webgis.uster.ch/]]
* Bugs: [[http://hub.qgis.org/projects/qgis-web-client]]
Come prelevare il codice aggiornato:
git clone git://github.com/qgis/qgis-web-client.git
==== Configurazione ====
**''js/GlobalOptions.js''**
:!: **ATTENZIONE!** Le richieste **''GetCapabilities''**, **''GetFeatureInfo''** e **''GetPrint''** devono essere indirizzate allo stesso host che ospita l'applicazione web, cioè il parametro **''serverAndCGI''** **deve puntare allo stesso host dove risiede l'applicazione web**, altrimenti la mappa appare vuota e genera alcuni errori JavaScript. È la limitazione **[[wp>Same origin policy]]** di **[[wp>XMLHttpRequest]]**. Le richieste **''GetMap''** non avrebbero questa limitazione.
var lang = "it";
var serverAndCGI = "http://www.faunalia.it/cgi-bin/qgis-ms-demo/qgis_mapserv.fcgi";
var epsgcode = 3003;
var MapOptions = {
...
units: "m",
maxScale:5000,
minScale:8000000,
...
}
var OverviewMapOptions = {
...
units: "m",
maxScale:500000,
minScale:16000000,
...
}
var overviewLayer = new OpenLayers.Layer.WMS(...);
**''index.xml''**
**''wsgi/search.wsgi''** e **''wsgi/getSearchGeom.wsgi''**
Contengono //hard-coded// le credenziali per l'accesso al database e il nome della tabella usata per le ricerche per parole chiave (//search field//). Cercare la funzione **''conn = psycopg2.connect()''** e la definizione della variabile **''searchtable''**.
Per provare il client:
http://localhost/qgiswebclient/qgiswebclient.html?map=qgis-ms-demo.qgs
==== Configurazione wsgi ====
La ricerca per parola chieve è implementata da uno script Python che viene eseguito da Apache tramite l'interfaccia WSGI (l'interfaccia preferita tra web server e applicativi Python).
Per il suo funzionamento bisogna installare il pacchetto Debian **libapache2-mod-wsgi**. Rispetto ad una installazione Debian standard è probabile che si debba installare anche il pacchetto **python-webob** e **python-psycopg2**.
Quindi si deve configurare Apache in modo che gli script vengano passati al modulo wsgi (le direttive per la configurazione sono documentate qui: [[http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives|mdwsgi Configuration Directives]]). Nell'opportuna sezione VirtualHost della configurazione di Apache si aggiunge:
# WSGI scripts for QGIS Web Client
WSGIDaemonProcess qgis processes=5 threads=15 display-name=%{GROUP}
WSGIScriptAlias /ws_demo/qgiswebclient/wsgi/ /var/www/ws_demo/qgiswebclient/wsgi/
WSGIScriptAliasMatch ^/ws_demo/qgiswebclient/wsgi/([^/]+) /var/www/ws_demo/qgiswebclient/wsgi/$1.wsgi
:!: **ATTENZIONE!** Se tutto è configurato a dovere gli script wsgi sono elaborati dall'interprete Python quando vengono richiesti dal browser. Tuttavia - in caso di errata configurazione - potrebbero essere serviti come testo inalterato, rivelando informazioni sensibili quali le credenziali per l'accesso al database. Per questo motivo è consigliato spostare gli script wsgi in una directory **fuori dalla DocumentRoot** e configurare opportunamente le direttive ''WSGIScriptAlias'' e ''WSGIScriptAliasMatch''.
==== Query ====
La funzione **Object identification (attribute data)** funziona con una semplice chiamata WMS **GetFeatureInfo**. I tempi di risposta posso essere lenti perché la query restituisce tutti gli attributi degli oggetti selezionati, compresa la geometria.
La lentezza è ancora più penalizzante con lo strumento **Display Map Tips (attribute data)**: il cursore del mouse deve rimanere immobile da quando si ferma su una feature per tutto il tempo in cui vengono prelevati i dati con la GetFeatureInfo e mostrati nella tool tip.
==== Search table ====
La funzione di ricerca tramite **Searchfield** effettua una richiesta allo script **''wsgi/search.wsgi''**.
Il funzionamento si basa sulla presenza di una tabella nel database, questo lo schema:
CREATE TABLE searchtable (
searchstring text,
displaytext text NOT NULL PRIMARY KEY,
search_category text,
the_geom geometry,
geometry_type text,
searchstring_tsvector tsvector
);
CREATE INDEX searchtable_searchstring_tsvector_idx
ON searchtable
USING gin(searchstring_tsvector);
La tabella può essere anche una vista oppure una vista materializzata. Ecco invece l'inserimento diretto di un dato:
INSERT INTO searchtable
(searchstring, displaytext, search_category, the_geom, geometry_type)
VALUES (
'colonne leopoldine, colonna del grillo, siena',
'Colonna del Grillo (Siena)',
'01_poi',
ST_GeometryFromText('POINT(11.552823242 43.330441145)', 4326),
'ST_Point');
Attenzione al sistema di riferimento delle geometrie, che deve essere lo stesso usato in ''js/GlobalOptions.js''.
==== Parametri GET ====
Nell'URL si possono passare al volo alcuni parametri:
^ ''lang'' | Impostazione della lingua (es. **''en''**). |
^ ''visibleLayers'' | Elenco separato da virgole dei layer visibili all'avvio. |
==== Usare proiezioni extra con proj4js ====
Per utilizzare proiezioni oltre alle poche supportate nativamente da OpenLayers è possibile includere la libreria JavaScript proj4js. Scompattare in **''libs/proj4js/''** e si aggiunge in **''qgiswebclient.html''** insieme alle definizioni EPSG necessarie (il tutto prima di caricare la libreria OpenLayers):
Vedere il paragrafo [[openlayers_tips#sistemi_di_riferimento|Sistemi di riferimento]] nella pagina dei trucchi OpenLayers.
==== Organizzazione elenco layer ====
Nell'elenco dei layer a sinistra della pagina web, i layer vengono organizzati gerarchicamente come nel progetto QGIS (click destro su layers, //Add group//, che nel file del progetto si traduce in una sezione ''%%%%'', ''%%