Initiation à MapServer

résumé: 
Dans ce tutoriel vous apprendrez à créer votre 1er carte en utilisant le moteur cartographique MapServer
pré-requis: 

- Avoir MapServer d'installé

- Introduction -


Dans ce tutoriel vous apprendrez dans un premier temps à construire votre MapFile, nous verrons ensuite comment afficher une carte grâce au langage PhpMapScript, enfin nous verrons les nouveautés apportées par la version de MapServer.

- Qu'est ce que MapServer
- Intégrer MapServer
- Définir un MapFile
- Afficher une carte avec PhpMapScript

- Qu'est ce que MapServer -


MapServer, est un environnement de développement permettant la réalisation d'applications web à composante cartographique. Il ne peut pas être considéré comme un SIG complet, mais il permet d'afficher des données géographique sous forme vectorielle ou cartographique. Pour plus d'informations vous pouvez consulter le site de MapServer.

- Comment intégrer MapServer -


MapServer est multi-plateforme (Windows, Linux, Solaris, Mac Osx...). Dans ce tutoriel, nous ne verrons que l'installation sous Windows. Pour cela, il est nécessaire de télécharger le package MS4W, celui-ci contient entre autre un serveur apache, PHP, MapServer, PhpMapScript...

Après avoir télécharger et dezipper le package MS4W, il faudra le placer à la racine de votre disque dur. Puis lancer le fichier bat apache-install.bat. Et voilà, c'est fini ! Si vous ouvrez votre navigateur préféré (firefox bien sûr) avec localhost comme adresse vous devriez alors voir apparaitre la page de démarrage de votre serveur local.

- Définir son MapFile -


Pour notre exemple, nous avons utilisé des données libres téléchargeable sur le site internet : http://www.grida.no/. Afin d'éviter d'avoir un fichier trop volumineux nous avons extrait la zone géographique correspondant à l'Indonésie. Un fichier zip des données utilisées est disponible ici.

Nous allons maintenant passer à la création de notre MapFile. C'est la pièce maîtresse de notre application, c'est lui qui est à la source de tous les échanges. Un MapFile se compose de plusieurs blocs. Il est important de comprendre et de bien former chacun d'eux. Sinon cela générera obligatoirement une erreur à l'exécution.

Notre fichier map sera composé de quatre blocs principaux. Chacun d'entre eux ont un rôle spécifique.

Le premier bloc va définir le MapFile d'une manière générale, un peu comme l'en-tête d'un fichier HTML. La balise MAP en haut du MapFile indique le début du fichier. Ensuite vient le nom du fichier, la taille de l'image qui va être générée, l'étendue géographique des données, l'unité utilisée et enfin le répertoire ou sont situées les données.

   MAP
   NAME "tutorial"
   SIZE 1000 500
   EXTENT 94.0000 -9.0048 131.000 4
   UNITS METERS
   IMAGECOLOR 255 255 255
   SHAPEPATH "C:/ms4w/apps/cartoweb3/htdocs/phpMapScript/data"

Ensuite vient le bloc Web, c'est lui qui va gérer où vont être entreposées les images générées par MapServer. Nous ne le verrons pas ici, mais c'est dans ce bloc qu'il va être possible de rajouter des éléments permettant d'enrichir l'interface générale de la page. Cela se passe grâce aux balises header et footer.

WEB
   IMAGEPATH "C:/ms4w/apps/cartoweb3/htdocs/phpMapScript/tmp"
   IMAGEURL "tmp/"
End

Maitenant nous allons spécifier à MapServer le type de fichier attendu en sortie. Dans notre cas cela sera une image de type png, il est bien sûr possible de définir d'autre type (jpg, gif etc.).

   OUTPUTFORMAT
   NAME png
   DRIVER "GD/PNG"
   MIMETYPE "image/png"
   IMAGEMODE PC256
   EXTENSION "png"
END

Pour finir nous allons maintenant lister les données à utiliser. Cela se passe grâce au bloc Layer. Il sera nécessaire de créer un bloc par données. A l'intérieur de ce bloc, il existe d'autres sous blocs tel que class, style, metadata etc.

   LAYER
   NAME Admin_Indonesie
   STATUS ON
   CONNECTIONTYPE OGR
   CONNECTION "data/indonesie_surface.tab"
   TYPE LINE
      CLASS
         STYLE
            COLOR 0 0 0
            OUTLINECOLOR 255 255 255
         END
      END
