MapServer avec Docker : publier des données géographiques en WMS et WFS
Les portails open data exposent souvent leurs données géographiques sous forme de fichiers statiques — Shapefile, GeoJSON, GeoPackage. C’est simple à distribuer, mais ça ne suffit plus dès qu’on a besoin d’intégrer ces couches dans un SIG, d’interroger des entités à la volée ou de superposer plusieurs jeux de données dans un client cartographique. MapServer est le moteur open source de référence pour publier des données spatiales via les protocoles standards OGC : WMS pour les tuiles image, WFS pour les entités vectorielles. Conteneurisé, il s’intègre naturellement dans n’importe quelle stack Docker. (Voir DataBFC pour une intégration)
WMS et WFS : pourquoi les protocoles OGC changent tout
Le Web Map Service (WMS) sert des images raster à la demande : le client envoie une boîte englobante (BBOX), une projection (CRS), une taille en pixels et le serveur renvoie une image PNG ou JPEG. Le client ne voit pas les données brutes, il reçoit un rendu. Le Web Feature Service (WFS) va plus loin : il renvoie les entités vectorielles elles-mêmes en GML ou GeoJSON, permettant au client de les filtrer, interroger, exporter. Ces deux protocoles sont implémentés par MapServer depuis ses débuts et constituent la colonne vertébrale de l’interopérabilité cartographique dans les infrastructures de données spatiales (IDS).
Un portail CKAN peut très bien exposer un fichier Shapefile en téléchargement. Mais si ce même jeu de données est derrière un endpoint WMS/WFS servi par MapServer, il devient directement consommable par QGIS, ArcGIS, Leaflet, OpenLayers, vMAP ou n’importe quel client conforme OGC, sans que l’utilisateur ait à télécharger quoi que ce soit.
Déployer MapServer avec Docker
L’image officielle camptocamp/mapserver (ou l’image de la communauté MapServer) permet de lancer un serveur fonctionnel en quelques minutes. La structure minimale repose sur deux éléments : un fichier .map (le mapfile, qui décrit les couches, projections et styles) et les données spatiales (Shapefile, PostGIS, GeoTIFF, GeoPackage…).
Voici un exemple de docker-compose.yml pour un démarrage rapide :
services:
mapserver:
image: camptocamp/mapserver:8.0
ports:
- "80:80"
volumes:
- ./mapfiles:/etc/mapserver:ro
- ./data:/data:ro
environment:
- MS_MAPFILE=/etc/mapserver/mymap.map
Les données et le mapfile sont montés en lecture seule. MapServer est accessible via son interface CGI standard à http://localhost/?SERVICE=WMS&REQUEST=GetCapabilities.
Anatomie d’un mapfile
Le mapfile est le fichier de configuration central de MapServer. Il définit la projection du projet, les couches (LAYER), leurs sources de données, leurs styles de rendu et les services OGC activés. Voici la structure d’un mapfile minimal exposant un Shapefile en WMS :
MAP
NAME "mon_portail_geo"
STATUS ON
EXTENT -180 -90 180 90
UNITS DD
PROJECTION
"init=epsg:4326"
END
WEB
METADATA
"wms_title" "Mon portail cartographique"
"wms_onlineresource" "http://localhost/"
"wms_srs" "EPSG:4326 EPSG:3857 EPSG:2154"
"wms_enable_request" "*"
"wfs_title" "Mon portail WFS"
"wfs_onlineresource" "http://localhost/"
"wfs_enable_request" "*"
END
END
LAYER
NAME "communes"
TYPE POLYGON
STATUS ON
DATA "/data/communes"
PROJECTION
"init=epsg:4326"
END
CLASS
STYLE
COLOR 220 220 220
OUTLINECOLOR 80 80 80
WIDTH 0.5
END
END
METADATA
"wms_title" "Communes"
"wfs_title" "Communes"
END
END
END
La section WEB / METADATA est la clé pour activer WMS et WFS. Le paramètre wms_srs liste les projections supportées — inclure EPSG:3857 (projection Web Mercator) et EPSG:2154 (Lambert 93, référence française) garantit la compatibilité avec la majorité des clients.
Connecter MapServer à PostGIS
Pour des jeux de données volumineux ou fréquemment mis à jour, servir directement depuis PostGIS est bien plus efficace que de régénérer des Shapefiles. La source de données d’une couche devient alors une chaîne de connexion PostGIS :
LAYER
NAME "batiments"
TYPE POLYGON
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "host=postgres dbname=geodata user=mapserver password=secret"
DATA "geom FROM batiments USING SRID=4326 USING UNIQUE id"
...
END
Dans une stack Docker Compose, postgres fait référence au nom du service PostgreSQL/PostGIS. Le service MapServer doit être dans le même réseau Docker que la base. Il est conseillé de créer un utilisateur PostGIS dédié à MapServer avec des droits en lecture seule sur les tables géographiques exposées.
Intégrer MapServer dans un portail CKAN
CKAN permet de référencer des ressources externes. Une fois MapServer déployé derrière un reverse proxy Nginx (accessible par exemple à https://geo.mondomaine.fr), il est possible d’ajouter chaque endpoint WMS ou WFS comme ressource dans un jeu de données CKAN. L’extension ckanext-geoview intègre un visualiseur cartographique directement dans les pages de ressources CKAN, s’appuyant sur Leaflet pour afficher les couches WMS à la volée.
Cette combinaison : CKAN pour le catalogue de métadonnées, MapServer pour les services de données spatiales, constitue la base d’une infrastructure de données spatiales (IDS) open source conforme aux standards OGC et INSPIRE.
Bonnes pratiques en production
Quelques points à ne pas négliger avant d’exposer MapServer publiquement. La mise en cache des tuiles WMS avec MapCache (le composant de cache dédié, également containerisable) est importante dès que le trafic augmente, car recalculer chaque tuile à la volée est coûteux. La limitation des requêtes WFS à une emprise géographique ou un nombre maximal d’entités (maxfeatures dans le mapfile) évite les requêtes trop larges. Enfin, les logs MapServer permettent de diagnostiquer les erreurs de projection ou de configuration : activer MS_ERRORFILE dans les variables d’environnement du conteneur est la première chose à faire lors du débogage.
Pour les infrastructures exposées sur Internet, placer MapServer derrière Nginx avec une configuration TLS standard et des headers de sécurité HTTP est suffisant : MapServer lui-même n’a pas de surface d’attaque applicative significative.
N’hésitez pas à nous contacter si vous avez besoin d’intégrer MapServer.
