0% ont trouvé ce document utile (0 vote)
27 vues11 pages

Création d'un MapFile avec PHP-MapScript

Cartographie

Transféré par

bobthunter24
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • format d'image,
  • système de navigation,
  • requêtes spatiales,
  • système de gestion de ressourc…,
  • configuration de l'interface,
  • système de gestion de base de …,
  • système de gestion de cartes,
  • objets géométriques,
  • MapScript,
  • données vectorielles
0% ont trouvé ce document utile (0 vote)
27 vues11 pages

Création d'un MapFile avec PHP-MapScript

Cartographie

Transféré par

bobthunter24
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • format d'image,
  • système de navigation,
  • requêtes spatiales,
  • système de gestion de ressourc…,
  • configuration de l'interface,
  • système de gestion de base de …,
  • système de gestion de cartes,
  • objets géométriques,
  • MapScript,
  • données vectorielles

ENI Dr RV p1

PARTIE 3 : CARTOGRAPHIE (WEB MAPPING)


AVEC PHP-MAPSCRIPT (VISUALISATION
D’UNE CARTE )

- Définir son MapFile -

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
oblifgatoirement 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 repertoire ou sont situées les
données.

Calcul de l'étendue géographique/emprise


d’une table Postgis - Extent() – Figure 1. Extent avec PostGIS. Ce qu'on
appelle aussi emprise en S.IG.

Note : Connaître l'étendue géographique peut


• Par définiton, l'étendue géographique d'un s'avérer utile, notamment avec Mapserver dont
objet spatial dans une base de données les fichiers mapfiles possèdent un paramètre
est la plus petit fenêtre (=rectangle) qui le EXTENT qui correspond à l'étendue
contienne. Ce dernier est défini par le géogpraphique.
quadruplet (Xmin,Ymin,Xmax,Ymax) .
(Xmin,Ymin) (respectivement Exemple d’un map
(Xmax,Ymax)) est le sommet inférieur
gauche (respectivement le sommet MAP
supérieur droit) du rectangle dans tout NAME "tutorial"
système de projection orienté de gauche à SIZE 1000 500
droite horizontalement et de bas en haut EXTENT 94.0000 -9.0048 131.000 4
verticalement. UNITS METERS
IMAGECOLOR 255 255 255
Ce dernier implique donc que tous les objets de la SHAPEPATH "C:/ms4w/apps/cartoweb3/
colonne géométrique the_geom sont contenus htdocs/phpMapScript/data"
dans le quadruplet ci-dessus obtenu.

Ensuite vient le bloc Web, c'est lui qui va gérer où


vont être entreprosées les images générées par
MapServer. Nous ne le verrons pas içi, mais c'est
dans ce bloc qu'il va être possible de rajouter des
éléments permettant d'enrichir l'interface génerale

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 .

WEB - Afficher une carte avec PhpMapScript -


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

End

Maitennant 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 PhpMapScript est un module Php permettant la


NAME png manipulation des objets, classes et methodes
DRIVER "GD/PNG" relatifs au MapFile. Il sera ainsi possible d'activer
MIMETYPE "image/png" ou de désactiver un layer, afficher la carte
IMAGEMODE PC256 dynamiquement etc.
EXTENSION "png"
Pour afficher la carte les objets MapScript et les
END méthodes suivantes seront utilisés:

Pour finir nous allons maintenant lister les • Objet MapObj


données à utiliser. Cela se passe grâce au bloc • Objet imageObj
Layer. Il sera nécéssaire de créer un bloc par
données. A l'intérieur de ce bloc, il existe d'autres Méthodes MapObj:
sous blocs tel que class, style, metadat etc.
• La méthode de construction: MapObj
LAYER ms_newMapObj(string map_file_name)
NAME Admin_Indonesie • La méthode de tracé: imageObj draw()
STATUS ON
CONNECTIONTYPE OGR Méthodes imageObj:
CONNECTION "data/indonesie_surface.tab"
TYPE LINE • La méthode saveWebImage: string
CLASS saveWebImage(int type, int transparent, int
STYLE interlace, int quality)
COLOR 0 0 0
OUTLINECOLOR 255 255 255 Pour cela nous aurons besoin tout d'abord
END d'instancier un nouvel objet Map, cela se fait
END grâce au constructeur ms_newMapObj auquel
END 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
Voilà nous sommes maintenant en mesure Web du MapFile.
d'afficher une carte. Il est d'ailleurs possible de le
faire directement en CGI grâce à la commande Exemple 1 : Utilisation d’un map
suivante :
MapPhp.map
http://localhost/cgi-bin/mapserv.exe?
map=C:/ms4w/apps/tutorial.map&mode=map MAP
EXTENT 1 -10.900001525879 158.800003051758
Il est très important de bien indenter son code 146.900001525879
dans le MapFile. Une erreur arrive très FONTSET "c:\wamp\www\tutorial\etc\fonts.txt"
2
ENI Dr RV p3

