Installation de QGIS Server et publication d’un projet QGIS

QGIS Server

Introduction

QGIS Server est une application qui va agir en service et répondre à des requêtes http qui suivent un standard conçu pour les échanges de données géospatiales sur le web.

Il s’installe en application FastCGI/CGI sur un serveur web et va générer des réponses aux formats standards qui permettrons d’échanger des données, de visualiser et publier des cartes sur Internet à partir de données géographiques.

Ce serveur est conçu à partir des librairies du projet QGIS, il possède le même moteur de rendu cartographique que l’application QGIS Desktop et permet de publier très simplement un projet QGIS Desktop vers le Web.

Le serveur cartographique possède 2 services nommés WMS et WFS que l’on utilisera au travers de clients web (Leaflet et Openlayers 3)

Serveur WMS

QGIS Server implémente le standard WMS (Web Map Service) publié par l’Open Geospatial Consortium (OGC). WMS est un service web mis en oeuvre au travers d’une architecture REST, il est possible de l’interroger par des requêtes HTTP. Le serveur va répondre aux requêtes, l’objet du service WMS est simplement de renvoyer une image : le serveur analyse la requête, détermine les paramètres, et en fonction, il va construire une carte raster à partir des sources de données dont il dispose.

Les opérations basiques du WMS sont :

  • GetCapabilities : Retourne les métadonnées sur les capacités du service. (Les paramètres de requête acceptés par le serveur)
  • GetMap : Retourne une carte (au format d’image) avec des paramètres définis, dimensions et informations
  • GetFeatureInfo : Retourne des informations sur les entités d’une carte

Serveur WFS et WFS-T

QGIS Server implémente également le standard WFS (Web Feature Service) publié par l’OGC. Contrairement au WMS, le WFS n’implique pas le rendu d’une carte par le serveur, il s’agit en fait d’une requête de récupération d’informations sous forme vectorielle. Les entités d’une couche sous QGIS peuvent être communiquées sous forme xml au client qui en fait la demande. Le client du service peut alors utiliser le service WFS pour effectuer par exemple un rendu de carte.

WFS-T est une version transactionnelle qui autorise la création, suppression, et mise à jour d’entités.

Référencez vous aux documents de standards pour les paramètres de construction de requêtes http

Et quoi d’autre ?

Eh bien à vous de découvrir… nous avons presque tout ce qu’il faut pour construire une application cartographique, les autres capacités du serveur ont peu d’importance dans ce contexte.

Nous verrons à partir d’un client web comment interroger les serveurs de tuile d’OpenStreetMap pour le rendu d’un fond de carte, QGIS Server n’a pas les capacités de serveur de tuiles à l’heure actuelle. En fin de projet je testerai l’installation des données OSM sur un serveur qui ne sera dédié qu’à cette opération. Il pourra être utilisé en remplacement des serveur OSM afin de ne pas pénaliser ceux ci.

Installation

Sous Windows

Vous pouvez installer QGIS Server en local sur votre poste de travail Windows, vous pouvez utiliser l’outil d’installation OSGeo4W fourni par la Fondation Geospatiale Open Source (OSGeo)

L’installateur propose une liste de paquets logiciels qui permet d’installer les logiciels et leurs dépendances. Le serveur QGIS se situe sous l’arborescence Web.

L’installation embarque une version du serveur web Apache 2 qui est installée comme un service, lancé au démarrage. Vous pouvez gérer le serveur Apache depuis une entrée du menu Démarrez.

Après installation vous devrez renseigner le port d’écoute d’Apache, particulièrement si vous possédez déjà des serveurs par défaut sur le port 80.

Il suffit d’éditer le fichier C:\OSGeo4W\apache\conf et remplacer la ligne

Listen @apache_port_number@

par votre port d’écoute. Par ex. sur le port 80

Listen 80

Redémarrez Apache depuis l’entrée de menu
Tous les programmes > OSGeo4W > Apache

Sous Debian Wheezy

Debian Wheezy possède des paquets compilés disponible via l’outil d’installation, ce qui rend la tâche en théorie triviale, cependant nous verrons plus loin que le paquet par défaut propose une ancienne version du serveur qui ne possède pas le support WFS.

La commande installera également Apache 2 avec un module capable de gérer le FastCGI.

aptitude install qgis-mapserver libapache2-mod-fcgid

Autoriser le module CGI

a2enmod cgid

Redémarrer Apache

service apache2 restart

Et c’est tout ? Oui. Sous Debian, et pour la version du serveur qui ne propose que le service WMS.

