From 28be4dfbe83bba5d5ccbbb04ebfcfba59b6bf3a4 Mon Sep 17 00:00:00 2001 From: Edmar Moretti Date: Fri, 21 Aug 2009 15:05:19 +0000 Subject: [PATCH] Implantação de criação automática de classes em layers raster por meio de uma palete de cores. Foram criados novos metadados para definir o arquivo com a palete e foram feitas alterações na função autoclasses. --- admin/js/editormapfile.js | 6 +++++- admin/php/editormapfile.php | 6 +++++- classesphp/funcoes_gerais.php | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------ menutemas/admin.db | Bin 53248 -> 0 bytes symbols/testepalete.txt | 13 +++++++++++++ temas/cinzapalete.map | 19 +++++++++++++++++++ testamapfile.php | 17 +++++++++++++---- 7 files changed, 195 insertions(+), 84 deletions(-) create mode 100644 symbols/testepalete.txt create mode 100644 temas/cinzapalete.map diff --git a/admin/js/editormapfile.js b/admin/js/editormapfile.js index 9fcfb6f..28c8cfe 100644 --- a/admin/js/editormapfile.js +++ b/admin/js/editormapfile.js @@ -782,6 +782,10 @@ function montaEditorMetadados(dados) titulo:"Download",id:"",value:dados.download,tipo:"text",div:"
"}, {ajuda:"Endereço de um arquivo para download dos dados (caminho completo no servidor). Se definido, o sistema irá usar esse arquivo ao invés de gerar os dados, quando o usuário clicar nas opções de download. Se não for definido, o arquivo de download é gerado diretamente do original, convertendo do banco ou copiando o arquivo definido em DATA.", titulo:"Arquivo download",id:"arquivodownload",value:dados.arquivodownload,tipo:"text"}, + {ajuda:"A palete é válida apenas para temas RASTER. Entre com o endereço do arquivo no servidor. Veja exemplo em i3geo/localhost/symbols/testepalete.txt", + titulo:"Arquivo com palete de cores (opcional e serve apenas para temas raster)",id:"palletefile",value:dados.palletefile,tipo:"text"}, + {ajuda:"Quantas cores em cada nível da palete. Veja exemplo em i3geo/localhost/symbols/testepalete.txt", + titulo:"Passo (opcional e serve apenas para temas raster)",id:"palletestep",value:dados.palletestep,tipo:"text"}, {ajuda:"Indica se as classes serão mostradas ou não na legenda. Por padrão é SIM.", titulo:"Classe",id:"",value:dados.classe,tipo:"text",div:"
"}, {ajuda:"Indica se o tema é mostrado no mapa mas não nas listas da legenda e na guia 'temas'", @@ -1142,7 +1146,7 @@ function salvarDadosEditor(tipo,codigoMap,codigoLayer,indiceClasse,indiceEstilo, {alert("Valor de escala incorreto");return;} } - var campos = new Array("arquivodownload","aplicaextensao","classestamanho","classessimbolo","classescor","classesnome","classesitem","mensagem","identifica","extensao","escondido","download","escala","tema","classe","tip","itenslink","itens","itensdesc") + var campos = new Array("palletefile","palettestep","arquivodownload","aplicaextensao","classestamanho","classessimbolo","classescor","classesnome","classesitem","mensagem","identifica","extensao","escondido","download","escala","tema","classe","tip","itenslink","itens","itensdesc") var par = "&codigoMap="+codigoMap+"&codigoLayer="+codigoLayer var prog = "../php/editormapfile.php?funcao=alterarMetadados" } diff --git a/admin/php/editormapfile.php b/admin/php/editormapfile.php index cdee704..88eff00 100644 --- a/admin/php/editormapfile.php +++ b/admin/php/editormapfile.php @@ -529,6 +529,8 @@ function pegaMetadados() $dados["classestamanho"] = $layer->getmetadata("classestamanho"); $dados["aplicaextensao"] = $layer->getmetadata("aplicaextensao"); $dados["arquivodownload"] = $layer->getmetadata("arquivodownload"); + $dados["palletefile"] = $layer->getmetadata("palletefile"); + $dados["palletestep"] = $layer->getmetadata("palletestep"); $dados["codigoMap"] = $codigoMap; $dados["codigoLayer"] = $codigoLayer; $dados["colunas"] = implode(" ,",pegaItens($layer)); @@ -536,7 +538,7 @@ function pegaMetadados() } function alterarMetadados() { - global $arquivodownload,$codigoMap,$codigoLayer,$locaplic,$aplicaextensao,$classestamanho,$classessimbolo,$classescor,$classesnome,$classesitem,$mensagem,$identifica,$extensao,$escondido,$download,$escala,$tema,$classe,$tip,$itenslink,$itens,$itensdesc; + global $palletestep,$palletefile,$arquivodownload,$codigoMap,$codigoLayer,$locaplic,$aplicaextensao,$classestamanho,$classessimbolo,$classescor,$classesnome,$classesitem,$mensagem,$identifica,$extensao,$escondido,$download,$escala,$tema,$classe,$tip,$itenslink,$itens,$itensdesc; $dados = array(); $mapfile = $locaplic."/temas/".$codigoMap.".map"; $mapa = ms_newMapObj($mapfile); @@ -560,6 +562,8 @@ function alterarMetadados() $layer->setmetadata("classestamanho",$classestamanho); $layer->setmetadata("aplicaextensao",$aplicaextensao); $layer->setmetadata("arquivodownload",$arquivodownload); + $layer->setmetadata("palletefile",$palletefile); + $layer->setmetadata("palletestep",$palletestep); $mapa->save($mapfile); removeCabecalho($mapfile); return "ok"; diff --git a/classesphp/funcoes_gerais.php b/classesphp/funcoes_gerais.php index e96a6c8..aed7753 100644 --- a/classesphp/funcoes_gerais.php +++ b/classesphp/funcoes_gerais.php @@ -1972,102 +1972,164 @@ function autoClasses(&$nlayer,$mapa) $nlayer->set("connection",$postgis_mapa); $substituicon = "sim"; } - } - if($nlayer->getmetadata("classesitem") == "") - {return;} - $itemnome = $nlayer->getmetadata("classesnome"); - $itemid = $nlayer->getmetadata("classesitem"); - $itemcor = $nlayer->getmetadata("classescor"); - $itemsimbolo = $nlayer->getmetadata("classesimbolo"); - $itemtamanho = $nlayer->getmetadata("classestamanho"); - $classeoriginal = $nlayer->getclass(0); - // - //pega a extensao geografica que devera ser utilizada + } // - $prjMapa = $mapa->getProjection(); - $prjTema = $nlayer->getProjection(); - $ret = $nlayer->getmetadata("extensao"); - if ($ret == "") + //gera classes automaticamente (temas vetoriais) + if($nlayer->getmetadata("classesitem") != "") { - $ret = $nlayer->getextent(); - //reprojeta o retangulo - if (($prjTema != "") && ($prjMapa != $prjTema)) + $itemnome = $nlayer->getmetadata("classesnome"); + $itemid = $nlayer->getmetadata("classesitem"); + $itemcor = $nlayer->getmetadata("classescor"); + $itemsimbolo = $nlayer->getmetadata("classesimbolo"); + $itemtamanho = $nlayer->getmetadata("classestamanho"); + $classeoriginal = $nlayer->getclass(0); + // + //pega a extensao geografica que devera ser utilizada + // + $prjMapa = $mapa->getProjection(); + $prjTema = $nlayer->getProjection(); + $ret = $nlayer->getmetadata("extensao"); + if ($ret == "") + { + $ret = $nlayer->getextent(); + //reprojeta o retangulo + if (($prjTema != "") && ($prjMapa != $prjTema)) + { + $projInObj = ms_newprojectionobj($prjTema); + $projOutObj = ms_newprojectionobj($prjMapa); + $ret->project($projInObj, $projOutObj); + } + } + else { - $projInObj = ms_newprojectionobj($prjTema); - $projOutObj = ms_newprojectionobj($prjMapa); - $ret->project($projInObj, $projOutObj); + $temp = explode(" ",$ret); + $ret = ms_newRectObj(); + $ret->setextent($temp[0],$temp[1],$temp[2],$temp[3]); + } + // + $sopen = $nlayer->open(); + if($sopen == MS_FAILURE){return "erro";} + + $status = $nlayer->whichShapes($ret); + $parametrosClasses = array(); + if ($status == 0) + { + while ($shape = $nlayer->nextShape()) + { + $id = trim($shape->values[$itemid]); + if (!$parametrosClasses[$id]) + { + $nome = ""; + if($itemnome != "") + $nome = trim($shape->values[$itemnome]); + $cor = ""; + if($itemcor != "") + $cor = explode(",",trim($shape->values[$itemcor])); + if(count($cor) != 3) + $cor = explode(" ",trim($shape->values[$itemcor])); + $tamanho = ""; + if($itemtamanho != "") + $tamanho = trim($shape->values[$itemtamanho]); + $simbolo = ""; + if($itemsimbolo != "") + $simbolo = trim($shape->values[$itemsimbolo]); + $parametrosClasses[$id] = array("nome"=>$nome,"cor"=>$cor,"tamanho"=>$tamanho,"simbolo"=>$simbolo); + } + } + $fechou = $nlayer->close(); + //echo "
";var_dump($parametrosClasses);
+			if (count($parametrosClasses) > 0)
+			{
+				$ids = array_keys($parametrosClasses);
+				for($i=0;$i < count($parametrosClasses);++$i)
+				{
+					$p = $parametrosClasses[$ids[$i]];
+					//echo "
";var_dump($p);
+					$nclasse = ms_newClassObj($nlayer,$classeoriginal);
+					if($p["nome"] != "")
+					$nclasse->set("name",$p["nome"]);
+					$estilo = $nclasse->getstyle(0);
+					if($p["cor"] != "")
+					{
+						$cor = $p["cor"];
+						$ncor = $estilo->color;
+						if($ncor == "")
+						$ncor = $estilo->outlinecolor;
+						$ncor->setrgb($cor[0],$cor[1],$cor[2]);
+					}
+					if($p["tamanho"] != "")
+					$estilo->set("size",$p["tamanho"]);
+					if($p["simbolo"] != "")
+					$estilo->set("symbolname",$p["simbolo"]);
+					$strE = "('[".$itemid."]'eq'".$ids[$i]."')";
+					$nclasse->setexpression($strE);
+				}
+				$classeoriginal->set("status",MS_DELETE);
+			}
 		}
