Table of Contents

PHP MapScript Recipes

MapScript documentation.

Return a map image from a map file

We can build an image from a working map file. Here we just turn on one layer, setting its status to DEFAULT:

<?php
// PHP MapScript example.
// Display a map as an inline image or embedded into an HTML page.
$inline = true;
$map_path = '/var/www/mapfiles/';
$mapfile = 'file.map';
$map = ms_newMapObj($map_path . $mapfile);
$layer = $map->getLayerByName('layer_name');
$layer->set('status', MS_DEFAULT);
$map_image = $map->draw();
if ($inline) {
    header('Content-Type: image/png');
    $map_image->saveImage('');
    exit;
}
$image_url = $map_image->saveWebImage();
?>
<HTML>
<HEAD>
<TITLE>PHP MapScript example: Display the map</TITLE>
</HEAD>
<BODY>
<IMG SRC=<?php echo $image_url; ?> >
</BODY>
</HTML>

Build a map from scratch

See this example.

Generate the legend image

We need a mapfile with all the necessary to display the legend.

We can return just the legend image via PHP code. The image can be served as an inline image or as a web image from the temporary directory.

<?php
// PHP MapScript example.
// Display a map legend as an inline image or embedded into an HTML page.
$inline = true;
$map_path='/var/www/mapfiles/';
$mapfile = $_REQUEST['mapfile'];
$map = ms_newMapObj($map_path . $mapfile);
$legend_image = $map->drawLegend();
if ($inline) {
    header('Content-Type: image/png');
    $legend_image->saveImage('');
    exit;
}
$image_url = $legend_image->saveWebImage();
?>
<HTML>
<HEAD>
<TITLE>PHP MapScript example: Display the legend</TITLE>
</HEAD>
<BODY>
<IMG SRC=<?php echo $image_url; ?> >
</BODY>
</HTML>

The mapfile requires all the relevant entries, among them: MAP.FONTSET, MAP.WEB.IMAGEPATH, MAP.WEB.IMAGEURL, MAP.LEGEND.

For inline images you can omit web paths, because no temporary images will be created.

Make a query

Open an existing map file and perform a query by rectangle on a layer, print results with a template.

<?php
$map = ms_newMapObj("/var/www/demo.map");
$selrect = ms_newrectObj();
$selrect->setextent(1681023, 4850413, 1681906, 4851167);
$map->queryByRect($selrect);
$buffer = $map->processquerytemplate(array(), false);
 
print "<table border=\"1\">\n";
print $buffer;
print "</table>\n";
?>

The $buffer variable contains one template instance for each record.

The querable layer is definend in the MAP.LAYER section, and it requires a query template:

MAP
  ...
  LAYER
    ...
    TEMPLATE "query_template.html"
    TOLERANCE 6
    METADATA
      DESCRIPTION    "Impianti Pubblicitari"
      RESULT_FIELDS  "objectid,field1,field2"
      RESULT_HEADERS "ID,Heading1,Heading2"
    END
  END
END

This is an example for query_template.html:

<!-- MapServer Template -->
<tr><td>[item name=objectid]</td><td>[item name=field1]</td><td>[item name=field2]</td></tr>

This example does not use the template, it iterates through the query results:

<?php
$map = ms_newMapObj("/var/www/demo.map");
$selrect = ms_newrectObj();
$selrect->setextent(1681023.81515592, 4850413.68207817, 1681906.91185973, 4851167.76185515);
 
$map->queryByRect($selrect);
$layer = $map->getLayerByName('layer_name');
$count = $layer->getNumResults();
 
print "Query result count: " . $count . "<br>\n";
print "<pre>\n";
for ($i = 0; $i < $count; $i++) {
    $qRes = $layer->getResult($i);
    print_r($qRes);
}
print "</pre>\n";
?>