GetExceptionMessage() . "
";
echo $e->GetStackTrace() . "
";
}
?>
width / 25.4 * $printDpi, $paperSize->height / 25.4 * $printDpi);
$array = explode(",", $args["box"]);
$captureBox = CreatePolygon($array);
$array = explode(",", $args["normalized_box"]);
$normalizedCapture = CreatePolygon($array);
}
function CreatePolygon($coordinates)
{
$geometryFactory = new MgGeometryFactory();
$coordinateCollection = new MgCoordinateCollection();
$linearRingCollection = new MgLinearRingCollection();
for ($index = 0; $index < count($coordinates); ++$index)
{
$coordinate = $geometryFactory->CreateCoordinateXY(ParseLocaleDouble($coordinates[$index]), ParseLocaleDouble($coordinates[++$index]));
$coordinateCollection->Add($coordinate);
}
$coordinateCollection->Add($geometryFactory->CreateCoordinateXY(ParseLocaleDouble($coordinates[0]), ParseLocaleDouble($coordinates[1])));
$linearRingCollection = $geometryFactory->CreateLinearRing($coordinateCollection);
$captureBox = $geometryFactory->CreatePolygon($linearRingCollection, null);
return $captureBox;
}
function GenerateMap($size)
{
global $sessionID, $mapName, $captureBox, $printSize, $normalizedCapture, $rotation, $scaleDenominator, $printDpi;
InitializeWebTier();
$userInfo = new MgUserInformation($sessionID);
$siteConnection = new MgSiteConnection();
$siteConnection->Open($userInfo);
$renderingService = $siteConnection->CreateService(MgServiceType::RenderingService);
$map = new MgMap($siteConnection);
$map->Open($mapName);
$selection = new MgSelection($map);
// Calculate the generated picture size
$envelope = $captureBox->Envelope();
$normalizedE = $normalizedCapture->Envelope();
$size1 = new Size($envelope->getWidth(), $envelope->getHeight());
$size2 = new Size($normalizedE->getWidth(), $normalizedE->getHeight());
$toSize = new Size($size1->width / $size2->width * $size->width, $size1->height / $size2->height * $size->height);
$center = $captureBox->GetCentroid()->GetCoordinate();
$map->SetDisplayDpi($printDpi);
$colorString = $map->GetBackgroundColor();
// The returned color string is in AARRGGBB format. But the constructor of MgColor needs a string in RRGGBBAA format
$colorString = substr($colorString, 2, 6) . substr($colorString, 0, 2);
$color = new MgColor($colorString);
$mgReader = $renderingService->RenderMap($map,
$selection,
$center,
$scaleDenominator,
$toSize->width,
$toSize->height,
$color,
"PNG",
false);
$tempImage = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "mgo" . uniqid();
$mgReader->ToFile($tempImage);
$image = imagecreatefrompng($tempImage);
unlink($tempImage);
// Rotate the picture back to be normalized
$normalizedImg = imagerotate($image, -$rotation, 0);
// Free the original image
imagedestroy($image);
// Crop the normalized image
$croppedImg = imagecreatetruecolor($size->width, $size->height);
imagecopy($croppedImg, $normalizedImg, 0, 0, (imagesx($normalizedImg) - $size->width) / 2, (imagesy($normalizedImg) - $size->height) / 2, $size->width, $size->height);
// Free the normalized image
imagedestroy($normalizedImg);
// Draw the north arrow on the map
DrawNorthArrow($croppedImg);
header ("Content-type: image/png");
imagepng($croppedImg);
imagedestroy($croppedImg);
}
function DrawNorthArrow($map)
{
global $paperSize, $rotation;
// Load the north arrow image which has a 300 dpi resolution
$na = imagecreatefrompng("../viewerfiles/quickplotnortharrow.png");
$transparent= imagecolortransparent($na);
// PHP 5.5 broke image rotation (or maybe we did it completely wrong before PHP 5.5).
// Either way, here's how we fix it. Assign an explicit color if imagecolortransparent() returns -1
if ($transparent < 0) {
$transparent = imagecolorallocatealpha($na, 0, 0, 0, 127);
$bReleaseTrans = true;
}
// Rotate the north arrow according to the capture rotation
$rotatedNa = imagerotate($na, -$rotation, $transparent);
// Free the transparent color if we allocated it
if ($bReleaseTrans)
imagecolordeallocate($na, $transparent);
// Free the north arrow image
imagedestroy($na);
// Get the size of north arrow image
$naWidth = imagesx($rotatedNa);
$naHeight = imagesy($rotatedNa);
// Get the map size
$mapWidth = imagesx($map);
$mapHeight = imagesy($map);
// Get the logical resolution of map
$resolution = $mapWidth * 25.4 / $paperSize->width;
// On printed paper, north arrow is located at the right bottom corner with 6 MM margin
$naRes = 300;
$naMargin = 12;
// Calculate the margin as pixels according to the resolutions
$margin = $resolution * $naMargin / 25.4;
// Get the width of the north arrow on the map picture
$drawWidth = $naWidth * $resolution / $naRes;
$drawHeight = $naHeight * $resolution / $naRes;
// Draw the north arrow on the map picture
imagecopyresized($map, $rotatedNa, $mapWidth - $drawWidth - $margin, $mapHeight - $drawHeight - $margin, 0, 0, $drawWidth, $drawHeight, $naWidth, $naHeight);
// Free the north arrow image
imagedestroy($rotatedNa);
}
function ParseLocaleDouble($stringValue)
{
$lc = localeconv();
$result = str_replace(".", $lc["decimal_point"], $stringValue);
return doubleval($result);
}
?>
width = $width;
$this->height = $height;
}
}
?>