How to Draw Icons or Images on a Mapserver Generated Map
In this example I have used the map of the Itasca demo of the Mapserver.I have done only small changes to the map file.The Itasca demo has (into the html file) the parameters of the path where to store the images:
IMAGEPATH "set in index.html" IMAGEURL "set in index.html"
I have changed them as fixed path
IMAGEPATH "/tmp/ms_tmp/" IMAGEURL "/ms_tmp/"
Than I have set as STATUS ON several layers for a better map.
The Database
The positions and the images paths that have to be shown on the map are stored into a table of a database in MySql.
I have created a new database named "mapexample" and a new table "weather":
CREATE TABLE weather (
id bigint(20) NOT NULL auto_increment,
imagepath varchar(255) default NULL,
x double(16,4) default NULL,
y double(16,4) default NULL,
PRIMARY KEY (id)
)
and than I have inserted into the table the positions of the weather images and the path of every icon:
INSERT INTO `weather` VALUES (1, '/data/weather/icons/sunny.gif', 478107.0000, 5250301.0000);
INSERT INTO `weather` VALUES (2, ''/data/weather/icons/cloudy.gif', 408107.0000, 5220301.0000);
INSERT INTO `weather` VALUES (3, ''/data/weather/icons/storm.gif', 468107.0000, 5270301.0000);
INSERT INTO `weather` VALUES (4, ''/data/weather/icons/variable.gif', 408107.0000, 5310301.0000);
It is not necessary for the images to be stored into a directory visible from the web, because are taken directly by the script and then merged with the map.
The PHPMapscript codeHere is the code I have used for generating the map:
define("img_WIDTH", 0);define("img_HEIGHT", 1);define("img_TYPE", 2);
// CONFIGURATION OF MYSQL ACCESS $MyHost = "localhost";$MyLogin = "root";
$MyPassword = "";
$MyDatabase = "mapexample";$mappath = "D:/data/web";
$scale_to_showicons = 1000000; // SCALE LIMIT TO START TO SHOW THE ICONS ON THE MAPfunction AddImagesToMap($mapurl)
{global $MyHost, $MyLogin, $MyPassword, $MyDatabase, $scale_to_showicons, $map, $mappath;
// CONNECT TO DATABASE
@mysql_connect($MyHost, $MyLogin, $MyPassword);
@mysql_select_db($MyDatabase);
// IF the scale is small enougth to show the images on the map?
if ($scale_to_showicons > $map->scale) {
// PATH WHERE TO FIND THE MAP IMAGE GENERATED BY MAPSERVER
$mapimagepath = $mappath . $mapurl;
$mapdim = GetImageSize($mapimagepath);
$coords_map_width = $map->extent->maxx - $map->extent->minx;
$mapscale = $mapdim[img_WIDTH] / $coords_map_width;
switch ($mapdim[img_TYPE]) {
case 1:
$mapimg = ImageCreateFromGif($mapimagepath);
break;
case 2:
$mapimg = ImageCreateFromJpeg($mapimagepath);
break;
case 3:
$mapimg = ImageCreateFromPng($mapimagepath);
break;
} ;
$qry .= "select * from weather where x > '" . $map->extent->minx . "' AND x < '" . $map->extent->maxx . "'
AND y > '" . $map->extent->miny . "' AND y < '" . $map->extent->maxy . "'";
$res = mysql_query($qry);
while ($row = mysql_fetch_object($res)) {
$dimic = GetImageSize($row->imagepath);
switch ($dimic[img_TYPE]) {
case 1:
$tmpimg = ImageCreateFromGif($row->imagepath);
break;
case 2:
$tmpimg =?; ImageCreateFromJpeg($row->imagepath);
break;
case 3:
$tmpimg = ImageCreateFromPng($row->imagepath);
break;
}
$x = ($row->x - $map->extent->minx) * $mapscale;
$y = $mapdim[img_HEIGHT] - (($row->y - $map->extent->miny) * $mapscale);
@ImageCopy ($mapimg, $tmpimg, $x, $y, 0, 0, $dimic[img_WIDTH], $dimic[img_HEIGHT]);
} ;
// SAVE THE NEW IMAGE ON THE OLD ONE
switch ($mapdim[img_TYPE]) {
case 1:
ImageGif($mapimg, $mapimagepath);
break;
case 2:
ImageJpeg($mapimg, $mapimagepath);
break;
case 3:
ImagePng($mapimg, $mapimagepath);
break;
}
} ;
} ;$map = ms_newMapObj("itasca.map");
$img = $map->draw();
$url = $img->saveWebImage();
AddImagesToMap($url);?>
Show Weather On Map
More info: http://www.parsec.it/tutorials/
Roberto Colonello owns and operates http://www.parsec.it and http://www.gmdir.com

<< Home