END

Voilà nous sommes maintenant en mesure d'afficher une carte. Le fichier complet est disponible ici. Il est d'ailleurs possible de le faire directement en CGI grâce à la commande suivante :

http://localhost/cgi-bin/mapserv.exe?map=C:/ms4w/apps/tutorial.map&mode=map

Il est très important de bien indenter son code dans le MapFile. Une erreur arrive très rapidement, de plus vérifiez bien que tous vos blocs soient fermés par un END.

- Afficher une carte avec PhpMapScript -


PhpMapScript est un module Php permettant la manipulation des objets, classes et méthodes relatifs au MapFile. Il sera ainsi possible d'activer ou de désactiver un layer, afficher la carte dynamiquement etc.

Dans ce tutoriae nous verrons simplement l'affichage d'une carte grâce au PhpMapScript. Cela vous permettra de vous familiariser un peu avec ce langage. Une liste complète des classes et méthodes est disponible sur cette page.

Pour cela nous aurons besoin tout d'abord d'instancier un nouvel objet Map, cela se fait grâce au constructeur ms_newMapObj auquel nous passons l'adresse où est situé notre MapFile. Ensuite, nous allons lui demander de dessiner la carte correspondante et enfin de la sauvegarder dans le dossier définit dans le bloc Web du MapFile.

<?php
   // Éclaration de la bibliothèque PHPMAPSCRIPT
   dl('php_mapscript.dll')
   $map_file = "./tutorial.map";
   $map = ms_newMapObj($map_file);
   $image=$map->draw();
   $image_url=$image->saveWebImage(MS_PNG,1,1,0);
?>
 
<HTML>
    <HEAD>
      <TITLE?>Tutorial MapServer</TITLE?>
         </HEAD>
         <BODY>
             <IMG SRC= <?php echo $image_url; ?> >
          </BODY>
</HTML>

Si vous avez tout bien suivi, et que je ne me suis pas trompé (j'espère... :) ), une carte des contours de l'Indonésie devrait s'être dessinée. Une carte comme celle-ci :

Salut Merci pour le tutoriel,

Salut
Merci pour le tutoriel, même si j'ai quelque difficulté à comprendre (je suis un Débutant et je n'ai aucune notion).
j'ai quelque question à poser vu que c'est la première fois j'utilise MapServer:
- Ou doit je placer le fichier Tutorial.map?
- Est ce normal que après la commande "http://localhost/cgi-bin/mapserv.exe?map=C:/ms4w/apps/tutorial.map&mode=map" rien ne s'affiche?
- ou dois je taper les instructions en php et après qu'est ce que j'en fait?

Merci d'avance.

Bonjour, Alors dans l'ordre

Bonjour,

Alors dans l'ordre

> Ou doit je placer le fichier Tutorial.map?

Il se place dans votre environnement web local. Au regard de votre url (C:/ms4w/apps/tutorial.map), cela semble bon.

> Est ce normal que après la commande "http://localhost/cgi-bin/mapserv.exe?map=C:/ms4w/apps/tutorial.map&mode=map" rien ne s'affiche?

Non. Parfois, certaines personnes ont une page blanche mais l'image est bien présente. Changer la couleur du fond dans le map. Sinon faite afficher les bordures de l'img dans votre css. Au moins vous serez fixé.

> ou dois je taper les instructions en php et après qu'est ce que j'en fait?

Les instructions se placent dans un fichier php. Fichier que vous pouvez ensuite appeler via une url.

Arnaud

Bonjour, Je viens d'installer

Bonjour,
Je viens d'installer la dernière version de MS4W. Lorsque je lance Apache j'ai l'impression que rien ne se passe.
J'avais déjà installé Apache avec Wamp, y a-t-il un risque de conflit ?
Au final j'ai placé le dossier Apps dans celui de Wamp et je démarre avec ce dernier.

Du coup quand je lance le localhost j'arrive sur une page MapServer4 Windows
J'ai essayé de lancer un fichier map présent à l'installation pour voir ce qui se passe, j'obtiens ce message :
msProcessProjection(): Projection library error. no options found in 'init' file

Autre chose, dans quel répertoire faut-il placer le fichier phpmapscript? Faut il un fichier propre ou bien le placer dans le fichier map ?

Merci.

Olivier

dans la partie - Comment

dans la partie - Comment intégrer MapServer- j'ai placé le dossier MS4W à la racine de mon disque dur et j'ai lancé le fichier bat et j'ai envoyé localhost comme adresse mais le serveur me renvoi une image blanche !!!

Bonjour, L'image est-elle

Bonjour,

L'image est-elle correctement générée? Il y a t il une image blanche dans votre fichier ?

C'est vraiment bizarre, je refais le tuto point par point et cela me donne le bon résultat. Par contre vous êtes nombreux à avoir une image blanche. Il est décidément temps que je reprenne ce tutoriel.

Arnaud

Merci J'ai pu réaliser mon

Merci
J'ai pu réaliser mon premier test avec map script avec succès grâce à votre tutoriel.

J'ai fait la partie

J'ai fait la partie concernant le MapFile.
Mais j'ai quelques interrogations :
- Je ne sais pas où je dois placer mon fichier .map
- Je ne sais pas où je dois placer les donnnées (le fichier data)
- Je vois dans vos lien "cartoweb3/htdocs". Je n'ai pas cartoweb. J'ai OpenLayers, mais il n'y a pas de fichier htdocs à l'intérieur.

Où dois-je placer mes fichiers, et quels paths dois-je utiliser?

Merci,

Marie

Bonsoir, Désolé d'avoir pris

Bonsoir,

Désolé d'avoir pris si longtemps à vous répondre.

Alors concernant vos questions :

> Je ne sais pas où je dois placer mon fichier .map
Le fichier Map doit être situé dans un répertoire accessible à votre serveur web.

>Je ne sais pas où je dois placer les donnnées (le fichier data)
Vous pouvez les placer où vous voulez. Leur emplacement étant ensuite spécifié dans votre fichier map.

> J'ai OpenLayers, mais il n'y a pas de fichier htdocs à l'intérieur
OpenLayers s'exécute côté client, MapServer comme son nom l'indique côté serveur. Les deux sont liés mais pas dépendants. Cf voir cours

Si vus avez d'autres questions, je vous propose de continuer cette discussion sur le ForumSIG

Dans la dernière version de

Dans la dernière version de mapserver (utilisant php 5.4.3), il faut supprimer la ligne contenant l'appel de la dll (dl('php_mapscript.dll')).
Les appels de fonction se font directement par l'intermédiaire du php.ini.
Vérifiez à l'aide de la fonction phpinfo(); que extension_dir pointe bien vers le dossier '/ms4w/Apache/php/ext/' qui contient la dll : php_mapscript.dll
Ensuite dans le fichier .map mettre à jour les lignes suivantes :
SHAPEPATH "C:/ms4w/Apache/htdocs/"
IMAGEPATH "C:/ms4w/Apache/htdocs/tmp/"
IMAGEURL "tmp/"
et créer un dossier 'tmp' dans le dossier 'htdocs'
et ça fonctionne chez moi avec ms4w

Super merci pour ces

Super merci pour ces précisions :)

Arnaud

Bonjour, J'ai le même

Bonjour,
J'ai le même problème que Anonybis, à savoir le serveur me renvoi une image blanche alors que j'utilise tous les fichiers donnés dans ce tutoriel.

En revanche j'ai installé mon serveur dans un environnement Linux et je ne dispose pas pour l'instant de PhpMapScript, j'essaye simplement de générer la carte via CGI.

Comme tu soulèves le problème d'une éventuelle mauvaise projection j'aimerais savoir s'il n'était pas possible que MapServer interprète sous une mauvaise projection la carte et donc ne pourrait-on pas rajouter un attribut de projection dans le MapFile pour éliminer cette hypothèse ou dans le meilleur des cas résoudre le problème ?

Merci.

Bonjour, Un ogrinfo -so -al

Bonjour,

Un ogrinfo -so -al sur la couche retourne bien le bon extent?

Arnaud

Oui ça me parait cohérent

Oui ça me parait cohérent :

INFO: Open of `data/indonesie_surface.tab'
using driver `MapInfo File' successful.

Layer name: indonesie_surface
Geometry: Line String
Feature Count: 3014
Extent: (95.009331, -11.004850) - (133.073410, 8.726957)
Layer SRS WKT:
GEOGCS["unnamed",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563],
TOWGS84[0,0,0,-0,-0,-0,0]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433]]
USERID: Real (11.0)
FNODE_: Real (11.0)
TNODE_: Real (11.0)
LPOLY_: Real (11.0)
RPOLY_: Real (11.0)
LENGTH: Real (16.3)
SE_ASIA_: Real (5.0)
SE_ASIA_ID: Real (5.0)
FEATURE: Real (3.0)

En utilisant la commande

En utilisant la commande shp2img je parviens à générer l'image attendue :
shp2img ./data/indonesie_surface.shp -m ./tutorial.map -o ./tmp/img_test.png

Mais impossible via le mode map via CGI qui me renvoi toujours une image blanche...

Une idée quant à la cause de ce comportement ? Comment lancer le script dans le mode le plus verbeux possible afin éventuellement de trouver la source du problème ?

Avez-vous activé les messages

Avez-vous activé les messages d'erreur dans la config du PHP?

Le problème d'étirement était

Le problème d'étirement était lié à une BBOX qui ne respecte pas le ratio de l'image (à savoir dans ce tutoriel un ratio de 1000px/500px = 2).
Ainsi une manière de résoudre ce problème est d'adapter la BBOX à ce ratio.
Exemple de BBOX qui rétabli le ratio : BBOX=-16,90,14,150

HTH !

Oui, j'avais activé les

Oui, j'avais activé les messages d'erreur dans php.

Je viens de trouver le problème ou plutôt je viens de détourner quelque peu le problème.

Le "mode=map" semble causer quelques désagréments sur ma version de MapServer (5.4.2) puisqu'il n'affiche pas la bonne Bounds Box (BBOX pour les intimes) !

Je suis parvenu à afficher ma carte via l'url suivante :
http://domain/cgi-bin/mapserv?map=/var/www/htdocs/mapserver/tutorial.map...

Pour que ça fonctionne il a fallut que je modifie le MapFile pour déclarer la projection :

# Dans MAP --------->
PROJECTION
"init=epsg:4326"
END
# <------------------

# Dans TYPE LINE --->
PROJECTION
"init=epsg:4326"
END
METADATA
"ows_title" "Admin_Indonesie"
"ows_srs" "EPSG:4326"
"ows_abstract" "blabla"
END
# <------------------

Cependant, un petit problème d'étirement dans la largeur de l'image est à noter... Je cherche encore la solution.

ps : Pour plus d'informations je vous renvoi vers mon post sur le forum GeoRezo : http://georezo.net/forum/viewtopic.php?id=62641

Merci pour le retour

Merci pour le retour d'expérience et le solutions apportées.

Je suis sûr que cela servira à beaucoup d'autres (et à moi même).

Arnaud

Au plaisir ! :)

Au plaisir ! :)

Bonjour,j'ai fait ce tutoriel

Bonjour,j'ai fait ce tutoriel et pour la première parti rien ne s'affiche et je comprend pas pourquoi?j'ai pourtant copier le même code et mis les fichiers à l'endroit spécifier...j'ai une page blanche...

ensuite pour phpmapscript ,le fichier doit être enregistré avec quel extension et dans quel fichier?

je l'ai mit dans htdocs d'apache mais je ne sais vraiement pas...help

Bonjour, Les données que vous

Bonjour,

Les données que vous avez utilisé sont-elles celles du tutoriel?
En effet, une page blanche signifie souvent un problème de projection.

Le fichier phpmapscript se présente, si vous êtes, sur windows, sous la forme d'une DLL. Le plus simple étant d'installer le package ms4w qui est un serveur carto pour windows.

Arnaud

Précision pour le tutoriel

Précision pour le tutoriel Mapserver
J'ai suivi avec intérêt ce tutoriel mais il n'est pas suffisant en soi. Il faut aller voir le fil de GeoRezo ci-dessus pour arriver à afficher la carte

Note à Arnaud: suite à mon expérience (laborieuse) j'ai corrigé le document pour mon archivage personnel, je peux vous le faire parvenir pour rectificatif si vous le souhaitez (contactez moi sur mon email privé)

Merci de votre support

Très bon Tutoriel pour

Très bon Tutoriel pour debuter, par contre tu parles de fichiers disponibles "ici" mais il n'y a aucun lien :/

Merci pour le suivi. Les

Merci pour le suivi.
Les liens sont à nouveau disponibles.

Arnaud