+		if($substituicon == "sim"){$nlayer->set("connection"," ");}
 	}
-	else
+	$pf = $nlayer->getmetadata("palletefile");
+	if($pf != "")
 	{
-		$temp = explode(" ",$ret);
-		$ret = ms_newRectObj();
-		$ret->setextent($temp[0],$temp[1],$temp[2],$temp[3]);
-	}
-	//	
-	$sopen = $nlayer->open();
-	if($sopen == MS_FAILURE){return "erro";}
-
-	$status = $nlayer->whichShapes($ret);
-	$parametrosClasses = array();	
-	if ($status == 0)
-	{	
-		while ($shape = $nlayer->nextShape())
+		if(!file_exists($pf)){return;}
+		$ps = $nlayer->getmetadata("palletesteps");
+		if ($ps == "") $ps=8;
+		//
+		//pega os valores do arquivo
+		//
+		$rules = array();
+		$abre = fopen($pf, "r");
+		$paletteRules = array();
+		while (!feof($abre))
 		{
-			$id = trim($shape->values[$itemid]);
-			if (!$parametrosClasses[$id])
+			$line = trim(fgets($abre));
+			$pos = strpos($line, "#");
+			if ($pos === false || $pos > 0)
 			{
-				$nome = "";
-				if($itemnome != "")
-				$nome = trim($shape->values[$itemnome]);
-				$cor = "";
-				if($itemcor != "")
-				$cor = explode(",",trim($shape->values[$itemcor]));
-				if(count($cor) != 3)
-				$cor = explode(" ",trim($shape->values[$itemcor]));
-				$tamanho = "";
-				if($itemtamanho != "")
-				$tamanho = trim($shape->values[$itemtamanho]);
-				$simbolo = "";
-				if($itemsimbolo != "")
-				$simbolo = trim($shape->values[$itemsimbolo]);
-				$parametrosClasses[$id] = array("nome"=>$nome,"cor"=>$cor,"tamanho"=>$tamanho,"simbolo"=>$simbolo);
+				$paletteEntry = explode(" ",$line);
+				$rules[] = array(
+					"v0" => $paletteEntry[0],
+					"v1" => $paletteEntry[1],
+					"r0" => $paletteEntry[2],
+					"g0" => $paletteEntry[3],
+					"b0" => $paletteEntry[4],
+					"r1" => $paletteEntry[5],
+					"g1" => $paletteEntry[6],
+					"b1" => $paletteEntry[7]
+				);
 			}
 		}
-		$fechou = $nlayer->close();
-		//echo "
";var_dump($parametrosClasses);
-		if (count($parametrosClasses) > 0)
+		fclose($abre);
+		foreach($rules as $rule)
 		{
-			$ids = array_keys($parametrosClasses);
-			for($i=0;$i < count($parametrosClasses);++$i)
+			$delta = ceil(($rule["v1"]-$rule["v0"])/$ps);
+			$legenda=true;
+			for($value=$rule["v0"]; $value<$rule["v1"]; $value+=$delta)
 			{
-				$p = $parametrosClasses[$ids[$i]];
-				//echo "
";var_dump($p);
-				$nclasse = ms_newClassObj($nlayer,$classeoriginal);
-				if($p["nome"] != "")
-				$nclasse->set("name",$p["nome"]);
-				$estilo = $nclasse->getstyle(0);
-				if($p["cor"] != "")
+    			$class = ms_newClassObj($nlayer);
+    			$style = ms_newStyleObj($class);
+				if ($legenda)
 				{
-					$cor = $p["cor"];
-					$ncor = $estilo->color;
-					if($ncor == "")
-					$ncor = $estilo->outlinecolor;
-					$ncor->setrgb($cor[0],$cor[1],$cor[2]);
+					$class->set(name,round($value,0));
+					$legenda=true;
 				}
-				if($p["tamanho"] != "")
-				$estilo->set("size",$p["tamanho"]);
-				if($p["simbolo"] != "")
-				$estilo->set("symbolname",$p["simbolo"]);
-				$strE = "('[".$itemid."]'eq'".$ids[$i]."')";
-				$nclasse->setexpression($strE);
+				$expression="([pixel] > ".round($value,0)." AND [pixel] <= ".round($value+$delta,0).")";
+				$class->setExpression($expression);
+				$rgb=getRGBpallete($rule,$value);
+				$style->color->setRGB($rgb[0],$rgb[1],$rgb[2]);
 			}
-			$classeoriginal->set("status",MS_DELETE);
-		}
+		}	
 	}