IMAGECOLOR 255 255 255 MINFEATURESIZE -1


IMAGETYPE png OFFSET 0 0
SYMBOLSET PARTIALS TRUE
"c:\wamp\www\tutorial\etc\symbols.sym" END
SIZE 700 594 POSITION LL
STATUS ON SIZE 200 3
UNITS METERS STATUS OFF
NAME "madatabase" STYLE 0
UNITS MILES
OUTPUTFORMAT END
NAME png
MIMETYPE image/png WEB
DRIVER GD/PNG IMAGEPATH "D:/MAPSERVER/ms4w/tmp"
EXTENSION png IMAGEURL "/temp/"
IMAGEMODE PC256 METADATA
TRANSPARENT FALSE END
END QUERYFORMAT text/html
END
LEGEND
IMAGECOLOR 255 255 255 LAYER
KEYSIZE 20 10 CONNECTION "user=postgres dbname=mabase
KEYSPACING 5 5 host=localhost"
LABEL CONNECTIONTYPE POSTGIS
SIZE MEDIUM DATA "the_geom from small_roads"
TYPE BITMAP LABELITEM "data"
BUFFER 0 METADATA
COLOR 0 0 0 END
FORCE FALSE NAME "small_roads"
MINDISTANCE -1 SIZEUNITS PIXELS
MINFEATURESIZE -1 STATUS DEFAULT
OFFSET 0 0 TOLERANCE 0
PARTIALS TRUE TOLERANCEUNITS PIXELS
POSITION CC TYPE LINE
END UNITS METERS
POSITION LL CLASS
STATUS OFF METADATA
END END
STYLE
QUERYMAP ANGLE 360
COLOR 255 255 0 OUTLINECOLOR 80 80 80
SIZE -1 -1 SIZE 10
STATUS OFF SYMBOL "circle"
STYLE HILITE END
END END
END
SCALEBAR
COLOR 0 0 0 LAYER
IMAGECOLOR 255 255 255 CONNECTION "user=postgres dbname=mabase
INTERVALS 4 host=localhost"
LABEL CONNECTIONTYPE POSTGIS
SIZE MEDIUM DATA "the_geom from great_roads"
TYPE BITMAP LABELITEM "data"
BUFFER 0 METADATA
COLOR 0 0 0 END
FORCE FALSE NAME "great_roads"
SIZEUNITS PIXELS
MINDISTANCE -1 STATUS DEFAULT

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

UNITS METERS END


CLASS STYLE
LABEL ANGLE 360
SIZE MEDIUM COLOR 255 0 0
TYPE BITMAP SIZE 8
BACKGROUNDCOLOR 255 255 255 SYMBOL "circle"
BUFFER 0 END
COLOR 22 8 3 END
FORCE FALSE END
MINDISTANCE -1
MINFEATURESIZE -1 END
OFFSET 0 0
OUTLINECOLOR 255 255 255 Afficher_Map.php
PARTIALS TRUE
POSITION CC
END <?php
METADATA
END // define variables
STYLE define( "MAPFILE",
ANGLE 360 "D:\MAPSERVER\ms4w\Apache\
COLOR 234 156 78 htdocs\mapfile\MapPhp.map" );
OUTLINECOLOR 234 156 78 define( "MODULE", "php_mapscript.dll" );
SIZE 5
SYMBOL 0 // load the mapscript module
END if (!extension_loaded("MapScript")) dl(MODULE);
END
END // dl('php_mapscript.so');
LAYER // open map
CONNECTION "user=postgres dbname=mabase $oMap = ms_newMapObj( MAPFILE );
host=localhost"
CONNECTIONTYPE POSTGIS //force all errors to display
DATA "the_geom from personnes" // comment out the next 2 lines, useful on servers
LABELITEM "data" not displaying errors
METADATA //ini_set('display_errors','On');
END //error_reporting(E_ALL);
NAME "personnes"
SIZEUNITS PIXELS // set projection if necessary
STATUS DEFAULT //$oMap->setProjection("init=epsg:42304");
TOLERANCE 0 // set image size
TOLERANCEUNITS PIXELS $oMap->setsize(400, 300);
TYPE POINT // set image format
UNITS METERS $oMap->selectoutputformat("png");
CLASS // draw map
LABEL $oImage = $oMap->draw();
SIZE MEDIUM // set header
TYPE BITMAP if (!headers_sent()) header("Content-type:
BUFFER 0 image/gif");
COLOR 22 8 3
FORCE FALSE // output map
MINDISTANCE -1 $url = $oImage->saveImage("");
MINFEATURESIZE -1 // $image_url=$oImage->saveWebImage("");
OFFSET 0 0
PARTIALS TRUE ?>
POSITION CC
END
METADATA Exemple 2 :
5
ENI Dr RV p6

Affichage d’une carte EUROPE à partir d’un if (!extension_loaded("MapScript"))


fichier shapefile {
dl(MODULE);
EUROPE.MAP }

NAME "Europe in purple" // open map


SIZE 700 700 $oMap = ms_newMapObj( MAPFILE );
STATUS ON
EXTENT 1 -544 342 -3 //force all errors to display
#SYMBOLSET ./symbols/symbols.sym // comment out the next 2 lines, useful on
UNITS METERS servers not displaying errors
IMAGECOLOR 255 255 255 //ini_set('display_errors','On');
SHAPEPATH "C:\data\shp" //error_reporting(E_ALL);
// set projection if necessary
WEB //$oMap->setProjection("init=epsg:42304");
IMAGEPATH // set image size
"C:\ms4w\ms4w\Apache\htdocs\EXEMPLE\temp\" $oMap->setsize(1000, 1000);
IMAGEURL "/EXEMPLE/temp/"
END // set image format
$oMap->selectoutputformat("png");
LAYER
NAME "Europe" // draw map
TYPE POLYGON $oImage = $oMap->draw();
STATUS ON
DATA "europesvg" // set header
# DATA "europesvg.shp" if (!headers_sent()) header("Content-type:
image/png");
CLASS // output map
STYLE $url = $oImage->saveImage("");
COLOR 110 50 100 ?>
OUTLINECOLOR 200 200 200
END
END Il est possible d’afficher de la carte avec
END MapScript comme suit :

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

Maintenant nous allons ajouter à ce code les KEYSIZE 20 10


capacités de zoom et de déplacement d'image. KEYSPACING 5 5
LABEL
Voici la liste des nouvelles méthodes et objets SIZE MEDIUM
appelés. TYPE BITMAP
BUFFER 0
Nouveaux objets: COLOR 0 0 0
FORCE FALSE
• pointObj MINDISTANCE -1
• rectObj MINFEATURESIZE -1
OFFSET 0 0
Nouvelles méthodes et membres appelés: PARTIALS TRUE
POSITION CC
END
• La méthode zoompoint de l'objet map: void
POSITION LL
zoompoint(int nZoomFactor, pointObj
STATUS OFF
oPixelPos, int nImageWidth, int
END
nImageHeight, rectObj oGeorefExt).
• La méthode setextent de l'objet map:
QUERYMAP
$map->setextent(double minx, double
COLOR 255 255 0
miny, double maxx, double maxy);.
SIZE -1 -1
• Les membres zone (extent), largeur
STATUS OFF
(width) et hauteur (height) de l'objet map.
STYLE HILITE
• Les constructeurs de RectObj et PointObj:
END
$point = ms_newPointObj(); $rect =
ms_newRectObj();
SCALEBAR
• La méthode setXY de l'objet point: $point-
COLOR 0 0 0
>setXY(double x_coord, double y_coord);
IMAGECOLOR 255 255 255
• La méthode setextent de l'objet rectangle:
INTERVALS 4
$rect->setextent(double minx, double
LABEL
miny, double maxx, double maxy);
SIZE MEDIUM
TYPE BITMAP
Le mapfile reste le même que celui de l'exemple BUFFER 0
précédent avec ajout dynamique des couches COLOR 0 0 0
FORCE FALSE
Cna.map ( carte de base) MINDISTANCE -1
MINFEATURESIZE -1
MAP OFFSET 0 0
EXTENT 43.15464 -25.61114 47.39753 PARTIALS TRUE
-20.012138 END
IMAGECOLOR 255 255 255 POSITION LL
IMAGETYPE png SIZE 200 3
SIZE 700 594 STATUS OFF
STATUS ON STYLE 0
UNITS METERS UNITS MILES
NAME "madatabase" END

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

host=localhost" dbname=basecna host=localhost");


CONNECTIONTYPE POSTGIS
DATA "the_geom from ag_wgs" // Requête spatiale utilisée
LABELITEM "gid" //$layer->set("data",$colonne_geometrique." from ".
METADATA $table_choisie." as foo using unique gid using
END SRID=-1");
NAME "ag_wgs" //$layer->set("data","the_geom from ".$nomCouche."
SIZEUNITS PIXELS as foo using unique gid using SRID=-1");
STATUS DEFAULT
TOLERANCE 0 $layer->set("data","the_geom from ".
TOLERANCEUNITS PIXELS $nomCouche);
TYPE POLYGON // Précision sur le type de donnée géomatrique à
UNITS METERS prendre en compte: LINE, POINT...
CLASS
METADATA //$layer->set("type",$type_donnee_geom);
END $layer->set("type",MS_LAYER_POLYGON); //
STYLE MS_LAYER_POINT_LINE
ANGLE 360
COLOR 0 123 0 // on crée une classe dans cette couche
OUTLINECOLOR 80 80 80 $class = ms_newClassObj($layer);
SIZE 10 $class->set("name", $nomCouche);
SYMBOL 0
END // dans lequel on crée un style
END // Précision sur l'affichage des données
END géomatriques
// couleur de bourdure en code 128 0 0 pour RGB
END
$style = ms_newStyleObj($class);
SCRIPT.PHP $style->color->setRGB ($color1,$color2,$color3);
$style->set("size",4);
<?php // $style->outlinecolor->setRGB(128,0,0);
$style->set("symbol", 2);
//AJOUT DYNAMIQUE DES COUCHES
// si on a un label, on l'affiche
if ($labelitem)
function creeCouche($map,$nomCouche,
{
$affiche, $labelitem=false, $color1, $color2,
$layer->set("labelitem", $labelitem);
$color3,$labelcolor1 = false,$labelcolor2 = false,
// $class->label->outlinecolor-
$labelcolor3 = false)
>setRGB($labelcolor1,$labelcolor2,$labelcolor3);
{
$class->label->outlinecolor->setRGB
// on crée la couche
(255,255,255) ;
$layer = ms_newLayerObj($map);
$class->label->color->setRGB(22,8,3);
$class->label->set("position", MS_UC);
// on attribue son nom
}
$layer->set("name", $nomCouche);
}
if($affiche)
$layer->set("status", MS_ON);
// PRINCIPAL
else
define( "MAPFILE",
$layer->set("status", MS_OFF);
"C:\ms4w\ms4w\Apache\htdocs\EXEMPLE\
// sa source de donnée est le shape définit
mapfile\cna.map" );
// $layer->set("data", $data);
// Connexion à la base de données PostGIS
if (!extension_loaded("MapScript"))
dl('php_mapscript.dll');
$layer->set("connectiontype",MS_POSTGIS);
// Default values and configuration
// $layer->set("connection","user=".$utilisateur."
dbname=".$base_de_donnees." host=".$hote);
$val_zsize=3;
$layer->set("connection","user=postgres
8
ENI Dr RV p9

$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

NAME="zoom" VALUE=0 <?php echo $check_pan? }


>>
</TD> ?>
</TR>
<TR>
<TD> Zoom In </TD> <?php
<TD>
<INPUT TYPE=RADIO NAME="zoom" VALUE=1 printf("<TABLE BGCOLOR=WHITE>");
<?php echo $check_zin?>> for ($i=0; $i<$map->numlayers; $i++)
</TD> {
</TR> $layer = $map->getLayer($i);
<TR>
<TD> Zoom Out </TD> if ($layer->status != MS_OFF && $layer->type !=
<TD> MS_LAYER_QUERY)
<INPUT TYPE=RADIO NAME="zoom" VALUE=-1 for ($j=0; $j<$layer->numclasses; $j++)
<?php echo $check_zout?>> {
</TD> $myClass = $layer->GetClass($j);
</TR>
<TR> $img = $myClass->createLegendIcon($map->
<TD> Zoom Size </TD> keysizex, $map->keysizey);
<TD> $url = $img->saveWebImage(MS_PNG, 0, 0, 0);
<INPUT TYPE=TEXT NAME="zsize" VALUE="<?
php echo $val_zsize?>" printf("<TR><TD><IMG SRC=%s></TD><TD>
SIZE=2> %s</TD></TR>", $url, $layer->name);
</TD> }
</TR> }
<TR> printf("</TABLE>");
<TD>Full Extent </TD> //
<TD> // Ajout de l'échelle
<INPUT TYPE=SUBMIT NAME="full" VALUE="Go" //
SIZE=2> $img = $map->drawScaleBar();
</TD> $url = $img->saveWebImage(MS_PNG, 0, 0, 0);
</TABLE> printf("<P><IMG SRC=%s>\n", $url);
<INPUT TYPE=HIDDEN NAME="extent" ?>
VALUE="<?php echo $extent_to_html?>">
</FORM> </BODY>
</CENTER> </HMTL>

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

Nous créons un nouvel objet rectangle et le


renseignons avec la zone de la précédente image,
En fait, nous aurions pu écrire $my_extent =
$map->extent;.

Pour effectuer le zoom ou le déplacement, nous


appelons la fonction zoompoint, mais d'abord
nous devons préparer les arguments qu'elle
reçoit. Nous avions le point cliqué par l'utilisateur,
et la zone de l'image (respectivement $my_point
et $my_extent), maintenant nous avons besoin de
déterminer le facteur de zoom. Si vous vous
11

Vous aimerez peut-être aussi