numlayers; for($i=0;$i<$nlayers;$i++){ $ll = $mapa->getlayer($i); if($ll->getmetadata("SAIKU") != ""){ $ll->set("status",MS_DELETE); } } $mapa->save($map_file); } else{ $dados = (array) json_decode($_POST["dados"],true); $metadados = (array) json_decode($_POST["metadados"],true); $nmetadados = count($metadados); //pega o id da regiao (busca pelo posfixo geocod) $codigo_tipo_regiao = $metadados[0]["colName"]; $codigo_tipo_regiao = explode("#",$codigo_tipo_regiao); $codigo_tipo_regiao = $codigo_tipo_regiao[1]; /* echo "
";
	var_dump($metadados);
	echo $codigo_tipo_regiao;exit;
	*/
	if(empty($codigo_tipo_regiao)){
		echo "Nao foi possivel determinar o codigo da regiao ou localidade no sistema Metaestat";
		exit;
	}
	$m = new MetaestatInfo();

	$meta = $m->listaTipoRegiao($codigo_tipo_regiao);
	$titulolayer = $meta["nome_tipo_regiao"];
	if(empty($titulolayer)){
		echo "Nao foi possivel encontrar a regiao ou localidade no sistema Metaestat";
		exit;
	}
	$titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer));
	//$conexao = $m->listaConexao($meta["codigo_estat_conexao"],true);
	$conexao = $m->listaConexaoMetaestat();
	$conexao = "user=".$conexao["usuario"]." password=".$conexao["senha"]." dbname=".$conexao["bancodedados"]." host=".$conexao["host"]." port=".$conexao["porta"]."";
	$colunageo = $meta["colunageo"];
	$sqlColunaGeo = $meta["colunageo"];
	$srid = $meta["srid"];
	$colunastabela = $m->colunasTabela($meta["codigo_estat_conexao"],$meta["esquemadb"],$meta["tabela"],"geometry","!=");
	$tipoLayer = "POLYGON";
	//define a coluna geo correta
	if($opcoes["tipo"] == "calor" || $opcoes["tipo"] == "mapaPizzas" || $opcoes["tipo"] == "mapaBarras" || $opcoes["tipo"] == "raiosProporcionais" || $opcoes["tipo"] == "circulosProporcionais"){
		if($meta["colunacentroide"] != ""){
			$colunageo = $meta["colunacentroide"];
			$sqlColunaGeo = $meta["colunacentroide"];
		}
		$sqlColunaGeo = "st_centroid(".$colunageo.")";
		$tipoLayer = "POINT";
		if($opcoes["tipo"] == "mapaBarras" || $opcoes["tipo"] == "mapaPizzas"){
			$tipoLayer = "CHART";
		}
	}
	//var_dump($metadados);exit;
	//constroi um sql que retorna os dados na forma de uma tabela inline
	$nomesColunas = array();
	$metadataItens = array();
	$valores = array();
	for($i=0;$i<$nmetadados;$i++){
		if($metadados[$i]["colName"] != ""){
			$nomesColunas[] = "coluna".$i;//$metadados[$i]["colName"];
			$metadataItens[] = $metadados[$i]["colName"];
		}
	}
	$nomesColunas[0] = "geocodigo";
	$metadataItens[0] = "geocodigo";
	$codigosRegioes = array();
	//select * from (values (1000,2),(5,6)) as teste ("a","b") where

	foreach($dados as $dado){
		//$codigosRegioes[] = $dado[0];
		$linha = array();
		for($i=0;$i<$nmetadados;$i++){
			$linha[] = $dado[$i];
		}
		$valores[] = "(".implode(",",$linha).")";
	}
	//
	//o nome da coluna com os dados e acentuado em alguns casos
	//por isso, camadas baseadas em plugins precisam mudar isso
	if($opcoes["tipo"] == "calor" && count($nomesColunas) > 1){
		$nomesColunas[count($nomesColunas) - 1] = "colunaCalor";
	}
	$sqldados = "
		select st_setsrid(".$sqlColunaGeo.",".$srid.") as $colunageo, ".implode(",",$colunastabela).",dataset.*
		from ".$meta["esquemadb"].".".$meta["tabela"]." INNER JOIN
		(values ".implode(",",$valores).') as dataset ("'.implode('","',$nomesColunas).'") ON geocodigo = '.$meta["identificador"];
	$sqlmapa = $colunageo." from ($sqldados) as foo using unique ".$meta["identificador"]." using srid=$srid";

	//para o tema com o outline caso o saiku tenha sido aberto de fora do i3Geo
	$sqldados1 = "
	select st_setsrid(".$meta["colunageo"].",".$srid.") as ".$meta["colunageo"].", ".implode(",",$colunastabela).",dataset.*
	from ".$meta["esquemadb"].".".$meta["tabela"]." INNER JOIN
	(values ".implode(",",$valores).') as dataset ("'.implode('","',$nomesColunas).'") ON geocodigo = '.$meta["identificador"];

	$sqlmapa1 = $meta["colunageo"]." from ($sqldados1) as foo using unique ".$meta["identificador"]." using srid=$srid";

	$mapa = ms_newMapObj($map_file);
	$nlayers = $mapa->numlayers;
	for($i=0;$i<$nlayers;$i++){
		$ll = $mapa->getlayer($i);
		$ll->set("status",MS_DELETE);
		/*
		if($ll->getmetadata("SAIKU") == $opcoes["tipo"]){
			$ll->set("status",MS_DELETE);
		}
		else{
			if($ll->getmetadata("SAIKU") != ""){
				$ll->set("status",MS_OFF);
			}
		}
		*/
		if($ll->getmetadata("tema") == "Limites"){
			$ll->set("status",MS_DELETE);
		}
		if(strtoupper($ll->getmetadata("classe")) == "NAO" || $ll->getmetadata("classe") == ""){
			$ll->set("status",MS_DELETE);
		}
	}

	$layer = ms_newLayerObj($mapa);
	$nomeLayer = nomeRandomico();
	$l = array();
	$l[] = "LAYER";
	$l[] = '	NAME "'.$nomeLayer.'"';
	$l[] = "	TYPE $tipoLayer";
	$l[] = "	DATA '".$sqlmapa."'";
	$l[] = '	CONNECTION "'.$conexao.'"';
	$l[] = '	CONNECTIONTYPE POSTGIS';
	$l[] = '	TEMPLATE "none.htm"';
	$l[] = '	STATUS DEFAULT';
	$l[] = '	METADATA';
	if($opcoes["tipo"] == "mapaBarras" || $opcoes["tipo"] == "mapaPizzas"){
		$l[] = '		TEMA "'.$titulolayer.' - '.$opcoes["tipo"].'"';
	}
	else{
		$l[] = '		TEMA "'.$titulolayer.' - '.$metadataItens[1].' - '.$opcoes["tipo"].'"';
	}
	$l[] = '		CLASSE "SIM"';
	$l[] = '		SAIKU "'.$opcoes["tipo"].'"';
	$l[] = '		TIP "'.$meta["colunanomeregiao"].','.implode(',',$nomesColunas).'"';
	$l[] = '		ITENSDESC "'.$meta["colunanomeregiao"].','.implode(',',$metadataItens).'"';
	$l[] = '		ITENS "'.$meta["colunanomeregiao"].','.implode(',',$nomesColunas).'"';
	$l[] = '		METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
	$l[] = '		TILES "NAO"';
	$l[] = '	END	';

	$l = implode(PHP_EOL,$l);

	if($opcoes["tipo"] == "raiosProporcionais"){
		$l .= implode(PHP_EOL,raiosProporcionais(1,$nomesColunas[1]));
	}
	if($opcoes["tipo"] == "circulosProporcionais"){
		$l .= '	OPACITY 50';
		$l .= implode(PHP_EOL,circulosProporcionais(1,$nomesColunas[1]));
	}
	if($opcoes["tipo"] == "coresChapadas"){
		$l .= '	OPACITY 50';
		$l .= implode(PHP_EOL,coresChapadas(1,$nomesColunas[1]));
	}
	if($opcoes["tipo"] == "mapaBarras"){
		$l .= PHP_EOL.' PROCESSING "CHART_SIZE='.$opcoes["size"].' '.$opcoes["size"].'"';
		$l .= PHP_EOL.' PROCESSING "CHART_TYPE=bar"';
		$l .= implode(PHP_EOL,mapaBarras($nomesColunas,$metadataItens));
	}
	if($opcoes["tipo"] == "mapaPizzas"){
		$l .= PHP_EOL.' PROCESSING "CHART_SIZE='.$opcoes["size"].' '.$opcoes["size"].'"';
		$l .= PHP_EOL.' PROCESSING "CHART_TYPE=pie"';
		$l .= implode(PHP_EOL,mapaBarras($nomesColunas,$metadataItens));
	}
	$l .= PHP_EOL.'END';

	//echo $l;exit;
	$layer->updateFromString($l);

	//inclui o layer com o contorno se for o caso
	if($opcoes["tipo"] != "calor" && empty($_GET["origem"]) && ($tipoLayer == "CHART" || $tipoLayer == "POINT")){
		$layer = ms_newLayerObj($mapa);
		$nomeLayer = nomeRandomico();
		$l = array();
		$l[] = "LAYER";
		$l[] = '	NAME "'.$nomeLayer.'"';
		$l[] = "	TYPE POLYGON";
		$l[] = "	DATA '".$sqlmapa1."'";
		$l[] = '	CONNECTION "'.$conexao.'"';
		$l[] = '	CONNECTIONTYPE POSTGIS';
		$l[] = '	TEMPLATE "none.htm"';
		$l[] = '	STATUS DEFAULT';
		$l[] = '	METADATA';
		$l[] = '		TEMA "Limites"';
		$l[] = '		CLASSE "SIM"';
		$l[] = '		SAIKU "'.$opcoes["tipo"].'"';
		$l[] = '		METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
		$l[] = '		TILES "NAO"';
		$l[] = '	END	';
		$l[] = '	CLASS	';
		$l[] = '	OUTLINECOLOR 255 255 255	';
		$l[] = '	END	';
		$l[] = 'END	';
		$l = implode(PHP_EOL,$l);
		$layer->updateFromString($l);
	}

	$mapa->save($map_file);

	if($opcoes["tipo"] == "coresChapadas"){
		include(dirname(__FILE__)."/../../classesphp/classe_alteraclasse.php");
		$m = new Alteraclasse($map_file,$nomeLayer);
		$cor = $opcoes["cores"][0];
		$cori = $cor["red"].','.$cor["green"].','.$cor["blue"];
		$cor = $opcoes["cores"][1];
		$corf = $cor["red"].','.$cor["green"].','.$cor["blue"];
		$retorno = $m->alteraCoresClasses($cori,$corf);
		$m->salva();
	}
	if($opcoes["tipo"] == "calor"){
		$parametros = '{"plugin":"heatmap","parametros":{"tipoGradiente":"default","opacity":".8","valorPonto":'.$opcoes["valorPonto"].',"coluna":"'.$nomesColunas[1].'","radius":"'.$opcoes["raio"].'"}}';
		$layer->setmetadata("PLUGINI3GEO",$parametros);
		$layer->setmetadata("SAIKU",$opcoes["tipo"]);
		$mapa->save($map_file);
	}
}

header("Location:".$opcoes["locaplic"]."/mashups/openlayers.php?temas=".$map_file."&DESLIGACACHE=sim&botoes=legenda,analise,catalogo,camadas,identifica&controles=navigation,layerswitcher,scaleline,mouseposition,keyboarddefaults&fundo=eng&tiles=false&mapext=".$opcoes["mapext"]);

function mapaBarras($colunas,$metadataItens){
	global $opcoes;
	//$opcoes["coreshex"] = array_reverse($opcoes["coreshex"]);
	//$valores = retornaDadosColuna($coluna);
	//$cortes = quartis($valores,$nomeColuna);
	//var_dump($opcoes["coreshex"]);exit;
	$nclasses = count($colunas);
	$classes = array();
	for($i=1;$i<$nclasses;$i++){
		$classes[] = PHP_EOL.'CLASS';
		$classes[] = '	NAME "'.$metadataItens[$i].'"';
		$classes[] = '	STYLE';
		$cor = $opcoes["outlinecolor"];
		$classes[] = '		OUTLINECOLOR '.$cor["red"].' '.$cor["green"].' '.$cor["blue"];
		$classes[] = '		SIZE ['.$colunas[$i].']';
		$classes[] = '		COLOR '.$opcoes["cores"][$i-1];
		$classes[] = '	END';
		$classes[] = 'END	';
	}
	return $classes;
}

function coresChapadas($coluna,$nomeColuna){
	global $opcoes;
	$valores = retornaDadosColuna($coluna);
	$cortes = quartis($valores,$nomeColuna);
	//var_dump($cortes);exit;
	$nclasses = count($cortes["nomes"]);
	$classes = array();
	$size = 10;
	for($i=0;$i<$nclasses;$i++){
		$nome = $cortes["nomes"][$i];
		$exp = $cortes["exp"][$i];
		$classes[] = PHP_EOL.'CLASS';
		$classes[] = '	NAME "'.$nome.'"';
		$classes[] = '	EXPRESSION '.$exp;
		$classes[] = '	STYLE';
		$cor = $opcoes["cores"][0];
		$classes[] = '		COLOR '.$cor["red"].' '.$cor["green"].' '.$cor["blue"];
		$classes[] = '		SIZE '.($opcoes["size"] * $i);
		$classes[] = '		OUTLINECOLOR 255 255 255';
		$classes[] = '	END';
		$classes[] = 'END	';
	}
	return $classes;
}
function raiosProporcionais($coluna,$nomeColuna){
	global $opcoes;
	$valores = retornaDadosColuna($coluna);
	$cortes = quartis($valores,$nomeColuna);
	//var_dump($cortes);exit;
	$nclasses = count($cortes["nomes"]);
	$classes = array();
	$size = 10;
	for($i=0;$i<$nclasses;$i++){
		$nome = $cortes["nomes"][$i];
		$exp = $cortes["exp"][$i];
		$classes[] = PHP_EOL.'CLASS';
		$classes[] = '	NAME "'.$nome.'"';
		$classes[] = '	EXPRESSION '.$exp;
		$classes[] = '	STYLE';
		$cor = $opcoes["cores"][0];
		$classes[] = '		OUTLINECOLOR '.$cor["red"].' '.$cor["green"].' '.$cor["blue"];
		$classes[] = '		WIDTH 2';
		$classes[] = '		SYMBOL "ponto"';
		$classes[] = '		SIZE '.($opcoes["size"] * $i);
		$classes[] = '		COLOR -1 -1 -1';
		$classes[] = '	END';
		$classes[] = 'END	';
	}
	return $classes;
}
function circulosProporcionais($coluna,$nomeColuna){
	global $opcoes;
	$valores = retornaDadosColuna($coluna);
	$cortes = quartis($valores,$nomeColuna);
	//var_dump($cortes);exit;
	$nclasses = count($cortes["nomes"]);
	$classes = array();
	$size = 10;
	for($i=0;$i<$nclasses;$i++){
		$nome = $cortes["nomes"][$i];
		$exp = $cortes["exp"][$i];
		$classes[] = PHP_EOL.'CLASS';
		$classes[] = '	NAME "'.$nome.'"';
		$classes[] = '	EXPRESSION '.$exp;
		$classes[] = '	STYLE';
		$cor = $opcoes["cores"][0];
		$classes[] = '		COLOR '.$cor["red"].' '.$cor["green"].' '.$cor["blue"];
		$classes[] = '		WIDTH 1';
		$classes[] = '		SYMBOL "ponto"';
		$classes[] = '		SIZE '.($opcoes["size"] * $i);
		$classes[] = '		OUTLINECOLOR 255 255 255';
		$classes[] = '	END';
		$classes[] = 'END	';
	}
	return $classes;
}

function quartis($valores,$nomeColuna){
	$estat = new estatistica();
	$estat->calcula($valores);
	$calc = $estat->resultado;
	$nomes = array();
	$expressao = array();
	$expressao[] = "([".$nomeColuna."]<=".($calc["quartil1"]).")";
	$expressao[] = "(([".$nomeColuna."]>".($calc["quartil1"]).")and([".$nomeColuna."]<=".($calc["quartil2"])."))";
	if($calc["quartil3"] != 0){
		$expressao[] = "(([".$nomeColuna."]>".($calc["quartil2"]).")and([".$nomeColuna."]<=".($calc["quartil3"])."))";
		$expressao[] = "([".$nomeColuna."]>".($calc["quartil3"]).")";
	}
	$nomes[] = "Q1 valor <= ".($calc["quartil1"]);
	$nomes[] = "Q2 valor > ".($calc["quartil1"])." e valor <= ".($calc["quartil2"]);
	if($calc["quartil3"] != 0){
		$nomes[] = "Q3 valor > ".($calc["quartil2"])." e valor <= ".($calc["quartil3"]);
		$nomes[] = "Q4 valor > ".($calc["quartil3"]);
	}
	return array("nomes"=>$nomes,"exp"=>$expressao);
}
function retornaDadosColuna($coluna){
	global $dados;
	$valores = array();
	foreach($dados as $dado){
		$valores[] = $dado[$coluna];
	}
	return $valores;
}
function cHexToDec ($hexStr, $returnAsString = true, $seperator = ' ') {
		$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
		$rgbArray = array();
		if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
				$colorVal = hexdec($hexStr);
				$rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
				$rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
				$rgbArray['blue'] = 0xFF & $colorVal;
		} elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
				$rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
				$rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
				$rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
		} else {
				return false; //Invalid hex color code
		}
		return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array
}
?>