From a42cf08bc5b8bcb7b8dfae3f6aa8099095bd978a Mon Sep 17 00:00:00 2001 From: Edmar Moretti Date: Tue, 1 May 2018 15:34:11 -0300 Subject: [PATCH] Correção na geração de KMZ para visualização de vetores no Google Earth --- pacotes/kmlmapserver/classes/layerserver.class.php | 2419 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pacotes/kmlmapserver/kmlservice.php | 1 + 2 files changed, 1253 insertions(+), 1167 deletions(-) diff --git a/pacotes/kmlmapserver/classes/layerserver.class.php b/pacotes/kmlmapserver/classes/layerserver.class.php index 579b929..c42b31b 100755 --- a/pacotes/kmlmapserver/classes/layerserver.class.php +++ b/pacotes/kmlmapserver/classes/layerserver.class.php @@ -1,1177 +1,1262 @@ -* accepted parameters (case insensitive): -* - request = string - request type (OGC WFS like), can be kml (default), kmz, icon -* - map = string - path to mapfile -* - typename = string - (can be a csv list) - layer name(s) -* - filter = string - filter encoding -* - bbox = string - (csv) - bounding box csv -* - encoding = string - data and mapfile encoding, defaults to ISO-8859-1 -* -* -* -* -* @author Alessandro Pasotti -* @copyright 2007 ItOpen.it - All rights reserved -* @package KMLMAPSERVER - -This file is part of KMLMAPSERVER. - - KMLMAPSERVER is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - KMLMAPSERVER is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with KMLMAPSERVER; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -*/ - - -/** Fix a GE bug for filled polygons */ + * Mapserver wrapper to KML/KMZ data + * + * Returns KML or KMZ representation of common OGC requests + * + *
+ * accepted parameters (case insensitive):
+ * - request     = string - request type (OGC WFS like), can be kml (default), kmz, icon
+ * - map         = string - path to mapfile
+ * - typename    = string - (can be a csv list) - layer name(s)
+ * - filter      = string - filter encoding
+ * - bbox        = string - (csv) - bounding box csv
+ * - encoding    = string - data and mapfile encoding, defaults to ISO-8859-1
+ *
+ *
+ * 
+ * + * @author Alessandro Pasotti + * @copyright 2007 ItOpen.it - All rights reserved + * @package KMLMAPSERVER + + This file is part of KMLMAPSERVER. + + KMLMAPSERVER is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + KMLMAPSERVER is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with KMLMAPSERVER; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + */ + +/** + * Fix a GE bug for filled polygons + */ define('TREAT_POLY_AS_LINE', false); -/** Enable cache */ +/** + * Enable cache + */ define('ENABLE_CACHE', true); -if(function_exists("dl")){ - if (!function_exists('ms_GetVersion')) - {dl( 'php_mapscript.'.PHP_SHLIB_SUFFIX );} - if (!extension_loaded('php_mbstring')) - {dl( 'php_mbstring.' . PHP_SHLIB_SUFFIX );} +if (function_exists("dl")) { + if (! function_exists('ms_GetVersion')) { + dl('php_mapscript.' . PHP_SHLIB_SUFFIX); + } + if (! extension_loaded('php_mbstring')) { + dl('php_mbstring.' . PHP_SHLIB_SUFFIX); + } } -if (!function_exists('ms_GetVersion')) -{echo "Nao foi possivel carregar php_mapscript";} -/** -* Main server class -*/ -class LayerServer { - - /** map file path */ - var $map; - - /** request */ - var $request; - - /** map instance */ - var $map_object; - - /** layer name(s) passed on the request */ - var $typename; - - /** array of requested layer objects (hash with layer name as key) */ - var $layers; - - /** filters */ - var $filter; - - /** bounding box */ - var $bbox; - - /** error messages */ - var $errors; - - /** send zipped data */ - var $_zipped = false; - - /** internal XML buffer */ - var $_xml; - - /** input projection */ - var $in_proj; - - /** output projection */ - var $out_proj; - - /** debug flag */ - var $_debug = false; - - /** end point */ - var $endpoint; - - /** custom style counter */ - var $style_counter = 0; - - /** - * Mapfile and data encoding encoding - * XMl output must be UTF-8, attributes and METADATA based strings - * must be converted to UTF-8, encoding defaults to ISO-8859-1, if - * your encoding is different, you can set it through CGI style parameters - */ - var $encoding; - /** - * send networklink - * wether folder should contain networklinks instead of real geometries - * it is automatically set when all layers are requested - */ - var $_networklink; - /** - * Initialize - * - */ - function LayerServer(){ - $this->errors = array(); - // Load request parameters - $this->get_request(); - $this->style_counter = 0; - // Load map - if(!$this->has_error()) { - $this->load_map(); - } - } - /** - * Run the server and sends data - * @return string or void - */ - function run(){ - // Check cache - if(ENABLE_CACHE){ - $cache_file = $this->get_cache_file_name(); - if(file_exists($cache_file)){ - $this->send_header(); - readfile($cache_file); - exit; - } - } - // If not layer are requested, send all as networklinks - if(!$this->typename){ - $this->_networklink = true; - $this->typename = $this->get_layer_list(); - } else { - $this->_networklink = false; - } - if($this->_networklink == false){ - //desliga todos os layers - for($i = 0; $i < $this->map_object->numlayers; $i++){ - $l = $this->map_object->getLayer($i); - $l->set("status",MS_OFF); - } - //ajusta a legenda - $nomesl = explode(',', $this->typename); - foreach ($nomesl as $nomel){ - $layer = $this->map_object->getlayerbyname($nomel); - if($layer){ - $layer->set("status",MS_DEFAULT); - if ($layer->numclasses > 0){ - $classe = $layer->getclass(0); - if (($classe->name == "") || ($classe->name == " ")){ - $classe->set("name",$layer->getmetadata("tema")); - } - //corrige o titulo da legenda - $nclass = $layer->numclasses; - for($j=0;$j<$nclass;$j++){ - $classe = $layer->getclass($j); - if($classe->title === ""){ - $classe->title = $classe->name; - } - } - } - } - } - } - $imageObj = $this->map_object->drawlegend(); - $url = $imageObj->saveWebImage(); - $protocolo = explode("/",$_SERVER['SERVER_PROTOCOL']); - $url = strtolower($protocolo[0]."://".$_SERVER['HTTP_HOST']).$url; - $legenda = " " . PHP_EOL - . " Legenda" . PHP_EOL - . " " . PHP_EOL - . " ".$url."" . PHP_EOL - . " " . PHP_EOL - . " " . PHP_EOL - . " " . PHP_EOL - . " " . PHP_EOL - . " " . PHP_EOL; - if($this->_networklink == false){ - $this->_xml = new SimpleXMLElement(''.$legenda.''); - } - else{ - $this->_xml = new SimpleXMLElement(''); - } - // Prepare projection - $this->in_proj = ms_newProjectionObj($this->map_object->getProjection()); - // Set projection to GOOGLE earth's projection - $this->out_proj = ms_newProjectionObj("init=epsg:4326"); - // Set endpoint - //die($_SERVER['REQUEST_URI']); - - $protocolo = explode("/",$_SERVER['SERVER_PROTOCOL']); - $protocolo = strtolower($protocolo[0]); - $this->endpoint = $protocolo . '://'.$_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] ? ':'.$_SERVER['SERVER_PORT'] : '') . $_SERVER['PHP_SELF']; - // Process request - if(!$this->has_error()) { - $this->process_request(); - } - if($this->has_error()){ - $this->add_errors(); - } - return $this->send_stream($this->get_kml()); - } - - /** - * Set debug flag - * @param boolean $value - */ - function set_debug($value){ - $this->_debug = $value; - } - - /** - * Get all request parameters - */ - function get_request(){ - $this->map = $this->load_parm('map'); - $this->bbox = $this->load_parm('bbox'); - $this->filter = $this->load_parm('filter'); - $this->typename = $this->load_parm('typename'); - $this->encoding = $this->load_parm('encoding', 'ISO-8859-1'); - $this->request = $this->load_parm('request', 'kml'); - if($this->request == 'kmz') { - $this->_zipped = true; - } - if(!$this->map){ - $this->set_error('No mapfile specified'); - } - } - - /** - * Apply filter - * @return array - */ - function apply_filter(&$layer, &$filter){ - if($layer->connectiontype == MS_POSTGIS){ - if($filter->PropertyIsEqualTo){ - $searchstring = '"'.$filter->PropertyIsEqualTo->PropertyName . ' = ' . '\''.addslashes($filter->PropertyIsEqualTo->Literal).'\''.'"'; - $searchfield = $filter->PropertyIsEqualTo->PropertyName; - } elseif($filter->PropertyIsLike){ - $searchfield = $filter->PropertyIsLike->PropertyName; - $searchstring ='"'.$filter->PropertyIsLike->PropertyName . ' LIKE \'%' . addslashes($filter->PropertyIsLike->Literal) . '%\''.'"'; - } - } elseif($layer->connectiontype == MS_SHAPEFILE || $layer->connectiontype == MS_OGR){ - if($filter->PropertyIsEqualTo){ - $searchstring = $filter->PropertyIsEqualTo->Literal; - $searchfield = $filter->PropertyIsEqualTo->PropertyName; - } elseif($filter->PropertyIsLike){ - $searchstring = $filter->PropertyIsLike->Literal; - $searchfield = $filter->PropertyIsLike->PropertyName; - } - } - return array($searchfield, $searchstring); - } - /** - * Process request - */ - function process_request(){ - // Get layer(s) - $layers = explode(',', $this->typename); - if($this->_networklink){ - foreach($layers as $layer){ - $this->add_networklink($layer); - } - } else { - foreach($layers as $layer){ - //echo "Oi";exit; - $this->process_layer_request($layer); - } - } - } - /** - * Add a networklink - */ - function add_networklink(&$layer_name){ - $nl =& $this->_xml->Document->addChild('NetworkLink'); - $layer = @$this->map_object->getLayerByName($layer_name); - if(!$layer) - {$layer = $this->map_object->getlayer(0);} - $nl->addChild('name', $this->get_layer_description($layer)); - $nl->addChild('visibility', 0); - $link =& $nl->addChild('Link'); - $link->addChild('href', $this->endpoint . '?map=' . $this->map . '&typename=' . urlencode($layer_name) . '&request=' . ($this->_zipped ? 'kmz' : 'kml')); - } - - - /** - * Process a single layer - * @return boolean false on error - */ - function process_layer_request(&$layer_name){ - error_reporting(0); - $v = "5.0.0"; - $vs = explode(" ",ms_GetVersion()); - $cvs = count($vs); - for ($i=0;$i<$cvs;++$i) { - if(trim(strtolower($vs[$i])) == "version") - {$v = $vs[$i+1];} - } - $v = explode(".",$v); - $versao = $v[0]; - - $layer = @$this->map_object->getLayerByName($layer_name); - if(!$layer) - {$layer = $this->map_object->getlayer(0);} - if(!$layer){ - $this->set_error('Nenhum layer com esse nome foi encontrado no mapfile ' . $layer_name, $layer_name); - return false; - } - // Add to layer list - $this->layers[$layer_name] =& $layer; - // Get custom template if any - $description_template = $layer->getMetadata('DESCRIPTION_TEMPLATE'); - // Set on - $layer->set( 'status', MS_DEFAULT ); - // Set kml title from layer description (default to layer name) - $layer_desc = $this->get_layer_description($layer); - - // Now switch raster layers - //var_dump($layer->type == MS_LAYER_RASTER); - if($layer->type == MS_LAYER_RASTER){ - // Check if wms_onlineresource metadata is set - $wms_link = $this->map_object->getMetadata('wms_onlineresource'); - if(!$wms_link){ - $wms_link = $this->map_object->getMetadata('ows_onlineresource'); - } - if(!$wms_link){ - $this->set_error('No WMS server available for ' . $layer_name, $layer_name); - return false; - } - // Add parameters to OGC server call - // Fix & - $wms_link = preg_replace('/&/', '&', $wms_link); - $wms_link .= 'VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4618&STYLES=&FORMAT=image/png&TRANSPARENT=TRUE&'; - // Link ok, create folder - //$folder =& $this->_xml->Document->addChild('GroundOverlay'); - $folder =& $this->simplexml_addChild($this->_xml->Document,'GroundOverlay'); - //simplexml_addChild($parent, $name, $value='') - //$folder->addChild('description', $this->get_layer_description($layer)); - $this->simplexml_addChild($folder,'name',$layer_desc); - - //$folder->addChild('name', $layer_desc); - $this->add_wms_link($folder, $layer, $wms_link); - } else { - // Apply filter - if($this->filter){ - // Try loading as XML - try { - $filter = @new SimpleXMLElement($this->filter); - list($searchfield, $searchstring) = $this->apply_filter($layer, $filter); - if(! ($searchfield && $searchstring)){ - $this->set_error('Error parsing filter', $layer_name); - return false; - } - } catch (Exception $e) { - $this->set_error('Wrong XML filter', $layer_name); - $this->filter = null; - return false; - } - } - - // Get results - if(MS_SUCCESS == $layer->open()){ - // Search which column to use to identify the feature - $namecol = $layer->getMetadata("itens"); - if($namecol == ""){ - $cols = array_values($layer->getItems()); - $namecol = $cols[0]; - } - else - {$namecol = explode(",",$namecol);$namecol = $namecol[0];} - // Add classes - $folder =& $this->_xml->Document->addChild('Folder'); - - $class_list = $this->parse_classes($layer, $folder, $namecol, $title_field, $description_template); - - //die(print_r($class_list, true)); - $folder->addChild('description', $this->get_layer_description($layer)); - $folder->addChild('name', $layer_desc); - - //print("$searchfield && $searchstring"); - if(!isset($searchfield)){$searchfield = false;} - if(!isset($searchstring)){$searchstring = false;} - - if($searchfield && $searchstring){ - if(@$layer->queryByAttributes($searchfield, $searchstring, MS_MULTIPLE) == MS_SUCCESS){ - $layer->open(); - //var_dump($layer->getItems()); die(); - for ($j=0; $j < $layer->getNumResults(); $j++) - { - // get next shape row - if($versao >= 6) - {$shape = $layer->getShape($layer->getResult($j));} - else{ - $result = $layer->getResult($j); - $shape = $layer->getFeature($result->shapeindex,$result->tileindex); - } - $this->process_shape($layer, $shape, $class_list, $folder, $namecol); - // end for loop - } - } else { - $this->set_error('Query returned no data', $layer_name); - return false; - } - } else { // Get all shapes - $layer->set("template","none.htm"); - $layer->queryByrect($this->map_object->extent); - $layer->open(); - $n = $layer->getNumResults(); - for ($j=0; $j < $n; $j++) - { - // get next shape row - if($versao >= 6) - { - $result = $layer->getResult($j); - $shape = $layer->getShape($result); - } - else{ - $result = $layer->getResult($j); - $shape = $layer->getFeature($result->shapeindex,$result->tileindex); - } - $shape->classindex = $result->classindex; - $this->process_shape($layer, $shape, $class_list, $folder, $namecol); - } - if($n == 0) { - $this->set_error('QueryByRect returned no data', $layer_name); - return false; - } - } - $layer->close(); - } else { - $this->set_error('Layer cannot be opened', $layer_name); - return false; - } - } - return true; - } - - /** - * Process the shape - */ - function process_shape(&$layer, &$shape, &$class_list, &$folder, &$namecol){ - $permite = $layer->getmetadata("permitekmz"); - if(strtolower($permite) == "nao"){return;} - $itens = $layer->getmetadata("itens"); - $itensdesc = $layer->getmetadata("itensdesc"); - $shape->project($this->in_proj, $this->out_proj); - // Assign style - if($layer->classitem){ - //$style_id = $this->get_shape_class($layer->classitem, $shape->values, $class_list); - } - if(!isset($style_id)){ - // Get first class - $class_keys = array_keys($class_list); - $indice = $shape->classindex; - $classe = $layer->getclass($indice); - $nome= $classe->name; - $style_id = preg_replace('/[^A-z0-9]/', '_', $layer->name . $nome); - } - // Add the feature - if(array_key_exists('folder', $class_list[$style_id])) { - $feature_folder =& $class_list[$style_id]['folder']; - } else { - //die('missing folder for ' . $style_id); - $feature_folder =& $folder; - } - if(!is_object($feature_folder)){ - $folder_name = $feature_folder; - $feature_folder =& $folder ->addChild('Folder'); - $feature_folder->addChild('name', $folder_name); - } - // Add style class - $style_url =& $this->add_style($layer, $feature_folder, $style_id, $class_list[$style_id], $namecol, $shape->values); - $wkt = $shape->toWkt(); - $description_template = $layer->getMetadata('DESCRIPTION_TEMPLATE');//false; - if($description_template == "") - {$description_template = false;} - $placemark =& $this->add_feature($feature_folder, $wkt, $shape->values[$namecol], $shape->values, $description_template, $class_list[$style_id],$itens,$itensdesc); - - $placemark->addChild('styleUrl', '#'. $style_url); - - } - /** - * Add the feature to the result set - * @return reference to placemark object - */ - function &add_feature(&$folder, &$wkt, $featurename, $attributes, $description_template, $style_data,$itens,$itensdesc){ - $pm = $folder->addChild('Placemark'); - $fname = mb_convert_encoding($featurename,"UTF-8",mb_detect_encoding($featurename,'UTF-8, UTF-7, ASCII, ISO-8859-1')); - $pm->addChild('name',$fname); - $pm->addChild('description', $this->get_feature_description($fname, $attributes, $description_template,$itens,$itensdesc)); - // Now parse the wkt - if(strpos($wkt, 'MULTILINESTRING') !== false){ - $this->add_multilinestring($wkt, $pm, $featurename, $style_data['icon']); - } elseif(strpos($wkt, 'LINESTRING') !== false){ - $this->add_linestring($wkt, $pm, $featurename, $style_data['icon']); - } elseif(strpos($wkt, 'POINT') !== false){ - $this->add_point($wkt, $pm, $featurename); - } elseif(strpos($wkt, 'MULTIPOLYGON') !== false){ - if(TREAT_POLY_AS_LINE){ - $ml = $pm->addChild('MultiGeometry'); - foreach(split('\), \(', $wkt) as $line){ - $this->add_multilinestring($line, $ml, $featurename ); - } - } else { - $this->add_multipolygon($wkt, $pm, $featurename); - } - } elseif(strpos($wkt, 'POLYGON') !== false){ - if(TREAT_POLY_AS_LINE){ - $this->add_multilinestring($wkt, $pm, $featurename); - } else { - $this->add_polygon($wkt, $pm, $featurename); - } - } else { - // Error? - } - return $pm; - } - - /** - * Add a linestring - */ - function add_linestring(&$wkt, &$element, $featurename, $add_points){ - preg_match('/(\d+[^\(\)]*\d)/', $wkt, $data); - $data = str_replace(', ', '#', $data[1]); - $data = str_replace(' ', ',', $data); - $data = str_replace('#', ' ', $data); - if($add_points){ - preg_match('/^(\d+\.\d+,\d+\.\d+).*(\d+\.\d+,\d+\.\d+)$/', $data, $points); - if(count($points) == 3){ - $mg = $element->addChild('MultiGeometry'); - $ls = $mg->addChild('LineString'); - $pt1 = $mg->addChild('Point'); - $pt1->addChild('coordinates', $points[1]); - $pt2 = $mg->addChild('Point'); - $pt2->addChild('coordinates', $points[2]); - } else { - die('errore'); - $ls = $element->addChild('LineString'); - } - //print_r($points);die(); - } else { - $ls = $element->addChild('LineString'); - } - $ls->addChild('coordinates', $data); - } - - /** - * Add a multilinestring - */ - function add_multilinestring(&$wkt, &$element, $featurename, $add_points){ - $ml = $element->addChild('MultiGeometry'); - foreach(split('\), \(', $wkt) as $line){ - $this->add_linestring($line, $ml, $featurename, $add_points ); - } - } - - /** - * Add a point - */ - function add_point(&$wkt, &$element, $featurename){ - $pt = $element->addChild('Point'); - /* - preg_match('/(\d\.?\d+\s\d+\.?\d+)/', $wkt, $data); - //var_dump($data);exit; - $data = str_replace(' ', ',', $data[1]); - */ - $data = str_replace("(","",$wkt); - $data = str_replace(")","",$data); - $data = str_replace("POINT","",$data); - $data = str_replace(" ",",",trim($data)); - //echo $data;exit; - $pt->addChild('coordinates', $data); - } - - - /** - * Add a polygon - */ - function add_polygon(&$wkt, &$element, $featurename){ - $ml = $element->addChild('Polygon'); - foreach(split('\), \(', $wkt) as $line){ - preg_match('/(\d+[^\(\)]*\d)/', $wkt, $data); - $data = str_replace(', ', '#', $data[1]); - $data = str_replace(' ', ',', $data); - // Add 1 meter height - $data = str_replace('#', ',1 ', $data) . ',1'; - $ml->addChild('tessellate', 1); - //$element->addChild('altitudeMode', 'relativeToGround'); - $element->addChild('altitudeMode', 'clampToGround'); - $ob = $ml->addChild('outerBoundaryIs'); - $ls = $ob->addChild('LinearRing'); - $ls->addChild('coordinates', $data); - } - } - - - /** - * Add a multipolygon - * fixme: untested, should take holes into account - */ - function add_multipolygon(&$wkt, &$element, $featurename){ - $ml = $element->addChild('MultiGeometry'); - foreach(split('\), \(', $wkt) as $line){ - $this->add_polygon($line, $ml, $featurename ); - } - } - - - /** - * Get the feature description - */ - function get_feature_description($featurename, $attributes, $description_template,$itens,$itensdesc){ - // Compute hyperlink - //var_dump($attributes);exit; - //if($description_template != ""){return $description_template;} - $n = ""; - if($description_template != "") - { - foreach($attributes as $k => $val) - {$description_template = str_replace("%".$k."%",$attributes[$k],$description_template);} - $n = $description_template; - } - else - { - if($itens == "") - { - foreach($attributes as $k => $val){ - $n .= $k." - ".$attributes[$k]."\n"; - } - } - else - { - $itens = explode(",",$itens); - $itensdesc = explode(",",$itensdesc); - for($i=0;$i style_data) - */ - function parse_classes(&$layer, &$folder, &$namecol, &$title_field, &$description_template ){ - $style_ar = array(); - $numclasses = $layer->numclasses; - $versao = $this->versao(); - $vi = $versao["inteiro"]; - for($i = 0; $i < $numclasses; $i++){ - $class = $layer->getClass($i); - if($vi >= 60200){ - if($class->numlabels > 0) - $label = $class->getLabel(0); - } - else{ - $label = $class->label; - } - if($label){ - $style['label_color'] = $label->color; - $style['label_size'] = $label->size; - } - // Get styles - for($j = 0; $j < $class->numstyles; $j++){ - $_style = $class->getStyle($j); - $style['color'] = $_style->color; - $style['outlinecolor'] = $_style->outlinecolor; - $style['width'] = $_style->size; // Lines - $style['backgroundcolor'] = $_style->backgroundcolor; - if($layer->type == MS_LAYER_POINT) - $style['icon'] = $this->get_icon_url($layer, $class->name,$i); - $style['icon_width'] = $_style->size; // Points - } - $style['expression'] = $class->getExpressionString(); - // Set description_template if any - $style['description_template'] = $description_template; - // Get icon for lines if any - if($icon = $layer->getMetadata('KML_ADD_POINT')){ - $style['icon'] = $icon; - $style['icon_width'] = 32; - } - // Create style element - $style_id = preg_replace('/[^A-z0-9]/', '_', $layer->name . $class->name); - $this->add_style($layer, $folder, $style_id, $style, $namecol, $title_field ); - // create folder if more than one class - if($numclasses > 1){ - //$style['folder'] =& $class->name; - //$folder->addChild('Folder'); - //$style['folder']->addChild('name', $class->name); - } - $style_ar[$style_id] = $style; - } - return $style_ar; - } - - /** - * Return a CSV list of all layer names in the mapfile - * fixme: filter out ANNOTATIONS and other "strange" layers - */ - function get_layer_list(){ - $layer_list = array(); - for($i = 0; $i < $this->map_object->numlayers; $i++){ - $layer =& $this->map_object->getLayer($i); - $kml_skip = $layer->getMetadata('KML_SKIP'); - if(strtolower($kml_skip) !== 'true'){ - $layer_list[] = $layer->name; - } - } - return join(',', $layer_list); - } - - - /** - * Return the class for the shape, default to last class if not match - */ - function get_shape_class(&$classitem, &$values, &$class_list){ - //var_dump($class_list); die(); - foreach($class_list as $style_id => $style_data){ - if($style_data['expression'] && preg_match($style_data['expression'], $values[$classitem])){ - //print "get_shape_class($classitem) ".$values[$classitem]." matches
"; - return $style_id; - } - } - //print "get_shape_class($classitem) ".$values[$classitem]." no matches
"; - return $style_id; - } - - /** - * Add the style - * @return the style URL - */ - function add_style(&$layer, &$folder, $style_id, &$style_data){ - // Calculare style URL - - if($style_data['description_template']){ - $this->style_counter++; - $style_id .= '_'.$this->style_counter; - $balloon_data = $this->get_feature_description($attributes[$namecol], $attributes, $style_data['description_template']); - } - - // Check if the style already exists - $expr = '//*[@id=\''.$style_id.'\']'; - if($folder->xpath($expr)) { - return $style_id; - } - $new_style =& $folder->addChild('Style'); - $new_style['id'] = $style_id; - // Switch layer type - switch($layer->type){ - case MS_LAYER_POINT: - $this->add_style_point($new_style, $style_data); - break; - case MS_LAYER_POLYGON: - $this->add_style_polygon($new_style, $style_data); - break; - case MS_LAYER_LINE: - $this->add_style_line($new_style, $style_data); - // Add KML_ADD_POINT icon - if($style_data['icon']){ - $this->add_style_point($new_style, $style_data); - } - break; - } - return $style_id; - } - - /** - * Add style for lines - */ - function add_style_line(&$new_style, &$style_data){ - if($style_data['outlinecolor']->red != -1){ - $st =& $new_style->addChild('LineStyle'); - $st->addChild('color', sprintf('FF%02X%02X%02X', $style_data['outlinecolor']->blue, $style_data['outlinecolor']->green, $style_data['outlinecolor']->red)); - if($width) { - $st->addChild('width', $width); - } - } elseif($style_data['color']->red != -1){ - $st =& $new_style->addChild('LineStyle'); - $st->addChild('color', sprintf('FF%02X%02X%02X', $style_data['color']->blue, $style_data['color']->green, $style_data['color']->red)); - if($width) { - $st->addChild('width', $width); - } - } - } - - /** - * Add style for points - */ - function add_style_point(&$new_style, &$style_data){ - if($style_data['icon']){ - $st =& $new_style->addChild('IconStyle'); - if($style_data['width'] && $style_data['icon_width'] != 32){ - /** - * - */ - //$st->addChild('scale', $style_data['icon_width'] / 32); - $st->addChild('scale', 1); - } - else - {$st->addChild('scale', 1);} - $icon =& $st->addChild('Icon'); - $icon->addChild('href', htmlentities($style_data['icon'])); - - } - $ls =& $new_style->addChild('LabelStyle'); - $ls->addChild('scale', $style_data['label_size'] / 32); - // Add the balloon style if description_template is set - /* - if($style_data['description_template']){ - $this->add_balloon_style($new_style, $balloon_data); - } - */ - // Label size and color - /* - if($style_data['label_size'] || $style_data['label_color']){ - $ls =& $new_style->addChild('LabelStyle'); - if($style_data['label_size'] != -1 && $style_data['label_size'] != 32){ - $ls->addChild('scale', $style_data['label_size'] / 32); - } - if($style_data['label_color']->red != -1){ - $ls->addChild('color', sprintf('FF%02X%02X%02X', $style_data['label_color']->blue, $style_data['label_color']->green, $style_data['label_color']->red)); - } - } - */ - } - - /** - * Add style for polygons - */ - function add_style_polygon(&$new_style, &$style_data){ - // Get also outline styles - $this->add_style_line($new_style, $style_data); - $st =& $new_style->addChild('PolyStyle'); - //die(print_r($backgroundcolor, true)); - if($style_data['color']->red != -1){ - $st->addChild('color', sprintf('FF%02X%02X%02X', $style_data['color']->blue, $style_data['color']->green, $style_data['color']->red)); - $st->addChild('fill', 1); - } else { - $st->addChild('fill', 0); - } - $st->addChild('outline', 1); - } - - /** - * Add a WMS raster link - */ - function add_wms_link(&$folder, &$layer, &$link){ - // Build up the KML response document. - //$icon =& $folder->addChild('Icon'); - $icon =& $this->simplexml_addChild($folder,'Icon'); - //$icon->addChild('href', $link . 'layers=' . $layer->name); - $this->simplexml_addChild($icon,'href', $link . 'layers=' . $layer->name); - //$icon->addChild('viewRefreshMode', 'onStop'); - $this->simplexml_addChild($icon,'viewRefreshMode', 'onStop'); - //$llbox =& $folder->addChild('LatLonBox'); - $llbox =& $this->simplexml_addChild($folder,'LatLonBox'); - $ext = $this->map_object->extent; - $ext->project($this->in_proj, $this->out_proj); - //$llbox->north = $ext->maxy; - $this->simplexml_addChild($llbox,'north', $ext->maxy); - //$llbox->south = $ext->miny; - $this->simplexml_addChild($llbox,'south', $ext->miny); - //$llbox->east = $ext->maxx; - $this->simplexml_addChild($llbox,'east', $ext->maxx); - //$llbox->west = $ext->minx; - $this->simplexml_addChild($llbox,'west', $ext->minx); - // Reset original projection - $ext->project($this->out_proj, $this->in_proj); - } - - /** - * Get the url for a point icon - */ - function get_icon_url($layer, $classname, $classindex){ - $classe = $layer->getclass($classindex); - $estilo = $classe->getstyle(0); - $url = ""; - $imageObj = $classe->createLegendIcon(30,30); - if($imageObj) - { - $url = $imageObj->saveWebImage(); - $protocolo = explode("/",$_SERVER['SERVER_PROTOCOL']); - $url = strtolower($protocolo[0]."://".$_SERVER['HTTP_HOST']).$url; - $nome = $imageObj->imagepath . basename($url); - - $img = imagecreatefrompng($nome); - $index = imagecolorexact($img, 255, 255, 255); - imagecolortransparent($img, $index); - imagepng($img, $nome); - } - return $url; //$this->endpoint . '?service=icon&map=' . $this->map . '&typename=' . urlencode($layer->name) . '&classname=' . urlencode($classname); - } - - /** - * Get the layer description - */ - function get_layer_description(&$layer){ - $description = $layer->getMetadata('DESCRIPTION'); - if(!$description){ - $description = $layer->getMetadata('OWS_TITLE'); - } - if(!$description){ - $description = $layer->getMetadata('WFS_TITLE'); - } - if(!$description){ - $description = $layer->getMetadata('WMS_TITLE'); - } - if(!$description){ - $description = $layer->getMetadata('TEMA'); - } - if(!$description){ - $description = $layer->name; - } - $description = mb_convert_encoding($description,"UTF-8",mb_detect_encoding($description,"UTF-8,ISO-8859-1")); - return $description; - } - - - - /** - * Add style for balloon - * @param string style XML id - * @param string column name for title - */ - function add_balloon_style(&$style, $balloon_data){ - $balloon =& $style->addChild('BalloonStyle'); - $balloon->addChild('text', htmlentities($balloon_data)); - } - - - /** - * Get a request parameter - * @param string $name - * @param string $default parameter optional - * @return string the parameter value or empty string if null - */ - function load_parm($name, $default = ''){ - if(!isset($_REQUEST[$name])) return $default; - $value = $_REQUEST[$name]; - if(get_magic_quotes_gpc() != 1) $value = addslashes($value); - //$value = escapeshellcmd($value); - return $value; - } - - /** - * Set error message - * @param string $message - * @param string $layer name - */ - function set_error($message, $layer = 'Error'){ - $this->errors[$layer][] = $message; - } - /** - * Load the map and create the map instance - */ - function load_map(){ - if(!file_exists($this->map) && is_readable($this->map)){ - $this->set_error('Cannot read mapfile '. $this->map); - } else { - $protocolo = explode("/",$_SERVER['SERVER_PROTOCOL']); - $servidor = strtolower($protocolo[0])."://".$_SERVER['HTTP_HOST']; - $temp = $this->map; - if(file_exists(dirname(__FILE__)."/../../../ms_configura.php")){ - include(dirname(__FILE__)."/../../../ms_configura.php"); - } else { - include(dirname(__FILE__)."/../../ms_configura.php"); - } - if(!file_exists($this->map)){ - $maptemp = ms_newMapObj($locaplic."/temas/".$this->map.".map"); - //if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) - //{$this->map = $locaplic."/aplicmap/geral1windows.map";} - //else - //{$this->map = $locaplic."/aplicmap/geral1.map";} - - $versao = $this->versao(); - $versao = $versao["principal"]; - if(!isset($base) || $base == "") - { - if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) - {$base = $locaplic."/aplicmap/geral1windowsv".$versao.".map";} - else - { - if($base == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv'.$versao.'.map')){ - $base = "/var/www/i3geo/aplicmap/geral1debianv".$versao.".map"; - } - if($base == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){ - $base = "/var/www/html/i3geo/aplicmap/geral1fedorav".$versao.".map"; - } - if($base == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){ - $base = "/opt/www/html/i3geo/aplicmap/geral1v".$versao.".map"; - } - if($base == "") - {$base = $locaplic."/aplicmap/geral1v".$versao.".map";} - } - } - $this->map = $base; - - $this->map_object = ms_newMapObj($this->map); - if(!$this->_zipped){ - $this->map_object->setmetadata('wms_onlineresource',$servidor.":80/i3geo/ogc.php?tema=".$temp."&width=1500&height=1500&TRANSPARENT=true&FORMAT=image/png&"); - $this->map_object->setmetadata("ows_enable_request","*"); - } - $n = $this->map_object->numlayers; - for ($i=0;$i < $n;$i++) - { - $l = $this->map_object->getlayer($i); - $l->set("status",MS_DELETE); - $l->set("name",""); - } - for ($i=0;$i < ($maptemp->numlayers);$i++) - { - $l = $maptemp->getlayer($i); - $l->set("status",MS_DEFAULT); - if(!$this->_zipped) - { - $l->set("type",MS_LAYER_RASTER); - $l->setmetadata('wms_onlineresource',"../../ogc.php?tema=".$temp."&width=1500&height=1500&TRANSPARENT=true&FORMAT=image/png&"); - $l->setmetadata("ows_enable_request","*"); - } - ms_newLayerObj($this->map_object, $l); - } - } - else{ - $this->map_object = ms_newMapObj($this->map); - //$w = $this->map_object->web; - //$w->set("template","none.htm"); - - if(!$this->_zipped){ - //$this->map_object->setmetadata('wms_onlineresource',$servidor.":80".$locmapserv."?map=".$temp."&width=1500&height=1500&"); - $this->map_object->setmetadata('wms_onlineresource',"../../ogc.php?tema=".$temp."&width=1500&height=1500&TRANSPARENT=true&FORMAT=image/png&"); - $this->map_object->setmetadata("ows_enable_request","*"); - } - $n = $this->map_object->numlayers; - for ($i=0;$i < $n;$i++) - { - $l = $this->map_object->getlayer($i); - $l->set("status",MS_DEFAULT); - if(!$this->_zipped) - $l->set("type",MS_LAYER_RASTER); - //$l->setmetadata('wms_onlineresource',"../../ogc.php?tema=".$temp."&width=500&height=500&"); - //ms_newLayerObj($this->map_object, $l); - } - } - if(!$this->map_object){ - $this->set_error('Cannot load mapfile '. $this->map); - } - } - } - - /** - * Test if has errors - * @return boolean - */ - function has_error(){ - return count($this->errors) > 0; - } - - /** - * Add error messages to folders TAGS - */ - function add_errors(){ - foreach($this->errors as $layer => $errors){ - $folder =& $this->_xml->Document->addChild('Folder'); - $folder->addChild('name', $layer); - $folder->addChild('description', '

' . join("

\n

", $errors) . "

"); - } - return $errorxml; - } - - /** - * Fetch XML and format it - */ - function get_kml(){ - $doc = new DOMDocument('1.0'); - $doc->formatOutput = true; - $domnode = dom_import_simplexml($this->_xml); - $domnode = $doc->importNode($domnode, true); - $domnode = $doc->appendChild($domnode); - return $doc->saveXML(); - } - - /** - * Send header - */ - function send_header(){ - header('Content-Disposition: attachment; filename=kml.km'.($this->_zipped ? 'z' : 'l')); - header('Content-type: application/vnd.google-earth.km'.($this->_zipped ? 'z' : 'l').'+XML'); - } - - /** - * Calculate cache file name - */ - function get_cache_file_name(){ - //obtem o arquivo do metadata do layer se existir - $layer = @$this->map_object->getlayerbyname($this->typename); - if(!$layer) - {$layer = $this->map_object->getlayer(0);} - $k = $layer->getmetadata("arquivokmz"); - if($k != ""){ - return $k; - } - if(file_exists(dirname(__FILE__)."/../../../ms_configura.php")){ - include(dirname(__FILE__)."/../../../ms_configura.php"); - } else { - include(dirname(__FILE__)."/../../ms_configura.php"); - } - return $dir_tmp.'/'. md5($_SERVER['QUERY_STRING']) . ($this->_zipped ? '.kmz' : '.kml'); - } - - /** - * Send stream - */ - function send_stream($data){ - $this->send_header(); - // Compress data - - if($this->_zipped){ - include("zip.class.php"); - $ziper = new zipfile(); - $ziper->addFile($data, 'doc.kml'); - $data = $ziper->file(); - } - - // Create cache if needed - if(ENABLE_CACHE && count($this->layers) == 1) { - //error_log( 'creating cache ' . $this->get_cache_file_name() ); - file_put_contents($this->get_cache_file_name(), $data); - } - print $data; - exit(); - } -// phpversion <= 5.1.2 - -function simplexml_addChild($parent, $name, $value=''){ - $new_child = new SimpleXMLElement("<$name>$value"); - $node1 = dom_import_simplexml($parent); - $dom_sxe = dom_import_simplexml($new_child); - $node2 = $node1->ownerDocument->importNode($dom_sxe, true); - $node1->appendChild($node2); - return simplexml_import_dom($node2); +if (! function_exists('ms_GetVersion')) { + echo "Nao foi possivel carregar php_mapscript"; } -function versao() + +/** + * Main server class + */ +class LayerServer { - $v = "5.0.0"; - $vs = explode(" ",ms_GetVersion()); - $cvs = count($vs); - for ($i=0;$i<$cvs;++$i) - { - if(trim(strtolower($vs[$i])) == "version") - {$v = $vs[$i+1];} - } - $versao["completa"] = $v; - $v = explode(".",$v); - $versao["principal"] = $v[0]; - $versao["inteiro"] = ms_GetVersionInt(); - return $versao; -} + + /** + * map file path + */ + var $map; + + /** + * request + */ + var $request; + + /** + * map instance + */ + var $map_object; + + /** + * layer name(s) passed on the request + */ + var $typename; + + /** + * array of requested layer objects (hash with layer name as key) + */ + var $layers; + + /** + * filters + */ + var $filter; + + /** + * bounding box + */ + var $bbox; + + /** + * error messages + */ + var $errors; + + /** + * send zipped data + */ + var $_zipped = false; + + /** + * internal XML buffer + */ + var $_xml; + + /** + * input projection + */ + var $in_proj; + + /** + * output projection + */ + var $out_proj; + + /** + * debug flag + */ + var $_debug = false; + + /** + * end point + */ + var $endpoint; + + /** + * custom style counter + */ + var $style_counter = 0; + + /** + * Mapfile and data encoding encoding + * XMl output must be UTF-8, attributes and METADATA based strings + * must be converted to UTF-8, encoding defaults to ISO-8859-1, if + * your encoding is different, you can set it through CGI style parameters + */ + var $encoding; + + /** + * send networklink + * wether folder should contain networklinks instead of real geometries + * it is automatically set when all layers are requested + */ + var $_networklink; + var $postgis_mapa; + + /** + * Initialize + */ + function LayerServer() + { + $this->errors = array(); + // Load request parameters + $this->get_request(); + $this->style_counter = 0; + // Load map + if (! $this->has_error()) { + $this->load_map(); + } + } + + /** + * Run the server and sends data + * + * @return string or void + */ + function run() + { + // Check cache + if (ENABLE_CACHE) { + $cache_file = $this->get_cache_file_name(); + if (file_exists($cache_file)) { + $this->send_header(); + readfile($cache_file); + exit(); + } + } + // If not layer are requested, send all as networklinks + if (! $this->typename) { + $this->_networklink = true; + $this->typename = $this->get_layer_list(); + } else { + $this->_networklink = false; + } + if ($this->_networklink == false) { + // desliga todos os layers + for ($i = 0; $i < $this->map_object->numlayers; $i ++) { + $l = $this->map_object->getLayer($i); + $l->set("status", MS_OFF); + } + // ajusta a legenda + $nomesl = explode(',', $this->typename); + foreach ($nomesl as $nomel) { + $layer = $this->map_object->getlayerbyname($nomel); + if ($layer) { + $layer->set("status", MS_DEFAULT); + if ($layer->numclasses > 0) { + $classe = $layer->getclass(0); + if (($classe->name == "") || ($classe->name == " ")) { + $classe->set("name", $layer->getmetadata("tema")); + } + // corrige o titulo da legenda + $nclass = $layer->numclasses; + for ($j = 0; $j < $nclass; $j ++) { + $classe = $layer->getclass($j); + if ($classe->title === "") { + $classe->title = $classe->name; + } + } + } + } + } + } + $imageObj = $this->map_object->drawlegend(); + $url = $imageObj->saveWebImage(); + $protocolo = explode("/", $_SERVER['SERVER_PROTOCOL']); + $url = strtolower($protocolo[0] . "://" . $_SERVER['HTTP_HOST']) . $url; + $legenda = " " . PHP_EOL . " Legenda" . PHP_EOL . " " . PHP_EOL . " " . $url . "" . PHP_EOL . " " . PHP_EOL . " " . PHP_EOL . " " . PHP_EOL . " " . PHP_EOL . " " . PHP_EOL; + if ($this->_networklink == false) { + $this->_xml = new SimpleXMLElement('' . $legenda . ''); + } else { + $this->_xml = new SimpleXMLElement(''); + } + // Prepare projection + $this->in_proj = ms_newProjectionObj($this->map_object->getProjection()); + // Set projection to GOOGLE earth's projection + $this->out_proj = ms_newProjectionObj("init=epsg:4326"); + // Set endpoint + // die($_SERVER['REQUEST_URI']); + + $protocolo = explode("/", $_SERVER['SERVER_PROTOCOL']); + $protocolo = strtolower($protocolo[0]); + $this->endpoint = $protocolo . '://' . $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] ? ':' . $_SERVER['SERVER_PORT'] : '') . $_SERVER['PHP_SELF']; + // Process request + if (! $this->has_error()) { + $this->process_request(); + } + if ($this->has_error()) { + $this->add_errors(); + } + return $this->send_stream($this->get_kml()); + } + + /** + * Set debug flag + * + * @param boolean $value + */ + function set_debug($value) + { + $this->_debug = $value; + } + + /** + * Get all request parameters + */ + function get_request() + { + $this->map = $this->load_parm('map'); + $this->bbox = $this->load_parm('bbox'); + $this->filter = $this->load_parm('filter'); + $this->typename = $this->load_parm('typename'); + $this->encoding = $this->load_parm('encoding', 'ISO-8859-1'); + $this->request = $this->load_parm('request', 'kml'); + if ($this->request == 'kmz') { + $this->_zipped = true; + } + if (! $this->map) { + $this->set_error('No mapfile specified'); + } + } + + /** + * Apply filter + * + * @return array + */ + function apply_filter(&$layer, &$filter) + { + if ($layer->connectiontype == MS_POSTGIS) { + if ($filter->PropertyIsEqualTo) { + $searchstring = '"' . $filter->PropertyIsEqualTo->PropertyName . ' = ' . '\'' . addslashes($filter->PropertyIsEqualTo->Literal) . '\'' . '"'; + $searchfield = $filter->PropertyIsEqualTo->PropertyName; + } elseif ($filter->PropertyIsLike) { + $searchfield = $filter->PropertyIsLike->PropertyName; + $searchstring = '"' . $filter->PropertyIsLike->PropertyName . ' LIKE \'%' . addslashes($filter->PropertyIsLike->Literal) . '%\'' . '"'; + } + } elseif ($layer->connectiontype == MS_SHAPEFILE || $layer->connectiontype == MS_OGR) { + if ($filter->PropertyIsEqualTo) { + $searchstring = $filter->PropertyIsEqualTo->Literal; + $searchfield = $filter->PropertyIsEqualTo->PropertyName; + } elseif ($filter->PropertyIsLike) { + $searchstring = $filter->PropertyIsLike->Literal; + $searchfield = $filter->PropertyIsLike->PropertyName; + } + } + return array( + $searchfield, + $searchstring + ); + } + + /** + * Process request + */ + function process_request() + { + // Get layer(s) + $layers = explode(',', $this->typename); + if ($this->_networklink) { + foreach ($layers as $layer) { + $this->add_networklink($layer); + } + } else { + foreach ($layers as $layer) { + // echo "Oi";exit; + $this->process_layer_request($layer); + } + } + } + + /** + * Add a networklink + */ + function add_networklink(&$layer_name) + { + $nl = & $this->_xml->Document->addChild('NetworkLink'); + $layer = @$this->map_object->getLayerByName($layer_name); + if (! $layer) { + $layer = $this->map_object->getlayer(0); + } + $nl->addChild('name', $this->get_layer_description($layer)); + $nl->addChild('visibility', 0); + $link = & $nl->addChild('Link'); + $link->addChild('href', $this->endpoint . '?map=' . $this->map . '&typename=' . urlencode($layer_name) . '&request=' . ($this->_zipped ? 'kmz' : 'kml')); + } + + /** + * Process a single layer + * + * @return boolean false on error + */ + function process_layer_request(&$layer_name) + { + error_reporting(0); + $v = "5.0.0"; + $vs = explode(" ", ms_GetVersion()); + $cvs = count($vs); + for ($i = 0; $i < $cvs; ++ $i) { + if (trim(strtolower($vs[$i])) == "version") { + $v = $vs[$i + 1]; + } + } + $v = explode(".", $v); + $versao = $v[0]; + + $layer = @$this->map_object->getLayerByName($layer_name); + if (! $layer) { + $layer = $this->map_object->getlayer(0); + } + if (! $layer) { + $this->set_error('Nenhum layer com esse nome foi encontrado no mapfile ' . $layer_name, $layer_name); + return false; + } + // Add to layer list + $this->layers[$layer_name] = & $layer; + // Get custom template if any + $description_template = $layer->getMetadata('DESCRIPTION_TEMPLATE'); + // Set on + $layer->set('status', MS_DEFAULT); + // Set kml title from layer description (default to layer name) + $layer_desc = $this->get_layer_description($layer); + + // Now switch raster layers + // var_dump($layer->type == MS_LAYER_RASTER); + if ($layer->type == MS_LAYER_RASTER) { + // Check if wms_onlineresource metadata is set + $wms_link = $this->map_object->getMetadata('wms_onlineresource'); + if (! $wms_link) { + $wms_link = $this->map_object->getMetadata('ows_onlineresource'); + } + if (! $wms_link) { + $this->set_error('No WMS server available for ' . $layer_name, $layer_name); + return false; + } + // Add parameters to OGC server call + // Fix & + $wms_link = preg_replace('/&/', '&', $wms_link); + $wms_link .= 'VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG:4618&STYLES=&FORMAT=image/png&TRANSPARENT=TRUE&'; + // Link ok, create folder + // $folder =& $this->_xml->Document->addChild('GroundOverlay'); + $folder = & $this->simplexml_addChild($this->_xml->Document, 'GroundOverlay'); + // simplexml_addChild($parent, $name, $value='') + // $folder->addChild('description', $this->get_layer_description($layer)); + $this->simplexml_addChild($folder, 'name', $layer_desc); + + // $folder->addChild('name', $layer_desc); + $this->add_wms_link($folder, $layer, $wms_link); + } else { + // Apply filter + if ($this->filter) { + // Try loading as XML + try { + $filter = @new SimpleXMLElement($this->filter); + list ($searchfield, $searchstring) = $this->apply_filter($layer, $filter); + if (! ($searchfield && $searchstring)) { + $this->set_error('Error parsing filter', $layer_name); + return false; + } + } catch (Exception $e) { + $this->set_error('Wrong XML filter', $layer_name); + $this->filter = null; + return false; + } + } + //error_log(implode(",",$this->postgis_mapa)); + if ($layer->connectiontype == MS_POSTGIS) { + $layer->set("connection", $this->postgis_mapa[$layer->connection]); + } + // Get results + if (MS_SUCCESS == $layer->open()) { + // Search which column to use to identify the feature + $namecol = $layer->getMetadata("itens"); + if ($namecol == "") { + $cols = array_values($layer->getItems()); + $namecol = $cols[0]; + } else { + $namecol = explode(",", $namecol); + $namecol = $namecol[0]; + } + // Add classes + $folder = & $this->_xml->Document->addChild('Folder'); + + $class_list = $this->parse_classes($layer, $folder, $namecol, $title_field, $description_template); + + // die(print_r($class_list, true)); + $folder->addChild('description', $this->get_layer_description($layer)); + $folder->addChild('name', $layer_desc); + + // print("$searchfield && $searchstring"); + if (! isset($searchfield)) { + $searchfield = false; + } + if (! isset($searchstring)) { + $searchstring = false; + } + + if ($searchfield && $searchstring) { + if (@$layer->queryByAttributes($searchfield, $searchstring, MS_MULTIPLE) == MS_SUCCESS) { + $layer->open(); + // var_dump($layer->getItems()); die(); + for ($j = 0; $j < $layer->getNumResults(); $j ++) { + // get next shape row + if ($versao >= 6) { + $shape = $layer->getShape($layer->getResult($j)); + } else { + $result = $layer->getResult($j); + $shape = $layer->getFeature($result->shapeindex, $result->tileindex); + } + $this->process_shape($layer, $shape, $class_list, $folder, $namecol); + // end for loop + } + } else { + $this->set_error('Query returned no data', $layer_name); + return false; + } + } else { // Get all shapes + $layer->set("template", "none.htm"); + $layer->queryByrect($this->map_object->extent); + $layer->open(); + $n = $layer->getNumResults(); + for ($j = 0; $j < $n; $j ++) { + // get next shape row + if ($versao >= 6) { + $result = $layer->getResult($j); + $shape = $layer->getShape($result); + } else { + $result = $layer->getResult($j); + $shape = $layer->getFeature($result->shapeindex, $result->tileindex); + } + $shape->classindex = $result->classindex; + $this->process_shape($layer, $shape, $class_list, $folder, $namecol); + } + if ($n == 0) { + $this->set_error('QueryByRect returned no data', $layer_name); + return false; + } + } + $layer->close(); + } else { + $this->set_error('Layer cannot be opened', $layer_name); + return false; + } + } + return true; + } + + /** + * Process the shape + */ + function process_shape(&$layer, &$shape, &$class_list, &$folder, &$namecol) + { + $permite = $layer->getmetadata("permitekmz"); + if (strtolower($permite) == "nao") { + return; + } + $itens = $layer->getmetadata("itens"); + $itensdesc = $layer->getmetadata("itensdesc"); + $shape->project($this->in_proj, $this->out_proj); + // Assign style + if ($layer->classitem) { + // $style_id = $this->get_shape_class($layer->classitem, $shape->values, $class_list); + } + if (! isset($style_id)) { + // Get first class + $class_keys = array_keys($class_list); + $indice = $shape->classindex; + $classe = $layer->getclass($indice); + $nome = $classe->name; + $style_id = preg_replace('/[^A-z0-9]/', '_', $layer->name . $nome); + } + // Add the feature + if (array_key_exists('folder', $class_list[$style_id])) { + $feature_folder = & $class_list[$style_id]['folder']; + } else { + // die('missing folder for ' . $style_id); + $feature_folder = & $folder; + } + if (! is_object($feature_folder)) { + $folder_name = $feature_folder; + $feature_folder = & $folder->addChild('Folder'); + $feature_folder->addChild('name', $folder_name); + } + // Add style class + $style_url = & $this->add_style($layer, $feature_folder, $style_id, $class_list[$style_id], $namecol, $shape->values); + + $wkt = $shape->toWkt(); + $description_template = $layer->getMetadata('DESCRIPTION_TEMPLATE'); // false; + if ($description_template == "") { + $description_template = false; + } + $placemark = & $this->add_feature($feature_folder, $wkt, $shape->values[$namecol], $shape->values, $description_template, $class_list[$style_id], $itens, $itensdesc); + + $placemark->addChild('styleUrl', '#' . $style_url); + } + + /** + * Add the feature to the result set + * + * @return reference to placemark object + */ + function &add_feature(&$folder, &$wkt, $featurename, $attributes, $description_template, $style_data, $itens, $itensdesc) + { + $pm = $folder->addChild('Placemark'); + $fname = mb_convert_encoding($featurename, "UTF-8", mb_detect_encoding($featurename, 'UTF-8, UTF-7, ASCII, ISO-8859-1')); + $pm->addChild('name', $fname); + $pm->addChild('description', $this->get_feature_description($fname, $attributes, $description_template, $itens, $itensdesc)); + // Now parse the wkt + if (strpos($wkt, 'MULTILINESTRING') !== false) { + $this->add_multilinestring($wkt, $pm, $featurename, $style_data['icon']); + } elseif (strpos($wkt, 'LINESTRING') !== false) { + $this->add_linestring($wkt, $pm, $featurename, $style_data['icon']); + } elseif (strpos($wkt, 'POINT') !== false) { + $this->add_point($wkt, $pm, $featurename); + } elseif (strpos($wkt, 'MULTIPOLYGON') !== false) { + if (TREAT_POLY_AS_LINE) { + $ml = $pm->addChild('MultiGeometry'); + foreach (split('\), \(', $wkt) as $line) { + $this->add_multilinestring($line, $ml, $featurename); + } + } else { + $this->add_multipolygon($wkt, $pm, $featurename); + } + } elseif (strpos($wkt, 'POLYGON') !== false) { + if (TREAT_POLY_AS_LINE) { + $this->add_multilinestring($wkt, $pm, $featurename); + } else { + $this->add_polygon($wkt, $pm, $featurename); + } + } else { + // Error? + } + return $pm; + } + + /** + * Add a linestring + */ + function add_linestring(&$wkt, &$element, $featurename, $add_points) + { + preg_match('/(\d+[^\(\)]*\d)/', $wkt, $data); + $data = str_replace(', ', '#', $data[1]); + $data = str_replace(' ', ',', $data); + $data = str_replace('#', ' ', $data); + if ($add_points) { + preg_match('/^(\d+\.\d+,\d+\.\d+).*(\d+\.\d+,\d+\.\d+)$/', $data, $points); + if (count($points) == 3) { + $mg = $element->addChild('MultiGeometry'); + $ls = $mg->addChild('LineString'); + $pt1 = $mg->addChild('Point'); + $pt1->addChild('coordinates', $points[1]); + $pt2 = $mg->addChild('Point'); + $pt2->addChild('coordinates', $points[2]); + } else { + die('errore'); + $ls = $element->addChild('LineString'); + } + // print_r($points);die(); + } else { + $ls = $element->addChild('LineString'); + } + $ls->addChild('coordinates', $data); + } + + /** + * Add a multilinestring + */ + function add_multilinestring(&$wkt, &$element, $featurename, $add_points) + { + $ml = $element->addChild('MultiGeometry'); + foreach (split('\), \(', $wkt) as $line) { + $this->add_linestring($line, $ml, $featurename, $add_points); + } + } + + /** + * Add a point + */ + function add_point(&$wkt, &$element, $featurename) + { + $pt = $element->addChild('Point'); + /* + * preg_match('/(\d\.?\d+\s\d+\.?\d+)/', $wkt, $data); + * //var_dump($data);exit; + * $data = str_replace(' ', ',', $data[1]); + */ + $data = str_replace("(", "", $wkt); + $data = str_replace(")", "", $data); + $data = str_replace("POINT", "", $data); + $data = str_replace(" ", ",", trim($data)); + // echo $data;exit; + $pt->addChild('coordinates', $data); + } + + /** + * Add a polygon + */ + function add_polygon(&$wkt, &$element, $featurename) + { + $ml = $element->addChild('Polygon'); + foreach (split('\), \(', $wkt) as $line) { + preg_match('/(\d+[^\(\)]*\d)/', $line, $data); + $data = str_replace(', ', '#', $data[1]); + $data = str_replace(' ', ',', $data); + // Add 1 meter height + $data = str_replace('#', ',1 ', $data) . ',1'; + $ml->addChild('tessellate', 1); + // $element->addChild('altitudeMode', 'relativeToGround'); + $element->addChild('altitudeMode', 'clampToGround'); + $ob = $ml->addChild('outerBoundaryIs'); + $ls = $ob->addChild('LinearRing'); + //a inclusao do - foi necessario pois o sinal nao e mantido no processo. Deve ter uma forma melhor de fazer isso + $ls->addChild('coordinates', "-".$data); + } + } + + /** + * Add a multipolygon + * fixme: untested, should take holes into account + */ + function add_multipolygon(&$wkt, &$element, $featurename) + { + $ml = $element->addChild('MultiGeometry'); + foreach (split('\), \(', $wkt) as $line) { + $this->add_polygon($line, $ml, $featurename); + } + } + + /** + * Get the feature description + */ + function get_feature_description($featurename, $attributes, $description_template, $itens, $itensdesc) + { + // Compute hyperlink + // var_dump($attributes);exit; + // if($description_template != ""){return $description_template;} + $n = ""; + if ($description_template != "") { + foreach ($attributes as $k => $val) { + $description_template = str_replace("%" . $k . "%", $attributes[$k], $description_template); + } + $n = $description_template; + } else { + if ($itens == "") { + foreach ($attributes as $k => $val) { + $n .= $k . " - " . $attributes[$k] . "\n"; + } + } else { + $itens = explode(",", $itens); + $itensdesc = explode(",", $itensdesc); + for ($i = 0; $i < count($itens); $i ++) { + $n .= $itensdesc[$i] . " - " . $attributes[$itens[$i]] . "\n"; + } + } + } + $description = mb_convert_encoding($n, "UTF-8", mb_detect_encoding($n, "UTF-8,ISO-8859-1")); + return $description; + } + + /** + * Parse classes + * + * @return array hash of 'style_id' => style_data) + */ + function parse_classes(&$layer, &$folder, &$namecol, &$title_field, &$description_template) + { + $style_ar = array(); + $numclasses = $layer->numclasses; + $versao = $this->versao(); + $vi = $versao["inteiro"]; + for ($i = 0; $i < $numclasses; $i ++) { + $class = $layer->getClass($i); + if ($vi >= 60200) { + if ($class->numlabels > 0) + $label = $class->getLabel(0); + } else { + $label = $class->label; + } + if ($label) { + $style['label_color'] = $label->color; + $style['label_size'] = $label->size; + } + // Get styles + for ($j = 0; $j < $class->numstyles; $j ++) { + $_style = $class->getStyle($j); + $style['color'] = $_style->color; + $style['outlinecolor'] = $_style->outlinecolor; + $style['width'] = $_style->size; // Lines + $style['backgroundcolor'] = $_style->backgroundcolor; + if ($layer->type == MS_LAYER_POINT) + $style['icon'] = $this->get_icon_url($layer, $class->name, $i); + $style['icon_width'] = $_style->size; // Points + } + $style['expression'] = $class->getExpressionString(); + // Set description_template if any + $style['description_template'] = $description_template; + // Get icon for lines if any + if ($icon = $layer->getMetadata('KML_ADD_POINT')) { + $style['icon'] = $icon; + $style['icon_width'] = 32; + } + // Create style element + $style_id = preg_replace('/[^A-z0-9]/', '_', $layer->name . $class->name); + $this->add_style($layer, $folder, $style_id, $style, $namecol, $title_field); + // create folder if more than one class + if ($numclasses > 1) { + // $style['folder'] =& $class->name; + // $folder->addChild('Folder'); + // $style['folder']->addChild('name', $class->name); + } + $style_ar[$style_id] = $style; + } + return $style_ar; + } + + /** + * Return a CSV list of all layer names in the mapfile + * fixme: filter out ANNOTATIONS and other "strange" layers + */ + function get_layer_list() + { + $layer_list = array(); + for ($i = 0; $i < $this->map_object->numlayers; $i ++) { + $layer = & $this->map_object->getLayer($i); + $kml_skip = $layer->getMetadata('KML_SKIP'); + if (strtolower($kml_skip) !== 'true') { + $layer_list[] = $layer->name; + } + } + return join(',', $layer_list); + } + + /** + * Return the class for the shape, default to last class if not match + */ + function get_shape_class(&$classitem, &$values, &$class_list) + { + // var_dump($class_list); die(); + foreach ($class_list as $style_id => $style_data) { + if ($style_data['expression'] && preg_match($style_data['expression'], $values[$classitem])) { + // print "get_shape_class($classitem) ".$values[$classitem]." matches
"; + return $style_id; + } + } + // print "get_shape_class($classitem) ".$values[$classitem]." no matches
"; + return $style_id; + } + + /** + * Add the style + * + * @return the style URL + */ + function add_style(&$layer, &$folder, $style_id, &$style_data) + { + // Calculare style URL + if ($style_data['description_template']) { + $this->style_counter ++; + $style_id .= '_' . $this->style_counter; + $balloon_data = $this->get_feature_description($attributes[$namecol], $attributes, $style_data['description_template']); + } + + // Check if the style already exists + $expr = '//*[@id=\'' . $style_id . '\']'; + if ($folder->xpath($expr)) { + return $style_id; + } + $new_style = & $folder->addChild('Style'); + $new_style['id'] = $style_id; + // Switch layer type + switch ($layer->type) { + case MS_LAYER_POINT: + $this->add_style_point($new_style, $style_data); + break; + case MS_LAYER_POLYGON: + $this->add_style_polygon($new_style, $style_data); + break; + case MS_LAYER_LINE: + $this->add_style_line($new_style, $style_data); + // Add KML_ADD_POINT icon + if ($style_data['icon']) { + $this->add_style_point($new_style, $style_data); + } + break; + } + return $style_id; + } + + /** + * Add style for lines + */ + function add_style_line(&$new_style, &$style_data) + { + if ($style_data['outlinecolor']->red != - 1) { + $st = & $new_style->addChild('LineStyle'); + $st->addChild('color', sprintf('FF%02X%02X%02X', $style_data['outlinecolor']->blue, $style_data['outlinecolor']->green, $style_data['outlinecolor']->red)); + if ($width) { + $st->addChild('width', $width); + } + } elseif ($style_data['color']->red != - 1) { + $st = & $new_style->addChild('LineStyle'); + $st->addChild('color', sprintf('FF%02X%02X%02X', $style_data['color']->blue, $style_data['color']->green, $style_data['color']->red)); + if ($width) { + $st->addChild('width', $width); + } + } + } + + /** + * Add style for points + */ + function add_style_point(&$new_style, &$style_data) + { + if ($style_data['icon']) { + $st = & $new_style->addChild('IconStyle'); + if ($style_data['width'] && $style_data['icon_width'] != 32) { + /** + */ + // $st->addChild('scale', $style_data['icon_width'] / 32); + $st->addChild('scale', 1); + } else { + $st->addChild('scale', 1); + } + $icon = & $st->addChild('Icon'); + $icon->addChild('href', htmlentities($style_data['icon'])); + } + $ls = & $new_style->addChild('LabelStyle'); + $ls->addChild('scale', $style_data['label_size'] / 32); + // Add the balloon style if description_template is set + /* + * if($style_data['description_template']){ + * $this->add_balloon_style($new_style, $balloon_data); + * } + */ + // Label size and color + /* + * if($style_data['label_size'] || $style_data['label_color']){ + * $ls =& $new_style->addChild('LabelStyle'); + * if($style_data['label_size'] != -1 && $style_data['label_size'] != 32){ + * $ls->addChild('scale', $style_data['label_size'] / 32); + * } + * if($style_data['label_color']->red != -1){ + * $ls->addChild('color', sprintf('FF%02X%02X%02X', $style_data['label_color']->blue, $style_data['label_color']->green, $style_data['label_color']->red)); + * } + * } + */ + } + + /** + * Add style for polygons + */ + function add_style_polygon(&$new_style, &$style_data) + { + // Get also outline styles + $this->add_style_line($new_style, $style_data); + $st = & $new_style->addChild('PolyStyle'); + // die(print_r($backgroundcolor, true)); + if ($style_data['color']->red != - 1) { + $st->addChild('color', sprintf('FF%02X%02X%02X', $style_data['color']->blue, $style_data['color']->green, $style_data['color']->red)); + $st->addChild('fill', 1); + } else { + $st->addChild('fill', 0); + } + $st->addChild('outline', 1); + } + + /** + * Add a WMS raster link + */ + function add_wms_link(&$folder, &$layer, &$link) + { + // Build up the KML response document. + // $icon =& $folder->addChild('Icon'); + $icon = & $this->simplexml_addChild($folder, 'Icon'); + // $icon->addChild('href', $link . 'layers=' . $layer->name); + $this->simplexml_addChild($icon, 'href', $link . 'layers=' . $layer->name); + // $icon->addChild('viewRefreshMode', 'onStop'); + $this->simplexml_addChild($icon, 'viewRefreshMode', 'onStop'); + // $llbox =& $folder->addChild('LatLonBox'); + $llbox = & $this->simplexml_addChild($folder, 'LatLonBox'); + $ext = $this->map_object->extent; + $ext->project($this->in_proj, $this->out_proj); + // $llbox->north = $ext->maxy; + $this->simplexml_addChild($llbox, 'north', $ext->maxy); + // $llbox->south = $ext->miny; + $this->simplexml_addChild($llbox, 'south', $ext->miny); + // $llbox->east = $ext->maxx; + $this->simplexml_addChild($llbox, 'east', $ext->maxx); + // $llbox->west = $ext->minx; + $this->simplexml_addChild($llbox, 'west', $ext->minx); + // Reset original projection + $ext->project($this->out_proj, $this->in_proj); + } + + /** + * Get the url for a point icon + */ + function get_icon_url($layer, $classname, $classindex) + { + $classe = $layer->getclass($classindex); + $estilo = $classe->getstyle(0); + $url = ""; + $imageObj = $classe->createLegendIcon(30, 30); + if ($imageObj) { + $url = $imageObj->saveWebImage(); + $protocolo = explode("/", $_SERVER['SERVER_PROTOCOL']); + $url = strtolower($protocolo[0] . "://" . $_SERVER['HTTP_HOST']) . $url; + $nome = $imageObj->imagepath . basename($url); + + $img = imagecreatefrompng($nome); + $index = imagecolorexact($img, 255, 255, 255); + imagecolortransparent($img, $index); + imagepng($img, $nome); + } + return $url; // $this->endpoint . '?service=icon&map=' . $this->map . '&typename=' . urlencode($layer->name) . '&classname=' . urlencode($classname); + } + + /** + * Get the layer description + */ + function get_layer_description(&$layer) + { + $description = $layer->getMetadata('DESCRIPTION'); + if (! $description) { + $description = $layer->getMetadata('OWS_TITLE'); + } + if (! $description) { + $description = $layer->getMetadata('WFS_TITLE'); + } + if (! $description) { + $description = $layer->getMetadata('WMS_TITLE'); + } + if (! $description) { + $description = $layer->getMetadata('TEMA'); + } + if (! $description) { + $description = $layer->name; + } + $description = mb_convert_encoding($description, "UTF-8", mb_detect_encoding($description, "UTF-8,ISO-8859-1")); + return $description; + } + + /** + * Add style for balloon + * + * @param + * string style XML id + * @param + * string column name for title + */ + function add_balloon_style(&$style, $balloon_data) + { + $balloon = & $style->addChild('BalloonStyle'); + $balloon->addChild('text', htmlentities($balloon_data)); + } + + /** + * Get a request parameter + * + * @param string $name + * @param string $default + * parameter optional + * @return string the parameter value or empty string if null + */ + function load_parm($name, $default = '') + { + if (! isset($_REQUEST[$name])) + return $default; + $value = $_REQUEST[$name]; + if (get_magic_quotes_gpc() != 1) + $value = addslashes($value); + // $value = escapeshellcmd($value); + return $value; + } + + /** + * Set error message + * + * @param string $message + * @param string $layer + * name + */ + function set_error($message, $layer = 'Error') + { + $this->errors[$layer][] = $message; + } + + /** + * Load the map and create the map instance + */ + function load_map() + { + if (! file_exists($this->map) && is_readable($this->map)) { + $this->set_error('Cannot read mapfile ' . $this->map); + } else { + $protocolo = explode("/", $_SERVER['SERVER_PROTOCOL']); + $servidor = strtolower($protocolo[0]) . "://" . $_SERVER['HTTP_HOST']; + $temp = $this->map; + if (file_exists(dirname(__FILE__) . "/../../../ms_configura.php")) { + include (dirname(__FILE__) . "/../../../ms_configura.php"); + } else { + include (dirname(__FILE__) . "/../../ms_configura.php"); + } + $this->postgis_mapa = $postgis_mapa; + if (! file_exists($this->map)) { + $maptemp = ms_newMapObj($locaplic . "/temas/" . $this->map . ".map"); + // if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) + // {$this->map = $locaplic."/aplicmap/geral1windows.map";} + // else + // {$this->map = $locaplic."/aplicmap/geral1.map";} + + $versao = $this->versao(); + $versao = $versao["principal"]; + if (! isset($base) || $base == "") { + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) { + $base = $locaplic . "/aplicmap/geral1windowsv" . $versao . ".map"; + } else { + if ($base == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv' . $versao . '.map')) { + $base = "/var/www/i3geo/aplicmap/geral1debianv" . $versao . ".map"; + } + if ($base == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav' . $versao . '.map')) { + $base = "/var/www/html/i3geo/aplicmap/geral1fedorav" . $versao . ".map"; + } + if ($base == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav' . $versao . '.map')) { + $base = "/opt/www/html/i3geo/aplicmap/geral1v" . $versao . ".map"; + } + if ($base == "") { + $base = $locaplic . "/aplicmap/geral1v" . $versao . ".map"; + } + } + } + $this->map = $base; + + $this->map_object = ms_newMapObj($this->map); + if (! $this->_zipped) { + $this->map_object->setmetadata('wms_onlineresource', $servidor . ":80/i3geo/ogc.php?tema=" . $temp . "&width=1500&height=1500&TRANSPARENT=true&FORMAT=image/png&"); + $this->map_object->setmetadata("ows_enable_request", "*"); + } + $n = $this->map_object->numlayers; + for ($i = 0; $i < $n; $i ++) { + $l = $this->map_object->getlayer($i); + $l->set("status", MS_DELETE); + $l->set("name", ""); + } + for ($i = 0; $i < ($maptemp->numlayers); $i ++) { + $l = $maptemp->getlayer($i); + $l->set("status", MS_DEFAULT); + if (! $this->_zipped) { + $l->set("type", MS_LAYER_RASTER); + $l->setmetadata('wms_onlineresource', "../../ogc.php?tema=" . $temp . "&width=1500&height=1500&TRANSPARENT=true&FORMAT=image/png&"); + $l->setmetadata("ows_enable_request", "*"); + } + ms_newLayerObj($this->map_object, $l); + } + } else { + $this->map_object = ms_newMapObj($this->map); + // $w = $this->map_object->web; + // $w->set("template","none.htm"); + + if (! $this->_zipped) { + // $this->map_object->setmetadata('wms_onlineresource',$servidor.":80".$locmapserv."?map=".$temp."&width=1500&height=1500&"); + $this->map_object->setmetadata('wms_onlineresource', "../../ogc.php?tema=" . $temp . "&width=1500&height=1500&TRANSPARENT=true&FORMAT=image/png&"); + $this->map_object->setmetadata("ows_enable_request", "*"); + } + $n = $this->map_object->numlayers; + for ($i = 0; $i < $n; $i ++) { + $l = $this->map_object->getlayer($i); + $l->set("status", MS_DEFAULT); + if (! $this->_zipped) + $l->set("type", MS_LAYER_RASTER); + // $l->setmetadata('wms_onlineresource',"../../ogc.php?tema=".$temp."&width=500&height=500&"); + // ms_newLayerObj($this->map_object, $l); + } + } + if (! $this->map_object) { + $this->set_error('Cannot load mapfile ' . $this->map); + } + } + } + + /** + * Test if has errors + * + * @return boolean + */ + function has_error() + { + return count($this->errors) > 0; + } + + /** + * Add error messages to folders TAGS + */ + function add_errors() + { + foreach ($this->errors as $layer => $errors) { + $folder = & $this->_xml->Document->addChild('Folder'); + $folder->addChild('name', $layer); + $folder->addChild('description', '

' . join("

\n

", $errors) . "

"); + } + return $errorxml; + } + + /** + * Fetch XML and format it + */ + function get_kml() + { + $doc = new DOMDocument('1.0'); + $doc->formatOutput = true; + $domnode = dom_import_simplexml($this->_xml); + $domnode = $doc->importNode($domnode, true); + $domnode = $doc->appendChild($domnode); + return $doc->saveXML(); + } + + /** + * Send header + */ + function send_header() + { + header('Content-Disposition: attachment; filename=kml.km' . ($this->_zipped ? 'z' : 'l')); + header('Content-type: application/vnd.google-earth.km' . ($this->_zipped ? 'z' : 'l') . '+XML'); + } + + /** + * Calculate cache file name + */ + function get_cache_file_name() + { + // obtem o arquivo do metadata do layer se existir + $layer = @$this->map_object->getlayerbyname($this->typename); + if (! $layer) { + $layer = $this->map_object->getlayer(0); + } + $k = $layer->getmetadata("arquivokmz"); + if ($k != "") { + return $k; + } + if (file_exists(dirname(__FILE__) . "/../../../ms_configura.php")) { + include (dirname(__FILE__) . "/../../../ms_configura.php"); + } else { + include (dirname(__FILE__) . "/../../ms_configura.php"); + } + return $dir_tmp . '/' . md5($_SERVER['QUERY_STRING']) . ($this->_zipped ? '.kmz' : '.kml'); + } + + /** + * Send stream + */ + function send_stream($data) + { + $this->send_header(); + // Compress data + + if ($this->_zipped) { + include ("zip.class.php"); + $ziper = new zipfile(); + $ziper->addFile($data, 'doc.kml'); + $data = $ziper->file(); + } + + // Create cache if needed + if (ENABLE_CACHE && count($this->layers) == 1) { + // error_log( 'creating cache ' . $this->get_cache_file_name() ); + file_put_contents($this->get_cache_file_name(), $data); + } + print $data; + exit(); + } + + // phpversion <= 5.1.2 + function simplexml_addChild($parent, $name, $value = '') + { + $new_child = new SimpleXMLElement("<$name>$value"); + $node1 = dom_import_simplexml($parent); + $dom_sxe = dom_import_simplexml($new_child); + $node2 = $node1->ownerDocument->importNode($dom_sxe, true); + $node1->appendChild($node2); + return simplexml_import_dom($node2); + } + + function versao() + { + $v = "5.0.0"; + $vs = explode(" ", ms_GetVersion()); + $cvs = count($vs); + for ($i = 0; $i < $cvs; ++ $i) { + if (trim(strtolower($vs[$i])) == "version") { + $v = $vs[$i + 1]; + } + } + $versao["completa"] = $v; + $v = explode(".", $v); + $versao["principal"] = $v[0]; + $versao["inteiro"] = ms_GetVersionInt(); + return $versao; + } } ?> diff --git a/pacotes/kmlmapserver/kmlservice.php b/pacotes/kmlmapserver/kmlservice.php index a993611..4c6c227 100755 --- a/pacotes/kmlmapserver/kmlservice.php +++ b/pacotes/kmlmapserver/kmlservice.php @@ -26,6 +26,7 @@ http://10.1.1.34:80/i3geo/pacotes/kmlmapserver/kmlservice.php?map=bioma&typename */ error_reporting(0); set_time_limit(0); +//error_log($_SERVER['QUERY_STRING']); //para o caso do mapa ser o que esta em uso if(!empty($_GET["sid"])){ session_name("i3GeoPHP"); -- libgit2 0.21.2