User Tools

Site Tools


tecnica:gps_cartografia_gis:beyond_mapserver

Oltre MapServer

TinyOWS

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

Debug

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">

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.

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:

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

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

Pacchetti necessari:

  • php5-xsl
  • php5-curl

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

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: 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):

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

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 <qgis>, <legend>, <legendgroup>.

Lizmap Web Client

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.

PyWPS

Installazione

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

Allestire una demo integrata

  • Un database GIS (es. ws_demo)
  • Una istanza di QGIS-Mapserver (es. /usr/lib/cgi-bin/qgis-ms-demo/)
  • Una istanza di TinyOWS (es. /usr/lib/cgi-bin/tinyows-demo)
  • Un cron-job che ripristina il database una volta al giorno
  • QGIS Web Client
  • Un dominio web, es. www.faunalia.it/ws_demo/

Altri componenti software

tecnica/gps_cartografia_gis/beyond_mapserver.txt · Last modified: 2012/03/22 11:54 by niccolo