15
22 aoû 2008

- Introduction -


Ce tutorial vous permettra d'appréhender au mieux la notion de serveur WMS puis de le mettre en application ensuite au moyen de deux exemples concrets en se basant sur MapServer et GéoServer. L'affichage sera ensuite géré par OpenLayers.

- Qu'est-ce que la norme WMS et comment elle fonctionne
- Faire de MapServer un serveur WMS
- Faire de GéoServer un serveur WMS
- Afficher une carte WMS avec OpenLayers

- Qu'est-ce que la norme WMS et comment elle fonctionne -


WMS qui signifie "Web Map Service" est un protocole défini par l'Open Geospatial Consortium (OGC) permettant au moyen d'une URL formatée d'interroger des serveurs cartographiques et d'obtenir ainsi des cartes géoréférencées..

Ce protocole est devenu un standard implémenté par la quasi-totalité des serveurs cartographiques tels que MapServer, GeoServer, ArcGis Server... Côtè client, de nombreuses applications permettent l'interrogation de ces services : OpenLayers, GoogleMap, PMapServer, MapGuide OS...

Comme nous l'avons rapidement abordé, l'interrogation d'un serveur WMS se fait par l'URL à laquelle est passée des arguments bien définis. Ces mots-clés une fois mis bout à bout forment un ensemble compréhensible par le serveur cartographique. Les différents paramètres possibles sont :

* VERSION : Version du protocole WMS.
* REQUEST : Types d'opérations possibles -> GetCapabilities, GetMap, GetFeatureInfo.
* OUTPUTFORMAT : Format de sortie de l'image (exemple : image/png).
* BBOX : Etendue de la carte.
* WIDTH : Largeur de l'image.
* HEIGHT : Hauteur de l'image.
* LAYERS : Liste des couches désirées.
* SRS : Système de projection utilisé.

Voici un exemple d'URL :

http: //map.ngdc.noaa.gov/servlet/com.esri.wms.Esrimap?servicename=glacier&WMTVER=1.0&request=GetMAP&SRS=EPSG:4326&BBOX=-100,-90,100,80
&WIDTH=400&HEIGHT=400&LAYERS=Continents,Rivers,Glaciers%20(all%20sizes)&STYLES=&FORMAT=image/png

Un serveur WMS est composé de 3 parties essentielles : le serveur cartographique, les données et le client. Un exemple de reque serait la suivante : une requête de type "GetMap" est envoyée par le navigateur au serveur cartographique. Celui-ci, en fonction de sa configuration et des données, retourne la carte correspondante.

- Faire de MapServer un serveur WMS -


Cette partie suppose que vous soyez déjà familier de l'environnement MapServer et que vous sachiez comment est constitué un MapFile. Dans le cas contraire, je vous invite à lire auparavant ce tutorial : Tutorial MapServer.

Pour spécifier permettre à MapServer de fonctionner en tant que serveur WMS, il sera nécessaire d'ajouter trois éléments à votre MapFile. Un dans le bloc Web, et deux pour chacune des couches que vous souhaitez rendre disponible. Pour le bloc Web il faut ajouter un sous bloc nommé METADATA qui est composé des éléments ci-dessous :


METADATA
"wms_title" "WMS Demo Server"
"wms_onlineresource" "localhost/cgi-bin/mapserv?map=path_to_mapfile/demo.map&"
"wms_srs" "epsg:4326"
"wms_format" "image/png"
END

Ensuite pour chaque couche il faudra ajouter deux blocs, le premier est obligatoire contrairement au second qui est optionnel mais fortement recommandé


METADATA
"wms_title" "Commune" ##required
END
PROJECTION
"init=epsg:4326" ##recommended
END

Pour un aperçu plus global vous pouvez également télécharger le MapFile qui a servi pour ce tutorial

- Faire de GéoServer un serveur WMS -


GeoServer ne nécessite aucune modification. Il propose de base un service WMS. Pour ajouter des données à GeoServer je vous conseille la lecture de ce tutorial : Ajouter des Shape dans GéoServer

- Afficher une carte WMS avec OpenLayers -


Il existe différentes classes permettant l'interrogation de serveur WMS via OpenLayers. Mais elles se basent toutes sur le même mécanisme que l'on a étudié durant la première partie.

Nous devons tout d'abord spécifier le début de l'URL, ensuite nous lui passons les différents paramètres souhaités. Cela se fait de la manière suivante :

Pour GeoServer


// Layer GeoServer
Alea_volcanisme = new OpenLayers.Layer.WMS(
"Risque Sismique - Untiled", "http://server_path:8080/geoserver/wms,
{
srs: 'EPSG:4326',
width: '588',
styles: '',
height: '550',
layers: 'topp:risque_sismique',
transparent:"true",
format: 'image/png'
}
{singleTile: true, opacity: 0.5, isBaseLayer : false}
);


Pour MapServer


// Layer MapServer
Alea_volcanisme = new OpenLayers.Layer.WMS(
"Volcanisme", "http://localhost/cgi-bin/mapserv?map=path_To_MapFile/mFile.map&",
{
srs: 'EPSG:4326',
width: '800',
styles: '',
height: '550',
layers: 'Alea_volcanisme',
transparent:"true",
format: 'image/png'
}
{singleTile: true, opacity: 0.5, isBaseLayer : false}
);

Ne disposant pas de serveur personnel tous les tests ont été effectués en local. La copie d'écran ci-dessous, qui est une représentation des risques sismiques et volcaniques à La Réunion, vous donnera néanmoins un aperçu de ce qu'il est possible de réaliser. Les données utilisées sont disponibles sur le site Internet de La Diren de La Réunion.

WMS

A propos de l'auteur: 
Arnaud Vandecasteele

Fervent défenseur de l'Open Source, Arnaud s'est spécialisé dans le développement d'application cartographiques web. OpenLayers, PostGIS ou encore Django sont autant d'outils qu'il manipule au quotidien.
S'il n'est pas en face de son ordinateur, vous le retrouverez un GPS à la main en train de cartographier pour OpenStreetMap, de faire voler son drone ou sur un tatami !

Commentaires

Bonjour,

J'ai installé Géoserver, dans le but de distribué les fonds de cartes wms a des laptops qui ne sont pas sur internet, seulement je n'arrive pas a afficher le wms grâce a Geoserver qui ai bien démarré etc :)

Mon petit code :

var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
"http://localhost:8080/geoserver/wms?", {layers: 'basic'} );

Mais je n'affiche que des tuiles roses d'erreurs !

MErci d'avance

Bonjour,

Si vos données avaient été du texte (comme du WFS), j'aurai pensé à un problème de sécurité du navigateur.
Néanmoins le chargement d'image depuis plusieurs serveurs en mode ajax est normalement accepté.
Donc je pencherai sur un problème de configuration.
Essayez d'appeler simplement votre couche WMS dans votre navigateur en lui indiquant l'URL de celle-ci. Est-ce que vous avez un résultat?

Arnaud

Alors :

Si je rentre directement dans l'url : http://localhost:8080/geoserver/wms?

Il me propose de télécharger un fichier "wms" je l'ai ouvert avec un éditeur, c'est en fait un fichier XML comprenant toutes les données des wms compris de base dans geoserver.

Mais perso je cherche une carte du monde ( la même que celle que j'ai sur internet de base avec vmap0 .. ) mais dans les données exemple de geoserver je ne crois pas qu'il y en ai une ?

Voila , si tu as une idée , je suis preneur, car complètement bloqué !

En tapant uniquement l'adresse que tu as donné tu n'auras pas ta couche c'est normal, il faut lui spécifier ta requête qui est de type "GetMap" (+ d'autres params).
Il faut que l'URL ressemble à celle-ci dessous :
http: //map.ngdc.noaa.gov/servlet/com.esri.wms.Esrimap?servicename=glacier&WMTVER=1.0&request=GetMAP&SRS=EPSG:4326&BBOX=-100,-90,100,80
&WIDTH=400&HEIGHT=400&LAYERS=Continents,Rivers,Glaciers%20(all%20sizes)&STYLES=&FORMAT=image/png

Regarde également ce cours cela pourra t'aider à comprendre le fonctionnement du WMS

Oui tu as raison ;)
Sinon en changeant juste le nom de la couche layers, je peut afficher les données exemples de Geoserver !

Me reste plus qu'a trouvé une carte du monde utilisable avec Geoserver, ben c'est pas facile , j'ai rien après 2 jours !

Alors c'est que vous n'avez pas bien cherché. Le ForumSIG regorge de ressources intéressantes. De plus sur ce billet, je liste également quelques sites qui proposent des données libres.

Bonjour,

moi je suis débutant en geoserver et je veux savoir, s'il est possible d'utiliser geoserver dans une application en dotnet et IIS?

Bonjour,
ceci devrait vous aider : http://www.forumsig.org/showthread.php?p=208429 ou ici http://georezo.net/forum/viewtopic.php?id=62851 ... vous se seriez pas l'auteur de ses deux messages par hasard ?

Bonjour,

J'aurais souhaité savoir s'il est possible d'installer deux serveurs cartographiques sur la même machine pour qu'ils tournent en même temps. Ils ne se "marchent pas sur les pieds"? Est-ce que ça peut marcher avec un seul serveur web ou faut-il en installer deux?

Merci

Bonjour Celia,
pourquoi installer deux serveurs carto sur la même machine ? Un seul ne fait pas l'affaire ?
Si on installe deux serveurs différents (ex. MapServer et Geoserver) je pense que ça peut passer, par contre deux instances d'un même serveur je suis très sceptique - ça me paraît impossible (sans avoir tester du moins).

Bonjour,
Merci pour ta réponse, je ne m'attendais pas à en avoir une aussi vite et étais passée à autre chose en attendant.
En fait, je dois réaliser une carte interactive avec une API qui n'est pas compatible avec le serveur cartographique déjà en place, qui sert pour une autre carte que je souhaite conserver (format propriétaire, ESRI pour tout dire). S'il est possible d'installer deux serveurs carto sur un même serveur sans problèmes techniques alors ça m'ôte une bonne épine du pied! Peut-être y a-t-il quand même des paramétrages à faire?

Je pense que oui tu peux installer deux serveurs carto différents. Par contre je n'ai jamais testé avec ESRI - GeoServer et Mapserver peuvent fonctionner en parallèle.
Et oui il y aura quelques paramétrages à faire - mais les paramètres par défaut pour l'un et l'autre devraient fonctionner.

Merci beaucoup pour ces réponses! Il n'y a donc plus qu'à tester!
Je donnerais des nouvelles quand je serais arrivée à quelque chose :)

Après tests, faire fonctionner les deux serveurs en parallèle marche parfaitement. On peut même afficher, dans la même API carto, des données provenant des deux serveurs en même temps. Pour l'anecdote, je souhaitais afficher des polylignes et il se trouve que l'esthétisme du rendu est meilleur avec GeoServer qu'avec le produit ESRI qui donne un résultat pixellisé.
Merci encore pour votre aide et bonne continuation!

Parfait, donc deux serveurs carto en même temps cohabitent bien. Merci du retour !