postgis_mapa = $postgis_mapa; $map_file = str_replace(".map","",$map_file).".map"; $this->qyfile = str_replace(".map",".qy",$map_file); $this->arquivo = $map_file; if(file_exists($locaplic."/funcoes_gerais.php")) include_once($locaplic."/funcoes_gerais.php"); else include_once("funcoes_gerais.php"); $this->v = versao(); $this->vi = $this->v["inteiro"]; $this->v = $this->v["principal"]; $this->locaplic = $locaplic; if($map_file != "") { $this->mapa = ms_newMapObj($map_file); substituiConObj($this->mapa,$postgis_mapa); $this->arquivo = $map_file; if($tema != "") { $listaTemas = str_replace(" ",",",$tema); $listaTemas = explode(",",$tema); foreach ($listaTemas as $tema){ $this->layer = $this->mapa->getlayerbyname($tema); $this->nome = $tema; $vermultilayer = new vermultilayer(); $vermultilayer->verifica($map_file,$tema); if ($vermultilayer->resultado == 1) // o tema e multi layer {$ls = $vermultilayer->temas;} else {$ls[] = $tema;} $this->grupo = $ls; $this->visiveis = $vermultilayer->temasvisiveis; foreach ($ls as $l) { $t = $this->mapa->getlayerbyname($l); $this->indices[] = $t->index; } } } if($ext && $ext != ""){ $e = explode(" ",$ext); $extatual = $this->mapa->extent; $extatual->setextent((min($e[0],$e[2])),(min($e[1],$e[3])),(max($e[0],$e[2])),(max($e[1],$e[3]))); } } } /* function: salva Salva o mapfile atual */ function salva() { restauraConObj($this->mapa,$this->postgis_mapa); $this->mapa->save($this->arquivo); } /* function: pegaMetadata Pega os metadata do tema parameter: */ function pegaMetadata(){ if(!$this->layer){return "erro";} $buscar = array("METAESTAT","METAESTAT_ID_MEDIDA_VARIAVEL"); $meta = array(); foreach($buscar as $b){ $meta[$b] = $this->layer->getmetadata($b); } return array( $this->layer->name => $meta ); } /* function: aplicaProcessos Aplica processos em um tema do tipo imagem parameter: $lista - lista de processos separados por | */ function aplicaProcessos($lista) { if(!$this->layer){return "erro";} if ($this->layer->num_processing > 0) {$this->layer->clearProcessing();} //$lista = str_replace('"',"",$lista); $lista = explode("|",$lista); foreach ($lista as $processo) { $this->layer->setprocessing($processo); $this->layer->setMetaData("cache",""); } return("ok"); } /* function: gravaImagemCorpo (depreciado) Grava a imagem do mapa atual return: Nome da imagem gravada */ function gravaImagemCorpo() { $imgo = $this->mapa->draw(); $nome = ($imgo->imagepath).nomeRandomico().".png"; $imgo->saveImage($nome); return ($imgo->imageurl).basename($nome); } /* function: geraDestaque Gera uma imagem para destaque. Gera a imagem desenhando apenas um tema na resolução atual. */ function geraDestaque() { desligatemas($this->mapa); foreach ($this->grupo as $l) { $l = $this->mapa->getlayerbyname($l); $l->set("status",MS_DEFAULT); } $i = gravaImagemMapa($this->mapa); return $i["url"]; } /* function: alteraRepresentacao Altera a representacao de um tema. Temas poligonais são transformados em lineares, e lineares em poligonais. A mudança é feita apenas na representação do layer. */ function alteraRepresentacao() { $retorno = "ok"; foreach ($this->grupo as $l) { $l = $this->mapa->getlayerbyname($l); if (($l->type == 1) || ($l->type == MS_LAYER_LINE)) //se for do tipo linear {$l->set("type",MS_LAYER_POLYGON);} elseif (($l->type == 2) || ($l->type == MS_LAYER_POLYGON)) //se for do tipo poligonal {$l->set("type",MS_LAYER_LINE);} if (($l->type < 1) || ($l->type > 2)) {$retorno = "erro. O tipo desse tema nao pode ser alterado";} if ($this->layer) { $this->layer->setMetaData("cache",""); } } return $retorno; } /* function: desceTema Desce um tema na ordem de desenho. Altera a ordem de armazenamento dos layers no mapfile. */ function desceTema() { if (file_exists($this->qyfile)) {unlink ($this->qyfile);} $nl = $this->mapa->numlayers; $mover = 1; $indice = $this->indices[0]; if ($indice < $nl) { $conta = $indice - 1; $tmpl = $this->mapa->getlayer($conta); if (($tmpl->getmetadata("escondido") != "")) { $mover = $mover + 1; $conta = $conta - 1; } $tmpl = $this->mapa->getlayer($conta); if (($tmpl->group) <> "") { $gr = $tmpl->group; $conta = $conta - 1; $tmpl = $this->mapa->getlayer($conta); while($gr == $tmpl->group) { $mover= $mover + 1; $conta = $conta - 1; $tmpl = $this->mapa->getlayer($conta); } } } foreach ($this->indices as $indice) { for ($i=0;$i<$mover;++$i) {$moveu = $this->mapa->moveLayerUp($indice);} } if ($moveu == MS_TRUE) {return "ok";} else {return "erro. Nao foi possivel mover o tema";} } /* function: sobeTema Sobe um tema na ordem de desenho. Altera a ordem de armazenamento dos layers no mapfile. */ function sobeTema() { if (file_exists($this->qyfile)) {unlink ($this->qyfile);} $nl = $this->mapa->numlayers; $mover = 1; $indices = array_reverse($this->indices); $indice = $indices[0]; if ($indice < ($nl - 1)) { $conta = $indice + 1; $tmpl = $this->mapa->getlayer($conta); if (($tmpl->getmetadata("escondido") != "")) { $mover = $mover + 1; $conta = $conta + 1; } $tmpl = $this->mapa->getlayer($conta); if (($tmpl->group) <> "") { $gr = $tmpl->group; $conta = $conta + 1; $tmpl = $this->mapa->getlayer($conta); while($gr == $tmpl->group) { $mover= $mover + 1; $conta = $conta + 1; $tmpl = $this->mapa->getlayer($conta); } } } foreach ($indices as $indice) { for ($i=0;$i<$mover;++$i) {$moveu = $this->mapa->moveLayerDown($indice);} } if ($moveu == MS_TRUE) {return "ok";} else {return "erro. Nao foi possivel mover o tema";} } /* function: reordenatemas Reordena os temas baseados em uma lista com a nova ordem. Parametros: lista - lista com a nova ordem para os temas. A lista contém os nomes dos temas separados por vírgula. */ function reordenatemas($lista) { $nlayers = $this->mapa->numlayers; $lista = explode(",",$lista); $lista = array_reverse($lista); $novaordem = array(); foreach ($lista as $l) { for ($i=0;$i<$nlayers;++$i) { $la = $this->mapa->getlayer($i); if($la->getmetadata("escondido") != "") { if (!in_array($la->index,$novaordem)) $novaordem[] = $i; } else { $g = strtoupper($la->group); $n = strtoupper($la->name); if ((strtoupper($l) == $n) || (strtoupper($l) == $g)) {$novaordem[] = $i;} } } } for ($i=0;$i<$nlayers;++$i) { if (!in_array($i,$novaordem)) {$novaordem[] = $i;} } //echo "
";
		//var_dump($novaordem);
		$this->mapa->setlayersdrawingorder($novaordem);
		return "ok";
	}

/*
function: zoomTema

Zoom para um tema.

Calcula a extensão geográfica de um tema e ajusta o mapa para essa extensão.
*/
	function zoomTema()
	{
		if(!$this->layer){return "erro";}
		if($this->mapa->getmetadata("interface") == "googlemaps"){
			$projO = $this->mapa->getProjection();
			$this->mapa->setProjection(pegaProjecaoDefault("proj4"));
		}
		$prjMapa = "";
		$prjTema = "";
		if($this->layer->type != MS_LAYER_RASTER){
			$prjMapa = $this->mapa->getProjection();
			$prjTema = $this->layer->getProjection();
		}
		$extatual = $this->mapa->extent;
		$ret = $this->layer->getmetadata("extensao");
		//
		//necessário para evitar que em qualquer redesenho do mapa, seja aplicado o zoom para o tema marcado com aplicaextensao
		//
		$this->layer->setmetadata("aplicaextensao","");
		if($ret == "" && $this->layer->type == MS_LAYER_RASTER){
			$ret = "-75.233614607 -33.7515829981 -27.592958622 5.272156";
		}
		if ($ret == ""){
			$ret = $this->layer->getextent();
			//reprojeta o retangulo
			if (($prjTema != "") && ($prjMapa != $prjTema))
			{
				$projInObj = ms_newprojectionobj($prjTema);
				$projOutObj = ms_newprojectionobj($prjMapa);
				$ret->project($projInObj, $projOutObj);
			}
			$extatual->setextent($ret->minx,$ret->miny,$ret->maxx,$ret->maxy);
		}
		else{
			$ret = explode(" ",$ret);
			$extatual->setextent($ret[0],$ret[1],$ret[2],$ret[3]);
			//echo "oi";exit;
		}
		if($this->mapa->getmetadata("interface") == "googlemaps"){
			$this->mapa->setProjection($projO);
		}
		return("ok");
	}
/*
function: pegaFiltro

Pega o filtro de um tema.

return:
string Filtro.
*/
	function pegaFiltro()
	{
		if(!$this->layer){return "erro";}
		$fil = $this->layer->getfilterstring();
		if ($this->layer->getfilterstring() == '"(null)"'){return " ";}
		if (function_exists("mb_convert_encoding"))
		{return (mb_convert_encoding($this->layer->getfilterstring(),"HTML-ENTITIES","auto"));}
		else
		{return ($this->layer->getfilterstring());}
	}
/*
function: insereFiltro

Inclui um filtro no tema.

parameters:

$filtro - string com o filtro. As aspas simples devem ser substituídas por |.

$testa - Testa o filtro e retorna uma imagem.
*/
	function insereFiltro($filtro,$testa="",$base64="nao")
	{
		if($base64 == "sim"){
			//$filtro = base64_decode($filtro);
		}
		foreach($this->indices as $indice){
			$layer = $this->mapa->getlayer($indice);
			$items = pegaItens($layer);
			if(!$layer){return "erro";}
			$layer->setmetadata("cache","");
			$fil = $layer->getFilterString();
			$filtro = str_replace("|","'",$filtro);
			if ($layer->connectiontype == MS_POSTGIS){
				$filtro = str_replace("'[","",$filtro);
				$filtro = str_replace("[","",$filtro);
				$filtro = str_replace("]'","",$filtro);
				$filtro = str_replace("]","",$filtro);
				$filtro = str_replace("("," ",$filtro);
				$filtro = str_replace(")"," ",$filtro);
			}
			if ($filtro == ""){
				$layer->setfilter($filtro);
			}
			else{
				//testa o filtro
				$teste = $layer->querybyattributes($items[0],$filtro,1);
				if($teste != MS_SUCCESS){
					$teste = $this->layer->queryByAttributes($items[0], mb_convert_encoding($filtro,"ISO-8859-1","UTF-8"), 1);
					if($teste != MS_SUCCESS){
						$teste = $this->layer->queryByAttributes($items[0], mb_convert_encoding($filtro,"UTF-8","ISO-8859-1"), 1);
						$filtro =  mb_convert_encoding($filtro,"UTF-8","ISO-8859-1");
					}
					else{
						$filtro = mb_convert_encoding($filtro,"ISO-8859-1","UTF-8");
					}
				}
				if($teste == MS_SUCCESS){
					$layer->setfilter($filtro);
				}
				$v = versao();
				//corrige bug do mapserver
				if (($v["completa"] == "4.10.0") && ($layer->connectiontype == MS_POSTGIS)){
					$layer->setfilter("\"".$filtro."\"");
				}
			}
			if ($testa == ""){
				$layer->setMetaData("cache","");
			}
		}
		if ($testa != ""){
			$i = gravaImagemMapa($this->mapa);
			return ($i["url"]);
		}
		return "ok";
	}
/*
function: mudaTransparencia

Muda a transparência do tema.

parameter:
$valor - Novo valor da transparência
*/
	function mudaTransparencia($valor){
		$v = versao();
		foreach ($this->grupo as $lg){
			$ll = $this->mapa->getlayerbyname($lg);
			$ll->setmetaData("cache","");
			if($this->v == 4){
				$ll->set("transparency",$valor);
				return("ok");
			}
			if($this->v < 7){
				$ll->set("opacity",$valor);
				return("ok");
			}
			if($this->v >= 7){
				//$ll->composite->opacity = $valor;
				//$ll->set("opacity",$valor);
				//$ll->updateFromString('LAYER COMPOSITE OPACITY '.$valor.'END END');
				$numclasses = $ll->numclasses;
				for($i=0;$i<$numclasses;++$i){
					$classe = $this->layer->getclass($i);
					$numestilos = $classe->numstyles;
					for($j=0;$j<$numestilos;++$j){
						$estilo = $classe->getstyle($j);
						$estilo->set("opacity",$valor);
					}
				}
				return("ok");
			}
		}
	}
/*
function: inverteStatusLegenda

Muda o metadata CLASSE, invertendo seu valor

*/
	function inverteStatusLegenda()
	{
				//error_reporting(0);
		$valor = $this->layer->getmetadata("classe");
		if($valor == "" || strtolower($valor) == "sim")
		{$valor = "NAO";}
		else
		{$valor = "SIM";}
		foreach ($this->grupo as $lg)
		{
			$ll = $this->mapa->getlayerbyname($lg);
			$ll->setmetaData("classe",$valor);
		}
		return("ok");
	}
/*
function: mudaNome

Muda nome do tema.

paremeter:

$valor - Novo nome.
*/
	function mudaNome($valor)
	{
		$valor = str_replace("*","&",$valor);
		$valor = str_replace("|",";",$valor);
		$valor = html_entity_decode($valor);

		foreach ($this->grupo as $lg)
		{
			$ll = $this->mapa->getlayerbyname($lg);
			$meta = $ll->getmetadata("tema");
			if (($meta != "") && ($meta != "NAO"))
			{$ll->setmetadata("tema",$valor);}
		}
		return ("ok");
	}
/*
function: copiaTema

Copia um tema

*/
	function copiaTema()
	{
		foreach ($this->grupo as $lg){
			$ll = $this->mapa->getlayerbyname($lg);
			$layer = ms_newLayerObj($this->mapa, $ll);
			$layer->setmetadata("nomeoriginal",$ll->getmetadata("nomeoriginal"));
			$meta = $layer->getmetadata("tema");
			if (($meta != "") && ($meta != "NAO")){
				$layer->setmetadata("tema","Copia de ".$meta);
			}
			$layer->setmetadata("cache","");
			$novoname = "copia".nomerandomico();
			$layer->set("name",$novoname);
		}
		return ("ok");
	}
/*
function: insereFeature

Insere elemento gráfico em um tema.

parameters:

$marca - nome do símbolo que será utilizado

$tipo - Tipo de elemento GRAFICOPIZZA|POLYGON|LINE|POINT|ANNOTATION|limpaponto.

$xy - Pares de coordenadas separadas por espaço.

$texto - Texto que será inserido, no caso do tipo ANNOTATION.

$position - Posição da âncora do texto.

$partials - Corta texto nas bordas do mapa.

$offsetx - Deslocamento em X.

$offsety - Deslocamento em Y.

$minfeature - Tamanho mínimo que o texto deve ter.

$mindistance - Distância mínima entre os textos.

$force - Força colisão.

$shadowcolor - Cor da sombra.

$shadowsizex - Tamanho em X da sombra.

$shadowsizey - Tamanho em Y da sombra.

$outlinecolor - Cor do contorno.

$cor - Cor do texto.

$sombray - Deslocamento Y da sombra.

$sombrax - Deslocamento X da sombra.

$sombra - Inclui sombra.

$fundo - Cor do fundo.

$angulo - Ângulo do texto.

$tamanho - Tamanho do texto.

$fonte - Fonte

$wrap - caractere que indica quebra de linha

$wkt - boolean indicando se $xy e um WKT
*/
	function insereFeature($marca,$tipo,$xy,$texto,$position,$partials,$offsetx,$offsety,$minfeaturesize,$mindistance,$force,$shadowcolor,$shadowsizex,$shadowsizey,$outlinecolor,$cor,$sombray,$sombrax,$sombra,$fundo,$angulo,$tamanho,$fonte,$wrap,$wkt=false,$nomeTema="")
	{
		//verifica se ja existe um layer criado anteriormente com o mesmo nome e apaga se existir
		if ($tipo == "limpaponto")
		{
			if ($this->layer)
			{
				$this->layer->set("status",MS_DELETE);
				$this->layer->set("name","pindelete");
				$tipo = "POINT";
			}
		}
		if (!$this->layer)
		{
			$pinlayer = criaLayer($this->mapa,MS_LAYER_LINE,MS_DEFAULT,"Ins",$metaClasse="SIM");
			$c = $pinlayer->getclass(0);
			$c->set("name","");
			$e = $c->getstyle(0);
			$e->set("size",1);
			$e->set("symbol","ponto");
			$core = $e->color;
			$core->setrgb(255,0,0);
			if(!isset($cor))
			{$cor = "255 0 0";}
			switch ($tipo)
			{
				case "GRAFICOPIZZA":
					if(!isset($tamanho)){$tamanho = 5;}
					$e->set("size",$tamanho);
					$pinlayer->setmetadata("tema","Pontos inseridos");
					$pinlayer->set("type",MS_LAYER_POINT);
				break;
				case "POINT";
					if ((!isset($marca)) || ($marca=="")){$marca="marca";}
					if(!isset($tamanho)){$tamanho = 5;}
					$e->set("size",$tamanho);
					$e->set("symbolname",$marca);
					corE($e,$cor,"color");
					$pinlayer->setmetadata("tema","Pontos inseridos");
					$pinlayer->set("type",MS_LAYER_POINT);
				break;
				case "LINE":
					if (!isset($marca) || $marca == ""){$marca="linha";}
					if(!isset($tamanho)){$tamanho = 2;}
					$e->set("size",$tamanho);
					$e->set("symbol",$marca);
					if(isset($cor) && $cor != "")
					{corE($e,$cor,"color");}
					if(isset($texto) && $texto != "")
					{$pinlayer->setmetadata("TEMA",$texto);}
					else
					{$pinlayer->setmetadata("tema","Linhas inseridas");}
					$pinlayer->set("type",MS_LAYER_LINE);
				break;
				case "POLYGON":
					if (!isset($marca)){$marca="p9";}
					if(!isset($tamanho)){$tamanho = 5;}
					$e->set("size",$tamanho);
					$e->set("symbol",$marca);
					$pinlayer->setmetadata("tema","Poligonos inseridos");
					$pinlayer->set("type",MS_LAYER_POLYGON);
					$pinlayer->set("opacity","50");
				break;
				case "ANNOTATION":
					//$c->set("status",MS_DELETE);
					$pinlayer->setmetadata("TEMA",$texto);
					$pinlayer->setmetadata("tiles","nao");
					$pinlayer->set("type",MS_LAYER_POINT);
					$pinlayer->set("opacity","100");
				break;
			}
		}
		switch ($tipo)
		{
			case "ANNOTATION":
				$shp = ms_newshapeobj(MS_SHAPE_POINT);
			break;
			case "POINT":
				$shp = ms_newshapeobj(MS_SHAPE_POINT);
			break;
			case "LINE":
				$shp = ms_newshapeobj(MS_SHAPE_LINE);
			break;
			case "POLYGON":
				$shp = ms_newshapeobj(MS_SHAPE_POLYGON);
			break;
		}
		if($wkt == false){
			$apt = explode(" ",$xy);
			$lin = ms_newlineobj();
			for ($i = 0;$i < count($apt); $i = $i + 2){
				$lin->addxy($apt[$i],$apt[$i + 1]);
			}
			$shp->add($lin);
		}
		else{
			$shp = ms_shapeObjFromWkt($xy);
		}
		if($texto != ""){
			$texto = str_replace("*","&",$texto);
			$texto = str_replace("|",";",$texto);
			$shp->set("text",$texto);
			//caso nao seja do tipo annotation
			if($pinlayer->numclasses == 1){
				$novac = $pinlayer->getclass(0);
			}
			else{
				$novac = ms_newclassobj($pinlayer);
			}
			$this->adicionaLabel($novac,$wrap,$fonte,$tamanho,$angulo,$fundo,$sombra,$cor,$outlinecolor,$shadowcolor,$shadowsizex,$shadowsizey,$force,$mindistance,$minfeaturesize,$offsetx,$offsety,$partials,$position,"");
		}

		$pinlayer->addfeature($shp);
		if($nomeTema != ""){
			$pinlayer->setmetadata("tema",$nomeTema);
		}
		//verifica a projecao
		$c = $shp->getCentroid();
		$c = $c->x;
		if($c > -181 && $c < 181){
			$pinlayer->setprojection(pegaProjecaoDefault("proj4"));
		}
		else{
			$pinlayer->setprojection($this->mapa->getProjection());
		}
		return("ok");
	}
/*
function: capturaGeometrias

Captura as geometrias selecionadas e salva em um arquivo texto serializado (analise de geometrias).

parameters:
$dir_tmp - diretório temporário do I3Geo

$imgdir - diretório temporário das imagens do mapa atual

$nome - nome que será dado a geometria
*/
	function capturaGeometrias($dir_tmp,$imgdir,$nome="")
	{
		if(!$this->layer){return "erro";}
		$this->mapa->setsize(30,30);
		$ext = $this->mapa->extent;
		$sb = $this->mapa->scalebar;
		$sb->set("status",MS_OFF);
		$items = pegaItens($this->layer);
		$final["layer"] = pegaNome($this->layer,"UTF-8");
		$shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa);
		$registros = array();
		$i = 0;
		foreach($shapes as $shape)
		{
			$valitem = array();
			foreach ($items as $item)
			{
				$v = trim($shape->values[$item]);
				if (function_exists("mb_convert_encoding"))
				{$v = mb_convert_encoding($v,"UTF-8","ISO-8859-1");}
				$valitem[] = array("item"=>$item,"valor"=>$v);
			}
			$wktgeo=$shape->toWkt();
			if ($wktgeo != "")
			{
				$fechou = $this->layer->close();
				$bounds = $shape->bounds;
				//gera imagem
				$d = 0.01;
				//se for do tipo ponto, faz um deslocamento do extent
				if ($shape->type == 2)
				{$d = 0;}
				$ext->setextent(($bounds->minx) - $d,($bounds->miny) - $d,($bounds->maxx) + $d,($bounds->maxy) + $d);
				$im = gravaImagemMapa($this->mapa);
				$registros[] = array("id"=>$i,"wkt"=>$wktgeo,"valores"=>$valitem,"imagem"=>$im["url"]);
				$abriu = $this->layer->open();
			}
			else{return "erro";}
			$i++;
		}
		$fechou = $this->layer->close();
		if (count($registros) > 0)
		{
			$final["dados"] = $registros;
			//salva arquivo
			$nome == "" ? $nome = nomerandomico(15) : $nome = str_replace(" ","_",$nome);
			$arq = $dir_tmp."/".$imgdir."/".$nome."keo";
			if (file_exists($arq))
			{unlink($arq);}
			$fp = fopen($arq,"w");
			$r = serialize($final);
			fwrite($fp,$r);
			fclose($fp);
		}
		return("ok");
	}
/*
function: listaGeometrias

Lista as geometrias arquivos com extensão geo (análise de geometrias).

parameters:

$dir_tmp - diretório temporário do I3Geo

$imgdir - diretório temporário das imagens do mapa atual
*/
	function listaGeometrias($dir_tmp,$imgdir)
	{
		$resultado = array();
		foreach (glob($dir_tmp."/".$imgdir."/*keo") as $arquivo)
		{
			$handle = fopen ($arquivo, "r");
			$conteudo = fread ($handle, filesize ($arquivo));
			fclose ($handle);
			$final = unserialize($conteudo);
			//var_dump($final);exit;
			$dados = array();
			foreach ($final["dados"] as $d){
				$dados[] = array("id"=>($d["id"]),"valores"=>($d["valores"]),"imagem"=>($d["imagem"]));
			}
			$resultado[] = array("arquivo"=>(basename($arquivo)),"layer"=>$final["layer"],"dados"=>$dados);
		}
		return($resultado);
	}
/*
function: removerGeometrias

Remove os arquivos correspondentes a determinadas geometrias (análise de geometrias).

parameters:
$dir_tmp - diretório temporário do I3Geo

$imgdir - diretório temporário das imagens do mapa atual

$lista - lista com os nomes dos arquivos
*/
	function removerGeometrias($dir_tmp,$imgdir,$lista)
	{
		$lista = explode(",",$lista);
		foreach ($lista as $f)
		{
			if (file_exists($dir_tmp."/".$imgdir."/".$f))
			{unlink ($dir_tmp."/".$imgdir."/".$f);}
		}
		return("ok");
	}
/*
function: graficotema

Gera um tema com gráficos em cada elemento.

parameters:

lista - lista de item e cores de cada parte do grafico

*/
	function graficotema($lista,$tamanho="50",$tipo="PIE",$outlinecolor="",$offset=0, $mesmoTema=false)
	{
		if(!$this->layer){return "erro";}
		$nome = pegaNome($this->layer);
		$novolayer = ms_newLayerObj($this->mapa, $this->layer);
		$nomer = nomeRandomico();
		$novolayer->set("name",$nomer);
		$novolayer->set("group","");
		$novolayer->setmetadata("cache","nao");
		$novolayer->set("type",MS_LAYER_CHART);
		$novolayer->setprocessing("CHART_TYPE=$tipo");
		$novolayer->setprocessing("CHART_SIZE=$tamanho");
		$nclasses = $novolayer->numclasses;
		for ($i=0; $i < $nclasses; ++$i)
		{
			$c = $novolayer->getclass($i);
			$c->set("status",MS_DELETE);
		}
		$novolayer->set("status",MS_DEFAULT);
		$novolayer->setmetadata("tema","grafico de ".$nome);
		$lista = explode("*",$lista);
		foreach($lista as $l)
		{
			$ll = explode(",",$l);
			$novac = ms_newClassObj($novolayer);
			$novac->set("name",$ll[0]);
			$novoestilo = ms_newStyleObj($novac);
			$novoestilo->setBinding(MS_STYLE_BINDING_SIZE, $ll[0]);
			$cor = $novoestilo->color;
			$cor->setrgb($ll[1],$ll[2],$ll[3]);
			if($outlinecolor != "")
			{
				$o = explode(",",$outlinecolor);
				$corl = $novoestilo->outlinecolor;
				$corl->setrgb($o[0],$o[1],$o[2]);
			}
			if($tipo == "PIE")
			$novoestilo->set("offsetx",$offset);
		}
		if($mesmoTema == true){
			$this->layer->set("status",MS_DELETE);
			$novolayer->set("name",$this->layer->name);
			$novolayer->setmetadata("tema",$this->layer->getmetadata("tema"));
		}
	}
/*
function: fonteTema

Retorna o link para a fonte do tema.

parameters:

tema - codigo do tema

*/
	function fonteTema($tema)
	{
		include_once($this->locaplic."/admin/php/xml.php");
		require($this->locaplic."/classesphp/classe_menutemas.php");
			$menutemas = new Menutemas("","","",$this->locaplic);
		$linkfonte = "erro";
		$tipo = "";
		$this->xml = "";
		foreach($menutemas->pegaListaDeMenus() as $menu)
		{
			if(!isset($menu["url"])){$menu["url"] = "";} //para efeitos de compatibilidade entre versões do i3geo
			$ondexml = $menu["arquivo"];
			if($menu["url"] != ""){$ondexml = $menu["url"];}
			$verificaXml = false;
			if($ondexml != "")
			{
				$verificaXml = simplexml_load_file($ondexml);
				if($verificaXml)
				$this->xml[] = $verificaXml;
			}
			else //pega o xml do sistema de administração
			{
				$verificaXml = simplexml_load_string(geraXmlMenutemas(implode(" ",$this->perfil),$menu["idmenu"],$tipo,$this->locaplic));
				if($verificaXml)
				$this->xml[] = $verificaXml;
			}
			if(!$verificaXml)
			$this->xml[] = simplexml_load_string(geraXmlMenutemas(implode(" ",$this->perfil),$menu["idmenu"],$tipo,$this->locaplic));
		}
		foreach ($this->xml as $xml)
		{
			$subgrupo = array();
			foreach($xml->GRUPO as $grupo)
			{
					foreach($grupo->SGRUPO as $sgrupo)
					{
							foreach($sgrupo->TEMA as $t)
							{
								$link = ixml($t,"TLINK");
								$tid = ixml($t,"TID");
								if($tid == $tema)
								{$linkfonte = $link;}
							}
					}
			}
		}
		return ($linkfonte);
	}
/*
function: zoomSel

Zoom para os elementos selecionados de um tema.

Calcula a extensão geográfica dos elementos selecionados de um tema e ajusta o mapa para essa extensão.
*/
	function zoomSel()
	{
		if(!$this->layer){return "erro";}
		if($this->mapa->getmetadata("interface") == "googlemaps"){
			$projO = $this->mapa->getProjection();
			$projecao = pegaProjecaoDefault("epsg");
			$this->mapa->setProjection("init=epsg:".$projecao);
		}
		$extatual = $this->mapa->extent;
		$prjMapa = $this->mapa->getProjection();
		$prjTema = $this->layer->getProjection();
		$shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa);
		$xmin = array();
		$xmax = array();
		$ymin = array();
		$ymax = array();
		foreach($shapes as $shape)
		{
			$bound = $shape->bounds;
			$xmin[] = $bound->minx;
			$xmax[] = $bound->maxx;
			$ymin[] = $bound->miny;
			$ymax[] = $bound->maxy;
		}
		$ret = ms_newRectObj();
		$ret->set("minx",min($xmin));
		$ret->set("miny",min($ymin));
		$ret->set("maxx",max($xmax));
		$ret->set("maxy",max($ymax));
		if (($prjTema != "") && ($prjMapa != $prjTema))
		{
			$projInObj = ms_newprojectionobj($prjTema);
			$projOutObj = ms_newprojectionobj($prjMapa);
			$ret->project($projInObj, $projOutObj);
		}
		$extatual->setextent($ret->minx,$ret->miny,$ret->maxx,$ret->maxy);
			if($this->mapa->getmetadata("interface") == "googlemaps")
		{$this->mapa->setProjection($projO);}
		return("ok");
	}
