Création d'un MapFile avec PHP-MapScript
Thèmes abordés
Création d'un MapFile avec PHP-MapScript
Thèmes abordés
1
ENI Dr RV p2
de la page. Cela se passe grâce aux balises rapidement, de plus vérifiez bien que tous vos
header et footer. blocs soient fermés par un End .
End
3
ENI Dr RV p4
TOLERANCE 0
TOLERANCEUNITS PIXELS LAYER
TYPE LINE CONNECTION "user=postgres dbname=mabase
UNITS METERS host=localhost"
CLASS CONNECTIONTYPE POSTGIS
METADATA DATA "the_geom from rivers"
END LABELITEM "data"
STYLE METADATA
ANGLE 360 END
OUTLINECOLOR 125 125 125 NAME "rivers"
SIZE 10 SIZEUNITS PIXELS
SYMBOL "circle" STATUS DEFAULT
END TOLERANCE 0
END TOLERANCEUNITS PIXELS
END TYPE POLYGON
UNITS METERS
LAYER CLASS
CONNECTION "user=postgres dbname=mabase LABEL
host=localhost" SIZE MEDIUM
CONNECTIONTYPE POSTGIS TYPE BITMAP
DATA "the_geom from parcs" BACKGROUNDCOLOR 255 255 255
LABELITEM "data" BUFFER 0
METADATA COLOR 22 8 3
END FORCE FALSE
NAME "parcs" MINDISTANCE -1
SIZEUNITS PIXELS MINFEATURESIZE -1
STATUS DEFAULT OFFSET 0 0
TOLERANCE 0 OUTLINECOLOR 255 255 255
TOLERANCEUNITS PIXELS PARTIALS TRUE
TYPE POLYGON POSITION CC
UNITS METERS END
CLASS METADATA
LABEL END
SIZE MEDIUM STYLE
TYPE BITMAP ANGLE 360
BACKGROUNDCOLOR 255 255 255 COLOR 0 12 189
BUFFER 0 OUTLINECOLOR 0 12 189
COLOR 22 8 3 SIZE 5
FORCE FALSE SYMBOL 0
MINDISTANCE -1 END
MINFEATURESIZE -1 END
OFFSET 0 0 END
OUTLINECOLOR 255 255 255
PARTIALS TRUE LAYER
POSITION CC CONNECTION "user=postgres dbname=mabase
END host=localhost"
METADATA CONNECTIONTYPE POSTGIS
END DATA "the_geom from buildings"
STYLE LABELITEM "data"
ANGLE 360 METADATA
COLOR 0 123 0 END
OUTLINECOLOR 255 255 255 NAME "buildings"
SIZE 5 SIZEUNITS PIXELS
SYMBOL 0 STATUS DEFAULT
END TOLERANCE 0
END TOLERANCEUNITS PIXELS
END TYPE POLYGON
4
ENI Dr RV p5
END <?php
dl('php_mapscript.so');
Ici nous avons une carte avec une simple couche, $map_path="/var/www/html/ms/ map_files/";
avec le fichier shape appelé europe situé dans le $map =
répertoire data. Les symboles sont situés dans le ms_newMapObj($map_path."europe.map");
sous-répertoire symbols. Toutes les localisations $image=$map->draw();
sont relatives au fichier mapfile. La partie WEB est $image_url=$image->
seulement utilisée pour définir où les images saveWebImage(MS_PNG,1,1,0); //pour générer le
générées sont sauvegardées et à quelle URL fichier d'image PNG;
elles seront disponibles. ?>
<HTML>
SCRIPT.PHP pour visualiser la carte <HEAD>
<TITLE>Example 1: Displaying a map</TITLE>
<?php </HEAD>
// define variables <BODY>
define( "MAPFILE", <IMG SRC=<?php echo $image_url; ?> >
"C:\ms4w\ms4w\Apache\htdocs\EXEMPLE\ </BODY>
mapfile\Europe.map" ); </HTML>
define( "MODULE", "php_mapscript.dll" );
// load the mapscript module
Voyons le zoom!
6
ENI Dr RV p7
OUTPUTFORMAT WEB
NAME png IMAGEPATH "c:/postgis8/temp"
MIMETYPE image/png IMAGEURL "temp/"
DRIVER GD/PNG METADATA
EXTENSION png END
IMAGEMODE PC256 QUERYFORMAT text/html
TRANSPARENT FALSE END
END
LAYER
LEGEND CONNECTION "user=postgres dbname=basecna
IMAGECOLOR 255 255 255
7
ENI Dr RV p8
$check_pan="CHECKED";
// $map_path="C://ms4w//ms4w//Apache// $map->setsize(400, 400);
htdocs//EXEMPLE//mapfile//"; // set image format
// $map_path="C:\ms4w\ms4w\Apache\ htdocs\ // $map->selectoutputformat("png");
EXEMPLE\mapfile\";
$img_path = "C:\\ms4w\\ms4w\\Apache\\htdocs\\
// $map_file="Europe.map"; EXEMPLE\\ temp\\";
$img_web = "/EXEMPLE/temp/";
// $map = ms_newMapObj($map_path.$map_file); //$map_id = sprintf("%0.6d",rand(0,999999));
$map = ms_newMapObj(MAPFILE); // $image_name = "mapscript".$map_id.".png";
$image_name = "mapscript.png";
if ( isset($HTTP_POST_VARS["mapa_x"]) &&
isset($HTTP_POST_VARS["mapa_y"]) creeCouche($map,
&& !isset($HTTP_POST_VARS["full"]) ) { "za2_commune_wgs84",MS_ON,"nomfir",
$extent_to_set = explode(" ", 199,199,199);
$HTTP_POST_VARS["extent"]); creeCouche($map,
"za3_6_commune_wgs84",MS_ON,"nomfir",
$map->setextent ($extent_to_set[0], 80,0,0);
$extent_to_set[1], creeCouche($map,
$extent_to_set[2],$extent_to_set[3]); "za4_commune_wgs84",MS_ON,"nomfir",
180,40,0);
$my_point = ms_newpointObj();
$my_point->setXY // creeCouche($map,$nomCouche, $affiche, $type,
($HTTP_POST_VARS["mapa_x"], $labelitem = false, $color1, $color2,
$HTTP_POST_VARS["mapa_y"]); $color3,,$labelcolor1 = false,$labelcolor2 = false,
$labelcolor3 = false)
$my_extent = ms_newrectObj();
$image = $map->draw();
$my_extent->setextent ($extent_to_set[0], $image->saveImage($img_path.$image_name);
$extent_to_set[1],
$extent_to_set[2], //echo $image_url;
$extent_to_set[3]); $extent_to_html = $map->extent->minx." ".
$map->extent->miny." " .$map->extent->maxx." ".
$zoom_factor = $HTTP_POST_VARS["zoom"]* $map->extent->maxy;
$HTTP_POST_VARS["zsize"]; ?>
if ($zoom_factor == 0) { <HTML>
$zoom_factor = 1; <HEAD>
$check_pan = "CHECKED"; <TITLE>Map 2</TITLE>
$check_zout = ""; </HEAD>
$check_zin = ""; <BODY>
} else if ($zoom_factor < 0) { <CENTER>
$check_pan = ""; <FORM METHOD=POST ACTION=<?php echo
$check_zout = "CHECKED"; $PHP_SELF?>>
$check_zin = ""; <TABLE>
} else { <TR>
$check_pan = ""; <TD>
$check_zout = ""; <!-- <INPUT TYPE=IMAGE NAME="mapa"
$check_zin = "CHECKED"; SRC="<?php echo "http://localhost/".$image_url?>">
} -->
<INPUT TYPE=IMAGE NAME="mapa" SRC="<?
$val_zsize = abs($zoom_factor); php echo $image_url;?>">
</TD>
$map->zoompoint($zoom_factor,$my_point, $map- </TR>
>width,$map->height, $my_extent); <TR>
<TD> Pan </TD>
} <TD> <INPUT TYPE=RADIO
9
ENI Dr RV p 10
<?php
for ($i=0; $i<$map->numlayers; $i++)
{
$layer = $map->getlayer($i);
for ($k=0; $k<$layer->numclasses; $k++) Ce code permettra les différents zoom
{ (agrandissement, réduction), le déplacement et la
$class = $layer->getclass($k); restauration de la vue initiale de l' image affichée
$class->label->outlinecolor->setRGB dans l'exemple précédent.
(255,255,255);
$nb_min = 0; Nous déclarons l'image générée par MapScript
$nb_max = 255; comme faisant partie de ce formulaire, donc
$col1 = mt_rand($nb_min,$nb_max); quand vous cliquez sur elle, les coordonnées X et
$col2 = mt_rand($nb_min,$nb_max); Y du clique (en pixels) sont envoyées avec les
$col3 = mt_rand($nb_min,$nb_max); autres données du code PHP pour être
analysées.
$class->label->color->setRGB(col1,col2,col3);
Nous vérifions que les variables du formulaire
}
sont bien renseignées. 'mapa_x' et 'mapa_y'
représentent les coordonnées X et Y du clique de
10
ENI Dr RV p 11
souris sur l'image, et 'full' représente le clique sur inquiétiez de savoir pourquoi les valeurs des
le bouton 'Full Extent'. boutons radio étaient 0, -1, et 1 pour le
déplacement, l'agrandissement et la réduction,
La première fois que la page est affichée la maintenant vous en connaissez la raison.
condition 'if' n'est pas exécutée, mais le reste du
code l'est. Nous renseignons la variable Un facteur de zoom de 1 indique à zoompoint que
'$extent_to_html' avec les valeurs de la zone nous déplaçons l'image, une valeur négative
(extent) définie dans le mapfile, séparées par des indique que nous avons une réduction et une
espaces; cette valeur sera mise dans la variable valeur positive indique que nous avons un
HTML 'extent'. agrandissement. Ainsi nous multiplions la valeur
reçue pour les boutons radio (variable HTML
Nous sommes dans la condition 'if', ça veut dire 'zoom') par la taille du zoom que l'utilisateur a
que le formulaire a été soumis au moins une fois. donné. Si cette valeur est zéro, ça veut dire que
Nous extrayons la zone stockée lors de la nous voulons déplacer l'image, ainsi nous
précédente exécution (la variable HTML 'extent') renseignons '$zoom_factor' à 1, sinon le résultat
du code et renseignons la zone de la carte pour de la multiplication est le facteur de zoom que
devenir cette dernière zone. Ceci permet de zoompoint a besoin de recevoir. Les autres lignes
zoomer ou déplacer d'après la zone précédente, empêchent l'utilisateur de cliquer sur le bouton la
et non la zone qui est définie dans le mapfile. prochaine fois. On essaye de préserver la valeur
de la taille du zoom que l'utilisateur a donné (ça
D'après ce dernier paragraphe vous pouvez ne marche pas à tous les coups, quand et
déduire que toutes les valeurs par défaut sont pourquoi? A vous de trouver).
renseignées dans le mapfile, que tout
changement se fait à travers MapScript et devrait Et finalement, nous appelons la méthode
être présent dans votre code, étant stocké zoompoint avec le facteur de zoom obtenu, le
quelque part. Dans ce cas nous faisons ça avec point construit à partir des coordonnées en pixels
des variables cachées du formulaire. Pour une (j'insiste là-dessus parce que zoompoint est la
application plus aboutie nous utiliserions des seule méthode qui reçoit des coordonnées en
variables de session ou une base de données. pixels, pour les autres méthodes vous devrez
vous-même convertir les pixels en coordonnées
Maintenant vous devriez être capable de géographiques), la hauteur (height) et largeur
comprendre pourquoi le bouton 'Full Extent' (width) de l'image, et la zone (extent).
fonctionne ; elle indique que si vous pressez le
bouton, la condition 'if' est sautée, ainsi la zone Après avoir appelé zoompoint, la zone de l'image
est réinitialisée à la valeur définie dans le mapfile. est changée de manière à correspondre à
Vous devriez aussi voir qu'il ne s'agit pas l'opération effectuée (ou, encore mieux, au facteur
obligatoirement de la zone complète (dans le cas de zoom). Puis nous traçons l'image et
où le mapfile n'est pas une zone complète). sauvegardons la zone actuelle (après le zoom)
pour être utilisée dans l'itération suivante.
Nous déclarons un nouvel objet point et
initialisons celui-ci avec les valeurs du clique de
l'utilisateur. N'oubliez pas que ces valeurs sont en
pixels, et non dans des coordonnées
géographiques.