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