/*
function: sld

Retorna o SLD correspondente a legenda do tema.
*/
	function sld()
	{
		if(!$this->layer){return "erro";}
		$this->layer->set("status",MS_DEFAULT);
		return $this->layer->generateSLD();
	}
/*
function: peganomelayer

Retorna o nome do layer e outros dados relacionados
*/
	function peganomelayer()
	{
		if(!$this->layer){return "erro";}
		$nomeoriginal = $this->layer->getmetadata("nomeoriginal");
		$nomearquivo = $this->locaplic."/temas/".$nomeoriginal;
		if(!file_exists($nomearquivo))
		{$nomearquivo = "";}
		return array("mapfile"=>$this->arquivo,"nomeoriginal"=>$nomeoriginal,"nomelayer"=>$this->layer->name,"nomearquivo"=>$nomearquivo);
	}
/*
function: pegadata

Retorna o valor do elemento DATA
*/
	function pegadata(){
		if(!$this->layer){
			return "erro";
		}
		$metadata = $this->layer->getmetadata("editorsql");
		if(strtolower($metadata) == "sim"){
			return $this->layer->data;
		}
		else{
			return "O layer não permite a alteracao do elemento DATA";
		}
	}
/*
function: alteradata

Altera o valor do elemento DATA
*/
	function alteradata($data,$removemeta="nao") {
		if(!$this->layer){return "erro";}
		$data = str_ireplace("delete","",$data);
		$data = str_ireplace("insert","",$data);
		$data = str_ireplace("update","",$data);
		$data = str_ireplace("create","",$data);
		$data = str_ireplace("alter","",$data);
		$metadata = $this->layer->getmetadata("editorsql");
		if(strtolower($metadata) == "sim"){
			$this->layer->set("data",$data);
			$this->layer->setMetaData("cache","");
			if($removemeta == "sim"){
				$this->layer->setMetaData("itens","");
				$this->layer->setMetaData("itensdesc","");
				$this->layer->setMetaData("itensimg","");
				$this->layer->setMetaData("tips","");
			}
			return $this->layer->data;
		}
		else{
			return "O layer não permite a alteracao do elemento DATA";
		}
	}
