Comment utiliser MapFish serveur

Document officiel “How To Use MapFish Server” non traduit disponible ici

Ce tutoriel décrit étape par étape comment utiliser le framework MapFish coté Serveur et mettre en place un projet MapFish. Un projet MapFish définit les Services Web sur lesquels les composants Clients MapFish peuvent s’appuyer. Voir le Protocole MapFish pour la description des interfaces fournies par les Services Web de MapFish.

Attention : Ce tutoriel de MapFish suppose que le fichier egg est installé.

Sinon, allez à la page Comment Installer Mapfish.

Attention: Les fichiers eggs de MapFish-0,1 version 0.1 (fournis sur http://dev.camptocamp.com/packages/eggs/) ne supportent pas les commandes paster. Par conséquent, assurez-vous que les fichiers egg utilisés pour votre installation proviennent d’une version de MapFish 0,1. S’il n’y en a pas(ce qui est le cas au moment d’écrire ces lignes), alors construisez et installez le fichier egg de MapFish à partir du tronc SVN.

Créer un projet MapFish

Paster est utilisé pour créer des projets MapFish:

/chemin/vers/vpython/bin/paster create --overwrite --no-interactive --template=mapfish MonPojetMapFish mapfishclientmfbasepath=/chemin/vers/MapFish/client/mfbase

Remplacez MonPojetMapFish par le vrai nom de votre projet. Dans la suite de ce tutoriel, vous vous réfèrerez au nom de votre projet dés que nous utiliserons le nom MonProjetMapFish.

Note : la commande ci-dessus suppose que vous avez installé le fichier egg de MapFish avec ses dépendances dans un environnement virtuel Python. Votre projet est maintenant créé. Plus concrètement, un répertoire nommé MonProjetMapFish contenant divers dossiers a été créé. Ceci est votre répertoire de projet.

Un projet MapFish est vraiment comme un projet Pylons avec quelques spécificités géo-orienté.

Mettre en place des connexions PostGIS

Pour configurer des connexions PostGIS, éditez le fichier de configuration development.ini et ajoutez des lignes sous cette forme dans la section [app: main_pylons]:

sqlalchemy.<db>.url = postgres://<dbuser>:<dbpassword>@<dbhost>/<db>

Remplacer , , et par les caractéristiques appropriées.

Si vous avez besoin de vous connecter à plusieurs bases de données, vous devez ajouter plusieurs lignes de ce type.

Mettre en place des couches

Vous avez maintenant besoin de créer des calques. En effet, une couche correspond à une table de votre base de données PostGIS. Pour créer des couches, vous devez éditer le fichier layers.ini et ajouter vos couches suivant l’exemple donné dans le fichier suivant.

Exemple de configuration d’une couche unique:

# fichier de configuration des couches
#
# ps: j'ai conservé les noms des exemples car
# ce sont ceux que vous utiliserez pour débuter
# Example:
#
# [users]
# singular=user
# db=dbname
# table=users
# epsg=4326
# units=degrees
# geomcolumn=the_geom
# idcolumn=Integer:id
 
[countries]
singular=country
db=geostat
table=world_factbk_simplified
epsg=4326
units=degrees
geomcolumn=simplify
idcolumn=Integer:gid

Note: conventionnellement vous utilisez comme nom de couche le pluriel du mot utilisé. Vous devez également fournir un nom singulier. En réalité, ce nom peut être n’importe quoi, mais pour que le code généré soit propre il vaut mieux envisager d’utiliser le singulier nom associé au nom de la couche.

Générer le modèle et le contrôleur de code

Maintenant, il est temps pour vous de comprendre paster et le code de MapFish généré.

Si vous avez créé un calque countries (comme dans l’exemple ci-dessus) utiliser cette commande :

/chemin/vers/vpython/bin/paster mf-layer countries

Cette commande crée trois fichiers : le fichier contrôleur, son fichier de test associé, et un modèle de fichier.

Jetez un coup d’œil au niveau du contrôleur et du modèle de fichiers histoire de vous faire une idée sur ce que le générateur de code a fait pour vous. Pour faire des choses sophistiqués, vous devrez éditer ces fichiers de toute façon, alors ne soyez pas timide …

Note : deux autres commandes paster sont fournies par MapFish: mf-controller et mf-model.

Le premier s’occupe de la création du contrôleur. Le dernier porte sur le modèle. À l’intérieur, le mf-layer compose le mf-controller et le mf-model.

Terminer la configuration

Dans un monde parfait, vous n’auriez plus rien à faire. Or, le monde n’est pas (encore) parfait. Vous devrez donc modifier certains fichiers pour terminer la configuration vos couches.

Allez dans le répertoire MonProjetMapFish et éditer les fichiers:

  1. Config/environment.py

    trouver la ligne :

    from pylons import config

    Ajoutez la ligne suivante après :

    from sqlalchemy import engine_from_config

    Et celle-là à la fin du fichier:

         config['pylons.g'].sa_geostat_engine = engine_from_config(config, 'sqlalchemy.geostat.')

    Cette dernière ligne crée un moteur de base de données sqlalchemy associée à votre base de données. De toute évidence, le mot geostat doit être remplacé par le nom de la connexion à votre de base de données (celle que vous avez configuré dans le fichier development.ini)

    Note: N’oubliez pas l’importance de l’indentation en Python! La ligne doit être en retrait pour faire partie de la fonction load_environment().

  2. Config/routing.py

    La configuration du routage de certaines URL est nécessaire. Ajoutez les lignes suivantes :

          map.connect('countries/', controller='countries', action='show', conditions=dict(method=['GET']))
          map.connect('countries/:(id).:(format)', controller='countries', action='show', conditions=dict(method=['GET']))

    Avant les lignes pour les routespar défaut :

          map.connect(':controller/:action/:id')
          map.connect('*url', controller='template', action='view')

    Encore une fois, vérifiez vos indentations!

    Consultez la documentation sur les routes (en anglais) pour en savoir plus sur la configuration du routage.

  3. Modèle/__init__.py

    La couche doit être liée au moteur de la base de données. Modifiez le model/__init__.py et remplacez la ligne

    binds = {}

    Dans le cas de notre exemple par:

    binds = {'countries': MetaData(config['pylons.g'].sa_geostat_engine)}
  4. Lib/base.py

    La dernière chose à faire est de changer le code BaseController. La classe BaseController doit ressembler à ceci:

    class BaseController(WSGIController):
     
        def __call__(self, environ, start_response):
            try:
                """Invoke the Controller"""
                # WSGIController.__call__ dispatches to the Controller method
                # the request is routed to. This routing information is
                # available in environ['pylons.routes_dict']
                return WSGIController.__call__(self, environ, start_response)
            finally:
                model.Session.remove()

    La méthode .remove() est très importante! Voir cette page pour plus de détails.

Démarrage du serveur Web

Maintenant tout devrait être configuré. Essayez de démarrer le serveur web paster:

/path/to/vpython/bin/paster serve --reload development.ini

Et vérifiez : http://localhost:5000/countries?maxfeatures=10

Votre navigateur devrait afficher un joli objet GeoJSON!

Vous pouvez maintenant revenez à votre page Web et configurez le widget de MapFish pour accéder à votre calque via l’URL http://localhost:5000/countries .

Si vous avez ce message d’avertissement :

/chemin/vers/vpython/lib/python2.4/site-packages/SQLAlchemy-0.4.0-py2.4.egg/sqlalchemy/databases/postgres.py:497: RuntimeWarning: Did not recognize type 'geometry' of column 'the_geom'
warnings.warn(RuntimeWarning("Did not recognize type '%s' of column '%s'" % (attype, name)))

Ne vous inquiétez pas, c’est sans danger.

À propos de gglafouine

Je suis actuellement en poste dans le Groupe Nicollin en tant que Cartographe. J'ai pris l'initiative de mettre en place ce blog en 2008 afin de partager mes connaissances, mes problématiques et mes interrogations. Ainsi, cette plateforme me sert d'appui dans mon travail et d'interface d'échange avec mes collègues.
Ce contenu a été publié dans API Web, Divertissement, Erreurs, Géomatique, HowTo, logiciel, Outils, Serveur, SGBD, avec comme mot(s)-clef(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire