31
22 aoû 2008

- 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.


// É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);
?>



Tutorial MapServer


>


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 :

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

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 liens sont à nouveau disponibles.

Arnaud

Merci pour ce tuto.
J'ai réussi en php, mais pas en CGI (page blanche).

A+

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 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 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

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 sur la couche retourne bien le bon extent?

Arnaud

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 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 d'erreur dans la config du PHP?

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 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 ! :)

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 !

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 précisions :)

Arnaud

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 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

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

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 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

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

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

> 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

Salut,
merci bcp pour le tutoriel
En fait je l ai suivi (je suis débutante ), mais quand j 'execute l 'url que vous avez cité dans le Tutorial ça donne l erreur suivante
msLoadMap(): Unable to access file. (C:/ms4w/apps/tutorial.map)
même si j'ai placé les fichiers dans leur emplacement.

j 'ai aussi quelque question à poser:

-le fichier map est il un simple fichier texte enregistré sous format .map
- y a t'il un moyen pour faire communiquer automatiquement le arcgis et le mapserver
-y a t'il un moyen pour afficher la carte depuis apache directement sans avoir besoin d’écrire l url moi même
-

Bonjour.
Tout d'abord merci pour cette tentative de tutoriel. Je suis aussi totalement novice dans tout ce qui est serveur et communication internet, alors je n'ai vraiment aucune notion en la matière (je maîtrise par contre tout ce qui est programmation java/C++).
Pourriez-vous m'indiquer comment installer MapServer, car je ne suis pas certain que je l'aie installé comme il faut (suffit-il que lorsque j'aille ensuite sur le MS4W-localhost et qu'il m'affiche une page descriptive pour être sur que cela fonctionne correctement ?).
De plus, j'ai rencontré le même problème que d'autres avant moi, c'est-à-dire que quand je visite http://localhost/cgi-bin/mapserv.exe?map=C:/ms4w/apps/tutorial.map&mode=map,
rien ne s'affiche.
Je travaille actuellement sur un projet de site communautaire utilisant la cartographie, et voudrais tester les fonctionnalités de MapServer pour voir si je devrais me servir de ce dernier plutôt que d'un autre. Pourriez-vous m'aider assez rapidement ?
D'avance je vous remercie.

Merci pour le 'tentative' ;-)
Je vois que beaucoup d'entres vous ont des problèmes pour installer MapServer sur Windows. N'étant plus très fan de cet OS notamment sur un serveur, nous n'avons pris le temps de le corriger - c'est que ce tuto commence à dater.
Etes-vous certain du bon emplacement du MapFile ?

Pour trouver de l'aide 'rapidement' le ForumSIG semble plus indiqué qu'ici - par contre, essayez d'éviter le 'rapidement' ça risque de faire grincer des dents.

Sinon sur Ubuntu, l'installation de MapServer fonctionne parfaitement : http://geotribu.net/node/227 :-)

Bonjour,

voilà j'utilise depuis un certain temps WampServer et j'aimerais le couplet à Mapserver, et j'aimerais savoir comment faire pour coupler les 2.
Merci

Bonjour, tout d'abord merci pour ce tutoriel. C'est vrai qu'il est un peu vieux mais je le trouve bien fait.
J'ai cependant un problème, les fichiers proposés n'existant plus, j'ai voulu essayer le tutoriel avec des fichiers .osm qui contiennent les données de la corse.

Je me retrouve alors bloquée comme beaucoup à l'affichage de la carte sur une page blanche.

Alors je me pose la question déjà : est-ce que ce tutoriel marche avec des .osm ?
Si oui, je pensais à un problème de BoudyBox dans le Extent mais je ne sais pas comment y remédier (j'ai essayer d'ouvrir mon fichier corse.osm et j'ai regardé les coordonnées des tiles de la corse et j'ai entouré ces coordonnées, mais ça ne marche toujours pas ...

Avez-vous une idée ?

Merci d'avance !

Les données exemple pour faire le tuto ne sont pas disponible. Une page non trouvé arrive lorsque l'on clique sur le ici. Serait-il possible d'obtenir ces données exemples.
Merci!