Kvwmap ref.php: Unterschied zwischen den Versionen
Aus kvwmap
Rahn (Diskussion | Beiträge) |
(kein Unterschied)
|
Aktuelle Version vom 1. Dezember 2010, 14:05 Uhr
<?
define('CACHEPATH', '/www/kvwmap/cache/'); # Pfad, in dem die gecachten Bildern gespeichert werden
define('MAPFILE', 'kvwmap_ref.map'); # verwendete Mapdatei
function owsProxy() {
# prüft zunächst ob ein Bild schon mal abgefragt wurde
# wenn ja, liefert der Dienst dieses Bild aus
# wenn nicht wird der ows-respone neu erzeugt
# Parameter und Werte in Kleinschreibung zurückgeben
$wms_param=getKvpsToLower($_REQUEST);
$formvars = $wms_param;
# Folgendes bezieht sich nur auf getMap Anfragen
# alle anderen Operationen werden als ganz normale OWS-Requests abgearbeitet.
if ($wms_param['request']=='getmap') {
# Dateiformat zuweisen
$imageformat=$wms_param['format'];
# Dateiendung zuweisen
$imageextention=substr(strstr($imageformat,'/'),1); # z.B. macht aus image/png png
# eindeutigen Dateinamen erzeugen aus bbox Parameter
$bbox=explode(',',$wms_param['bbox']);
$box=$bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3];
$zoomstufe=round(log(720/($bbox[2]-$bbox[0]),2));
$sw=round($bbox[0],1).','.round($bbox[1],1);
$tmpfile = CACHEPATH.
$wms_param['layers'].'_'.
$zoomstufe.'-'.
$sw.'_'.
$wms_param['width'].'x'.
$wms_param['height'].'.'.$imageextention;
# Prüfen ob die Datei schon existiert
if(file_exists($tmpfile)) {
# Datei existiert schon, Ausgeben des Bildes an den Browser
ob_end_clean();
header('content-type:'.$imageformat);
echo file_get_contents($tmpfile);
}
else {
createBufferOWSResponse(300, $tmpfile, $formvars);
}
}
else {
createOWSResponse($formvars);
}
}
function createBufferOWSResponse($pixelbuffer, $tmpfile, $formvars){ # Angabe in Pixeln, wie groß der Buffer sein soll, tempfile
$width = $formvars['width'];
$height = $formvars['height'];
# Parameter um Buffer erweitern
$buffer = $pixelbuffer/$formvars['width'];
$bbox = explode(',', $formvars['bbox']);
$extent_width = $bbox[2] - $bbox[0];
$extent_buffer = $extent_width * $buffer;
$formvars['width'] = $formvars['width'] + 2*$pixelbuffer;
$formvars['height'] = $formvars['height'] + 2*$pixelbuffer;
$bbox[0] = $bbox[0] - $extent_buffer;
$bbox[1] = $bbox[1] - $extent_buffer;
$bbox[2] = $bbox[2] + $extent_buffer;
$bbox[3] = $bbox[3] + $extent_buffer;
$formvars['bbox'] = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3];
# GetMap-Response erzeugen
$map = ms_newMapObj(MAPFILE);
$requestobject = ms_newOwsRequestObj();
$params = array_keys($formvars);
for($i = 0; $i < count($formvars); $i++){
$requestobject->setParameter($params[$i],$formvars[$params[$i]]);
}
ms_ioinstallstdouttobuffer();
$map->owsdispatch($requestobject);
$contenttype = ms_iostripstdoutbuffercontenttype();
ob_end_clean(); //Ausgabepuffer leeren (sonst funktioniert header() nicht)
ob_start();
if ($contenttype == 'image/png'){
header('Content-type: image/png');
}
if ($contenttype == 'image/jpeg'){
header('Content-type: image/jpeg');
}
ms_iogetStdoutBufferBytes();
$contents = ob_get_contents();
ob_end_clean(); //Ausgabepuffer leeren (sonst funktioniert header() nicht)
$image = imagecreatefromstring($contents);
# Bild clippen
$clippedimage = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($clippedimage, 255,255,255);
imagefill($clippedimage, 0, 0, $white);
imagecolortransparent($clippedimage, $white);
ImageCopy($clippedimage, $image, 0, 0, $pixelbuffer, $pixelbuffer, $width, $height);
if($contenttype == 'image/png'){
imagepng($clippedimage);
if ($tmpfile != NULL) {
imagepng($clippedimage, $tmpfile);
}
}
elseif($contenttype == 'image/jpeg'){
imagejpeg($clippedimage);
if ($tmpfile != NULL) {
imagejpeg($clippedimage, $tmpfile);
}
}
ob_end_flush();
ms_ioresethandlers();
}
function createOWSResponse($formvars){
$map = ms_newMapObj(MAPFILE);
$requestobject = ms_newOwsRequestObj();
$params = array_keys($formvars);
for($i = 0; $i < count($formvars); $i++){
$requestobject->setParameter($params[$i],$formvars[$params[$i]]);
}
ms_ioinstallstdouttobuffer();
$map->owsdispatch($requestobject);
$contenttype = ms_iostripstdoutbuffercontenttype();
ob_end_clean(); //Ausgabepuffer leeren (sonst funktioniert header() nicht)
ob_start();
if ($contenttype == 'image/png'){
header('Content-type: image/png');
}
ms_iogetStdoutBufferBytes();
ob_end_flush();
ms_ioresethandlers();
}
function getKvpsToLower($kvps) {
foreach ($kvps as $key => $value) {
$param[strtolower($key)]=strtolower($value);
}
return $param;
}
dl('php_mapscript.so');
owsProxy();
?>