Annexe L. PhpMapScript

Table des matières

L.1. Table mapserver_desc
L.2. Script PHP
L.3. Sortie: Mapfile

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.

L.1. Table mapserver_desc

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)

L.2. Script PHP

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>

L.3. Sortie: Mapfile

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