Continuez la lecture ! Vous trouverez plus loin les instructions pour installer la dernière version stable afin de profiter du support WFS

J’ai moi même procédé en 2 étapes et je préfère conserver une trace du cheminement complet afin d’aider les personnes qui pourraient se poser les mêmes questions.

Le script qgis_mapserv.fcgi est placé sous le répertoire /usr/lib/cgi-bin/, c’est lui que l’on va interroger.

Tester l’installation

Le serveur tourne, il doit répondre aux requêtes selon des standards précis. On peut interroger le serveur et lancer une requête http GetCapabilities sur les services WMS et WFS pour qu’il nous informe de ce qu’il est capable de faire.

Par défaut sous Windows

http://localhost/qgis/qgis_mapserv.fcgi.exe?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
http://localhost/qgis/qgis_mapserv.fcgi.exe?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities

Par défaut sous Debian

http://92.222.27.205/cgi-bin/qgis_mapserv.fcgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
http://92.222.27.205/cgi-bin/qgis_mapserv.fcgi?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities

Nous allons voir comment ajouter un premier projet QGIS sur le serveur.

Mettre en ligne un projet QGIS Server

Préparation du projet sous QGIS

L’objet de ce premier projet sera de vérifier le fonctionnement du serveur, on se contentera d’afficher sur une carte les départements et les établissements scolaires à moins de 50 mètres d’une parcelle agricole sur le département 33

Ouvrez un nouveau projet sous QGIS. (Par défaut votre SCR doit être EPSG:4326)
Chargez les couches PostGIS des établissements, des départements, et de la parcelles pour le département 33 (GIRONDE) :

Couche > Ajouter une couche PostGIS

Le style de rendu des départements doit surtout mettre en avant le contour de polygone pour l’information de limite administrative.

Le contenu du polygone n’apporte pas d’information dans ce cas aussi nous allons le rendre opaque et accentuer les contours.

Ouvrez les propriétés de la couche Departement. (Il suffit de faire un double clic sur le nom de la couche dans l’explorateur de couche)
Dans la fenêtre de propriétés, ouvrez l’onglet Style.

Paramétrez le style de remplissage sur Bordure : Ligne simple pour le type de symbole.

Vous pouvez également modifier la couleur de remplissage et la transparence de la couche pour améliorer le rendu.

A ce stade vous pouvez enregistrer le projet (ex. C:\SIG\projet_1\projet_1.qgs)

La distance de 50 mètres autour d’un établissement peut se matérialiser approximativement par une zone tampon autour du point. Une zone tampon constitue une délimitation autour d’un objet géographique qui épouse la forme de l’objet. Autour d’un point une zone tampon aboutira plus ou moins à un cercle ayant pour centre l’objet point et pour rayon la distance tampon. La création d’une zone tampon permettra de déterminer s’il y a une intersection du tampon avec les objets de type polygone qui représentent les parcelles.

Ouvrez la fenêtre de création de tampons :
Vecteur > Outils de géotraitement > Tampon(s)

Renseignez le formulaire :

  • Couche vectorielle de saisie : il s’agit de la couche autour de laquelle seront crées les zones tampon
  • Segments pour l’approximation : plus la valeur est élevée plus les contours de la zone tampon seront arrondis
  • Distance tampon : Le système de coordonnées de référence du projet est WGS 84, l’unité du canevas est de ce fait exprimée par défaut en degrés décimaux ce qui n’est pas pratique pour matérialiser une distance en mètres ! Une valeur de 0.0005 donnera un résultat acceptable pour ce simple prototype. C’est très dommage que QGIS n’indique pas l’unité utilisée à cet endroit
  • Fichier de sortie : Choisissez l’emplacement de la couche qui sera créée, par exemple sous le répertoire projet C:/SIG/projet_1/etab_tampon_50m.shp
  • Ajouter le résultat au canevas

Si l’on utilise l’outil de mesure inclus dans QGIS on peut se rendre compte que le rayon de la zone tampon varie autour de 50 mètres (entre 40 et 56 mètres), c’est plus flagrant si l’on diminue le nombre de segments pour l’approximation dans la fenêtre de paramétrage de création du tampon.

L’intersection est l’opération qui va permettre de créer une couche avec les parties communes à la couche tampon autour des établissements et la couche de parcelles.

