Table des matières
Ici est donné à titre d'exemple les sources des fichiers qui ont permis de générer l'image servant pour les exemples dans le chapitre 4.
La table mapserver_desc est une table descriptive utilisée pour pouvoir gérer diverses options pour chaque table - correspondant à une layer de mapserver - comme la couleur des objets, la bordure, l'épaisseur etc...Voici son contenu
ms_gid | ms_table | ms_libelle | ms_name | ms_labelitem | ms_color | ms_outlinecolor | ms_symbol --------+-------------+-----------------+-------------+--------------+-------------+-----------------+----------- 0 | small_roads | Petite routes | small_roads | data | 80 80 80 | 80 80 80 | 1 | great_roads | Grandes routes | great_roads | data | 125 125 125 | 125 125 125 | 2 | parcs | Parcs publiques | parcs | data | 0 123 0 | 255 255 255 | 3 | rivers | RiviÞre | rivers | data | 0 12 189 | 0 12 189 | 4 | buildings | BÔtiments | buildings | data | 234 156 78 | 234 156 78 | 5 | personnes | PiÚtons | personnes | data | | 255 0 0 | circle (6 rows)
Avant tout chose, nous avons besoin de partir d'une mapfile -base.map - dont le contenu est le suivant
MAP EXTENT 0 0 1 1 SIZE 1 1 IMAGECOLOR 255 255 255 IMAGETYPE PNG STATUS ON OUTPUTFORMAT NAME png MIMETYPE image/png DRIVER GD/PNG EXTENSION png IMAGEMODE PC256 TRANSPARENT FALSE END END
Le script php suivant générera la mapfile attendue:
<html> <body> <?php /* Les paramètres à modifier */ $sw_MapFile = "./mapfiles/base.map"; /* Paramètres de connexion à PostgreSQL */ $pg_hote = "localhost";//"localhost"; $pg_base_de_donnees = "madatabase"; $pg_utilisateur = "david"; $pg_mot_de_passe = " "; $pg_srid="-1"; /* On vérifie que les librairies de PHP sont chargées comme il faut */ if ( extension_loaded('pgsql') + extension_loaded('MapScript')!= 2) { switch (PHP_OS) { case "WINNT": if (!extension_loaded('pgsql')) dl("php_pgsql.dll"); if (!extension_loaded('MapScript')) dl("php_mapscript_45.dll"); break; default: if (!extension_loaded('pgsql')) dl("php_pgsql.so"); if (!extension_loaded('MapScript')) dl("php_mapscript_dev.so"); break; } } /* OK.... On construit notre MapFile */ $map = ms_newMapObj( $sw_MapFile ); // Chargement du nom de la mapfile $map->set( "name", "madatabase" ); // Déterminations des chemins d'accès vers les fonts et les symboles switch (PHP_OS) { case "WINNT": $mapserver_fontset = getcwd()."\etc\fonts.txt"; $mapserver_symbolset = getcwd()."\etc\symbols.sym"; $mapserver_imagepath = str_replace("\\","/",getcwd())."/tmp/"; break; default: $mapserver_fontset = getcwd()."/etc/fonts.txt"; $mapserver_symbolset = getcwd()."/etc/symbols.sym"; $mapserver_imagepath = getcwd()."/tmp/"; break; } $mapserver_imageurl = str_replace("MakeMap.php", "", $_SERVER["REDIRECT_URL"])."tmp/"; $map->SetFontSet( $mapserver_fontset ); $map->setSymbolSet( $mapserver_symbolset ); $map->web->set( "imagepath" , $mapserver_imagepath ); $map->web->set( "imageurl", $mapserver_imageurl ); // // Connexion au serveur PostgreSQL // $db_handle = pg_connect("host=".$pg_hote." dbname=".$pg_base_de_donnees." user=".$pg_utilisateur." password=".$pg_mot_de_passe.""); $Requete_MS_Tables = "SELECT * from mapserver_desc"; /* if (!( $Resultat_MS_Tables = pg_exec( $db_handle, $Requete_MS_Tables ) )); { print( "Impossible d'interroger le serveur PostgreSQL"); print( pg_errormessage( $db_handle) ); exit(""); } */ $Resultat_MS_Tables = pg_exec( $db_handle, $Requete_MS_Tables ); // tableaux nécessaire pour calculer l'extent $Xmin = array(); $Xmax = array(); $Ymin = array(); $Ymax = array(); while( $MS_Ligne = pg_fetch_object( $Resultat_MS_Tables) ) { $layer = ms_newLayerObj( $map ); // Nom du layer $layer->set( "name", $MS_Ligne->ms_name ); // Affichage : oui par défaut $layer->set("status",MS_DEFAULT); // Type de connexion := PostGIS $layer->set("connectiontype",MS_POSTGIS); $layer->set("connection", "user=".$pg_utilisateur." dbname=".$pg_base_de_donnees." host=".$pg_hote); $layer->set("labelitem",$MS_Ligne->ms_labelitem); /* Pour effectuer la requete d'affichage, nous savons que la colonne s'appelle 'the_geom' mais jouons le jeu que nous l'ignorons. Or nous savons que le nom de la colonne géométrique est stockée dans la colonne 'f_geometry_column' de la table geometry_column et que le nom de la table associé est dans la colonne f_table_name */ $MS_GEOM = pg_exec($db_handle, "SELECT f_geometry_column,type FROM geometry_columns WHERE f_table_name LIKE '".$MS_Ligne->ms_table."'" ); $colonne_geometrique = pg_result( $MS_GEOM,0,0 ); $type_geometrique = pg_result( $MS_GEOM,0,1 ); // La requete spatiale $layer->set( "data", $colonne_geometrique." from ".$MS_Ligne->ms_table); $MS_Code_Bordure_Couleur = array(); $MS_Code_Bordure_Couleur = explode( " ", $MS_Ligne->ms_outlinecolor); $MS_Code_Couleur = array(); $MS_Code_Couleur = explode( " ", $MS_Ligne->ms_color); switch ($type_geometrique) { case "POINT": $layer->set("type",MS_LAYER_POINT); // // Ajout de la class // $class = ms_newClassObj($layer); // // Ajout du Label // // $label = $class->label; $label->set("size",MS_MEDIUM); $label->color->setRGB("22","8","3"); // // Ajout du style // $style = ms_newStyleObj($class); // // Précision sur la taille de l'objet // $style->set("size",10); $style->set("symbolname", $MS_Ligne->ms_symbol ); $style->color->setRGB($MS_Code_Bordure_Couleur[0], $MS_Code_Bordure_Couleur[1], $MS_Code_Bordure_Couleur[2]); break; case "POLYGON": $layer->set("type",MS_LAYER_POLYGON); //$layer->set("status",MS_OFF); $class = ms_newClassObj($layer); // // Ajout du Label // $label = $class->label; // Précision sur l'affichage de la données de type attributaire // la couleur, la taille de la donnée ... $label->set("size",MS_MEDIUM); $label->backgroundcolor->setRGB(255,255,255); $label->color->setRGB("22","8","3"); $label->outlinecolor->setRGB("255","255","255"); $style = ms_newStyleObj($class); $style->set("size",5); //$style->set("symbolname","circle"); $style->color->setRGB($MS_Code_Couleur[0], $MS_Code_Couleur[1], $MS_Code_Couleur[2]); $style->outlinecolor->setRGB( $MS_Code_Bordure_Couleur[0], $MS_Code_Bordure_Couleur[1], $MS_Code_Bordure_Couleur[2]); break; default: $layer->set("type",MS_LAYER_LINE ); $class = ms_newClassObj($layer); // // Ajout du Label // $label = $class->label; // // // Ajout du style // $style = ms_newStyleObj($class); // Précision sur l'affichage des données géométriques // couleur de bourdure en code 128 0 0 pour RGB $style->set("size",10); $style->set("symbolname","circle"); $style->outlinecolor->setRGB( $MS_Code_Bordure_Couleur[0], $MS_Code_Bordure_Couleur[1], $MS_Code_Bordure_Couleur[2]); break; } /* calcul de l'Extent pour chaque table */ $Requete_Extent = "select xmin(extent(".$colonne_geometrique.")), ymin(extent(".$colonne_geometrique.")), xmax(extent(".$colonne_geometrique.")), ymax(extent(".$colonne_geometrique.")) from ".$MS_Ligne->ms_table; $Resultat_Extent = pg_exec( $db_handle, $Requete_Extent ); while ( $Row_Extent = pg_fetch_object( $Resultat_Extent )) { $Xmin[] = $Row_Extent->xmin; $Ymin[] = $Row_Extent->ymin; $Xmax[] = $Row_Extent->xmax; $Ymax[] = $Row_Extent->ymax; } } /* Calcul de l'Extent générale et des dimensions de l'image */ $xmin = min($Xmin); $xmax = max( $Xmax ); $ymin = min($Ymin ); $ymax = max ($Ymax); $mapserver_longueur_image_mapfile = 600; $longueur_extent = abs($xmax-$xmin); $hauteur_extent = abs($ymax-$ymin); $rapport_extent = $longueur_extent / $hauteur_extent; $mapserver_hauteur_image_mapfile = $mapserver_longueur_image_mapfile / $rapport_extent; $map->setextent($xmin,$ymin,$xmax,$ymax); $map->set("width", $mapserver_longueur_image_mapfile); $map->set("height", $mapserver_hauteur_image_mapfile); switch (PHP_OS) { case "WINNT": $map->save(getcwd()."\\mapfiles\\madatabase.map"); break; default: $map->save(getcwd()."/mapfiles/madatabase.map"); break; } pg_freeresult( $Resultat_MS_Tables ); pg_close( $db_handle ); /* Il faudrait commencer */ $image = $map->draw(); $image_url = $image->saveWebImage(MS_PNG,1,1,0); echo "<IMG NAME='IEmapa' BORDER=0 SRC='http://".$_ENV["SERVER_NAME"].":".$_ENV["SERVER_PORT"]."".$image_url."'/> <BR>"; ?> </body> </html>
La mapfile obtenue est la suivante
MAP EXTENT 1 -10.900001525879 158.800003051758 146.900001525879 FONTSET "c:\wamp\www\tutorial\etc\fonts.txt" IMAGECOLOR 255 255 255 IMAGETYPE png SYMBOLSET "c:\wamp\www\tutorial\etc\symbols.sym" SIZE 700 594 STATUS ON UNITS METERS NAME "madatabase" OUTPUTFORMAT NAME png MIMETYPE image/png DRIVER GD/PNG EXTENSION png IMAGEMODE PC256 TRANSPARENT FALSE END LEGEND IMAGECOLOR 255 255 255 KEYSIZE 20 10 KEYSPACING 5 5 LABEL SIZE MEDIUM TYPE BITMAP BUFFER 0 COLOR 0 0 0 FORCE FALSE MINDISTANCE -1 MINFEATURESIZE -1 OFFSET 0 0 PARTIALS TRUE POSITION CC END POSITION LL STATUS OFF END QUERYMAP COLOR 255 255 0 SIZE -1 -1 STATUS OFF STYLE HILITE END SCALEBAR COLOR 0 0 0 IMAGECOLOR 255 255 255 INTERVALS 4 LABEL SIZE MEDIUM TYPE BITMAP BUFFER 0 COLOR 0 0 0 FORCE FALSE MINDISTANCE -1 MINFEATURESIZE -1 OFFSET 0 0 PARTIALS TRUE END POSITION LL SIZE 200 3 STATUS OFF STYLE 0 UNITS MILES END WEB IMAGEPATH "c:/wamp/www/tutorial/tmp/" IMAGEURL "/tutorial/tmp/" METADATA END QUERYFORMAT text/html END LAYER CONNECTION "user=david dbname=madatabase host=localhost" CONNECTIONTYPE POSTGIS DATA "the_geom from small_roads" LABELITEM "data" METADATA END NAME "small_roads" SIZEUNITS PIXELS STATUS DEFAULT TOLERANCE 0 TOLERANCEUNITS PIXELS TYPE LINE UNITS METERS CLASS METADATA END STYLE ANGLE 360 OUTLINECOLOR 80 80 80 SIZE 10 SYMBOL "circle" END END END LAYER CONNECTION "user=david dbname=madatabase host=localhost" CONNECTIONTYPE POSTGIS DATA "the_geom from great_roads" LABELITEM "data" METADATA END NAME "great_roads" SIZEUNITS PIXELS STATUS DEFAULT TOLERANCE 0 TOLERANCEUNITS PIXELS TYPE LINE UNITS METERS CLASS METADATA END STYLE ANGLE 360 OUTLINECOLOR 125 125 125 SIZE 10 SYMBOL "circle" END END END LAYER CONNECTION "user=david dbname=madatabase host=localhost" CONNECTIONTYPE POSTGIS DATA "the_geom from parcs" LABELITEM "data" METADATA END NAME "parcs" SIZEUNITS PIXELS STATUS DEFAULT TOLERANCE 0 TOLERANCEUNITS PIXELS TYPE POLYGON UNITS METERS CLASS LABEL SIZE MEDIUM TYPE BITMAP BACKGROUNDCOLOR 255 255 255 BUFFER 0 COLOR 22 8 3 FORCE FALSE MINDISTANCE -1 MINFEATURESIZE -1 OFFSET 0 0 OUTLINECOLOR 255 255 255 PARTIALS TRUE POSITION CC END METADATA END STYLE ANGLE 360 COLOR 0 123 0 OUTLINECOLOR 255 255 255 SIZE 5 SYMBOL 0 END END END LAYER CONNECTION "user=david dbname=madatabase host=localhost" CONNECTIONTYPE POSTGIS DATA "the_geom from rivers" LABELITEM "data" METADATA END NAME "rivers" SIZEUNITS PIXELS STATUS DEFAULT TOLERANCE 0 TOLERANCEUNITS PIXELS TYPE POLYGON UNITS METERS CLASS LABEL SIZE MEDIUM TYPE BITMAP BACKGROUNDCOLOR 255 255 255 BUFFER 0 COLOR 22 8 3 FORCE FALSE MINDISTANCE -1 MINFEATURESIZE -1 OFFSET 0 0 OUTLINECOLOR 255 255 255 PARTIALS TRUE POSITION CC END METADATA END STYLE ANGLE 360 COLOR 0 12 189 OUTLINECOLOR 0 12 189 SIZE 5 SYMBOL 0 END END END LAYER CONNECTION "user=david dbname=madatabase host=localhost" CONNECTIONTYPE POSTGIS DATA "the_geom from buildings" LABELITEM "data" METADATA END NAME "buildings" SIZEUNITS PIXELS STATUS DEFAULT TOLERANCE 0 TOLERANCEUNITS PIXELS TYPE POLYGON UNITS METERS CLASS LABEL SIZE MEDIUM TYPE BITMAP BACKGROUNDCOLOR 255 255 255 BUFFER 0 COLOR 22 8 3 FORCE FALSE MINDISTANCE -1 MINFEATURESIZE -1 OFFSET 0 0 OUTLINECOLOR 255 255 255 PARTIALS TRUE POSITION CC END METADATA END STYLE ANGLE 360 COLOR 234 156 78 OUTLINECOLOR 234 156 78 SIZE 5 SYMBOL 0 END END END LAYER CONNECTION "user=david dbname=madatabase host=localhost" CONNECTIONTYPE POSTGIS DATA "the_geom from personnes" LABELITEM "data" METADATA END NAME "personnes" SIZEUNITS PIXELS STATUS DEFAULT TOLERANCE 0 TOLERANCEUNITS PIXELS TYPE POINT UNITS METERS CLASS LABEL SIZE MEDIUM TYPE BITMAP BUFFER 0 COLOR 22 8 3 FORCE FALSE MINDISTANCE -1 MINFEATURESIZE -1 OFFSET 0 0 PARTIALS TRUE POSITION CC END METADATA END STYLE ANGLE 360 COLOR 255 0 0 SIZE 8 SYMBOL "circle" END END END END