In this file, you can found the description of installation and configuration of PyWPS script. At the and, you can learn, how to add your own process. This document describes most recent version of PyWPS (2.0.0), available in subversion respository.
PyWPS project has been started on April 2006 with support of DBU - Deutsche Bundesstiftung Umwelt1 and with help of GDF-Hannover2 and Help Service Remote Sensing companies. Initial author is Jachym Cepicky.
PyWPS (Service Web en Python) est une implémentation de la norme Web Processing Service (WPS) 1.0.x définie par l'Open Geospatial Consortium (OGC).
Ce projet débuté en Mai 2006 et supporté par le DBU offre un environnement permettant la programmation de processus pouvant être ensuite utilisé par tout un chacun.
L'avantage principal de PYWps est qu'il a été écrit de manière à pouvoir utiliser nativement les fonctions du logiciel SIG GRASS permettant ainsi un accès facilité aux différents modules de ce dernier directement depuis une interface Web.
Néanmoins, ce n'est pas le seul logiciel supporté, l'utilisation de programmes tels que le package R, GDAL ou PROJ est également possible.
Etant écrit en python, vous devrez également utiliser ce langage pour vos propres processus.
PyWPS est une application s'interfaçant entre plusieurs clients (Navigateur internet, Environnement SIG, ligne de commande...) pouvant utiliser l'ensemble des outils à disposition sur le serveur. PyWPS ne traite pas lui-même les données il utilise pour cela des applications externes telles que GRASS, GDAL, PROJ, R...
La traduction ne fonctionne par pour les requêtes de type GetCapabilities. elles ne fonctionnent que pour les requêtes de type DescribeProcess
Si les paramètres en entrée sont des valeurs littérales de type chaîne de caractère (string) cela peut causer des problèmes de sécurité. Une attention particulière doit donc être apportée aux paramètres d'entrée et surtout faite attention à ne pas les utiliser directement dans vos script afin d'éviter à votre serveur d'être attaqué.
Si vous rencontrez un nouveau bugs ou une nouvelle limitation n'hésitez pas à la faire remonter via la mailing-list ou le bug tracker de pywps.
GRASS. Application SIG OpenSource fournissant plus de 350 modules d'analyses de données vecteurs et/ou rasters. PyWPS a été écrit afin de supporter nativement GRASS et ses fonctions.
PROJ.4 Bibliothèque de projections cartographiques employée dans projets divers projets OpenSource tels que Grass, Qgis ... Elle peut être, par exemple, employée pour la transformation de données.
GDAL/OGR Bibliothèque de transformation de formats de données(vecteur et raster). Utilisé dans de nombreux projets pour l'importation, l'exportation ou la transformation de données multi-sources.
R Langage et environnement pour le calcul statistique et graphique.
PyWPS étant basé sur le protocole WPS vous devriez en obtenir une copie (OGC 05-007r7) avant de commencer à configurer votre application PyWPS.
NOTE: Attention, les options de configuration sont sensibles à la casse.
Le fichier de configuration, pywps.cfg, se situe dans le répertoire /etc/pywps.cfg ou pywps/etc/pywps.cfg
Le fichier de configuration par défaut est situé dans le répertoire pywps/default.cfg. Vous pouvez bien évidemment en faire une copie et commencer votre configuration personnelle directement depuis celui-ci.
Ce fichier est divisé en plusieurs sections dont les spécifications sont les suivantes :
Section [wps] : Options de configuration WPS :
encoding : Encodage des caractères (utf-8, iso-8859-2, windows-1250...)
Mots clé : Liste de mots clé séparée par une virgule
lang : Langue
Section [provider] : Options de configuration personnelle
providerName : Compagnie
individualName : Nom de l'administrateur
positionName : Role de l'administrateur
deliveryPoint : Rue
city : ville
postalCode : code postal
electronicMailAddress : Adresse mail
providerSite : Site de la compagnie
phoneVoice : Téléphone
phoneFacsimile : Fax
administrativeArea : Département administratif
Section [server]: Options de configuration du serveur
maxoperations : Nombre maximal de processus autorisés à fonctionner en parallèle (0 signifie qu'il n'y a aucune limite)
maxinputparamlength : Taille maximale de la chaîne de caractère entrée en paramètre (Ex nom du fichier)
maxfilesize : Taille maximale du fichier (raster ou vecteur). Les tailles peuvent être déterminées de la manière suivante : 1GB, 5MB, 3kB, 1000b
tempPath : Répertoire temporaire
outputUrl : Adresse (URL) où le résultat des traitements est sauvegardé
outputPath : Répertoire où le résultat des traitements est sauvegardé
debug : true/false
Section [grass] - GRASS GIS settings
path : variable $PATH (par exemple /usr/lib/grass/bin)
addonPath : $GRASS_ADDONS addons
version : Version de GRASS
gui : Graphical User Interface doit être de type text
gisbase : Chemin vers le répertoire GIS_BASE de GRASS (/usr/lib/grass)
ldLibraryPath : Chemin vers le répertoire où sont stockées les librairies de grass (/usr/lib/grass/lib)
Voici un exemple de fichier de configuration (pywps.cfg) :
[wps]encoding=utf-8title=PyWPS Serverversion=1.0.0abstract=See http://pywps.wald.intevation.org and http://www.opengeospatial.org/standards/wpsfees=Noneconstraints=noneserveraddress=http://localhost/cgi-bin/wpskeywords=GRASS,GIS,WPSlang=eng`[provider]providerName=Your Company NameindividualName=Your NamepositionName=Your Positionrole=Your roledeliveryPoint=Streetcity=CitypostalCode=000 00country=euelectronicMailAddress=login@server.orgproviderSite=http://foo.barphoneVoice=FalsephoneFacsimile=FalseadministrativeArea=False[server]maxoperations=3maxinputparamlength=1024maxfilesize=3mbtempPath=/tmpoutputUrl=http://localhost/wps/wpsoutputsoutputPath=/var/www/wps/wpsoutputsdebug=true[grass]path=/usr/lib/grass/bin/:/usr/lib/grass/scripts/addonPath=version=6.2.1gui=textgisbase=/usr/lib/grass/ldLibraryPath=/usr/lib/grass/lib
Afin de tester votre configuration il vous suffit simplement d'envoyer une requête à votre serveur. Cela se fait de la manière suivante (en ligne de commande) :
. /wps.py "service=wps&request=getcapabilities"
Si le résultat est le même que ci-dessous, alors votre configuration est correcte :
NITDONELOADINGPRECOMPILEDTEMPLATE:UPTODATEPRECOMPILED:UPTODATE
Content-type:text/xml
xmlversion="1.0"encoding="utf-8"?xmlns:xlink="http://www.w3.org/1999/xlink"xmlns:wps="http://www.opengis.net/wps/1.0.0"xmlns:ows="http://www.opengis.net/ows/1.1"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://www.opengis.net/wps/1.0.0http://schemas.opengis.net/wps/1.0.0/wpsGetCapabilities_response.xsd" updateSequence="1"> PyWPS Development Server ...
Cela veut dire qu'une de vos options de configuration n'est pas bonne. Par exemple le message ci-dessus signifie que le paquet python-htmltmpl n'est pas installé.
Tous les processus sont stockés dans le répertoire pywps/processes. Il est possible, grace à la variable d'environnement $PYTHON_PROCESS de définir un autre chemin que celui par défaut.
Les deux codes ci-dessous présente un processus de type buffer. Plusieurs processus sont livrés avec le code source PyWPS.
Create file exampleBufferProcess.py in PYWPS_PROCESSES directory.
Chaque processus est un script python pouvant fonctionner seul et possédant une classe ayant deux méhodes :
__init__
execute
Il est possible d'ajouter autant de fonctions et méthodes que vous le désirez.
Initialisation du processus buffer et configuration#
frompywps.Process.ProcessimportWPSProcessclassProcess(WPSProcess):"""Main process class"""def__init__(self):"""Process initialization"""# init process WPSProcess.__init__(self,identifier="exampleBufferProcess",title="Buffer",version="0.2",storeSupported="true",statusSupported="true",abstract="Create a buffer around an input vector file",grassLocation=True)
Nous avons défini un nouveau processus nommé exampleBufferProcess. Ce dernier est autorisé à conserver les données produites sur le serveur (storeSupported), il est également possible de l'utiliser en mode asynchrone (statusSupported). Enfin, ce processus utilisera comme environnement GRASS (grassLocation = True).
Celles-ci sont stockées dans le tableau self.Metadata de la méthode __init__. Il est possible de rajouter ses propres métadata en utilisant la méthode self.AddMetadata() :
self.AddMetadata(identifier="point",type="point",textContent="Click in the map")
Trois types de données/arguments en entrées sont définis :
Literal - entrée littérale de Base - Peut être un nombre simple ou du texte
ComplexValue - Cela sera la plus souvent un fichier vectoriel défini à l'intérieur d'une requête XML ou alors pointant vers la ressource elle même via une URL.
BoundingBox (Extention géographique) - Coordonnées des coins bas/gauche et haut/droit.
Une documentation plus complète présentant des exemples de processus ainsi qu'une aide en ligne (process.html) est distribuée avec le code source de PyWPS.
Le processus doit être défini dans le constructeur de sa méthode. Dans un processus classique, vous voudrez pouvoir définir vos valeurs en entrées et définir un résultat en sortie. Pour cela vous pourrez utiliser les méthodes getValue(input_identifier) et setValue(output_identifier,value) des objets input et ouput.
Si vous avez besoin d'exécuter une commande shell plutôt que d'utiliser, par exemple, les fonctions os.system() or os.popen() il est préférable d'utiliser la méthode self.cmd(command,["string for standard input"]).
Enfin, le temps de calcul restant peut être connu en utilisant la méthode self.status(string message, number percent)
Calculation progress can be set using self.status(string message, number percent) method.
Par exemple :
defexecute(self):"""Execute process. Each command will be executed and output values will be set """# run some command from the command line self.cmd("g.region -d")# set status value self.status.set("Importing data",20)self.cmd("v.in.ogr dsn=%s output=data"%\
(self.getInputValue('data')))self.status.set("Buffering",50)self.cmd("v.buffer input=data output=data_buff buffer=%s scale=1.0 tolerance=0.01"%\
(self.getInputValue('width')))self.status.set("Exporting data",90)self.cmd("v.out.ogr type=area format=GML input=data_buff dsn=out.xml olayer=path.xml")self.bufferOut.setValue("out.xml")self.textOut.setValue("ahoj, svete")return
A la fin de l'exécution de la fonction aucune valeur ne devrait, normalement, être retournée. Tout autre résultat signifie qu'une erreur s'est produite durant le processus et qu'une erreur sera renvoyée au client. Par exemple :
La configuration de grass se fait via le fichier de configuration de pywps.
Si vous désirez utiliser les commandes de GRASS dans vos processus et qu'aucun entrepôt de données GRASS n'est défini vous devrez définir grassLocation=True dans la définition de votre processus
Dans ce cas, un entrepôt temporaire sera créé durant l'exécution du processus puis supprimer une fois celui-ci achevé. Par défaut, aucun entrepôt n'est créé.
Il est bien sûr possible de travailler depuis un entrepôt existant. Pour cela il suffit de définir son emplacement de la manière suivante :
Pour tester PyWPS vous pouvez l'utiliser aussi bien depuis un navigateur qui interrogera votre CGI qu'en ligne de commande directement. Commencer par la ligne de commande est toujours une bonne idée vous n'aurez pas ainsi à regarder, en cas d'erreur, dans le fichier error.log de votre serveur web.
pour l'encodage des données utilisant la méthode GET depuis le protocole HTTP référez-vous à OGC 05-007r712, page 38 "Execute HTTP GET request KVP encoding"
De nombreux exemples de requêtes XML sont disponibles dans le répertoire doc/examples.
Avant de tester votre WPS via HTTP POST vous devrez définir la variable d'environnement REQUEST_METHOD. Vous pourrez ensuite rediriger le flux XML d'entrée vers le script into wps.py :
Bien qu'issu à l'origine d'un parcours universitaire (doctorat et post-doc), j'ai finalement tenté l'aventure entrepreunariale au travers de Geolab. Mes principaux centres d'intêrets dans le domaine de la géomatique portent sur les logiciels Open Source et plus particulièrement QGIS. J'aime également le développement informatique avec une forte préférence à tout ce qui se passe côté serveur (base de données, traitements, etc.). Côté techno, mes choix se portent habituellement sur du (Geo)Django et PostgreSQL/PostGIS.
Pendant mon temps libre, vous me trouverez un GPS à la main afin de contribuer à OpenStreetMap ou sur un tatami en train de pratiquer le Jiu-Jitsu Brésilien.
Si vous êtes intéressé par l'un ou tous ces sujets, n'hésitez pas à me contacter !
Commentaires
Afin de favoriser les échanges constructifs, merci de préférer le pseudonymat à l'anonymat. Pour rappel, l'adresse mail n'est pas exposée publiquement et sert principalement aux notifications de réponse. Les commentaires sont automatiquement republiés sur nos réseaux sociaux pour favoriser la discussion. Consulter la page sur la confidentialité et les données personnelles. Une version minimale de la syntaxe markdown est acceptée pour la mise en forme des commentaires. Propulsé par Isso.