Ouvrez la fenêtre de création d’intersection :
Vecteur > Outils de géotraitement > Intersection
Dans le formulaire qui s’ouvre alors, sélectionnez la couche des tampon et celle des parcelles de la Gironde puis ajoutez le résultat au canevas

N’essayez pas sur les parcelles pour la France entière, vous perdriez certainement votre temps…

Il reste alors à distinguer les établissements pour lesquels il existe une intersection. On peut pour cela ajouter une jointure sur le numéro d’établissement entre la couche des établissements et la couche des intersections puis à partir des attributs appliquer un filtre de sélection qui va restreindre les éléments sélectionnés sur la base de la base de l’existence des attributs de la table jointe.

Créer une jointure dans les propriétés de la couche établissement


Procéder à la sélection dans la table des attributs à l’aide d’un filtre avancé sous forme d’expression

NOT  "etab_parcel_inters_50m_appellatio"  IS NULL

Il suffit alors d’enregistrer la sélection en sauvegardant la couche établissement sous un autre nom et en précisant de n’enregistrer que les entités sélectionnées.

A ce stade j’ai supprimé la couche d’établissements du projet et la couche de tampons, puis appliqué un style à la nouvelle couche d’établissements à moins de 50 mètres d’une parcelle en Gironde.

Dernier point, j’ai rendu la visibilité des parcelles dépendante de l’échelle afin de n’afficher les parcelles que lorsque l’utilisateur aura suffisamment zoomé sur une école. Cela peut se faire à partir des propriétés générales de la couche.

Ce projet est presque prêt à être publié, il reste à paramétrer les propriétés du serveur dans les propriétés du projet.

Publication du projet sous QGIS Server

Paramétrer le projet pour publication

Ouvrez les propriétés du projet (CTRL + MAJ + P)
Projet > Propriétés du projet

Sous l’onglet Serveur OWS vous trouverez quatre rubriques, les plus importantes pour nous étant les capacités WMS et WFS

Sous la rubrique Informations générales du service vous pouvez instruire des informations qui seront communiquées par le service, c’est utile si vous destinez les services à des clients web externes à votre organisation. Vous pouvez renseigner ici à minima les informations pour vous contacter.

Faites un clic droit sur la couche Departement, et sélectionnez l’entrée de menu Zoomer sur la couche

L’emprise du projet est adaptée en conséquence, nous avons alors une vue globale de la France métropolitaine, ce sera notre vue par défaut.

Sous la rubrique Capacités WMS, cochez la case Emprise annoncée, et cliquez sur le bouton Utiliser l’emprise actuelle du canevas

Restreignez les SCR au SCR utilisé pour le projet (EPSG:4326), sans quoi le service listera tous les SCR lors d’une requête d’information sur ses capacités.

Sous la rubrique Capacités WFS vous pouvez sélectionner les couches que vous souhaitez publier en WFS, les colonnes Mise à jour, Insérer et Effacer permettent de sélectionner finement les opérations transactionnelles à autoriser (WFS-T).

Cliquez sur le bouton Sélectionner tout pour publier toutes les couches. Nous ne souhaitons pas publier en mode transactionnel, vous pouvez appliquer et enregistrer le projet

A ce stade le projet peut être mis en publication sous le serveur QGIS mais il comporte encore beaucoup d’informations qu’il n’est pas utile de transmettre sur une connexion web.

Pour la plupart des couches il est inutile de transmettre tous les attributs (c’est d’autant plus vrai que l’on a à chaque fois conservés tous les attributs lors des jointures), je supprime par défaut tous les attributs et n’autorise qu’un nombre restreint d’attributs qui pourraient utiles à l’application.

Faites un clic droit sur la couche Departement, et sélectionnez l’entrée de menu Propriétés

Sous l’onglet Champs QGIS dresse la liste des attributs d’une couche, avec pour dernières colonnes des cases à cocher qui permettent de publier ou pas l’attribut en service WMS et WFS.

Décochez les champs superflus, et procédez de même pour les autres couches.

Enregistrez le projet !

Cette fois ci, le projet est prêt ! Passons à la mise en route.

Prise en charge du projet par le serveur

Sous Windows

Pour ajouter le projet au serveur il suffit de créer un répertoire projet sous C:\OSGeo4W\apps\qgis\bin, copier l’exécutable CGI sous ce répertoire ainsi que le fichier projet *.qgs et les ressources qu’il utilise.

