Kvwmap ref.php

Aus kvwmap
Version vom 1. Dezember 2010, 14:05 Uhr von Rahn (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
<?

 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();

  ?>