diff --git a/admin/admin.db b/admin/admin.db index 42a3967..b4769e8 100644 Binary files a/admin/admin.db and b/admin/admin.db differ diff --git a/admin/php/classe_metaestat.php b/admin/php/classe_metaestat.php index 334a18f..29fd522 100755 --- a/admin/php/classe_metaestat.php +++ b/admin/php/classe_metaestat.php @@ -528,6 +528,7 @@ class Metaestat{ return array("caminho"=>$caminho,"colunas"=>$colunas); } } + return array("caminho"=>$caminho,"colunas"=>$colunas); } function hierarquiaPath($node){ $query="select codigo_tipo_regiao_pai as parent from ".$this->esquemaadmin."i3geoestat_agregaregiao WHERE codigo_tipo_regiao = $node"; @@ -2056,6 +2057,10 @@ class Metaestat{ } return $this->execSQL($sql,""); } + function listaHierarquia($codigoregiaopai=""){ + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao order by codigo_tipo_regiao"; + return $this->execSQL($sql,""); + } /** * Lista os registros de um tipo de regiao * Se for definido o pai, lista os valores da regiao que e filha @@ -2132,7 +2137,9 @@ class Metaestat{ function listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiao_pai){ $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao "; $sql .= "WHERE codigo_tipo_regiao_pai = $codigo_tipo_regiao_pai "; - $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao"; + if($codigo_tipo_regiao != ""){ + $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao"; + } return $this->execSQL($sql,$codigo_tipo_regiao_pai); } /** diff --git a/ferramentas/saiku/esquemaxml.php b/ferramentas/saiku/esquemaxml.php index 4fc39aa..2430a07 100644 --- a/ferramentas/saiku/esquemaxml.php +++ b/ferramentas/saiku/esquemaxml.php @@ -4,82 +4,253 @@ // //utilize &xmlesquema= caso o XML ja exista // -//http://localhost/i3geo/ferramentas/saiku/esquemaxml.php?output=&xmlesquema=http://localhost/i3geo/ferramentas/saiku/testemondrian.xml +//utilize $regiao para obter o xml de uma so regiao +// +/** +http://localhost/i3geo/ferramentas/saiku/esquemaxml.php?output=&xmlesquema=http://localhost/i3geo/ferramentas/saiku/testemondrian.xml&output=xml +http://localhost/i3geo/ferramentas/saiku/esquemaxml.php?xmlesquema=&output=xml®iao=1 +*/ + // //quando o saiku e iniciado de fora do i3geo, e necessario inicializar um mapfile para uso como base dos mapas -if(empty($_GET["g_sid"])){ - include(dirname(__FILE__)."/../../ms_criamapa.php"); - //reinicia a url - $urln = "?g_sid=".session_id()."&locaplic=".$_GET["locaplic"]."&mapext=".$mapext."&origem=".$_GET["origem"]."&output=".$_GET["output"]."&xmlesquema=".$_GET["xmlesquema"]; - header("Location:".$urln); - exit; -} +// +criaMapfileInicial(); include(dirname(__FILE__)."/../../classesphp/funcoes_gerais.php"); include(dirname(__FILE__)."/../../admin/php/classe_metaestat.php"); if(!isset($dir_tmp)){ include(dirname(__FILE__)."/../../ms_configura.php"); } -$nomeConexao = nomeRandomico(); -$nomeDatasource = $dir_tmp."/saiku-datasources/".$nomeConexao; -//pega a sessao PHP aberta pelo i3Geo ou ms_criamapa.php -session_name("i3GeoPHP"); -session_id($_GET["g_sid"]); -session_start(); +$urlXmlEsquema = ""; +$nomeConexao = criaConexaoEsquema(); + $map_file = $_SESSION["map_file"]; -if(empty($_GET["xmlesquema"])){ - $urlXmlEsquema = $_SESSION["tmpurl"].basename(dirname($map_file))."/".$nomeConexao.".xml"; + +$arquivoXmlEsquema = dirname($map_file)."/".$nomeConexao.".xml"; + +gravaDataSource(); + +if(!empty($_GET["xmlesquema"])){ + imprimeEsquema(); +} + +$m = new Metaestat(); + +// +//obtem do mapfile em uso os layers que sao do sistema metaestat, sao regioes e que possuem selecao +// +if(empty($_GET["regiao"])){ + $s = pegaSelecaoRegioes(); + $selecaoRegiao = $s["selecaoRegiao"]; + $codigo_tipo_regiao = $s["codigo_tipo_regiao"]; } else{ - $urlXmlEsquema = $_GET["xmlesquema"]; + $codigo_tipo_regiao = $_GET["regiao"]; } -$arquivoXmlEsquema = dirname($map_file)."/".$nomeConexao.".xml"; +//verifica se o cubo usa uma regiao especifica ou todas +if($codigo_tipo_regiao == ""){ + $regioes = $m->listaTipoRegiao(); +} +else{ + $regioes = array($m->listaTipoRegiao($codigo_tipo_regiao)); +} +$s = ""; -/* - $saikuConfigDataSource vem do ms_configura.php - -Exemplo de arquivo de fonte: -type=OLAP -name=i3geo -driver=mondrian.olap4j.MondrianOlap4jDriver -location=jdbc:mondrian:Jdbc=jdbc:postgresql://localhost:5432/i3geosaude;Catalog=http://localhost/i3geo/ferramentas/saiku/esquemaxml.php;JdbcDrivers=org.postgresql.Driver; -username=postgres -password=postgres - -Array com os parametros definidos em ms_configura: - -$saikuConfigDataSource = array( - "type"=>"OLAP", - "driver"=>"mondrian.olap4j.MondrianOlap4jDriver", - "location"=>"jdbc:mondrian:Jdbc=jdbc:postgresql", - "serverdb"=>"localhost", - "port"=>"5432", - "database"=>"i3geosaude", - "JdbcDrivers"=>"org.postgresql.Driver", - "username"=>"postgres", - "password"=>"postgres" -); -*/ -$stringDatasource = " -type={$saikuConfigDataSource["type"]} -name={$nomeConexao} -driver={$saikuConfigDataSource["driver"]} -location={$saikuConfigDataSource["location"]}://{$saikuConfigDataSource["serverdb"]}:{$saikuConfigDataSource["port"]}/{$saikuConfigDataSource["database"]};Catalog={$urlXmlEsquema};JdbcDrivers={$saikuConfigDataSource["JdbcDrivers"]}; -username={$saikuConfigDataSource["username"]} -password={$saikuConfigDataSource["password"]} -"; -//salva o arquivo com a fonte -gravaDados(array($stringDatasource),$nomeDatasource); - -if(empty($_GET["xmlesquema"])){ - $m = new Metaestat(); +if(empty($saikuConfigDataSource['tabelaDimensaoTempo'])){ + $saikuConfigDataSource['tabelaDimensaoTempo'] = "i3geo_metaestat.dim_tempo"; +} - // - //obtem do mapfile em uso os layers que sao do sistema metaestat, sao regioes e que possuem selecao - // - $selecaoRegiao = array(); +$medidas = $m->listaMedidaVariavel(); + +// +//formata o array de regioes colocando na chave o codigo da regiao +// +$chavesRegiao = array(); +$todasAsRegioes = $m->listaTipoRegiao(); +foreach($todasAsRegioes as $R){ + $chavesRegiao[$R["codigo_tipo_regiao"]] = $R; +} + +//inicia montagem do XML + +// +//cria as dimensoes de tipo temporal +// +$xmlTempo = dimensoesTemporais(); + +// +//dimensoes geograficas +//as dimensoes sao duplicadas +//uma delas contem o geocodigo que permite a geracao do mapa +// +//guarda as regioes filhas de uma determinada regiao (chave) +$filhosDaRegiao = array(); +$VirtualCubeDimensionDaRegiao = array(); +$VirtualCubeMeasureDaRegiao = array(); + +$dimRegioes = dimensoesGeo(); + +//var_dump(array_column($dimRegioes,"juncoes","codigo_tipo_regiao"));exit; + +$xmlRegioes = implode(" ",array_column($dimRegioes,"xml")); + +// +//outras dimensoes definidas nos parametros e que nao sejam do tipo tempo +// +$xmlOutrasDim = dimensoesOutras(); + +// +//cria as dimensoes das medidas conforme o nome da tabela utilizada +// +$VirtualCubeDimension = array(); +$VirtualCubeMeasure = array(); +$xmlDimensoesTabelas = dimensoesTabelas(); + +// +//cubo geral, com todas as dimensoes e medidas +// +$xmlCuboTodas = cuboTodas(); +// +//cubos por regiao +// +$xmlCuboRegioes = cuboRegioes(); + +$xml = ""; +$xml .= $xmlTempo.$xmlRegioes.$xmlOutrasDim.$xmlDimensoesTabelas.$xmlCuboRegioes.$xmlCuboTodas; +$xml .= ""; + +//xml pronto!!!!! + +error_reporting(0); +ob_end_clean(); +// +//grava os dados em um arquivo. O usuario pode evitar isso e imprimir direto na tela +//usando output "xml" +// +if($_GET["output"] != "xml"){ + gravaDados(array($xml),$arquivoXmlEsquema); +} +imprimeEsquema(); + + +////////////////////////////////////////////////////////////////////////////////////////// +function caminhoRegiao($hs,$chavesRegiao,$h,$regiaoInicial,$caminho) +{ + foreach($hs as $n){ + if($n["codigo_tipo_regiao"] == $regiaoInicial){ + $caminho[] = array("a"=>$regiaoInicial,"join"=>$n["codigo_tipo_regiao_pai"],"ligacao"=>$n["colunaligacao_regiaopai"]); + $caminho = caminhoRegiao($hs,$chavesRegiao,$h, $n["codigo_tipo_regiao_pai"],$caminho); + } + else{ + //$caminho = caminhoRegiao($hs,$chavesRegiao,$h, $n["codigo_tipo_regiao_pai"],$caminho); + } + } + return $caminho; +} +function converte($texto){ + $texto = str_replace("&","&",htmlentities($texto)); + return $texto; +} +function imprimeEsquema(){ + global $saikuUrl,$nomeConexao,$xml; + if($_GET["output"] == "xml"){ + if(!empty($_GET["xmlesquema"])){ + echo header("Content-type: application/xml"); + header("Location:".$_GET["xmlesquema"]); + } + else{ + imprimeXml($xml); + } + } + else{ + header("Location:".$saikuUrl."/?nomeConexao=".$nomeConexao."&locaplic=".$_GET["locaplic"]."&g_sid=".$_GET["g_sid"]."&mapext=".$_GET["mapext"]."&origem=".$_GET["origem"]."®iao=".$_GET["regiao"]); + } +} +function imprimeXml($xml){ + echo header("Content-type: application/xml"); + echo $xml; +} +function criaMapfileInicial(){ + global $mapext; + if(empty($_GET["g_sid"])){ + include(dirname(__FILE__)."/../../ms_configura.php"); + $interface = "mashup"; + include(dirname(__FILE__)."/../../ms_criamapa.php"); + + //reinicia a url + $urln = "?g_sid=".session_id()."&locaplic=".$_GET["locaplic"]."&mapext=".$mapext."&origem=".$_GET["origem"]."&output=".$_GET["output"]."&xmlesquema=".$_GET["xmlesquema"]."®iao=".$_GET["regiao"]; + header("Location:".$urln); + exit; + } +} +function criaConexaoEsquema(){ + global $dir_tmp, $urlXmlEsquema; + $nomeConexao = nomeRandomico(); + //pega a sessao PHP aberta pelo i3Geo ou ms_criamapa.php + session_name("i3GeoPHP"); + session_id($_GET["g_sid"]); + session_start(); + $map_file = $_SESSION["map_file"]; + if(empty($_GET["xmlesquema"])){ + $urlXmlEsquema = $_SESSION["tmpurl"].basename(dirname($map_file))."/".$nomeConexao.".xml"; + } + else{ + $urlXmlEsquema = $_GET["xmlesquema"]; + //cria um nome de arquivo reaproveitável + $nomeConexao = md5($_GET["xmlesquema"]); + } + //$arquivoXmlEsquema = dirname($map_file)."/".$nomeConexao.".xml"; + return $nomeConexao; +} +function gravaDataSource(){ + /* + $saikuConfigDataSource vem do ms_configura.php + + Exemplo de arquivo de fonte: + type=OLAP + name=i3geo + driver=mondrian.olap4j.MondrianOlap4jDriver + location=jdbc:mondrian:Jdbc=jdbc:postgresql://localhost:5432/i3geosaude;Catalog=http://localhost/i3geo/ferramentas/saiku/esquemaxml.php;JdbcDrivers=org.postgresql.Driver; + username=postgres + password=postgres + + Array com os parametros definidos em ms_configura: + + $saikuConfigDataSource = array( + "type"=>"OLAP", + "driver"=>"mondrian.olap4j.MondrianOlap4jDriver", + "location"=>"jdbc:mondrian:Jdbc=jdbc:postgresql", + "serverdb"=>"localhost", + "port"=>"5432", + "database"=>"i3geosaude", + "JdbcDrivers"=>"org.postgresql.Driver", + "username"=>"postgres", + "password"=>"postgres" + ); + */ + global $arquivoXmlEsquema,$saikuConfigDataSource,$nomeConexao,$urlXmlEsquema,$dir_tmp; + $nomeDatasource = $dir_tmp."/saiku-datasources/".$nomeConexao; + if(!file_exists($arquivoXmlEsquema)){ + $stringDatasource = " + type={$saikuConfigDataSource["type"]} + name={$nomeConexao} + driver={$saikuConfigDataSource["driver"]} + location={$saikuConfigDataSource["location"]}://{$saikuConfigDataSource["serverdb"]}:{$saikuConfigDataSource["port"]}/{$saikuConfigDataSource["database"]};Catalog={$urlXmlEsquema};JdbcDrivers={$saikuConfigDataSource["JdbcDrivers"]}; + username={$saikuConfigDataSource["username"]} + password={$saikuConfigDataSource["password"]} + "; + //salva o arquivo com a fonte + gravaDados(array($stringDatasource),$nomeDatasource); + } +} +function pegaSelecaoRegioes(){ + global $m,$map_file,$postgis_mapa; $codigo_tipo_regiao = ""; + $selecaoRegiao = array(); + $regiao = ""; + $item = ""; + $registros = ""; if($map_file != ""){ $mapa = ms_newMapObj($map_file); $c = $mapa->numlayers; @@ -126,28 +297,18 @@ if(empty($_GET["xmlesquema"])){ } } } + return array( + "selecaoRegiao"=>$selecaoRegiao, + "codigo_tipo_regiao"=>$codigo_tipo_regiao + ); } - if($codigo_tipo_regiao == ""){ - $regioes = $m->listaTipoRegiao(); - } - else{ - $regioes = array($m->listaTipoRegiao($codigo_tipo_regiao)); - } - //echo "
";var_dump($regioes);exit;
-	$regiao = "";
-	$item = "";
-	$registros = "";
-	//echo "
";var_dump($regioes);exit;
-
-	$xml = "";
-	//cria as dimensoes de tipo temporal
-	if(empty($saikuConfigDataSource['tabelaDimensaoTempo'])){
-		$saikuConfigDataSource['tabelaDimensaoTempo'] = "i3geo_metaestat.dim_tempo";
-	}
+}
+function dimensoesTemporais(){
+	global $saikuConfigDataSource;
 	$sqlAno = "select nu_ano from ".$saikuConfigDataSource['tabelaDimensaoTempo']." group by nu_ano order by nu_ano";
 	$sqlMes = "select nu_ano::text,nu_mes::text,ds_mes_abreviado as mes,COALESCE (nu_ano::text||'-'||nu_mes::text,nu_ano::text) as nu_anomes from ".$saikuConfigDataSource['tabelaDimensaoTempo']." group by nu_ano,nu_mes,mes,nu_anomes order by nu_ano,nu_mes";
 	//dimensoes temporais
-	$xml .= "
+	$xml = "
 	
 	
 	$sqlAno
@@ -169,113 +330,171 @@ if(empty($_GET["xmlesquema"])){
 	
 	
 	";
-	//global
-	$medidas = $m->listaMedidaVariavel();
-
-	//echo "
";var_dump($regioesTabela);exit;
-	//dimensoes geograficas
-	//as dimensoes sao duplicadas
-	//uma delas contem o geocodigo que permite a geracao do mapa
-
-	//guarda as regioes filhas de uma determinada regiao (chave)
-	$filhosDaRegiao = array();
-	$VirtualCubeDimensionDaRegiao = array();
-	$VirtualCubeMeasureDaRegiao = array();
+	return $xml;
+}
+function sqlDasRegioes($regiao,$caminho,$chavesRegiao){
+	$select = "SELECT tabela{$regiao["codigo_tipo_regiao"]}.{$regiao["identificador"]}::text as codigo, __COLUNAS__ FROM {$regiao['esquemadb']}.{$regiao['tabela']} as tabela{$regiao["codigo_tipo_regiao"]} \n";
+	$selectPrincipal = "";
+	$juncoes = "";
+	$colunas = array();
+	$nomesColunas = array();
+	$codRegioes = array();
+	$ncaminhos = count($caminho);
+	if($ncaminhos > 0){
+		foreach($caminho as $c){
+			$regiaoAnterior = $chavesRegiao[$c["a"]];
+			$tabelaAnterior = "tabela".$regiaoAnterior["codigo_tipo_regiao"];
+			$colunaLigacaoAnterior = $c["ligacao"];
+
+			$colunas[] = $tabelaAnterior.".".$regiaoAnterior["identificador"]. "::text AS codigo".$regiaoAnterior["codigo_tipo_regiao"];
+			$colunas[] = $tabelaAnterior.".".$regiaoAnterior["colunanomeregiao"]. "::text AS nome".$regiaoAnterior["codigo_tipo_regiao"];
+
+			$regiaoJoin = $chavesRegiao[$c["join"]];
+			$tabelaAtual = "tabela".$regiaoJoin["codigo_tipo_regiao"];
+			$colunaLigacaoAtual = $regiaoJoin["identificador"];
+
+			$colunas[] = $tabelaAtual.".".$regiaoJoin["identificador"]. "::text AS codigo".$regiaoJoin["codigo_tipo_regiao"];
+			$colunas[] = $tabelaAtual.".".$regiaoJoin["colunanomeregiao"]. "::text AS nome".$regiaoJoin["codigo_tipo_regiao"];
+
+			$nomesColunas[] = " codigo".$regiaoJoin["codigo_tipo_regiao"];
+			$nomesColunas[] = " nome".$regiaoJoin["codigo_tipo_regiao"];
+
+			$juncoes .= " JOIN {$regiaoJoin['esquemadb']}.{$regiaoJoin['tabela']} as $tabelaAtual ON
+				$tabelaAtual.$colunaLigacaoAtual::text = $tabelaAnterior.$colunaLigacaoAnterior::text
+			";
+			$codRegioes[] = $regiaoJoin["codigo_tipo_regiao"];
+		}
+		$colunas = array_unique($colunas);
+	}
+	else{
+		$colunas[] = $regiao["identificador"]. "::text AS codigo".$regiao["codigo_tipo_regiao"];
+		$colunas[] = $regiao["colunanomeregiao"]. "::text AS nome".$regiao["codigo_tipo_regiao"];
+
+		$nomesColunas[] = " codigo".$regiao["codigo_tipo_regiao"];
+		$nomesColunas[] = " nome".$regiao["codigo_tipo_regiao"];
+
+		$codRegioes[] = $regiao["codigo_tipo_regiao"];
+	}
+	$mascara = $select;
+	$select = str_replace("__COLUNAS__",implode(",",$colunas),$select);
+	$selectPricipal = $select;
+	$select .= $juncoes;
+	return array("codRegioes"=>$codRegioes,"juncoes"=>$juncoes,"mascara"=>$mascara,"principal"=>$selectPricipal,"select"=>$select,"colunas"=>$colunas,"nomesColunas"=>$nomesColunas);
+}
+
+function dimensoesGeo(){
+	global $chavesRegiao, $m, $selecaoRegiao, $regioes, $filhosDaRegiao, $VirtualCubeDimensionDaRegiao, $VirtualCubeMeasureDaRegiao;
+	//essas variaveis sao globais e usadas em outras funcoes
 	foreach($regioes as $regiao){
 		$filhosDaRegiao[$regiao["codigo_tipo_regiao"]] = array();
 		$VirtualCubeDimensionDaRegiao[$regiao["codigo_tipo_regiao"]] = array();
 		$VirtualCubeMeasureDaRegiao[$regiao["codigo_tipo_regiao"]] = array();
 	}
+	//xml normal
 	$xml1 = "";
+	//xml geocodigo
 	$xml2 = "";
-
-	foreach($regioes as $regiao){
+	//
+	//sera que e todas mesmo ou so a escolhida?????
+	//
+	$todasRegioes = $m->listaTipoRegiao();
+	$xmlRegioes = array();
+	foreach($todasRegioes as $regiao){
 		$sqls = array();
-		$xml1 .= "
-		
-		
+		$temp = converte($regiao["nome_tipo_regiao"]);
+		$xml1 = "
+			
+			
 		";
-		$xml2 .= "
-		
-		
+		$xml2 = "
+			
+			
 		";
+		//
 		//cria uma view juntando as tabelas da hierarquia de regioes
-		$caminho = $m->hierarquiaPath($regiao["codigo_tipo_regiao"]);
-		//$caminho[] = $regiao["codigo_tipo_regiao"];
-
-		$n = count($caminho);
-		$regiaoAtual = $regiao;
-		$niveis1 = array();
-		$niveis2 = array();
-		$unico = "true";
-		for($j=0;$j<=$n;$j++){
-			$colunas = array();
-			$sql = "SELECT __COLUNAS__ FROM {$regiaoAtual['esquemadb']}.{$regiaoAtual['tabela']} as a$j ";
-			$colunas[] = "a$j.{$regiaoAtual['identificador']}::text as codigo ";
-			//inclui campos vazios na sequencia de campos
-			for($k=0;$k<$j;$k++){
-				$colunas[] = "''";
-				$colunas[] = "''";
+		//
+		$hs = $m->listaHierarquia();
+		//$regiao["codigo_tipo_regiao"] = 2;
+		foreach($hs as $h){
+			if($h["codigo_tipo_regiao"] == $regiao["codigo_tipo_regiao"]){
+				$caminho = caminhoRegiao($hs,$chavesRegiao,$h,$regiao["codigo_tipo_regiao"]);
 			}
+		}
+		//
+		//sql da tabela principal da regiao
+		//
+		$dadosSelect = sqlDasRegioes($regiao,$caminho,$chavesRegiao);
+		//
+		//pega os dados das demais tabelas associadas, menos da primeira
+		//para unir os dados
+		//
+		$niveisXml1 = array();
+		$niveisXml2 = array();
+
+		$temp = converte($regiao["nome_tipo_regiao"]);
+		$niveisXml1[] = "
+			
+			";
+		$niveisXml2[] = "
+				
+			";
+		//juncoes
+		while($caminho){
+			$a = array_shift($caminho);
+			$u = sqlDasRegioes($chavesRegiao[$a["join"]],array(),$chavesRegiao);
+			//substitui as colunas para obter dados vazios
+			$colunasVazias = array();
+			foreach($dadosSelect["nomesColunas"] as $nomesPrincipais){
+				$colunasVazias[$nomesPrincipais] = "'' AS $nomesPrincipais";
+			}
+			$n = count($u["colunas"]);
+			for($q = 0; $q < $n; $q++){
+				$colunasVazias[$u["nomesColunas"][$q]] = $u["colunas"][$q];
+			}
+			//
+			//inclui as colunas da primeira tabela
+			//
+			$colunasPrimeiraTabela = "'' as codigo".$regiao["codigo_tipo_regiao"].","."'' as nome".$regiao["codigo_tipo_regiao"].",";
 
-			$colunas[] = "a$j.{$regiaoAtual['identificador']}::text AS  {$regiaoAtual['identificador']} ";
-			$colunas[] = "a$j.{$regiaoAtual['colunanomeregiao']}::text AS {$regiaoAtual['colunanomeregiao']} ";
+			$mascara = str_replace("__COLUNAS__",$colunasPrimeiraTabela."__COLUNAS__",$u["mascara"]);
 
-			for($i=$j;$i<$n;$i++){
-				$r = $m->listaTipoRegiao($caminho[$i]);
+			$u["select"] = str_replace("__COLUNAS__",implode(",",$colunasVazias),$mascara);
 
-				if(count($colunas) > ($j + 4)){
-					$colunas[] = "''::text AS {$r['identificador']} ";
-					$colunas[] = "''::text AS {$r['colunanomeregiao']} ";
-				}
-				else{
-					$colunas[] = "b$i.{$r['identificador']}::text AS {$r['identificador']} ";
-					$colunas[] = "b$i.{$r['colunanomeregiao']}::text AS {$r['colunanomeregiao']} ";
-				}
-				//descobre a coluna de ligacao da regiao
-				$agr = $m->listaAgregaRegiaoFilho($regiaoAtual['codigo_tipo_regiao'],$r['codigo_tipo_regiao']);
+			$temp = converte($chavesRegiao[$a["join"]]["nome_tipo_regiao"]);
 
-				$sql .= " JOIN {$r['esquemadb']}.{$r['tabela']} as b$i ON
-					a$j.{$agr['colunaligacao_regiaopai']}::text = b$i.{$r['identificador']}::text
-				";
-			}
-
-			$colunas = implode($colunas,",");
-			$sql = str_replace("__COLUNAS__",$colunas,$sql);
-			//inclui a selecao se houver
-			if(!empty($selecaoRegiao[$regiaoAtual["codigo_tipo_regiao"]])){
-				$rs = $selecaoRegiao[$regiaoAtual["codigo_tipo_regiao"]];
-			}
-			$pos = strpos($sql, "regiao.".$rs["item"]." ");
-			if($rs != "" || !$pos === false){
-				$sql .= " WHERE regiao.".$rs["sql"];
-			}
-			$sqls[] = $sql;
-
-			$niveis1[] = "
-			
+			$niveisXml1[] = "
+			
 			";
-			$niveis2[] = "
-			
+			$niveisXml2[] = "
+			
 			";
 			$unico = "false";
-
-			$regiaoAtual = $m->listaTipoRegiao($caminho[$j]);
 		}
-		//echo "
";echo implode("UNION\n\n",$sqls);exit;
 
+		//inclui a selecao se houver
+		$sqlreg = "";
+		if(!empty($selecaoRegiao[$regiao["codigo_tipo_regiao"]])){
+			$rs = $selecaoRegiao[$regiao["codigo_tipo_regiao"]];
+			$sqlreg = " WHERE regiao.".$rs["sql"];
+		}
 		$xml1 .= "
-		".implode(" UNION ",$sqls)."
+			
+					".$dadosSelect["select"]."
+			
 		";
 		$xml2 .= "
-		".implode(" UNION ",$sqls)."
+			
+					".$dadosSelect["select"]."
+			
 		";
-		$niveis1 = array_reverse($niveis1);
-		$niveis2 = array_reverse($niveis2);
-		$xml1 .= implode(" ",$niveis1);
-		$xml2 .= implode(" ",$niveis2);
+		$niveisXml1 = array_reverse($niveisXml1);
+		$niveisXml2 = array_reverse($niveisXml2);
+		$xml1 .= implode(" ",$niveisXml1);
+		$xml2 .= implode(" ",$niveisXml2);
 		$xml1 .= "
 		
 		
@@ -284,11 +503,19 @@ if(empty($_GET["xmlesquema"])){
 		
 		
 		";
+		$xmlRegioes[$regiao["codigo_tipo_regiao"]] = array(
+				"xml" => $xml1.$xml2,
+				"juncoes" => $dadosSelect["juncoes"],
+				"codigo_tipo_regiao"=> $regiao["codigo_tipo_regiao"],
+				"colunas" => $dadosSelect["colunas"],
+				"nomesColunas"=> $dadosSelect["nomesColunas"],
+				"codRegioes"=>$dadosSelect["codRegioes"]
+		);
 	}
-	//echo header("Content-type: application/xml");
-	//echo $xml.$xml1.$xml2;exit;
-	//echo "
";var_dump($filhosDaRegiao);exit;
-	//outras dimensoes definidas nos parametros e que nao sejam do tipo tempo
+	return $xmlRegioes;
+}
+function dimensoesOutras(){
+	global $m;
 	$parametros = $m->listaTodosParametros();
 	$dimOutras = array();
 	foreach($parametros as $p){
@@ -305,7 +532,7 @@ if(empty($_GET["xmlesquema"])){
 	}
 	$xml3 = "";
 	foreach($dimOutras as $d){
-		$k = $p["esquemadb"]."_".$d["tabela"]."_".$d["coluna"];
+		$k = $d["esquemadb"]."_".$d["tabela"]."_".$d["coluna"];
 		$xml3 .= "
 		
 		
@@ -322,16 +549,17 @@ if(empty($_GET["xmlesquema"])){
 		$xml3 .= "
 		";
 	}
-	$xml .= $xml1.$xml2.$xml3;
-	//junta as medidas conforme o nome da tabela utilizada
+	return $xml3;
+}
+function dimensoesTabelas(){
+	global $dimRegioes, $filhosDaRegiao, $m, $VirtualCubeDimension, $VirtualCubeMeasure, $chavesRegiao, $medidas, $codigo_tipo_regiao, $VirtualCubeDimensionDaRegiao, $VirtualCubeMeasureDaRegiao;
 
-	//var_dump($medidas);exit;
+	$xml = "";
 	$tbs = array();
-	//echo $codigo_tipo_regiao;exit;
 	foreach($medidas as $medida){
 		if($codigo_tipo_regiao == "" || $medida["codigo_tipo_regiao"] == $codigo_tipo_regiao){
 			$k = $medida["esquemadb"].$medida["tabela"];
-			//echo "
".$k;
+
 			if(empty($tbs[$k])){
 				$tbs[$k] = array($medida);
 			}
@@ -341,13 +569,9 @@ if(empty($_GET["xmlesquema"])){
 		}
 	}
 	//monta os cubos para cada esquema.tabela diferente
-	$VirtualCubeDimension = array();
-	$VirtualCubeMeasure = array();
-
 	foreach($tbs as $tb){
 		//cabecalho de cada cubo obtido da primeira medida
 		$c = $tb[0];
-
 		$VirtualCubeDimension[] = "
 		
 		";
@@ -356,18 +580,17 @@ if(empty($_GET["xmlesquema"])){
 		";
 
 		array_push(
-				$VirtualCubeDimensionDaRegiao[$c["codigo_tipo_regiao"]],
-				""
-				);
+		$VirtualCubeDimensionDaRegiao[$c["codigo_tipo_regiao"]],
+		""
+		);
 		array_push(
-				$VirtualCubeDimensionDaRegiao[$c["codigo_tipo_regiao"]],
-				""
-				);
+		$VirtualCubeDimensionDaRegiao[$c["codigo_tipo_regiao"]],
+		""
+		);
 		//verifica as dimensoes do tipo tempo
 		$dimEnsoes = array();
-		//echo "
";var_dump($tb)."
"; + foreach($tb as $medida){ - //echo "
";var_dump($medida)."
"; $parametros = $m->listaParametro($medida["id_medida_variavel"],"","",false,false); $parComposto = array(); //guarda a composicao da chave que liga com a dimensao $colunaAdicionais = array(); @@ -389,7 +612,7 @@ if(empty($_GET["xmlesquema"])){ } //outros parametros $outrosParametros = array(); - //echo "
";var_dump($parametros);
+
 			foreach($parametros as $parametro){
 				$k = $parametro["esquemadb"]."_".$parametro["tabela"]."_".$parametro["coluna"];
 				if($parametro["tipo"] > 5 || $parametro["tipo"] == 0){
@@ -404,8 +627,7 @@ if(empty($_GET["xmlesquema"])){
 		//$dimEnsoes[] = '';
 
 		$xml .= "";
-		$incluirChaves = array("*");
-
+		$incluirChaves = array("tabelamedida{$c["id_medida_variavel"]}.*");
 		if(count($parComposto) > 0){
 			//$sql = "select *,".implode("||'-'||",$parComposto)."::text as ".implode("_",$parComposto)."_ from {$c["esquemadb"]}.{$c["tabela"]}";
 			$incluirChaves[] = implode("||'-'||",$parComposto)."::text as ".implode("_",$parComposto)."_";
@@ -416,18 +638,39 @@ if(empty($_GET["xmlesquema"])){
 			}
 		}
 
-		$sql = "select ".implode(",",$incluirChaves).",{$c["colunaidgeo"]}::text as codigodim from {$c["esquemadb"]}.{$c["tabela"]}";
-		//a tabela pode ter dimensoes em diferentes hierarquias
+
+		$r = $chavesRegiao[$c["codigo_tipo_regiao"]];
+		$sql = "
+			select ".implode(",",$incluirChaves).", tabelamedida{$c["id_medida_variavel"]}.{$c["colunaidgeo"]}::text as codigoreg
+		";
+		if(count($dimRegioes[$c["codigo_tipo_regiao"]]["colunas"]) > 0){
+			$sql .= ",".implode(",",$dimRegioes[$c["codigo_tipo_regiao"]]["colunas"]);
+		}
+
+		$sql .= "
+			from {$c["esquemadb"]}.{$c["tabela"]} as tabelamedida{$c["id_medida_variavel"]}
+			JOIN {$r["esquemadb"]}.{$r["tabela"]} as tabela{$r["codigo_tipo_regiao"]}
+			ON  tabela{$r["codigo_tipo_regiao"]}.{$r["identificador"]}::text = tabelamedida{$c["id_medida_variavel"]}.{$c["colunaidgeo"]}::text
+			";
+		$sql .= $dimRegioes[$c["codigo_tipo_regiao"]]["juncoes"];
+
 		$xml .= "
-		$sql
-		
-		
+			$sql
 		";
+		//dimensoes vinculadas
+		$temp = $dimRegioes[$c["codigo_tipo_regiao"]]["codRegioes"];
+		$temp[] = $c["codigo_tipo_regiao"];
+		foreach($temp as $cod){
+			$xml .= "
+				
+				
+			";
+		}
 		//inclui as dimensoes filhas
 		foreach($filhosDaRegiao[$c["codigo_tipo_regiao"]] as $fr){
 			$xml .= "
-				
-				
+				
+				
 			";
 		}
 
@@ -454,60 +697,36 @@ if(empty($_GET["xmlesquema"])){
 		$xml .= "
 		
 		";
-
 	}
-
-	$xml .= '';
+	return $xml;
+}
+function cuboTodas(){
+	global $VirtualCubeDimension, $VirtualCubeMeasure;
+	$xml = '';
 	$VirtualCubeDimension = array_unique($VirtualCubeDimension);
 	$VirtualCubeMeasure = array_unique($VirtualCubeMeasure);
 	$xml .= implode(" ",$VirtualCubeDimension);
 	$xml .= implode(" ",$VirtualCubeMeasure);
 	$xml .= '';
-	//
-	//cubos por regiao
-	//
-	//$filhosDaRegiao = array();
-	//$VirtualCubeDimensionDaRegiao = array();
-	//$VirtualCubeMeasureDaRegiao = array();
-
+	return $xml;
+}
+function cuboRegioes(){
+	global $regioes, $VirtualCubeDimensionDaRegiao, $VirtualCubeMeasureDaRegiao, $filhosDaRegiao;
+	$xml = "";
 	foreach($regioes as $regiao){
 		//inclui os parametros para a regiao de acordo com os filhos que possui
 		$d = $VirtualCubeDimensionDaRegiao[$regiao["codigo_tipo_regiao"]];
-		$m = $VirtualCubeMeasureDaRegiao[$regiao["codigo_tipo_regiao"]];
+		$mm = $VirtualCubeMeasureDaRegiao[$regiao["codigo_tipo_regiao"]];
 		foreach($filhosDaRegiao[$regiao["codigo_tipo_regiao"]] as $f){
-			//$d = array_merge($d,$VirtualCubeDimensionDaRegiao[$f]);
-			$m = array_merge($m,$VirtualCubeMeasureDaRegiao[$f]);
+			$mm = array_merge($mm,$VirtualCubeMeasureDaRegiao[$f]);
 		}
-		if(count(array_unique($m)) > 0){
+		if(count(array_unique($mm)) > 0){
 			$xml .= '';
 			$xml .= implode(" ",array_unique($d));
-			$xml .= implode(" ",array_unique($m));
+			$xml .= implode(" ",array_unique($mm));
 			$xml .= '';
 		}
 	}
-	$xml .= "";
-	error_reporting(0);
-	ob_end_clean();
-
-	if($_GET["output"] == "xml"){
-		echo header("Content-type: application/xml");
-		echo $xml;exit;
-	}
-	gravaDados(array($xml),$arquivoXmlEsquema);
-}
-if($_GET["output"] == "xml"){
-	echo header("Content-type: application/xml");
-	header("Location:".$_GET["xmlesquema"]);
-}
-else{
-	header("Location:".$saikuUrl."/?nomeConexao=".$nomeConexao."&locaplic=".$_GET["locaplic"]."&g_sid=".$_GET["g_sid"]."&mapext=".$_GET["mapext"]."&origem=".$_GET["origem"]);
-}
-function converte($texto){
-	$texto = str_replace("&","&",htmlentities($texto));
-	//$texto = htmlentities($texto);
-	//$texto = mb_convert_encoding($texto, 'ISO-8859-1', "auto");
-	//$texto = utf8_encode($texto);
-	//$textox = mb_convert_encoding($texto, "UTF-8", mb_detect_encoding($texto, "UTF-8, ISO-8859-1, ISO-8859-15", true));
-	return $texto;
+	return $xml;
 }
 ?>
diff --git a/ms_criamapa.php b/ms_criamapa.php
index a260de6..f15862e 100644
--- a/ms_criamapa.php
+++ b/ms_criamapa.php
@@ -214,7 +214,7 @@ Cria os diretorios temporários que serão utilizados pelo i3geo par
 $diretorios = criaDirMapa($dir_tmp,$cachedir);
 if(!$diretorios)
 {echo "

Não foi possível criar os diretórios temporários em $dir_tmp.

";exit;} -criaIndex(); +criaIndex($dir_tmp,$diretorios); $tmpfname = $diretorios[0]; $protocolo = explode("/",$_SERVER['SERVER_PROTOCOL']); /* @@ -329,7 +329,6 @@ $_SESSION["contadorsalva"] = 0;//essa variavel e utilizada pela ferramenta telar $_SESSION["i3georendermode"] = $i3georendermode_; $_SESSION["saikuUrl"] = $saikuUrl_; - // //pega todas as variáveis da sessão, mesmo as que foram definidas anteriormente // @@ -450,6 +449,7 @@ else{ //algumas aplicacoes usam essa variavel (SAIKU) $mapext = $ext->minx." ".$ext->miny." ".$ext->maxx." ".$ext->maxy; } + /* Configura os endereços corretos no mapfile. @@ -490,20 +490,20 @@ if(isset($poligonos)) if(isset($url_wms)) {incluiTemaWms();} -adaptaLayers(); +adaptaLayers($tmpfname,$versao); if (file_exists($locaplic."/pacotes/geoip") && file_exists($locaplic."/pacotes/geoip/GeoLiteCity.dat")) {require_once(dirname(__FILE__)."/ms_registraip.php");} //echo $tmpfname;exit; if ($interface != "mashup") {abreInterface($interface,$caminho,$tempo);} + /* Adapta os dados de cada layer. Faz alterações em cada layer caso sejam necessárias. */ -function adaptaLayers(){ - global $tmpfname,$versao; +function adaptaLayers($tmpfname,$versao){ $mapa = ms_newMapObj($tmpfname); $path = $mapa->shapepath; $numlayers = $mapa->numlayers; @@ -749,11 +749,10 @@ function incluiTemasIniciais(){ erroCriacao(); } /* -Cria os arquivos vazios index.htm e index.html nos diret�rios temporários +Cria os arquivos vazios index.htm e index.html nos diretorios temporários */ -function criaIndex() +function criaIndex($dir_tmp,$diretorios) { - global $dir_tmp,$diretorios; if (!file_exists($dir_tmp."/index.htm")) { $f = fopen($dir_tmp."/index.htm","x"); @@ -771,7 +770,7 @@ function criaIndex() } if (!file_exists($dir_tmp."/index.htm")) { - echo "Erro. Não foi possível gravar no diret�rio temporário"; + echo "Erro. Não foi possível gravar no diretório temporário"; exit; } } -- libgit2 0.21.2