Lors de la création du projet j’ai enregistré le projet au même endroit que les couches créées, QGIS s’appuies sur un chemin relatif pour accéder aux ressources, il utilisera le chemin ./ pour accéder à chaque ressource, il vous incombe de respecter le chemin relatif vers vos données. Continuez la lecture, je vous montrerai plus loin comment modifier la source d’une couche pour un projet QGIS !

Si vous possédez une installation cygwin (Sinon c’est aussi rapide à la souris mais avec moins de valeur documentaire !):

cd C:/OSGeo4W/apps/qgis/bin
mkdir projet1
cp qgis_mapserv.fcgi.exe projet1/qgis_mapserv.fcgi.exe
cp C:/SIG/projet_1/* projet1

Vérifier le fonctionnement

WMS

http://localhost/qgis/projet1/qgis_mapserv.fcgi.exe?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities

Et pour ne pas vous décevoir, une carte… cette url est construite d’après les paramètres retournés par la requête GetCapabilities, à vous de fouiller pour trouver où.

http://localhost/qgis/projet1/qgis_mapserv.fcgi.exe?SERVICE=WMS&VERSION=1.3.0&CRS=EPSG:4326&REQUEST=GetMap&BBOX=-5.82882,41.1196,10.2496,51.3322&WIDTH=800&HEIGHT=800&LAYERS=Departement,etab_parcel_inters_50m,etabs_tampon_selec,etabs_sel&FORMAT=image/png&STYLE=

WFS

http://localhost/qgis/projet1/qgis_mapserv.fcgi.exe?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities

Si cela vous amuse vous pouvez ouvrir un nouveau projet sous QGIS et tenter d’accèder au service :
Couche > Ajouter une couche WFS

Vous pouvez alors vous connecter, sélectionner toutes les couches à importer et vérifier le résultat.

Sous Debian

Pour les besoins du projet j’ai travaillé sur une connexion PostGIS locale, cela implique que le projet pourrait ne pas fonctionner si je le transfère sur un serveur.

Vous pouvez modifier les sources de données pour chaque couche en éditant le fichier projet *.qgs avec n’importe quel éditeur de texte, il s’agit simplement d’un format xml.

Il suffit de rechercher et adapter les lignes de ce type

<datasource>dbname='Pesticides' host=localhost port=5432 user='postgres' password='postgres' sslmode=disable key='id_geofla' srid=4326 type=MULTIPOLYGON table="public"."Departement" (geom) sql=</datasource>

ou encore

<datasource>./etab_parcel_inters_50m.shp</datasource>

Dans l’immédiat il me manque la table des parcelles sur la Gironde sur le PostgreSQL distant, l’utilitaire de sauvegarde et restauration de PostgreSQL pg_dump peut me permettre d’exporter cette table vers un fichier sql.

cd C:\SIG\sql
pg_dump --host=localhost --port=5432 --username=postgres --dbname=Pesticides --no-password --table=cultures_33 > db.sql

Sous le serveur distant, la restauration se fait par :

su - postgres
psql --dbname=Pesticides --file=db.sql

Une fois l’environnement dupliqué l’installation du projet est très simple.

Il suffit comme sous Windows de créer un répertoire et de copier sous ce répertoire le fichier projet *.qgs et les ressources. Un lien symbolique doit suffire pour donner accès au script CGI depuis le répertoire projet.

mv projet1 /usr/lib/cgi-bin/
cd /usr/lib/cgi-bin/projet1
ln -s ../qgis_mapserv.fcgi .
ln -s ../wms_metadata.xml .

Vérifier le fonctionnement

WMS

http://92.222.27.205/cgi-bin/projet1/qgis_mapserv.fcgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
http://92.222.27.205/cgi-bin/projet1/qgis_mapserv.fcgi?SERVICE=WMS&VERSION=1.3.0&CRS=EPSG:4326&REQUEST=GetMap&BBOX=41.1196,-5.82882,51.3322,10.2496&WIDTH=800&HEIGHT=800&LAYERS=Departement,etab_parcel_inters_50m,etabs_tampon_selec,etabs_sel&FORMAT=image/png
Pour construire cette dernière url j’ai du inverser l’axe x,y du paramètre BBOX, autrement le serveur retournait une image vide. Je ne trouves pas les informations pour paramétrer le serveur sous Debian, mais à priori cela correspond à la version 1.1.0 du service, le numéro de version semble tout simplement ignoré.
WFS : Attention problème ! Si vous testez le lien suivant le serveur répond avec les capacités WMS, le paramètre est simplement ignoré, la version du serveur est trop ancienne !
http://92.222.27.205/cgi-bin/projet1/qgis_mapserv.fcgi?SERVICE=WFS&VERSION=1.1.0&REQUEST=GetCapabilities

Mais pourquoi ça ne fonctionne jamais du premier coup ?

Installer la dernière version stable de QGIS Server sur Debian Wheezy

En prérequis vous devrez avoir installé et configuré le paquet libapache2-mod-fcgid comme expliqué en amont.

Par défaut sous Debian Wheezy l’installeur ne propose pas la dernière version du serveur QGIS… en fait le paquet qgis-mapserver a été remplacé par le paquet qgis-server.

Retirez si besoin le paquet obsolète
apt-get remove qgis-mapserver

Il faut ensuite indiquer à Debian où récupérer les dernières versions stables du nouveau paquet.

Éditez le fichier de sources du gestionnaire de paquets
vi /etc/apt/sources.list.d/pgdg.list
Insérez les lignes suivantes : (Consultez la documentation QGIS pour votre version Debian)
deb     http://qgis.org/debian wheezy main
deb-src http://qgis.org/debian wheezy main
Récupérez la clef de sécurité et mettez à jour les informations dans le gestionnaire de paquets
gpg --keyserver keys.gnupg.net --recv-key DD45F6C3
gpg --export --armor DD45F6C3 | apt-key add -
apt-get update
Procédez à l’installation
apt-get install qgis-server
apt-get install build-essential python-dev

Cette dernière commande permet de régler des problèmes de fonctionnement, vous en aurez probablement également besoin.

Nous avions déjà tout paramétré, il ne vous reste qu’à reprendre à partir de l’étape de vérification du fonctionnement et vous pouvez désormais vérifier le chargement des couches WMS et WFS depuis QGIS.

En cas de problème

Les fichiers de log du script serveur qgis-server peuvent servir à résoudre des problèmes… encore faut-il savoir les trouver !

Sous Apache et avec le mode fcgid, vous pouvez éditer le fichier de configuration Apache pour insérer deux directives.

FcgidInitialEnv QGIS_SERVER_LOG_FILE /tmp/qgisserver.log
FcgidInitialEnv QGIS_SERVER_LOG_LEVEL 0

Remarquez qu’en dehors du répertoire temporaire je n’ai pas réussi à faire fonctionner ces directives.

Côté performances vous pouvez également paramétrer le mode fcgid.

vi /etc/apache2/mods-enabled/fcgid.conf

Ma configuration est la suivante :

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 5
  FcgidIOTimeout 240
  FcgidMaxProcesses 1500
  FcgidMaxProcessesPerClass 150
  FcgidMinProcessesPerClass 10
  FcgidMaxRequestInMem 655360
  FcgidMaxRequestLen 1310720
  DefaultInitEnv LD_LIBRARY_PATH /usr/lib:/usr/lib
</IfModule>

Avant PostgreSQL 9.3 il était aussi nécessaire de bien configurer le système pour des performances sur la base de données.

Pour référence les paramètres du kernel sont par défaut sous dimensionnés, ils peuvent être déterminés simplement par un script repris depuis ce Blog.

vi shmsetup
chmod o+x shmsetup
#!/bin/bash
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo kernel.shmmax = $shmmax
echo kernel.shmall = $shmall
./shmsetup >> /etc/sysctl.conf
sysctl -p

Epilogue

Vous devez probablement vous dire que tout ce que nous retirons du serveur est pour l’instant bien austère et manque cruellement de dynamisme par rapport à ce que l’on peut voir ailleurs et vous avez raison mais l’on a rien sans rien, et bientôt vous serez comblé. Dans le prochain article nous verrons comment faire appel à ces services sous un client Web

Faites découvrir ce billet...Email this to someonePrint this pageShare on FacebookTweet about this on TwitterShare on Google+Share on LinkedIn

Une réflexion au sujet de « Installation de QGIS Server et publication d’un projet QGIS »

  1. Bonjour,

    Très bon tuto, que j’ai suivi pas à pas mais je n’arrive toujours à faire fonctionner mon serveur qgis-serv.
    Dans le fichier qgisserver.log, j’ai cette erreur:
    « Error, configuration file  » does not exist ».
    Je ne sais pas si mon problème vient de là mais ça fait 2 jours que je tourne en rond.
    Je suis sur une Debian 8 (Jessie)
    avec qgis-serveur 2.12.2+13jessie et qgis-providers 2.12.2+13jessie.

    Quelqu’un pourait-il me dire ce qui ne va pas.

    Cordialement.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *