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:
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 fichierdevelopment.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()
.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.
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 lignebinds = {}
Dans le cas de notre exemple par:
binds = {'countries': MetaData(config['pylons.g'].sa_geostat_engine)}
Lib/base.py
La dernière chose à faire est de changer le code
BaseController
. La classeBaseController
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.