/*
function: adicionaLabel

Adiciona LABEL em uma classe de um tema
*/
	function adicionaLabel($novac,$wrap,$fonte,$tamanho,$angulo,$fundo,$sombra,$cor,$outlinecolor,$shadowcolor,$shadowsizex,$shadowsizey,$force,$mindistance,$minfeaturesize,$offsetx,$offsety,$partials,$position,$texto=""){
		if($this->vi >= 60300){
			while($novac->numlabels > 0){
				$novac->removeLabel(0);
			}
		}
		if($texto == ""){
			if($this->vi >= 60300){
				$indiceLabel = $novac->addLabel(new labelObj());
				$label = $novac->getLabel($indiceLabel);
			}
			else{
				$label = $novac->label;
			}
		}
		elseif ($this->vi >= 60300 && $novac->numlabels == 0){
			if($wrap != ""){
				$s = "CLASS LABEL WRAP '$wrap' TEXT '".$texto."' END END";
				$novac->updateFromString($s);
			}
			else{
				$s = "CLASS LABEL TEXT '".$texto."' END END";
				$novac->updateFromString($s);
			}
		}
		if($this->vi >= 60300){
			$label = $novac->getLabel(0);
		}
		else{
			$label = $novac->label;
		}
		if($wrap != ""){
			$label->set("maxlength",1);
		}
		if($fonte != "bitmap")
		{
			//para funcionar na versao 7 do mapserver
			$label->updateFromString("LABEL type truetype END");
			$label->set("font",$fonte);
			$label->set("size",$tamanho);
		}
		else
		{
			//para funcionar na versao 7 do mapserver
			$label->updateFromString("LABEL type bitmap END");
			$t = MS_TINY;
			if ($tamanho > 5 ){
				$t = MS_TINY;
			}
			if ($tamanho >= 7 ){
				$t = MS_SMALL;
			}
			if ($tamanho >= 10 ){
				$t = MS_MEDIUM;
			}
			if ($tamanho >= 12 ){
				$t = MS_LARGE;
			}
			if ($tamanho >= 14 ){
				$t = MS_GIANT;
			}
			$label->set("size",$t);
		}
		$label->set("angle",$angulo);
		corE($label,$fundo,"backgroundcolor");
		corE($label,$sombra,"backgroundshadowcolor",$sombrax,$sombray);
		corE($label,$cor,"color");
		corE($label,$outlinecolor,"outlinecolor");
		corE($label,$shadowcolor,"shadowcolor");
		$label->set("shadowsizex",$shadowsizex);
		$label->set("shadowsizey",$shadowsizey);
		$label->set("force",$force);
		$label->set("mindistance",$mindistance);
		$label->set("minfeaturesize",$minfeaturesize);
		$label->set("offsetx",$offsetx);
		$label->set("offsety",$offsety);
		$label->set("partials",$partials);
		$p = array("MS_AUTO"=>MS_AUTO,"MS_UL"=>MS_UL,"MS_LR"=>MS_LR,"MS_UR"=>MS_UR,"MS_LL"=>MS_LL,"MS_CR"=>MS_CR,"MS_CL"=>MS_CL,"MS_UC"=>MS_UC,"MS_LC"=>MS_LC,"MS_CC"=>MS_CC);
		$label->set("position",$p[$position]);
		if ($this->layer){
			$this->layer->setMetaData("cache","");
		}
	}
	function removeLabel($iclasse){
		$classe = $this->layer->getclass($iclasse);
		while($classe->numlabels > 0){
			$classe->removeLabel(0);
		}
		/*
		$nlabel = $classe->numlabels;
		for($i=0;$i<$nlabel;$i++){
			if($this->vi >= 60200){
				$label = $classe->getLabel($i);
			}
			else{
				$label = $classe->label;
			}
			$label->set("type",MS_TRUETYPE);
			$label->set("font","arial");
			$label->set("size",0);
			$s = "CLASS LABEL TEXT '' END END";
			$classe->updateFromString($s);
		}
		*/
		if ($this->layer){
			$this->layer->setMetaData("cache","");
		}
	}
	function criaCluster ($group = "",$filter = "",$maxdistance=5,$region='rectangle',$buffer=0){
		if($group != ""){
			$group = "('[".$group."]')";
		}
		$cluster = $this->layer->cluster;

		$par = "BUFFER $buffer REGION $region MAXDISTANCE $maxdistance";
		if($group != ""){
			$par .= " GROUP ".$group;
		}
		if($filter != ""){
			$par .= " FILTER ".$filter;
		}
		$cluster->updateFromString("CLUSTER $par END");
		$this->layer->setMetaData("cache","");
		$this->layer->setMetadata("tiles","NAO");
		$this->layer->setMetadata("cortepixels",0);
		//apaga as classes pois nao fazem mais sentido
		if($group == ""){
			$numclasses = $this->layer->numclasses;
			if ($numclasses > 0){
				for ($i=0; $i < $numclasses; ++$i)
				{
					$classe = $this->layer->getClass($i);
					$classe->set("status",MS_DELETE);
				}
			}
			$classe = ms_newClassObj($this->layer);
			$novoestilo = ms_newStyleObj($classe);
			$novoestilo->set("size",6);
			$novoestilo->set("symbolname","ponto");
			$cor = $novoestilo->color;
			$cor->setRGB(255,100,100);
		}
	}
	function removeCluster(){
		$cluster = $this->layer->cluster;
		$this->layer->updatefromstring("LAYER CLUSTER END END");
		$this->layer->setMetaData("cache","");
		$this->layer->setMetadata("tiles","NAO");
		$this->layer->setMetadata("cortepixels",0);
		$numclasses = $this->layer->numclasses;
		if ($numclasses > 0){
			for ($i=0; $i < $numclasses; ++$i)
			{
				$classe = $this->layer->getClass($i);
				$numestilos = $classe->numstyles;
				for($j=0;$j<$numestilos;++$j){
					$estilo = $classe->getstyle($j);
					$estilo->removebinding(MS_STYLE_BINDING_SIZE);
				}
			}
		}
	}
}
?>