You are currently viewing MapServer avec Docker : publier des données géographiques en WMS et WFS

MapServer avec Docker : publier des données géographiques en WMS et WFS

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.