loadXML($xmlString);
# Get a list of maps
$input = $document->getElementsByTagName('input')->item(0);
$extent = split(' ',$input->getAttribute('mapext'));
$imagesize = array($input->getAttribute('width'), $input->getAttribute('height'));
$UniqueHandle = 'print_output_'.time();
# Takes in the XML document and writes the appropriate image to the disk
print "
";
print "Available Printing Formats:
";
# These can be used to diagnose function availability
#checkFunction('Render Image', 'renderImage');
#checkFunction('Render HTML', 'renderHTML');
#checkFunction('Render PDF', 'renderPDF');
# This gets used by both pure image output and the HTML output
$ImageHandle = $UniqueHandle.'.jpg';
$TempImage = $TEMP_DIRECTORY.$ImageHandle;
if(!function_exists('renderImage')) {
appError('The "renderImage" function is undefined. No other printing options will function without it!');
} else {
# Basic Printing Option
renderImage($document, $TempImage, $imagesize[0], $imagesize[1], $extent[0], $extent[1], $extent[2], $extent[3]);
if($PRINT_SHOW_IMAGE_LINK) {
print "Open Printable Image in New Window";
}
}
if(function_exists('printHTML')) {
$HTMLHandle = $UniqueHandle.'.html';
printHTML($document, $TEMP_DIRECTORY.$HTMLHandle, $TEMP_WEB.$ImageHandle);
print "
Open Printable HTML Page in New Window";
}
if(function_exists('printPDF')) {
$PDFHandle = $UniqueHandle;
printPDF($document, $TEMP_DIRECTORY.$PDFHandle);
print "
Open Printable PDF Page in New Window";
}
print "";
function checkFunction($title, $fname) {
print $title.": ";
if(function_exists($fname)) {
print "ON";
} else {
print "OFF";
}
print "
";
}
#
# Generates an image based on an XML post request and writes it to the
# the file specified in outputFileName
#
function renderImage($xml, $outputFileName, $width, $height, $minx, $miny, $maxx, $maxy, $quality=1, $preserveScale=false) {
global $TEMP_DIRECTORY;
# This creates a temporary image for building and output.
$printImage = imagecreatetruecolor($width, $height);
$colorWhite = imagecolorallocate($printImage, 255, 255, 255);
imagefill($printImage, 0, 0, $colorWhite);
$maps = $xml->getElementsByTagName('map');
$minx = (float)($minx); $maxx = (float)($maxx);
$miny = (float)($miny); $maxy = (float)($maxy);
if($preserveScale) {
# Step Uno: Calculate the scales, choose the "densist"
$scale = ($maxx - $minx) / $width;
$scaleY = ($maxy - $miny) / $height;
if($scaleY < $scale) {
$scale = $scaleY;
}
# Step Zwei: Recalculate the extent
$centerX = ($maxx + $minx) / 2.0;
$centerY = ($maxy + $miny) / 2;
$minx = $centerX - $scale * $width;
$maxx = $centerX + $scale * $width;
$miny = $centerY - $scale * $height;
$maxy = $centerY + $scale * $height;
}
$majorKeys = array();
$majorKeys['WIDTH'] = $width;
$majorKeys['HEIGHT'] = $height;
$majorKeys['MINX'] = $minx;
$majorKeys['MINY'] = $miny;
$majorKeys['MAXX'] = $maxx;
$majorKeys['MAXY'] = $maxy;
$majorKeys['EXTENT'] = $minx.'+'.$miny.'+'.$maxx.'+'.$maxy;
$majorKeys['EXTENTS'] = $majorKeys['EXTENT'];
$majorKeys['SIZE'] = $width.'+'.$height;
for($i = $maps->length - 1; $i >= 0; $i--) {
$map = $maps->item($i);
# If it doesn't have a title, don't bother printing it
if($map->hasAttribute('title')) {
$file = $map->getElementsByTagName('file')->item(0)->nodeValue;
# This accounts for the random different possible settings
# Relative URL
if(!(strpos($file, 'relative://') === false)) {
# Absolute URL
} elseif (!(strpos($file, 'http://') === false)) {
$urlInfo = parse_url($file);
if(!(strpos($urlInfo['query'], "WMS") === false)) {
$params = array();
$urlSplit = split('\?', $file);
parse_str($urlSplit[1], $params);
$mapfile = ms_newMapObj('resources/printWMS.map');
$mapfile->selectOutputFormat("JPEG");
$mapfile->web->set("imagepath", $TEMP_DIRECTORY);
$mapfile->setSize($width,$height);
$mapfile->setExtent($minx, $miny, $maxx, $maxy);
$wmsLayer = $mapfile->getLayerByName('wms_temp');
$wmsLayer->set("connection", $urlSplit[0].'?');
$wmsLayer->setMetaData('wms_srs', $params['SRS']);
$wmsLayer->setMetaData('wms_name', $params['LAYERS']);
$wmsLayer->setMetaData('wms_server_version', $params['VERSION']);
$image = $mapfile->prepareImage();
$image = $mapfile->draw();
$image->saveImage($outputFileName);
$image = imagecreatefromjpeg($outputFileName);
ImageCopyResized($printImage, $image, 0,0,0,0, $width, $height, ImageSX($image), ImageSY($image));
} else {
$dlFileName = $outputFileName.'2';
foreach($majorKeys as $key=>$value) {
$file = str_replace('%'.$key.'%', $value, $file);
}
$file = str_replace(' ','+',$file);
$ch = curl_init($file);
$outfile = fopen($dlFileName, "w");
curl_setopt($ch, CURLOPT_FILE, $outfile);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
$mimetype = curl_getinfo($ch,CURLINFO_CONTENT_TYPE);
curl_close($ch);
fclose($outfile);
if(!(strpos($mimetype,'png') === false)) {
$image = imagecreatefrompng($dlFileName);
} elseif(!(strpos($mimetype,'gif') === false)) {
$image = imagecreatefromgif($dlFileName);
} elseif (!(strpos($mimetype,'jpeg') === false)) {
$image = imagecreatefromjpeg($dlFileName);
}
ImageCopyResized($printImage, $image, 0,0,0,0, $width, $height, ImageSX($image), ImageSY($image));
}
# This *should* be a reference to a mapfile
} else {
$mapfile = ms_newMapObj(getPath($file));
$mapfile->setSize($width, $height);
$mapfile->setExtent($minx, $miny, $maxx, $maxy);
# G'head and figure out any of the "special" parameters
$params = $map->getElementsByTagName('param');
$drawQueryMap = false;
$queryShape = false;
$itemQueryName = false;
$itemQueryValue = false;
$itemQueryLayer = false;
foreach($params as $param) {
$pName = $param->getAttribute('name');
if($pName == 'mapshape') {
# Create the shape and query the image.
$points = rtrim($param->getAttribute('value'));
$points = split(' ', $points);
$shapeLine = ms_newLineObj();
for($p = 0; $p < count($points); $p+=2) {
$point = ms_newPointObj();
$point->setXY($points[$p], $points[$p+1]);
$shapeLine->add($point);
}
$shape = ms_newShapeObj(MS_SHAPE_POLYGON);
$shape->add($shapeLine);
$queryShape = $shape;
}
# These are the three mapserver directives for enabling layers
if($pName == 'layer' or $pName == 'qlayer' or $pName == 'layers') {
$layerNames = split(' ', $param->getAttribute('value'));
# Occasionally "layers=" will be set to null
# this checks to make sure that the value is an actual list.
if(count($layerNames) > 0 and $layerNames[0] != "") {
for($l = 0; $l < $mapfile->numlayers; $l++) {
$layer = $mapfile->getLayer($l);
$layerName = $layer->name;
$layerOn = false;
foreach($layerNames as $testName) {
if($testName == $layerName or $layer->group == $layerName) {
$layerOn = true;
}
}
if($layerOn) {
$layer->set("status", MS_DEFAULT);
} else {
$layer->set("status", MS_OFF);
}
}
}
}
if($pName == 'qitem') {
$itemQueryName = $param->getAttribute('value');
}
if($pName == 'qstring') {
$itemQueryValue = $param->getAttribute('value');
}
if($pName == 'qlayer') {
$itemQueryLayer = $param->getAttribute('value');
}
}
if($quality > 1) {
for($l = 0; $l < $mapfile->numlayers; $l++) {
$layer = $mapfile->getLayer($l);
for($c = 0; $c < $layer->numclasses; $c++) {
$class = $layer->getClass($c);
if($class->label->size > MS_GIANT) {
$class->label->set("maxsize", $class->label->maxsize * $quality);
$class->label->set("size", $class->label->size * $quality);
} elseif($class->label->size > 0) {
$class->label->set("size", $class->label->size + $quality);
}
for($s = 0; $s < $class->numstyles; $s++) {
$style = $class->getStyle($s);
if($style->size > 0) {
# $style->set("maxsize", $style->maxsize * $quality);
# $style->set("size", $style->size * $quality);
}
}
}
}
}
$image = $mapfile->prepareImage();
# Draw the query map as required.
if($queryShape) {
$mapfile->queryByShape($queryShape);
$image = $mapfile->drawQuery();
} else if($itemQueryName && $itemQueryValue && $itemQueryLayer) {
$layer = $mapfile->getLayerByName($itemQueryLayer);
$layer->queryByAttributes($itemQueryName, $itemQueryValue, MS_SINGLE);
$layer->open();
$layer->close();
$image = $mapfile->drawQuery();
} else {
$image = $mapfile->draw();
}
$mimetype = $mapfile->outputformat->mimetype;
$image->saveImage($outputFileName);
if(!(strpos($mimetype,'png') === false)) {
$image = imagecreatefrompng($outputFileName);
} elseif(!(strpos($mimetype,'gif') === false)) {
$image = imagecreatefromgif($outputFileName);
} elseif (!(strpos($mimetype,'jpeg') === false)) {
$image = imagecreatefromjpeg($outputFileName);
} else {
# Generate an error
}
$opacity = 100;
if($map->hasAttribute('opacity')) {
$opacity = $map->getAttribute('opacity');
}
imagecopymerge($printImage, $image, 0, 0, 0, 0, ImageSX($image), ImageSY($image), $opacity);
}
}
}
imagejpeg($printImage, $outputFileName);
}
?>