-	if($substituicon == "sim"){$nlayer->set("connection"," ");}
 	return;
 }
+function getRGBpallete($rule, $value){
+	$escala=($value-$rule["v0"])/($rule["v1"]-$rule["v0"]);
+	$r=$rule["r0"] + round(($rule["r1"]-$rule["r0"])*$escala, 0);
+	$g=$rule["g0"] + round(($rule["g1"]-$rule["g0"])*$escala, 0);
+	$b=$rule["b0"] + round(($rule["b1"]-$rule["b0"])*$escala, 0);
+	return array($r,$g,$b);
+}
 /*
 Function: removeAcentos
 
diff --git a/menutemas/admin.db b/menutemas/admin.db
index 03ef559..0b3b566 100644
Binary files a/menutemas/admin.db and b/menutemas/admin.db differ
diff --git a/symbols/testepalete.txt b/symbols/testepalete.txt
new file mode 100644
index 0000000..5bcc171
--- /dev/null
+++ b/symbols/testepalete.txt
@@ -0,0 +1,13 @@
+#
+#utilize o formato
+#Z1 Z2 R1 G1 B1 R2 G2 B2
+#
+-3000 -400 150 0 255 0 0 255
+-400 -100 0 0 255 0 100 255
+-100 0 0 100 255 0 255 255
+0 1 0 255 255 0 150 0
+10 3 0 150 0 0 255 0
+3 5 0 255 0 255 255 0
+5 8 255 255 0 255 120 0
+8 14 255 120 0 255 0 0
+14 26 255 0 0 60 30 0
\ No newline at end of file
diff --git a/temas/cinzapalete.map b/temas/cinzapalete.map
new file mode 100644
index 0000000..714514d
--- /dev/null
+++ b/temas/cinzapalete.map
@@ -0,0 +1,19 @@
+MAP
+SYMBOLSET ../symbols/simbolos.sym
+FONTSET   "../symbols/fontes.txt"
+LAYER
+    DATA "c://ms4w/Apache/htdocs/geodados/cinza.png"
+    METADATA
+      "DOWNLOAD"	"sim"
+      "tema"	"teste palete"
+      "extensao" "-45.3164908803 -18.728115624 -36.4701672412 -13.692240792"
+      "palletefile" "c://ms4w/Apache/htdocs/i3geo/symbols/testepalete.txt"
+      "palletestep" "20"
+    END
+    NAME "cinza"
+    STATUS DEFAULT
+    TEMPLATE "none.htm"
+    TYPE RASTER
+    UNITS METERS
+  END
+END
\ No newline at end of file
diff --git a/testamapfile.php b/testamapfile.php
index 1a3b6b1..8fe5884 100644
--- a/testamapfile.php
+++ b/testamapfile.php
@@ -232,6 +232,7 @@ function verifica($map)
 			 $sca->set("status",MS_OFF);
 		}
 		$objImagem = @$mapa->draw();
+		$objImagemLegenda = @$mapa->drawLegend();
 		if (!$objImagem)
 		{
 			echo "Problemas ao gerar o mapa
"; @@ -247,9 +248,16 @@ function verifica($map) $nomec = ($objImagem->imagepath).nomeRandomico()."teste.png"; $objImagem->saveImage($nomec); $nomer = ($objImagem->imageurl).basename($nomec); + + $nomel = ($objImagemLegenda->imagepath).nomeRandomico()."testel.png"; + $objImagemLegenda->saveImage($nomel); + $nomerl = ($objImagemLegenda->imageurl).basename($nomel); + + if(($tipo == "") || ($tipo == "todos")) { - echo ""; + echo "
"; + echo ""; if($tipo == "todos") { echo "
".$dados."
"; @@ -264,7 +272,8 @@ function verifica($map) echo "
Error in %s: %s
", $error->routine, $error->message; $error = $error->next(); } - } + } + } else { @@ -277,12 +286,12 @@ function verifica($map) function zoomTema($nomelayer,&$mapa) { $layer = $mapa->getlayerbyname($nomelayer); - if($layer->type > 2) - {return;} $prjMapa = $mapa->getProjection(); $prjTema = $layer->getProjection(); $extatual = $mapa->extent; $ret = $layer->getmetadata("extensao"); + if($layer->type > 2 && $ret == "") + {return;} $ct = $layer->connectiontype; if(($ret == "") && ($ct != 1)) {return;} -- libgit2 0.21.2