Server WFS-T, legge e scrive dati geometrici da un database PostgreSQL/PostGIS.
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 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
Per avere un po' di logging da TinyOWS dovrebbe essere sufficiente aggiungere qualcosa del genere nel file di configurazione:
<tinyows online_resource="http://127.0.0.1/cgi-bin/tinyows" schema_dir="/usr/share/tinyows/schema/" check_schema="0" log="/tmp/tows.log" log_level="1">
Modulo CGI allegato al programma QGIS, fornisce un server WMS a partire da un progetto QGIS. Si installa con il pacchetto Debian qgis-mapserver.
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?
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:
<properties> <WMSEpsgList type="QStringList"> <value>4326</value> <value>32632</value> <value>3003</value> </WMSEpsgList> </properties>
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.
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
Come prelevare il codice aggiornato:
git clone git://github.com/qgis/qgis-web-client.git
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 Same origin policy di 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
<webgis path="/ws_demo/qgiswebclient/qgiswebclient.html" mapserver="/cgi-bin/qgis-ms-demo/qgis_mapserv.fcgi" thumbnails="/ws_demo/qgiswebclient/thumbnails" title="QGIS Webclient">
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
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: 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
.
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.
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
.
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. |
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):
<script type="text/javascript" src="libs/proj4js/lib/proj4js-compressed.js"></script> <script type="text/javascript" src="libs/proj4js/lib/defs/EPSG3003.js"></script> <script type="text/javascript" src="libs/proj4js/lib/defs/EPSG23032.js"></script>
Vedere il paragrafo Sistemi di riferimento nella pagina dei trucchi OpenLayers.
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 <qgis>
, <legend>
, <legendgroup>
.
Lizmap Web Client is a complete web application dedicated to show dynamic maps created with Qgis.
It is build with Jelix (a PHP framework), Jquery (a Javascript framework) and OpenLayers (a javascript set of tools to create and display maps in a web page).
It uses QgisServer as the map server. Lizmap Web Client needs the Qgis projects data to be send to the server via Lizmap Plugin, a python plugin which help to configure and publish a web map from a project.
L'installazione ufficiale (versione 3.2.1) prevede di scompattare l'archivio ed eseguire come root:
python setup.py install
Ma c'è un bug segnalato in questo messaggio, bisogna patchare setup.py
.
Vengono aggiunti questi file/directory in /usr/local/
:
./bin/wps.py ./lib/python2.6/dist-packages/pywps-3.2.1-py2.6.egg/ ./lib/python2.6/dist-packages/easy-install.pth