From 304cc8799f9156c6a7c626e44246fa709dc5ec22 Mon Sep 17 00:00:00 2001 From: edmarmoretti Date: Tue, 25 Apr 2017 20:25:57 -0300 Subject: [PATCH] Criação de classe PHP com métodos que permitem extrair informações do banco de dados Postgres e do sistema de administração. Complementação do formulário de edição de regiões (sistema de metadados estatísticos) para inclusão de botões que obtém listas de valores, auxiliando o usuário no preenchimento dos campos. --- admin/php/classe_metaestat.php | 2 +- admin1/js/bdexplorer.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ admin1/metaestat/regioes/index.js | 18 ++++++++++++++++++ admin1/metaestat/regioes/templates/templateFormLista.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- admin1/php/bdexplorer.php | 46 ++++++++++++++++++++++++++++++++++++++++++++-- classesphp/classe_bdexplorer.php | 1241 +++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- classesphp/classe_metaestat.php | 2017 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ms_configura.php | 2 +- 8 files changed, 2265 insertions(+), 1222 deletions(-) mode change 100644 => 100755 admin1/js/bdexplorer.js mode change 100644 => 100755 admin1/php/bdexplorer.php create mode 100755 classesphp/classe_metaestat.php diff --git a/admin/php/classe_metaestat.php b/admin/php/classe_metaestat.php index 7e78125..552a2d5 100755 --- a/admin/php/classe_metaestat.php +++ b/admin/php/classe_metaestat.php @@ -92,7 +92,7 @@ class Metaestat{ $this->nomecache = $this->nomeCache(); } function __destruct(){ - $this->fechaConexao; + $this->fechaConexao(); } /** * Cria um nome de arquivo concatenando $_request diff --git a/admin1/js/bdexplorer.js b/admin1/js/bdexplorer.js old mode 100644 new mode 100755 index 964d4a7..4bc44e0 --- a/admin1/js/bdexplorer.js +++ b/admin1/js/bdexplorer.js @@ -4,6 +4,7 @@ if (typeof (i3GEOadmin) === 'undefined') { i3GEOadmin.bdExplorer = { popOverTemplate: '', templateListaPopOver: '{{{valor}}}', + templateListaPopOver1: '{{{chave}}}', popOver: function(destino, conteudo){ var pop = $("#modalGeral input[name='" + destino + "']").popover({ "content": conteudo, @@ -50,5 +51,94 @@ i3GEOadmin.bdExplorer = { } else { $(".popover").popover("destroy"); } + }, + listaTabelas: function(codigo_estat_conexao,esquema,destino){ + if($(".popover").length == 0){ + $.post( + i3GEO.configura.locaplic + "/admin1/php/bdexplorer.php?funcao=listarTabelas", + "esquema=" + esquema + "&codigo_estat_conexao=" + codigo_estat_conexao + ) + .done( + function(data, status){ + var c = "", json = jQuery.parseJSON(data); + c = Mustache.to_html( + "{{#data}}" + i3GEOadmin.bdExplorer.templateListaPopOver + "{{/data}}", + { + "data":json, + "destino": destino, + "valor": function() { + return this; + } + } + ); + i3GEOadmin.bdExplorer.popOver(destino,c); + } + ) + .fail( + function(data){ + i3GEOadmin.core.mostraErro(data.status + " " +data.statusText); + } + ); + } else { + $(".popover").popover("destroy"); + } + }, + listaColunas: function(codigo_estat_conexao,esquema,tabela,destino){ + if($(".popover").length == 0){ + $.post( + i3GEO.configura.locaplic + "/admin1/php/bdexplorer.php?funcao=listarColunas", + "tabela=" + tabela + "&esquema=" + esquema + "&codigo_estat_conexao=" + codigo_estat_conexao + ) + .done( + function(data, status){ + var c = "", json = jQuery.parseJSON(data); + c = Mustache.to_html( + "{{#data}}" + i3GEOadmin.bdExplorer.templateListaPopOver + "{{/data}}", + { + "data":json, + "destino": destino, + "valor": function() { + return this; + } + } + ); + i3GEOadmin.bdExplorer.popOver(destino,c); + } + ) + .fail( + function(data){ + i3GEOadmin.core.mostraErro(data.status + " " +data.statusText); + } + ); + } else { + $(".popover").popover("destroy"); + } + }, + listaCodigosConexao: function(destino){ + if($(".popover").length == 0){ + $.post( + i3GEO.configura.locaplic + "/admin1/php/bdexplorer.php?funcao=listarCodigosConexao" + ) + .done( + function(data, status){ + var c = "", json = jQuery.parseJSON(data); + c = Mustache.to_html( + "{{#data}}" + i3GEOadmin.bdExplorer.templateListaPopOver1 + "{{/data}}", + { + "data":json, + "destino": destino + } + ); + i3GEOadmin.bdExplorer.popOver(destino,c); + } + ) + .fail( + function(data){ + i3GEOadmin.core.mostraErro(data.status + " " +data.statusText); + } + ); + } else { + $(".popover").popover("destroy"); + } } }; \ No newline at end of file diff --git a/admin1/metaestat/regioes/index.js b/admin1/metaestat/regioes/index.js index d6d397c..eace418 100755 --- a/admin1/metaestat/regioes/index.js +++ b/admin1/metaestat/regioes/index.js @@ -257,7 +257,25 @@ Obtém a lista de regioes //abre a pagina de edicao window.location.href = "hierarquia/index.php?codigo_tipo_regiao=" + codigo_tipo_regiao; }, + listaCodigosConexao: function(destino){ + i3GEOadmin.bdExplorer.listaCodigosConexao(destino); + }, listaEsquemas: function(destino){ i3GEOadmin.bdExplorer.listaEsquemas(destino); + }, + listaTabelas: function(destino){ + var esquema = $(".modal-body form input[name='esquemadb']").val(); + var codigo_estat_conexao = $(".modal-body form input[name='codigo_estat_conexao']").val(); + if(esquema != "" && codigo_estat_conexao != ""){ + i3GEOadmin.bdExplorer.listaTabelas(codigo_estat_conexao,esquema,destino); + } + }, + listaColunas: function(destino){ + var codigo_estat_conexao = $(".modal-body form input[name='codigo_estat_conexao']").val(); + var esquema = $(".modal-body form input[name='esquemadb']").val(); + var tabela = $(".modal-body form input[name='tabela']").val(); + if(esquema != "" && codigo_estat_conexao != ""){ + i3GEOadmin.bdExplorer.listaColunas(codigo_estat_conexao,esquema,tabela,destino); + } } }; \ No newline at end of file diff --git a/admin1/metaestat/regioes/templates/templateFormLista.php b/admin1/metaestat/regioes/templates/templateFormLista.php index 473c7ff..a533368 100755 --- a/admin1/metaestat/regioes/templates/templateFormLista.php +++ b/admin1/metaestat/regioes/templates/templateFormLista.php @@ -5,7 +5,7 @@
- +
@@ -25,8 +25,15 @@
- -
+
+ + +
+
@@ -36,7 +43,7 @@
+
@@ -51,8 +59,15 @@
@@ -61,8 +76,15 @@
- -
+
+ + +
+
@@ -81,8 +103,15 @@
- -
+
+ + +
+
@@ -91,8 +120,15 @@
- -
+
+ + +
+
@@ -111,8 +147,15 @@
- -
+
+ + +
+
diff --git a/admin1/php/bdexplorer.php b/admin1/php/bdexplorer.php old mode 100644 new mode 100755 index 342da8c..02cd139 --- a/admin1/php/bdexplorer.php +++ b/admin1/php/bdexplorer.php @@ -1,6 +1,5 @@ listaConexao((int) $_POST["codigo_estat_conexao"],true,false); + $bd = new \i3geo\classesphp\bdexplorer\Bdexplorer($_SESSION["locaplic"],$parametros); + $dados = $bd->listaDeTabelas($_POST["esquema"]); + if ($dados === false) { + header ( "HTTP/1.1 500 erro ao consultar banco de dados" ); + } else { + \admin\php\funcoesAdmin\retornaJSON ( $dados ); + } + break; + case "LISTARCOLUNAS" : + //pega os parametros de conexao + $mt = new \i3geo\classesphp\metaestat\Metaestat(); + $parametros = $mt->listaConexao((int) $_POST["codigo_estat_conexao"],true,false); + $bd = new \i3geo\classesphp\bdexplorer\Bdexplorer($_SESSION["locaplic"],$parametros); + $dados = $bd->listaDeColunas($_POST["esquema"],$_POST["tabela"]); + if ($dados === false) { + header ( "HTTP/1.1 500 erro ao consultar banco de dados" ); + } else { + \admin\php\funcoesAdmin\retornaJSON ( $dados ); + } + break; + case "LISTARCODIGOSCONEXAO" : + //pega os parametros de conexao + $mt = new \i3geo\classesphp\metaestat\Metaestat(); + $dados = $mt->listaConexao("",false,false); + if ($dados === false) { + header ( "HTTP/1.1 500 erro ao consultar banco de dados" ); + } else { + $kv = array(); + foreach($dados as $d){ + $kv[] = array("chave"=>$d["bancodedados"],"valor"=>$d["codigo_estat_conexao"]); + } + \admin\php\funcoesAdmin\retornaJSON ( $kv ); + } + break; default: if(!empty ($funcao)) header ( "HTTP/1.1 500 erro funcao nao existe" ); break; diff --git a/classesphp/classe_bdexplorer.php b/classesphp/classe_bdexplorer.php index 027104e..be64464 100755 --- a/classesphp/classe_bdexplorer.php +++ b/classesphp/classe_bdexplorer.php @@ -51,63 +51,30 @@ class Bdexplorer{ if(!empty($esquemaadmin)){ $this->esquemaadmin = str_replace(".","",$esquemaadmin)."."; } - $this->nomecache = $this->nomeCache(); if(!isset($i3geoEsquemasWL) || !is_array($i3geoEsquemasWL)){ $this->i3geoEsquemasWL = array(); } else { $this->i3geoEsquemasWL = $i3geoEsquemasWL; } //se a conexao nao vier como parametro, cria uma nova - if(empty($dbh)){ - $this->conecta($conexaoadmin); + if(is_array($dbh)){ + $this->dbh = $this->conecta($dbh); } else { $this->dbh = $dbh; - if(!isset($convUTF)){ - $this->convUTF = true; - } else { - $this->convUTF = $convUTF; - } } } function __destruct(){ $this->fechaConexao(); } - function conecta($conexaoadmin){ - if($conexaoadmin == ""){ - //banco de dados sqlite default - $arquivosqlite = $this->locaplic."/admin/admin.db"; - if(!file_exists($arquivosqlite)){ - header ( "HTTP/1.1 500 O arquivo admin.db nao existe. Utilize i3geo/admin/criabanco.php para criar o banco de dados SQLITE." ); - exit; - } - $conAdmin = "sqlite:$arquivosqlite"; - $conAdminw = "sqlite:$arquivosqlite"; - if(!extension_loaded("PDO")){ - header ( "HTTP/1.1 500 PDO nao instalado" ); - exit; - } - if (!extension_loaded( "pdo_sqlite")){ - header ( "HTTP/1.1 500 pdo_sqlite nao instalado" ); - exit; - } - if (!extension_loaded( "SQLite") && !extension_loaded( "sqlite3")){ - header ( "HTTP/1.1 500 sqlite nao instalado" ); - exit; - } - try { - $dbh = new PDO($conAdmin); - } - catch (PDOException $e) { - die(); - } - } - else { - include($conexaoadmin); - if(isset($convUTF)){ - $this->convUTF = $convUTF; - } - } - $this->dbh = $dbh; + function conecta($c){ + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); + return $dbh; + } + /** + * Fecha a conexao com o banco de dados de administracao + */ + function fechaConexao(){ + $this->dbh = null; } function listaDeEsquemas(){ return $this->i3geoEsquemasWL; @@ -121,1180 +88,46 @@ class Bdexplorer{ } return $novaLista; } - /** - * Cria um nome de arquivo concatenando $_request - * @return string - */ - function nomeCache(){ - return "AAAA".md5(implode("x",$_REQUEST)); - } - /** - * Cria um nome aleatorio - * @param numero de caracteres - * @return string - */ - function nomeRandomico($n=10){ - $nomes = ""; - $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $max = 51; - for($i=0; $i < $n; ++$i) - { - $nomes .= $a{mt_rand(0, $max)}; + function validaEsquema($esquema){ + $lista = $this->validaEsquemas(array($esquema)); + if(count($lista) == 0){ + return false; + } else { + return true; } - return $nomes; } - /** - * Fecha a conexao com o banco de dados de administracao - */ - function fechaConexao(){ - $this->dbh = null; - } - /** - * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao - * Verifica se o parametro e um array ou um texto e executa converteTexto() - * @param string|array - * @return string|array - */ - function converteTextoArray($texto){ - try { - if(empty($texto) || strtoupper($texto) == "NULL"){ - return ""; - } - $chaves = array_keys($texto); - if($chaves[0] != "0"){ - foreach($chaves as $chave){ - $texto[$chave] = $this->converteTexto($texto[$chave]); - } - } - else{ - $n = count($texto); - for($i=0;$i<$n;$i++){ - $chaves = array_keys($texto[$i]); - foreach($chaves as $chave){ - if(is_string($texto[$i][$chave])){ - $t = $this->converteTexto($texto[$i][$chave]); - $texto[$i][$chave] = $t; - } - } - } + function listaDeTabelas($esquema){ + $tabelas = array(); + if($this->validaEsquema($esquema) == true){ + $sql = "SELECT table_name as tabela FROM information_schema.tables where table_schema = '$esquema' AND table_schema NOT LIKE 'i3geo%' AND table_schema NOT LIKE 'pg_%' AND table_schema NOT LIKE '%_schema%'"; + $res = $this->execSQL($sql); + foreach($res as $r){ + $tabelas[] = $r["tabela"]; } - return $texto; - } - catch (Exception $e) { - return $texto; } + return $tabelas; } - /** - * Converte a codificacao de caracteres de uma string conforme o padrao do banco de admnistracao - * @param string - * @return string - */ - function converteTexto($texto){ - if($texto == "0"){ - return "0"; - } - if(empty($texto)){ - return ""; - } - if($this->convUTF == true){ - $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"UTF-8"); - } - else{ - $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"ISO-8859-1"); + function listaDeColunas($esquema,$tabela){ + $colunas = array(); + if($this->validaEsquema($esquema) == true){ + $sql = "SELECT column_name as coluna,udt_name FROM information_schema.columns where table_schema = '$esquema' and table_name = '$tabela'"; + $res = $this->execSQL($sql); + foreach($res as $r){ + $colunas[] = $r["coluna"]; + } } - return $texto; + return $colunas; } - /** - * Executa um SQL no banco de administracao - * Utiliza fetchAll() para obter os dados - * O resultado e processado por converteTextoArray se for desejado - * @param string sql - * @param se for vazio retorna todos os registros, caso contrario, retorna apenas o primeiro - * @param indica se deve ser feita a conversao de caracteres - * @return Array - */ - function execSQL($sql,$id="",$convTexto=true){ + function execSQL($sql){ $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql); try { $q = $this->dbh->query($sql,PDO::FETCH_ASSOC); + $q = $q->fetchAll(); + return $q; } catch (PDOException $e) { return "Error!: "; } - if($q){ - $r = $q->fetchAll(); - if($convTexto == false){ - return $r; - } - if($r){ - if($id != ""){ - if(count($r) == 1){ - $r = $r[0]; - } - else{ - $r = array(); - } - } - if($r != false && count($r) > 0){ - $r = $this->converteTextoArray($r); - } - return $r; - } - else{ - return array(); - } - } - else{ - return false; - } - } - /** - * Executa um SQL no banco de dados definido em uma conexao cadastrada no sistema de admnistracao - * @param codigo da conexao - * @param tring sql - * @return resultado de execSQL - */ - function execSQLDB($codigo_estat_conexao,$sql){ - $buscar = array("drop","update","insert","delete"); - $sql = str_ireplace($buscar,"",$sql); - $c = $this->listaConexao($codigo_estat_conexao,true); - $dbhold = $this->dbh; - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); - $this->dbh = $dbh; - $res = $this->execSQL($sql,"",false); - $this->dbh = $dbhold; - return $res; - } - /** - * Obtem os dados de uma medida de variavel - * @param id da medida - * @param filtro que sera concatenado ao sql - * @param 0|1 mostra ou nao todas as colunas da tabela com os dados - * @param coluna de agrupamento - * @param limite do numero de registros - * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro - * @return execSQL - */ - function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){ - set_time_limit(0); - $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto); - $sqlf = $sql["sqlmapserver"]; - //remove marcadores geo - $sqlf = explode("/*SE*/",$sqlf); - $sqlf = explode("/*SG*/",$sqlf[1]); - $sqlf = $sqlf[0]." ".$sqlf[2]; - if($limite != ""){ - $sqlf .= " limit ".$limite; - } - $sqlf = str_replace(", FROM"," FROM",$sqlf); - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel); - //echo $sqlf;exit; - if(!empty($metaVariavel["codigo_estat_conexao"])){ - $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true); - $dbhold = $this->dbh; - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); - $this->dbh = $dbh; - $res = $this->execSQL($sqlf); - $this->dbh = $dbhold; - return $res; - } - return false; - } - /** - * Lista as ocorrencias de valores em uma coluna de uma medida de variavel - * @param id da medida de variavel - * @param coluna - * @return execSQL - */ - function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){ - $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna); - $sqlf = $sqlf["sqlagrupamento"]; - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel); - if(!empty($metaVariavel["codigo_estat_conexao"])){ - $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true); - $dbhold = $this->dbh; - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); - $this->dbh = $dbh; - $res = $this->execSQL($sqlf); - $this->dbh = $dbhold; - return $res; - } - return false; - } - /** - * Sumario estatistico de uma medida de variavel - * @param id da medida - * @param filtro a ser concatenado ao sql - * @param coluna de agrupamento - * @param limite numero maximo de registros que serao lidos do banco - * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro - * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>) - */ - function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){ - if(!empty($agruparpor)){ - $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto); - } - else{ - $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto); - } - if($dados){ - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel); - $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]); - $agrupamento = ""; - $colunavalor = $metaVariavel["colunavalor"]; - foreach($dados as $d){ - if($d[$colunavalor]){ - $valores[] = $d[$colunavalor]; - } - } - if(!empty($agruparpor)){ - $agrupamento = array(); - foreach($dados as $d){ - $g = $d[$agruparpor]; - //var_dump($d);exit; - if(!empty($agrupamento[$g])){ - $agrupamento[$g] += $d[$colunavalor]; - } - else{ - $agrupamento[$g] = $d[$colunavalor]; - } - } - natsort($agrupamento); - } - $soma = ""; - $media = ""; - $min = ""; - $max = ""; - $quantidade = count($valores); - $sturges = 1 + (3.322 * (log10($quantidade))); - $quartis = array(); - if($un["permitesoma"] == "1"){ - $soma = array_sum($valores); - } - if($un["permitemedia"] == "1"){ - $media = $soma / $quantidade; - } - if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){ - sort($valores); - //var_dump($valores);exit; - $min = $valores[0]; - $max = $valores[$quantidade - 1]; - include_once(dirname(__FILE__)."/../../classesphp/classe_estatistica.php"); - $calc = new estatistica(); - $calc->calcula($valores); - $v = $calc->resultado; - //expressao para o mapfile - $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")"; - $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))"; - if($v["quartil3"] != 0){ - $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))"; - $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")"; - } - $nomes[] = "<= ".($v["quartil1"]); - $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]); - if($v["quartil3"] != 0){ - $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]); - $nomes[] = "> ".($v["quartil3"]); - } - $quartis = array( - "cortes"=>array( - "q1"=>$v['quartil1'], - "q2"=>$v['quartil2'], - "q3"=>$v['quartil3'] - ), - "expressoes"=>$expressao, - "nomes"=>$nomes - ); - } - $histograma = array_count_values($valores); - //echo "
".var_dump($quartis);exit;
-			return array(
-						"colunavalor"=>$colunavalor,
-						"soma"=>$soma,
-						"media"=>$media,
-						"menor"=>$min,
-						"maior"=>$max,
-						"quantidade"=>$quantidade,
-						"histograma"=>$histograma,
-						"grupos"=>$agrupamento,
-						"unidademedida"=>$un,
-						"quartis"=>$quartis,
-						"sturges"=>$sturges
-					);
-		}
-		return false;
-	}
-	/**
-	 * Lista os dados de um ou de todos os mapas cadastrados
-	 * @param id do mapa
-	 */
-	function listaMapas($id_mapa=""){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_mapa ";
-		if($id_mapa != ""){
-			$sql .= "WHERE id_mapa = $id_mapa ";
-		}
-		$sql .= "ORDER BY titulo";
-		return $this->execSQL($sql,$id_mapa);
-	}
-	/**
-	 * Lista os dados de um ou de todos os mapas grupos de um mapa
-	 * @param id do mapa
-	 * @param id do grupo
-	 */
-	function listaGruposMapa($id_mapa,$id_mapa_grupo){
-		if(!empty($id_mapa)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa = $id_mapa";
-		}
-		if(!empty($id_mapa_grupo)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa_grupo = $id_mapa_grupo";
-		}
-		$sql .= " ORDER BY titulo";
-		return $this->execSQL($sql,$id_mapa_grupo);
-	}
-	/**
-	 * Lista os dados de um ou de todos os temas de um grupo de um mapa
-	 * @param id do mapa
-	 * @param id do grupo
-	 * @param id do tema
-	 */
-	function listaTemasMapa($id_mapa_grupo,$id_mapa_tema){
-		if(!empty($id_mapa_grupo)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_grupo = $id_mapa_grupo";
-		}
-		if(!empty($id_mapa_tema)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_tema = $id_mapa_tema";
-		}
-		$sql .= " ORDER BY titulo";
-		return $this->execSQL($sql,$id_mapa_tema);
-	}
-	/**
-	 * Lista os dados de uma ou todas as unidades de medida cadastradas
-	 * @param codigo da unidade
-	 */
-	function listaUnidadeMedida($codigo_unidade_medida=""){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
-		if($codigo_unidade_medida != ""){
-			$sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
-		}
-		$sql .= "ORDER BY nome";
-		return $this->execSQL($sql,$codigo_unidade_medida);
-	}
-	/**
-	 * Lista os dados de uma ou todas as fontes cadastradas
-	 * @param id da fonte
-	 */
-	function listaFonteinfo($id_fonteinfo=""){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
-		if($id_fonteinfo != ""){
-			$sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
-		}
-		$sql .= "ORDER BY titulo";
-		return $this->execSQL($sql,$id_fonteinfo);
-	}
-	/**
-	 * Lista as fontes vinculadas a uma medida de variavel
-	 * @param id da medida de variavel
-	 */
-	function listaFonteinfoMedida($id_medida_variavel){
-		$sql = "SELECT i3geoestat_fonteinfo.* ";
-		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
-		$sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
-		$sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
-		$sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
-		$sql .= "ORDER BY titulo";
-		//echo $sql;exit;
-		return $this->execSQL($sql,$id_fonteinfo);
-	}
-	/**
-	 * Lista os dados de uma ou todas as variaveis cadastradas
-	 * @param codigo da variavel
-	 * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
-	 */
-	function listaVariavel($codigo_variavel="",$filtro_esquema=""){
-		$sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
-		if($codigo_variavel != ""){
-			$sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
-		}
-		if($filtro_esquema != ""){
-			$sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
-		}
-		$sql .= "ORDER BY a.nome";
-		//echo $sql;exit;
-		return $this->execSQL($sql,$codigo_variavel);
-	}
-	/**
-	 * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
-	 * @param id da medida de variavel
-	 * @param id da classificacao
-	 */
-	function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
-		if(!empty($id_medida_variavel)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
-		}
-		if(!empty($id_classificacao)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
-		}
-		return $this->execSQL($sql,$id_classificacao);
-	}
-	/**
-	 * Lista os dados de um ou todos os links de uma medida
-	 * @param id da medida
-	 * @param id do link
-	 */
-	function listaLinkMedida($id_medida_variavel,$id_link=""){
-		if(!empty($id_medida_variavel)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
-		}
-		if(!empty($id_link)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
-		}
-		return $this->execSQL($sql,$id_link);
-	}
-	/**
-	 * Lista os dados de uma ou todas as classes de uma classificacao
-	 * @param id da classificacao
-	 * @param id da classe
-	 */
-	function listaClasseClassificacao($id_classificacao,$id_classe=""){
-		if(!empty($id_classificacao)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
-		}
-		if(!empty($id_classe)){
-			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
-		}
-		return $this->execSQL($sql,$id_classe);
-	}
-	/**
-	 * Lista os dados de uma ou todas as medidas de variavel de uma variavel
-	 * @param codigo da variavel
-	 * @param id da medida de variavel
-	 */
-	function listaMedidaVariavel($codigo_variavel,$id_medida_variavel=""){
-		$sql = "SELECT i3geoestat_medida_variavel.*,i3geoestat_variavel.nome as nome_variavel,i3geoestat_unidade_medida.permitemedia,i3geoestat_unidade_medida.permitesoma,i3geoestat_unidade_medida.nome as unidade_medida ";
-		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
-		$sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
-		$sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
-		$sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
-		$sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
-		if($codigo_variavel != ""){
-			$sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
-			if($id_medida_variavel != ""){
-				$sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
-			}
-		}
-		elseif($id_medida_variavel != "") {
-			$sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
-		}
-		$sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
-		$res = $this->execSQL($sql,$id_medida_variavel);
-		$res = str_replace('"',"'",$res);
-		return $res;
-	}
-	/**
-	 * Lista as regioes vinculadas a uma medida de variavel
-	 * @param id da medida de vriavel
-	 */
-	function listaRegioesMedida($id_medida_variavel){
-		$variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
-		$codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
-		$regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
-		//var_dump($regioes);exit;
-		$agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
-		foreach($agregacoes as $a){
-			$regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
-		}
-		return $regioes;
-	}
-	/**
-	 * Lista os dados de uma conexao ou de todas
-	 * @param id da conexao
-	 * @param boolean inclui na lista a senha ou nao
-	 * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
-	 */
-	function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
-		if($senha == true){
-			$colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
-		}
-		else{
-			$colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
-		}
-		$sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
-		if($codigo_estat_conexao != ""){
-			$sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
-		}
-		$sql .= "ORDER BY bancodedados,host,usuario";
-		$res = $this->execSQL($sql,$codigo_estat_conexao);
-		//se achou e a requisico e para listar uma conexao, retorna o que for encontrado
-		$cres = count($res);
-		if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
-			return $res;
-		}
-		//caso contrario, e deve retornar todas as conexoes, inclui a fonte
-		if($codigo_estat_conexao == ""){
-			for($i=0; $i<$cres;$i++){
-				$res[$i]["fonte"] = "metaestat";
-			}
-		}
-		//obtem as conexoes definidas em ms_configgura.php
-		if($incluiPostgisMapa == true){
-			if(!isset($postgis_mapa)){
-				require(dirname(__FILE__)."/../../ms_configura.php");
-			}
-			if(!empty($postgis_mapa)){
-				foreach(array_keys($postgis_mapa) as $key){
-					$lista = explode(" ",$postgis_mapa[$key]);
-					$con = array();
-					foreach($lista as $l){
-						$teste = explode("=",$l);
-						$con[trim($teste[0])] = trim($teste[1]);
-					}
-					$c = array(
-						"codigo_estat_conexao" => $key,
-						"bancodedados" => $con["dbname"],
-						"host" => $con["host"],
-						"porta" => $con["port"],
-						"usuario" => $con["user"],
-						"fonte" => "ms_configura"
-					);
-					if($senha == true){
-						$c["senha"] = $con["password"];
-					}
-					$res[] = $c;
-					if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
-						return $c;
-					}
-				}
-			}
-		}
-		//echo "
";
-		//var_dump($res);exit;
-		return $res;
-	}
-	function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
-		//lista os parametros temporais
-		$parametros = $this->listaParametro($id_medida_variavel,"","",true,true);
-		echo "
";
-		//var_dump($parametros);exit;
-		//faz o sql para pegar os valores e definir a resolucao
-		//o tempo deve comecar sempre pelo ano
-		$data = array();
-		if($parametros[0]["tipo"] == 1){
-			//ano
-			$data[] = $prefixoAlias.$parametros[0]["coluna"];
-			$tipodata = "YYYY";
-			//mes
-			if(!empty($parametros[1])){
-				$data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
-				$tipodata = "YYYYMM";
-			}
-			else{
-				$data[] = "'-01'";
-			}
-			//dia
-			if(!empty($parametros[2])){
-				$data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
-				$tipodata = "YYYYMMDD";
-			}
-			else{
-				$data[] = "'-01'";
-			}
-			$data = implode("||",$data);
-			return "to_date($data,'$tipodata')";
-		}
-	}
-	/**
-	 * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
-	 * @param id da medida de variavel
-	 * @param id do parametro
-	 * @param id do pai (se definido, lista apenas os filhos deste)
-	 * @param bool indica se apenas parametros do tipo temporal serao retornados
-	 */
-	function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
-		$sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
-		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
-		$sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
-		$sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
-		if($id_medida_variavel != ""){
-			$sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
-			if($id_parametro_medida != ""){
-				$sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
-			}
-		}
-		elseif ($id_parametro_medida != ""){
-			$sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
-		}
-		if($id_pai != ""){
-			$sql .= " AND id_pai = $id_pai";
-		}
-		if($apenasTempo == true){
-			$tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
-			$sql .= $tempo;
-		}
-		if($ordenaPeloPai == true){
-			$sql .= " ORDER BY id_pai";
-		}
-		//echo $sql;exit;
-		return $this->execSQL($sql,$id_parametro_medida);
-	}
-	/**
-	 * Lista todos os parametros cadastrados
-	 */
-	function listaTodosParametros(){
-		$sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
-		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
-		$sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
-		$sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
-		$sql .= " ORDER BY nome";
-		return $this->execSQL($sql);
-	}
-	/**
-	 * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
-	 * @param id do parametro
-	 * @return array com os valores
-	 */
-	function listaValoresParametro($id_parametro_medida){
-		$parametro = $this->listaParametro("",$id_parametro_medida);
-		//$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
-		$sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
-		$nsm = array();
-		foreach($sm as $s){
-			$nsm[] = $s[$parametro["coluna"]];
-		}
-		return $nsm;
-	}
-	/**
-	 * Lista os dados de um ou todos os tipos de periodo cadastrados
-	 * @param id
-	 */
-	function listaTipoPeriodo($codigo_tipo_periodo=""){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
-		if($codigo_tipo_periodo != ""){
-			$sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
-		}
-		$sql .= "ORDER BY nome";
-		return $this->execSQL($sql,$codigo_tipo_periodo);
-	}
-	/**
-	 * Lista as propriedades da coluna com as geometrias de uma regiao geografica
-	 * @param codigo do tipo de regiao
-	 * @return array com os parametros, inclusive a dimensao (st_dimension)
-	 */
-	function listaPropGeoRegiao($codigo_tipo_regiao){
-		//st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
-		$regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
-		$c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
-		$dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
-		$c = $regiao["colunageo"];
-		$sql = "select st_dimension(".$regiao["colunageo"].") as st_dimension from ".$regiao["esquemadb"].".".$regiao["tabela"]." limit 1";
-		$q = $dbh->query($sql,PDO::FETCH_ASSOC);
-		$r = array();
-		if($q){
-			$r = $q->fetchAll();
-			$r = $r[0];
-		}
-		return $r;
-	}
-	/**
-	 * Lista os dados de uma ou todas as regioes cadastradas
-	 * @param codigo do tipo de regiao
-	 */
-	function listaTipoRegiao($codigo_tipo_regiao=""){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
-		if($codigo_tipo_regiao != ""){
-			$sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
-		}
-		$sql .= "ORDER BY nome_tipo_regiao";
-		return $this->execSQL($sql,$codigo_tipo_regiao);
-	}
-	/**
-	 * Obtem de um tipo de regiao a coluna do tipo serial
-	 * @param codigo do tipo de regiao
-	 */
-	function listaTipoRegiaoSerial($codigo_tipo_regiao){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
-		$regiao = $this->execSQL($sql,$codigo_tipo_regiao);
-		$nome_esquema = $regiao["esquemadb"];
-		$nome_tabela = $regiao["tabela"];
-		$sql = "SELECT a.attname as coluna FROM pg_class s JOIN pg_depend d ON d.objid = s.oid JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) JOIN pg_namespace n ON n.oid = s.relnamespace WHERE s.relkind = 'S' AND n.nspname = '$nome_esquema' AND t.relname = '$nome_tabela'";
-		$colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
-		$colunas = $colunas[0];
-		return $colunas["coluna"];
-	}
-	/**
-	 * Obtem de uma tabela a coluna do tipo serial
-	 * @param codigo do tipo de regiao
-	 */
-	function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
-		$sql = "SELECT a.attname as coluna FROM pg_class s JOIN pg_depend d ON d.objid = s.oid JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) JOIN pg_namespace n ON n.oid = s.relnamespace WHERE s.relkind = 'S' AND n.nspname = '$nome_esquema' AND t.relname = '$nome_tabela'";
-		$colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
-		$colunas = $colunas[0];
-		return $colunas["coluna"];
-	}
-	/**
-	 * Lista os dados de agregacao de uma regiao pai
-	 * @param codigo da regiao
-	 */
-	function listaHierarquiaRegioes($codigoregiaopai=""){
-		$sql = "select i3geoestat_agregaregiao.id_agregaregiao,i3geoestat_agregaregiao.colunaligacao_regiaopai,i3geoestat_tipo_regiao.codigo_tipo_regiao,i3geoestat_tipo_regiao.nome_tipo_regiao from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
-		$sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
-		$sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
-		if($codigoregiaopai != ""){
-			$sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
-		}
-		else{
-			$sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
-		}
-		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
-	 * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
-	 * @param codigo do tipo de regiao
-	 * @param codigo do tipo de regiao pai
-	 * @param identificador da regiao (registro) pai
-	 */
-	function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
-		//pega a tabela, esquema e conexao para acessar os dados da regiao
-		$regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
-		$c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
-		$dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
-		$c = $regiao["colunageo"];
-		$bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
-		$sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
-		if($valorregiaopai != ""){
-			$r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
-			$sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
-		}
-		$sql .= " order by ".$regiao["colunanomeregiao"];
-
-		$q = $dbh->query($sql,PDO::FETCH_ASSOC);
-		$r = array();
-		if($q){
-			$r = $q->fetchAll();
-		}
-		return $r;
-	}
-	/**
-	 * Lista os registros de uma tabela que e uma regiao
-	 * @param codigo do tipo de regiao
-	 */
-	function listaDadosGeometriaRegiao($codigo_tipo_regiao){
-		//pega a tabela, esquema e conexao para acessar os dados da regiao
-		$regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
-		$c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
-		$dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
-		$c = $regiao["colunageo"];
-		$s = "ST_dimension($c) as dimension ";
-		$sql = "select $s,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
-		$sql .= " limit 1";
-		$q = $dbh->query($sql,PDO::FETCH_ASSOC);
-		$r = array();
-		if($q){
-			$r = $q->fetchAll();
-		}
-		return $r[0];
-	}
-	/**
-	 * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
-	 * @param codigo do tipo de regiao
-	 * @param id da agregacao
-	 */
-	function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
-		$sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
-		if($id_agregaregiao != ""){
-			$sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
-		}
-		else{
-			if($codigo_tipo_regiao != ""){
-				$sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
-			}
-		}
-		$sql .= " ORDER BY colunaligacao_regiaopai";
-		//echo $sql;exit;
-		return $this->execSQL($sql,$id_agregaregiao);
-	}
-	/**
-	 * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
-	 * @param codigo do tipo de regiao
-	 * @param codigo do tipo de regiao que e pai
-	 */
-	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 ";
-		if($codigo_tipo_regiao != ""){
-			$sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
-		}
-		return $this->execSQL($sql,$codigo_tipo_regiao_pai);
-	}
-	/**
-	 * Lista os esquemas em um banco de dados
-	 * @param codigo da conexao
-	 * @return execSQLDB
-	 */
-	function esquemasConexao($codigo_estat_conexao){
-		return $this->execSQLDB($codigo_estat_conexao,"SELECT oid,nspname as esquema FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname NOT LIKE '%_schema%' group by nspname,oid order by nspname");
-	}
-	/**
-	 * Lista as tabelas de um esquema
-	 * @param codigo da conexao
-	 * @param nome do esquema
-	 * @param sim|nao exclui da lista as tabelas que contem geometria
-	 * @return execSQLDB
-	 */
-	function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
-		$sql = "SELECT table_name as tabela FROM information_schema.tables where table_schema = '$nome_esquema' AND table_schema NOT LIKE 'i3geo%' AND table_schema NOT LIKE 'pg_%' AND table_schema NOT LIKE '%_schema%'";
-		if(strtolower($excluigeom) == "sim"){
-			$sql = "SELECT c.table_name as tabela FROM information_schema.tables as c left join (SELECT distinct a.table_name FROM information_schema.tables as a left join information_schema.columns as b	on	a.table_name = b.table_name	where a.table_schema = '$nome_esquema' and	udt_name = 'geometry' ) as d on c.table_name = d.table_name where c.table_schema = '$nome_esquema'  AND c.table_schema NOT LIKE 'i3geo%' AND c.table_schema NOT LIKE 'pg_%' AND c.table_schema NOT LIKE '%_schema%' and d.table_name is null";
-		}
-		return $this->execSQLDB($codigo_estat_conexao,$sql);
-	}
-	/**
-	 * Lista as colunas de uma tabela
-	 * @param codigo da conexao
-	 * @param nome do esquema
-	 * @param nome da tabela
-	 * @param tipo de coluna (opcional)
-	 * @param tipo de tratamento do parametro tipo, pode ser =|!=
-	 * @return execSQLDB
-	 */
-	function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
-		$colunas = array();
-		$res = $this->execSQLDB($codigo_estat_conexao,"SELECT column_name as coluna,udt_name FROM information_schema.columns where table_schema = '$nome_esquema' and table_name = '$nome_tabela'");
-		if($tipo != ""){
-			$res = $this->execSQLDB($codigo_estat_conexao,"SELECT column_name as coluna,udt_name FROM information_schema.columns where table_schema = '$nome_esquema' and udt_name $tipotratamento '$tipo' and table_name = '$nome_tabela'");
-		}
-		foreach($res as $c){
-			$colunas[] = $c["coluna"];
-		}
-		return $colunas;
-	}
-	/**
-	 * Lista o comentario de uma tabela
-	 * @param codigo da conexao
-	 * @param nome do esquema
-	 * @param nome da tabela
-	 * @return execSQLDB
-	 */
-	function comentarioTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela){
-		$colunas = array();
-		$sql = "SELECT  pg_catalog.obj_description(c.oid, 'pg_class') AS comments FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace) WHERE n.nspname = '".$nome_esquema."' AND c.relname = '".$nome_tabela."'";
-		$res = $this->execSQLDB($codigo_estat_conexao,$sql);
-		if(count($res) > 0){
-			$res = $res[0];
-			$res = $res["comments"];
-		}
-		else{
-			$res = "";
-		}
-		if($res == null){
-			$res = "";
-		}
-		return $res;
-	}
-	/**
-	 * Lista os metadados de uma coluna
-	 * Os metadados sao obtidos do proprio PostgreSQL
-	 * @param codigo da conexao
-	 * @param nome do esquema
-	 * @param nome da tabela
-	 * @param nome da coluna (opcional)
-	 * @return execSQLDB
-	 */
-	function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
-		if($nome_coluna == ""){
-			return $this->execSQLDB($codigo_estat_conexao,"SELECT a.attnum,a.attname AS field,t.typname AS type,a.attlen AS length,a.atttypmod AS lengthvar,a.attnotnull AS notnull,p.nspname as esquema FROM pg_class c,pg_attribute a,pg_type t,pg_namespace p WHERE c.relname = '$nome_tabela' and p.nspname = '$nome_esquema' and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid and c.relnamespace = p.oid ORDER BY a.attname");
-		}
-		else{
-			$res = $this->execSQLDB($codigo_estat_conexao,"SELECT a.attnum,a.attname AS field,t.typname AS type,a.attlen AS length,a.atttypmod AS lengthvar,a.attnotnull AS notnull,p.nspname as esquema FROM pg_class c,pg_attribute a,pg_type t,pg_namespace p WHERE a.attname = '$nome_coluna' AND c.relname = '$nome_tabela' and p.nspname = '$nome_esquema' and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid and c.relnamespace = p.oid ORDER BY a.attname");
-			return $res[0];
-		}
-	}
-	/**
-	 * Lista os dados de uma tabela
-	 * @param codigo da conexao
-	 * @param nome do esquema
-	 * @param nome da tabela
-	 * @param sim|nao inclui o WKT da geometria de colunas geo
-	 * @param (opcional) numero de registros que serao listados
-	 * @return execSQLDB
-	 */
-	function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
-		$desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
-		$colunas = array();
-		$colsql = array();
-		foreach($desccolunas as $d){
-			if($d["type"] != "geometry" && $d["type"] != "geography"){
-				$colunas[] = $d["field"];
-				$colsql[] = $d["field"];
-			}
-			elseif($geo == "sim"){
-				$colunas[] = $d["field"];
-				$colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
-			}
-		}
-		$sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
-		if($nreg != ""){
-			$sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
-		}
-		$dados = $this->execSQLDB($codigo_estat_conexao,$sql );
-		$linhas = array();
-		foreach($dados as $d){
-			$l = array();
-			foreach($colunas as $c){
-				$l[] = $d[$c];
-			}
-			$linhas[] = $l;
-		}
-		return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
-	}
-	/**
-	 * Relatorio completo com a lista de variaveis e medidas
-	 * @param codigo da variavel
-	 * @param sim|nao inclui dados detalhados
-	 * @return Array
-	 */
-	function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
-		$dados = array();
-		if($codigo_variavel != "" || !empty($codigo_variavel)){
-			$vs[] = $this->listaVariavel($codigo_variavel);
-		}
-		else{
-			$vs = $this->listaVariavel();
-		}
-		foreach($vs as $v){
-			$nivel1["id"] = $v["codigo_variavel"];
-			$nivel1["titulo"] = $v["nome"];
-			$nivel1["descricao"] = $v["descricao"];
-			$ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
-			$nivel1["filhos"] = array();
-			foreach($ms as $m){
-				$nivel2["id"] = $m["id_medida_variavel"];
-				$nivel2["titulo"] = $m["nomemedida"];
-				$unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
-				$unidade = "Unidade de medida: ".$unidade["nome"];
-				$periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
-				$periodo = "Período de tempo: ".$periodo["nome"];
-				$regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
-				$regiao = "Região: ".$regiao["nome_tipo_regiao"];
-				$nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
-				$nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
-				$nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
-				$nivel2["dadosgerenciais"] = "";
-				if($dadosGerenciais == "sim"){
-					$nivel2["dadosgerenciais"] = $m;
-				}
-				$nivel1["filhos"][] = $nivel2;
-			}
-			$dados[] = $nivel1;
-		}
-		return $dados;
-	}
-	/**
-	 * Cria um raltorio formatado em HTML
-	 * @param dados obtidos com relatorioCompleto
-	 * @param sim|nao inclui os dados detalhados
-	 * @return string
-	 */
-	function formataRelatorioHtml($dados,$detalhes="sim"){
-		$html[] = "
"; - $var_cor = "var_cor1"; - foreach($dados as $variavel){ - $html[] = "
"; - $html[] = "

".$variavel["titulo"]; - $html[] = "
".$variavel["descricao"]."

"; - $filhos = $variavel["filhos"]; - foreach($filhos as $f){ - $html[] = "

ID: ".$f["id"]." - ".$f["titulo"]."

"; - $html[] = "
"; - $html[] = "

".$f["descricao"]."

"; - if($detalhes == "sim"){ - $html[] = "

Fontes:

"; - foreach($f["fontes"] as $fonte){ - $html[] = "

".$fonte["titulo"]."

"; - } - $html[] = "

Links:

"; - foreach($f["links"] as $link){ - $html[] = "

".$link["nome"]."

"; - } - if($f["dadosgerenciais"] != ""){ - $html[] = ""; - $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", "; - $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", "; - $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", "; - $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", "; - $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", "; - $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico]; - $html[] = ""; - } - } - $html[] = "
"; - } - $html[] = "
"; - if($var_cor == "var_cor1"){ - $var_cor = "var_cor2"; - } - else{ - $var_cor = "var_cor1"; - } - } - $html[] = "


"; - return implode("",$html); - } - /** - * Cria um relatorio no formato XML - * @param dados obtidos com relatorioCompleto - * @return string - */ - function formataXML($dados){ - $chaves = array_keys($dados[0]); - if(count($chaves) == 0){ - $chaves = false; - } - $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL; - $xml .= '' . PHP_EOL; - //tenta descobrir o tipo de coluna - //$xml .= '' . PHP_EOL; - $xmldados = ""; - if($chaves){ - foreach($dados as $d){ - $xmldados .= "" . PHP_EOL; - foreach($chaves as $c){ - $xmldados .= "<".$c.">".$d[$c]."" . PHP_EOL; - } - $xmldados .= "" . PHP_EOL; - } - $tipos = array(); - $d = $dados[0]; - foreach($chaves as $c){ - if(is_numeric($d[$c])){ - $tipos[] = "java.lang.Integer"; - } - else{ - $tipos[] = "java.lang.String"; - } - } - $xml .= '' . PHP_EOL; - } - else{ - while (list($key, $val) = each($dados)) { - $xmldados .= "" . PHP_EOL; - $xmldados .= "".$key."" . PHP_EOL; - $xmldados .= "".$val."" . PHP_EOL; - $xmldados .= "" . PHP_EOL; - } - reset($dados); - $tipos = array(); - while (list($key, $val) = each($dados)) { - if(is_numeric($val)){ - $tipos[] = "java.lang.Integer"; - } - else{ - $tipos[] = "java.lang.String"; - } - if(is_numeric($key)){ - $tipos[] = "java.lang.Integer"; - } - else{ - $tipos[] = "java.lang.String"; - } - break; - } - $xml .= '' . PHP_EOL; - } - $xml .= $xmldados; - $xml .= '' . PHP_EOL; - return $xml; - } - /** - * Verifica se em um array existe uma chave com determinado valor - * @param Array - * @param nome da chave - * @param valor a ser buscado - * @return boolean - */ - function buscaNoArray($lista,$chave,$valor){ - foreach($lista as $l){ - if($l[$chave] == $valor){ - return true; - } - } - return false; - } - /** - * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude - * @param codigo do tipo de regiao - * @param longitude - * @param latitude - * @return array - */ - function xy2regiao($codigo_tipo_regiao,$x,$y){ - //pega a tabela, esquema e conexao para acessar os dados da regiao - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao); - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true); - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); - $sql = "select ".$regiao["identificador"]." as identificador_regiao,".$regiao["colunanomeregiao"]." as nomeregiao from i3geo_metaestat.".$regiao["tabela"]." WHERE ST_within(ST_GeomFromText('POINT($x $y)',".$regiao["srid"]."),".$regiao["colunageo"].")"; - $q = $dbh->query($sql,PDO::FETCH_ASSOC); - $r = $q->fetchAll(); - if(count($r) > 0){ - return $r[0]; - } - else{ - return ""; - } - } - /** - * Busca os dados de uma medida de variavel para uma regiao - * Identificador da regiao e o valor a ser encontrado na coluna de - * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao) - * @param identificador da regiao - * @param id da medida da variavel - * @return multitype:unknown multitype: string - */ - function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){ - $medida = $this->listaMedidaVariavel("",$id_medida_variavel); - $c = $this->listaConexao($medida["codigo_estat_conexao"],true); - if($medida["colunavalor"] == ""){ - return ""; - } - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); - $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"]; - - $alias[] = $medida["nomemedida"]; - $colunas[] = $medida["colunavalor"]; - $alias[] = "idunico"; - $colunas[] = $medida["colunaidunico"]; - $descricao[] = $medida["unidade_medida"]; - $parametros = $this->listaParametro($id_medida_variavel); - foreach($parametros as $p){ - $colunassql[] = $p["coluna"]; - $alias[] = $p["nome"]; - $descricao[] = $p["descricao"]; - $colunas[] = $p["coluna"]; - } - - $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text "; - if($medida["filtro"] != ""){ - $sql .= " and ".$medida["filtro"]; - } - $q = $dbh->query($sql,PDO::FETCH_ASSOC); - $r = $q->fetchAll(); - return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao); - } - /* - * Testa se os elementos de um array sao numericos - */ - function testaNumerico($valores){ - foreach ($valores as $valor) { - if(!empty($valor) && !is_numeric($valor)) { - echo "valor nao numerico"; - exit; - } - } } } ?> diff --git a/classesphp/classe_metaestat.php b/classesphp/classe_metaestat.php new file mode 100755 index 0000000..2f58212 --- /dev/null +++ b/classesphp/classe_metaestat.php @@ -0,0 +1,2017 @@ +dir_tmp = $dir_tmp; + $this->logTransacoes = $logTransacoes; + $this->locaplic = $locaplic; + $this->base = $base; + if(!isset($convUTF)){ + $convUTF = true; + } + $this->convUTF = $convUTF; + $this->dbh = $dbh; + $this->esquemaadmin = ""; + if(!empty($esquemaadmin)){ + $this->esquemaadmin = str_replace(".","",$esquemaadmin)."."; + } + $this->nomecache = $this->nomeCache(); + } + function __destruct(){ + $this->fechaConexao(); + } + /** + * Cria um nome de arquivo concatenando $_request + * @return string + */ + function nomeCache(){ + return "AAAA".md5(implode("x",$_REQUEST)); + } + /** + * Cria um nome aleatorio + * @param numero de caracteres + * @return string + */ + function nomeRandomico($n=10){ + $nomes = ""; + $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $max = 51; + for($i=0; $i < $n; ++$i) + { + $nomes .= $a{mt_rand(0, $max)}; + } + return $nomes; + } + /** + * Fecha a conexao com o banco de dados de administracao + */ + function fechaConexao(){ + $this->dbh = null; + } + /** + * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao + * Verifica se o parametro e um array ou um texto e executa converteTexto() + * @param string|array + * @return string|array + */ + function converteTextoArray($texto){ + try { + if(empty($texto) || strtoupper($texto) == "NULL"){ + return ""; + } + $chaves = array_keys($texto); + if($chaves[0] != "0"){ + foreach($chaves as $chave){ + $texto[$chave] = $this->converteTexto($texto[$chave]); + } + } + else{ + $n = count($texto); + for($i=0;$i<$n;$i++){ + $chaves = array_keys($texto[$i]); + foreach($chaves as $chave){ + if(is_string($texto[$i][$chave])){ + $t = $this->converteTexto($texto[$i][$chave]); + $texto[$i][$chave] = $t; + } + } + } + } + return $texto; + } + catch (Exception $e) { + return $texto; + } + } + /** + * Converte a codificacao de caracteres de uma string conforme o padrao do banco de admnistracao + * @param string + * @return string + */ + function converteTexto($texto){ + if($texto == "0"){ + return "0"; + } + if(empty($texto)){ + return ""; + } + if($this->convUTF == true){ + $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"UTF-8"); + } + else{ + $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"ISO-8859-1"); + } + return $texto; + } + /** + * Executa um SQL no banco de administracao + * Utiliza fetchAll() para obter os dados + * O resultado e processado por converteTextoArray se for desejado + * @param string sql + * @param se for vazio retorna todos os registros, caso contrario, retorna apenas o primeiro + * @param indica se deve ser feita a conversao de caracteres + * @return Array + */ + function execSQL($sql,$id="",$convTexto=true){ + $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql); + try { + $q = $this->dbh->query($sql,PDO::FETCH_ASSOC); + } + catch (PDOException $e) { + return "Error!: "; + } + if($q){ + $r = $q->fetchAll(); + if($convTexto == false){ + return $r; + } + if($r){ + if($id != ""){ + if(count($r) == 1){ + $r = $r[0]; + } + else{ + $r = array(); + } + } + if($r != false && count($r) > 0){ + $r = $this->converteTextoArray($r); + } + return $r; + } + else{ + return array(); + } + } + else{ + return false; + } + } + /** + * Executa um SQL no banco de dados definido em uma conexao cadastrada no sistema de admnistracao + * @param codigo da conexao + * @param tring sql + * @return resultado de execSQL + */ + function execSQLDB($codigo_estat_conexao,$sql){ + $buscar = array("drop","update","insert","delete"); + $sql = str_ireplace($buscar,"",$sql); + $c = $this->listaConexao($codigo_estat_conexao,true); + $dbhold = $this->dbh; + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); + $this->dbh = $dbh; + $res = $this->execSQL($sql,"",false); + $this->dbh = $dbhold; + return $res; + } + /** + * Monta o sql que permite acessar os dados de uma media de uma variavel + * @param id da medida da variavel + * @param inclui todas as colunas da tabela com os dados ou nao + * @param coluna que sera usada para agrupar os dados + * @param tipo de layer. Usado para escolher qual coluna com as geometrias sera incluida no sql + * @param codigo do tipo de regiao. Se nao for definido, utiliza-se o default da variavel + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro + * @return array("sqlagrupamento"=>,"sql"=>,"sqlmapserver"=>,"filtro"=>,"colunas"=>,"alias"=>,"colunavalor"=>,"titulo"=>,"nomeregiao"=>) + */ + function sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor="",$tipolayer="polygon",$codigo_tipo_regiao = "",$suportaWMST = false,$filtro = "",$direto=false){ + // + //o sql que faz acesso aos dados e marcado com /*SE*//*SE*/ na string que sera usada nos mapfiles + //a parte que contem referencias a coluna com a geometria e marcada com /*SG*//*SG*/ + // + //registros da medida da variavel + $dados = $this->listaMedidaVariavel("",$id_medida_variavel); + + if(!empty($dados["filtro"])){ + if($filtro == ""){ + $filtro = $dados["filtro"]; + } + else{ + $filtro = $filtro." AND (".$dados["filtro"].")"; + } + } + + //parametros da medida da variavel + $parametrosMedida = array(); + $pp = $this->listaParametro($id_medida_variavel,"",0); + foreach($pp as $p){ + $parametrosMedida[] = $p["coluna"]; + } + + //titulo da medida de variavel + $titulo = $dados["nomemedida"]; + //indica se os dados devem ser agregados a uma regiao de nivel superior + $agregaregiao = false; + //nome da coluna que contem os limites geograficos da regiao desejada pelo usuario + $colunageo = ""; + + //se a regiao definida para a medida da variavel for diferente da regiao indicada pelo usuario + //significa que a regiao indicada pelo usuario e uma agragacao + if($codigo_tipo_regiao != "" && $dados["codigo_tipo_regiao"] != $codigo_tipo_regiao){ + $agregaregiao = true; + //guarda os dados da regiao que agrega a regiao original da medida variavel + $dadosgeo = $this->listaTipoRegiao($codigo_tipo_regiao); + } + else{ + $dadosgeo = $this->listaTipoRegiao($dados["codigo_tipo_regiao"]); + } + if($tipolayer != "point"){ + $colunageo = $dadosgeo["colunageo"]; + $titulo .= " (pol) "; + } + else{ + $colunageo = $dadosgeo["colunacentroide"]; + $titulo .= " (pt) "; + } + $titulo .= $dadosgeo["nome_tipo_regiao"]; + + $vis = $dadosgeo["colunasvisiveis"]; + if(!empty($vis) && $suportaWMST == false){ + $vis = $vis.",".$dadosgeo["identificador"]; + $vis = str_replace(" ",",",$vis); + $vis = str_replace(",,",",",$vis); + $vis = str_replace(";",",",$vis); + + $colunasSemGeo = explode(",",$vis); + $colunasSemGeo = array_unique($colunasSemGeo); + + if($dadosgeo["apelidos"] != ""){ + $alias = "Valor,".$dadosgeo["apelidos"].",".$dadosgeo["identificador"]; + $alias = mb_convert_encoding($alias,"ISO-8859-1",mb_detect_encoding($alias)); + $alias = str_replace(";",",",$alias); + $alias = str_replace(",,",",",$alias); + $alias = explode(",",$alias); + $alias = array_unique($alias); + } + else{ + $alias = $colunasSemGeo; + } + if(count($alias)-1 != count($colunasSemGeo)){ + $alias = array(); + } + } + else{ + //colunas da tabela geometria sem as colunas GEOMETRY + $colunasSemGeo = $this->colunasTabela($dadosgeo["codigo_estat_conexao"], $dadosgeo["esquemadb"], $dadosgeo["tabela"],"geometry","!="); + $alias = array(); + if($suportaWMST == true){ + $sqlWMST = $this->listaParametroTempo2CampoData($id_medida_variavel); + $colunasSemGeo[] = "dimtempo"; + } + } + //verifica o tipo de calculo para agragacao de valores + $tipoconta = ""; + if($dados["permitesoma"] == 1 && $direto == false){ + $tipoconta = "sum"; + if($agregaregiao == true){ + $titulo .= " - soma"; + } + } + elseif($dados["permitemedia"] == 1 && $direto == false){ + $tipoconta = "avg"; + if($agregaregiao == true){ + $titulo .= " - media"; + } + } + + //obtem o SQL que faz o acesso aos dados da media da variavel + if($dados["colunavalor"] == ""){ + $nomevalorcalculado = "'1'::numeric"; + } + else{ + $nomevalorcalculado = $dados["colunavalor"]; + } + + $sqlDadosMedidaVariavel = "SELECT ".$dados["colunaidgeo"]." AS cod_regiao,$tipoconta(".$nomevalorcalculado.") AS valorcalculado FROM ".$dados["esquemadb"].".".$dados["tabela"]; + if($suportaWMST == true && $direto == false){ + $sqlDadosMedidaVariavel = "SELECT $sqlWMST as dimtempo,".$dados["colunaidgeo"]." AS cod_regiao,".$nomevalorcalculado." AS valorcalculado FROM ".$dados["esquemadb"].".".$dados["tabela"]; + } + if(!empty ($filtro) && $direto == false){ + $sqlDadosMedidaVariavel .= " WHERE ".$filtro . " AND ".$nomevalorcalculado." IS NOT NULL "; + } + else{ + $sqlDadosMedidaVariavel .= " WHERE ".$nomevalorcalculado." IS NOT NULL "; + } + if($suportaWMST != true && $direto == false){ + $sqlDadosMedidaVariavel .= " /*FA*//*FA*/ /*FAT*//*FAT*/ GROUP BY cod_regiao "; + } + $sqlagrupamento = ""; + //sql que retorna a lista de ocorrencias agrupados de uma coluna especifica + if(!empty($agruparpor) && $direto == false){ + $sqlagrupamento = " SELECT $agruparpor FROM ".$dados["esquemadb"].".".$dados["tabela"]; + if(!empty ($filtro)){ + $sqlagrupamento .= " WHERE ".$filtro; + } + $sqlagrupamento .= " /*FA*//*FA*/ /*FAT*//*FAT*/ GROUP BY ".$agruparpor." ORDER BY ".$agruparpor; + } + if($dados["colunavalor"] == ""){ + $nomeColunaValor = "contagem"; + } + else{ + $nomeColunaValor = $dados["colunavalor"]; + } + $sqlIntermediario = "SELECT (j.valorcalculado) AS ".$nomeColunaValor.", __COLUNASSEMGEO__". + " FROM ".$dadosgeo["esquemadb"].".".$dadosgeo["tabela"]." AS regiao ". + " INNER JOIN ( __SQLDADOS__ ) ". + " AS j ON j.cod_regiao::text = regiao.".$dadosgeo["identificador"]."::text"; + //inclui os sqls de regioes de niveis inferiores + if($agregaregiao == true && $direto == false){ + $hierarquia = $this->regiaoFilhaAoPai($dados["codigo_tipo_regiao"],$codigo_tipo_regiao); + $caminho = $hierarquia["caminho"]; + $dadosColunas = $hierarquia["colunas"]; + //var_dump($hierarquia);exit; + if(count($caminho) > 0){ + $caminho = array_reverse($caminho); + foreach($caminho as $idregiao){ + if($idregiao != $codigo_tipo_regiao){//a regiao pai ja esta no sql + $tempDadosRegiao = $this->listaTipoRegiao($idregiao); + //para contador forcado + if($dados["colunavalor"] == ""){ + $nomevalorcalculado = "'1'::numeric"; + } + else{ + $nomevalorcalculado = "j.valorcalculado"; + } + $temp = "SELECT regiao.".$dadosColunas[$idregiao]["colunaligacao_regiaopai"]." AS cod_regiao,sum(".$nomevalorcalculado.") AS valorcalculado ". + "FROM ".$tempDadosRegiao["esquemadb"].".".$tempDadosRegiao["tabela"]." AS regiao ". + "INNER JOIN ". + "( __SQLDADOS__ )". + " AS j ON j.cod_regiao::text = regiao.".$tempDadosRegiao["identificador"]."::text GROUP BY regiao.".$dadosColunas[$idregiao]["colunaligacao_regiaopai"]; + $sqlIntermediario = str_replace("__SQLDADOS__",$temp,$sqlIntermediario); + } + } + } + } + //sql final que retorna os dados + //contem todas as colunas da tabela regiao, menos as que contem geometria + $sql = str_replace("__SQLDADOS__",$sqlDadosMedidaVariavel,$sqlIntermediario); + $sql = str_replace("__COLUNASSEMGEO__",implode(",",$colunasSemGeo),$sql); + + //sql para o mapserver + $sqlgeo = str_replace("__SQLDADOS__",$sqlDadosMedidaVariavel,$sqlIntermediario); + $colunasComGeo = $colunasSemGeo; + //$colunasComGeo[] = "/*SG*/st_setsrid(".$colunageo.",".$dadosgeo["srid"].") as ".$colunageo." /*SG*/"; + $colunasComGeo[] = "/*SG*/".$colunageo." as ".$colunageo." /*SG*/"; + $sqlgeo = str_replace("__COLUNASSEMGEO__",implode(",",$colunasComGeo),$sqlgeo); + $sqlgeo = $colunageo." from /*SE*/(".$sqlgeo." /*FR*//*FR*/ )/*SE*/ as foo using unique ".$dadosgeo["identificador"]." using srid=".$dadosgeo["srid"]; + + //o SQL com os dados contem um filtro ou nao? + $contemfiltro = false; + if(!empty($filtro) && $direto == false){ + $contemfiltro = true; + $titulo .= " ".$filtro; + } + //adiciona a coluna com os valores no inicio do array() + $colunasSemGeo = array_merge(array($dados["colunavalor"]),$colunasSemGeo); + $buscar = array("drop","update","insert","create","alter","delete"); + $sql = str_ireplace($buscar,"",$sql); + $sqlagrupamento = str_ireplace($buscar,"",$sqlagrupamento); + $sqlgeo = str_ireplace($buscar,"",$sqlgeo); + return array( + "nomeregiao"=>$dadosgeo["colunanomeregiao"], + "titulo"=>$titulo, + "colunavalor"=>$dados["colunavalor"], + "sqlagrupamento"=>$sqlagrupamento, + "sql"=>$sql, + "sqlmapserver"=>$sqlgeo, + "filtro"=>$contemfiltro, + "colunas"=>$colunasSemGeo, + "alias"=>$alias, + "srid"=>$dadosgeo["srid"] + ); + } + /** + * Retorna os ids das regioes que permitem partir de uma regiao filha chegar a uma regiao pai + * Usado para descobrir que regioes devem ser sequencialmente agregadas + * @param partir da regiao + * @param chegar na regiao + * @return array lista de ids de regioes sequenciais do filho ate chegar ao pai indicado + */ + function regiaoFilhaAoPai($codigo_tipo_regiao,$codigo_tipo_regiao_pai=""){ + $pais = $this->listaAgregaRegiao($codigo_tipo_regiao); + $caminho = array($codigo_tipo_regiao); + $colunas = array(); + if(count($pais) == 0){ + return $caminho; + } + foreach($pais as $pai){ + $caminho[] = $pai["codigo_tipo_regiao_pai"]; + $colunas[$pai["codigo_tipo_regiao"]] = $pai; + if($pai["codigo_tipo_regiao_pai"] == $codigo_tipo_regiao_pai){ + 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"; + $result=$this->execSQL($query,"",false); + $row = $result[0]; + // save the path in this array + $path = array(); + // only continue if this $node isn't the root node + // (that's the node with no parent) + if ($row['parent']!='') { + // the last part of the path to $node, is the name + // of the parent of $node + $path[] = $row['parent']; + // we should add the path to the parent of this node + // to the path + $path = array_merge($this->hierarquiaPath($row['parent']), $path); + } + // return the path + sort($path); + return $path; + } + /** + * Cria um arquivo mapfile para uma medida de variavel + * Inclui no arquivo o layer de acesso aos dados + * O mapfile contem apenas o layer + * O arquivo e armazenado em uma pasta temporaria + * O sql e obtido com o metodo sqlMedidaVariavel + * @param id da medida da variavel + * @param filtro que sera concatenado ao sql padrao da medida + * @param 0|1 indica se todas as colunas da tabela original dos dados sera incluida no sql + * @param tipo de layer + * @param titulo do layer + * @param id da classificacao cadastrada,se for vazio usa o primeiro + * @param coluna que sera usada como agrupamento no sql + * @param codigo do tipo de regiao cadastrada + * @param valor de opacidade do layer + * @param o layer deve suportar WMS-T ou nao + * @param faz o cache do mapfile + * @return array("mapfile"=>,"layer"=>,"titulolayer"=>) + */ + function mapfileMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$tipolayer="polygon",$titulolayer="",$id_classificacao="",$agruparpor="",$codigo_tipo_regiao="",$opacidade="",$suportaWMST=false,$cachemapfile=true){ + //para permitir a inclusao de filtros, o fim do sql e marcado com /*FW*//*FW*/ + //indicando onde deve comecar e terminar uma possivel clausula where + //ou com /*FA*//*FA*/ + //para marcar que deve ser utilizado AND ao adicionar o filtro + //utiliza-se da mesma forma /*FAT*//*FAT*/ e /*FWT*//*FWT*/ para os filtros de tempo + //Layers adicionados aqui sao marcados com o metadata METAESTAT "SIM" + //O codigo_tipo_regiao e marcado com o metadata METAESTAT_CODIGO_TIPO_REGIAO + //O id da medida da variavel e marcado com o metadata METAESTAT_ID_MEDIDA_VARIAVEL + //outros metadados tambem sao utilizados, veja em admin/php/editormapfile.php + $arq = $this->dir_tmp."/".$this->nomecache.".map"; + if(!file_exists($arq)){ + $meta = $this->listaMedidaVariavel("",$id_medida_variavel); + //evita agregar regioes qd nao e necessario + if($meta["codigo_tipo_regiao"] == $codigo_tipo_regiao || empty($codigo_tipo_regiao) ){ + $agruparpor = ""; + } + $dconexao = $this->listaConexao($meta["codigo_estat_conexao"],true); + $conexao = "user=".$dconexao["usuario"]." password=".$dconexao["senha"]." dbname=".$dconexao["bancodedados"]." host=".$dconexao["host"]." port=".$dconexao["porta"].""; + $sql = $this->sqlMedidaVariavel( + $id_medida_variavel, + $todasascolunas, + $agruparpor, + $tipolayer, + $codigo_tipo_regiao, + $suportaWMST, + $filtro + ); + if(empty($codigo_tipo_regiao)){ + $d = $this->listaMedidaVariavel("",$id_medida_variavel); + $codigo_tipo_regiao = $d["codigo_tipo_regiao"]; + } + //define o tipo correto de layer + $dg = $this->listaDadosGeometriaRegiao($codigo_tipo_regiao); + if(empty($tipolayer)){ + $tipolayer = "polygon"; + } + if($dg["dimension"] == 0){ + $tipolayer = "point"; + } + if($dg["dimension"] == 1){ + $tipolayer = "line"; + } + $sqlf = $sql["sqlmapserver"]; + + $classes = ""; + if(!empty($id_classificacao)){ + $classes = $this->listaClasseClassificacao($id_classificacao); + } + else{ + $classificacoes = $this->listaClassificacaoMedida($id_medida_variavel); + $classes = $this->listaClasseClassificacao($classificacoes[0]["id_classificacao"]); + } + if(!empty($titulolayer)){ + $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer)); + } + else{ + $titulolayer = mb_convert_encoding($sql["titulo"],"ISO-8859-1",mb_detect_encoding($sql["titulo"])); + } + //necessario para evitar problemas com ITENSDESC + $titulolayer = str_replace(","," ",$titulolayer); + $titulolayer = str_replace("=",": ",$titulolayer); + //pega os parametros caso seja um mapfile para WMS-time + if($suportaWMST == true){ + $sqlMinMax = "select min(dimtempo) as min,max(dimtempo) as max from(".$sql["sql"].") as x"; + $minmaxdata = $this->execSQLDB($meta["codigo_estat_conexao"],$sqlMinMax ); + $fontemeta = $this->listaFonteinfoMedida($id_medida_variavel); + if(count($fontemeta) > 0){ + $fontemeta = $fontemeta[0]["link"]; + } + else{ + $fontemeta = ""; + } + } + $dados[] = "MAP"; + $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"'; + $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"'; + //inclui os simbolos que podem ser definidos como imagens + foreach($classes as $classe){ + if(file_exists($classe["simbolo"])){ + $dados[] = "SYMBOL"; + $dados[] = ' NAME "'.$classe["simbolo"].'"'; + $dados[] = ' TYPE pixmap'; + $dados[] = ' IMAGE "'.$classe["simbolo"].'"'; + $dados[] = "END"; + } + } + $dados[] = "LAYER"; + $dados[] = ' NAME "'.$this->nomecache.'"'; + $dados[] = " TYPE $tipolayer"; + $dados[] = ' DATA "'.$sqlf.'"'; + $dados[] = ' CONNECTION "'.$conexao.'"'; + $dados[] = ' CONNECTIONTYPE POSTGIS'; + $dados[] = ' STATUS OFF'; + $dados[] = ' TEMPLATE "none.htm"'; + if($opacidade != ""){ + $dados[] = ' OPACITY '.$opacidade; + } + $dados[] = ' METADATA'; + $dados[] = ' TEMA "'.$titulolayer.'"'; + $dados[] = ' tme "{\"titulo\":\"'.$titulolayer.'\",\"colnome\":\"'.$sql["nomeregiao"].'\",\"colsdata\":[\"'.$sql["colunavalor"].'\"],\"lmax\":\"8000\",\"amax\":\"500000\",\"outlinecolor\":\"-1,-1,-1\",\"numvertices\":\"4\",\"auto\":\"nao\",\"exec\":\"nao\"}"'; + + $dados[] = ' TIP "'.$sql["colunavalor"].','.$sql["nomeregiao"].'"'; + $dados[] = ' CLASSE "SIM"'; + $dados[] = ' permitedownload "SIM"'; + $dados[] = ' METAESTAT "SIM"'; + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"'; + $dados[] = ' METAESTAT_ID_MEDIDA_VARIAVEL "'.$id_medida_variavel.'"'; + //marca se a tabela e editavel, verificando se esta no esquema padrao + if($meta["esquemadb"] == "i3geo_metaestat"){ + $dados[] = ' EDITAVEL "SIM"'; + $dados[] = ' COLUNAIDUNICO "'.$meta["colunaidunico"].'"'; + $dados[] = ' TABELAEDITAVEL "'.$meta["tabela"].'"'; + $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"'; + } + if(count($sql["alias"]) > 0){ + $dados[] = ' ITENS "'.implode(",",$sql["colunas"]).'"'; + $dados[] = ' ITENSDESC "'.implode(",",$sql["alias"]).'"'; + } + if($suportaWMST == true){ + $dados[] = ' "wms_timeitem" "dimtempo"'; + $dados[] = ' "wms_timeextent" "'.$minmaxdata[0]["min"]."/".$minmaxdata[0]["max"].'"'; + $dados[] = ' "wms_timedefault" "'.$minmaxdata[0]["max"].'"'; + $dados[] = ' "ows_metadataurl_href" "'.$fontemeta.'"'; + $dados[] = ' "ows_metadataurl_type" "TC211" '; + $dados[] = ' "ows_metadataurl_format" "text/html" '; + } + $dados[] = ' END'; + if($classes == ""){ + $dados[] = ' CLASS'; + $dados[] = ' NAME ""'; + $dados[] = ' STYLE'; + $dados[] = ' COLOR 200 0 0'; + if(strtolower($tipolayer) == "point"){ + $dados[] = ' SYMBOL "ponto"'; + $dados[] = ' SIZE 5'; + } + $dados[] = ' END'; + $dados[] = ' END'; + } + else{ + foreach($classes as $classe){ + //var_dump($classe);exit; + $dados[] = ' CLASS'; + $dados[] = ' NAME "'.mb_convert_encoding($classe["titulo"],"ISO-8859-1",mb_detect_encoding($classe["titulo"])).'"'; + if($classe["expressao"] != ""){ + $expressao = str_replace('"',"'",$classe["expressao"]); + $dados[] = " EXPRESSION ".$expressao; + } + $dados[] = ' STYLE'; + $dados[] = ' COLOR '.$classe["vermelho"].' '.$classe["verde"].' '.$classe["azul"]; + if(!empty($classe["tamanho"])){ + $dados[] = ' SIZE '.$classe["tamanho"]; + } + elseif(strtolower($tipolayer) == "point"){ + $dados[] = ' SIZE 5'; + } + if(!empty($classe["simbolo"])){ + $dados[] = ' SYMBOL '.$classe["simbolo"]; + } + elseif(strtolower($tipolayer) == "point"){ + $dados[] = ' SYMBOL ponto'; + } + if(!empty($classe["otamanho"])){ + $dados[] = ' OUTLINEWIDTH '.$classe["otamanho"]; + } + if(!empty($classe["overmelho"]) || $classe["overmelho"] == "0"){ + $dados[] = ' OUTLINECOLOR '.$classe["overmelho"].' '.$classe["overde"].' '.$classe["oazul"]; + } + $dados[] = ' END'; + $dados[] = ' END'; + } + } + $dados[] = "END"; + $dados[] = "END"; + $fp = fopen($arq,"w"); + foreach ($dados as $dado){ + fwrite($fp,$dado."\n"); + } + } + return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer); + } + /** + * Cria um mapfile para visualizacao de regioes + * Inclui no arquivo o layer de acesso aos dados + * O mapfile contem apenas o layer + * O arquivo e armazenado em uma pasta temporaria + * Se o arquivo para a mesma regiao ja existir, tenta usa-lo ao inves de criar um novo + * @param codigo da regiao + * @param cor do outline do simbolo de desenho + * @param largura do simbolo + * @param sim|nao inclui ou nao os labels + * @param boolean remove o arquivo em cache e cria um novo + * @return array("mapfile"=>,"layer"=>,"titulolayer"=>,"codigo_tipo_regiao"=>) + */ + function mapfileTipoRegiao($codigo_tipo_regiao,$outlinecolor="255,0,0",$width=1,$nomes="nao",$forcaArquivo=false){ + //para permitir a inclusao de filtros, o fim do sql e marcado com /*FW*//*FW*/ + //indicando onde deve comecar e terminar uma possivel clausula where + //Layers adicionados aqui sao marcados com o metadata METAESTAT "SIM" + //O codigo_tipo_regiao e marcado com o metadata METAESTAT_CODIGO_TIPO_REGIAO + if($forcaArquivo == false){ + $arq = $this->dir_tmp."/".$this->nomecache.".map"; + } + else{ + $arq = $this->dir_tmp."/".$this->nomecache.nomeRandomico(3).".map"; + } + if(!file_exists($arq)){ + $tipolayer = "polygon"; + //define o tipo correto de layer + $dg = $this->listaDadosGeometriaRegiao($codigo_tipo_regiao); + if(empty($tipolayer)){ + $tipolayer = "polygon"; + } + if($dg["dimension"] == 0){ + $tipolayer = "point"; + } + if($dg["dimension"] == 1){ + $tipolayer = "line"; + } + $meta = $this->listaTipoRegiao($codigo_tipo_regiao); + $titulolayer = $meta["nome_tipo_regiao"]; + $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer)); + $conexao = $this->listaConexao($meta["codigo_estat_conexao"],true); + $conexao = "user=".$conexao["usuario"]." password=".$conexao["senha"]." dbname=".$conexao["bancodedados"]." host=".$conexao["host"]." port=".$conexao["porta"].""; + $colunageo = $meta["colunageo"]; + $srid = $meta["srid"]; + //pega as colunas menos as do tipo geometry + $colunastabela = $this->colunasTabela($meta["codigo_estat_conexao"],$meta["esquemadb"],$meta["tabela"],"geometry","!="); + //define as colunas que serao mostradas no sql + $vis = $meta["colunasvisiveis"]; + $colunaSerial = $this->listaTipoRegiaoSerial($codigo_tipo_regiao); + if($vis != ""){ + $vis = str_replace(";",",",$vis); + $vis = str_replace(",,",",",$vis); + $vis = explode(",",$vis); + $itens = $vis;//array + $vis[] = $meta["identificador"]; + if(!empty($colunaSerial)){ + $vis[] = $colunaSerial; + } + $vis = array_unique($vis); + $visiveis = array(); + //verifica se as colunas existem mesmo + foreach($vis as $v){ + if(in_array($v,$colunastabela)){ + $visiveis[] = $v; + } + } + $vis = implode(",",$visiveis); + //apelidos + $apelidos = $meta["apelidos"]; + if($apelidos == ""){ + $apelidos = "Nome"; + } + $apelidos = str_replace(";",",",$apelidos); + $apelidos = str_replace(",,",",",$apelidos); + $apelidos = mb_convert_encoding($apelidos,"ISO-8859-1",mb_detect_encoding($apelidos)); + $apelidos = explode(",",$apelidos); + if(!empty($colunaSerial)){ + $apelidos[] = $colunaSerial." (serial)"; + } + $apelidos = array_unique($apelidos); + } + else{ + $itens = array(); + $apelidos = array(); + if(!empty($colunaSerial)){ + $colunastabela[] = $colunaSerial; + $colunastabela = array_unique($colunastabela); + } + $vis = implode(",",$colunastabela); + } + $sqlf = $colunageo." from (select st_setsrid(".$colunageo.",".$srid.") as $colunageo,$vis from ".$meta["esquemadb"].".".$meta["tabela"]." /*FW*//*FW*/) as foo using unique ".$meta["identificador"]." using srid=".$srid; + $sqlf = str_replace(",,",",",$sqlf); + $outlinecolor = str_replace(","," ",$outlinecolor); + $dados[] = "MAP"; + $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"'; + $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"'; + $dados[] = "LAYER"; + $dados[] = ' NAME "'.$this->nomecache.'"'; + $dados[] = " TYPE $tipolayer"; + $dados[] = ' DATA "'.$sqlf.'"'; + $dados[] = ' CONNECTION "'.$conexao.'"'; + $dados[] = ' CONNECTIONTYPE POSTGIS'; + $dados[] = ' TEMPLATE "none.htm"'; + $dados[] = ' STATUS OFF'; + $dados[] = ' METADATA'; + $dados[] = ' TEMA "'.$titulolayer.'"'; + $dados[] = ' CLASSE "SIM"'; + $dados[] = ' METAESTAT "SIM"'; + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"'; + if(!empty($colunaSerial)){ + $dados[] = ' EDITAVEL "SIM"'; + $dados[] = ' COLUNAIDUNICO "'.$colunaSerial.'"'; + $dados[] = ' TABELAEDITAVEL "'.$meta["tabela"].'"'; + $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"'; + $dados[] = ' COLUNAGEOMETRIA "'.$colunageo.'"'; + } + $dados[] = ' TIP "'.$meta["colunanomeregiao"].'"'; + if(count($itens) == count($apelidos)){ + $dados[] = ' ITENS "'.implode(",",$itens).'"'; + $dados[] = ' ITENSDESC "'.implode(",",$apelidos).'"'; + } + + $dados[] = ' END'; + $dados[] = ' CLASS'; + $dados[] = ' NAME ""'; + $dados[] = ' STYLE'; + $dados[] = ' OUTLINECOLOR '.$outlinecolor; + + $dados[] = ' WIDTH '.$width; + if(strtolower($tipolayer) == "point"){ + $dados[] = ' SYMBOL "ponto"'; + $dados[] = ' SIZE 5'; + $dados[] = ' COLOR 0 0 0 '; + } + else{ + $dados[] = ' COLOR -1 -1 -1'; + } + $dados[] = ' END'; + //$dados[] = ' STYLE'; + //$dados[] = ' OUTLINECOLOR -1 -1 -1'; + //$dados[] = ' COLOR 255 255 255'; + //$dados[] = ' OPACITY 20'; + //$dados[] = ' END'; + $dados[] = ' END'; + $dados[] = "END"; + //toponimia + if($nomes == "sim"){ + $dados[] = "LAYER"; + $dados[] = ' NAME "'.$this->nomecache.'_anno"'; + $dados[] = " TYPE ANNOTATION"; + $dados[] = ' DATA "'.$sqlf.'"'; + $dados[] = ' CONNECTION "'.$conexao.'"'; + $dados[] = ' CONNECTIONTYPE POSTGIS'; + $dados[] = ' TEMPLATE "none.htm"'; + $dados[] = ' STATUS OFF'; + $dados[] = ' LABELITEM "'.$meta["colunanomeregiao"].'"'; + $dados[] = ' METADATA'; + $dados[] = ' TEMA "'.$titulolayer.' (nomes)"'; + $dados[] = ' CLASSE "SIM"'; + $dados[] = ' METAESTAT "SIM"'; + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"'; + $dados[] = ' END'; + $dados[] = ' CLASS'; + $dados[] = ' NAME ""'; + $dados[] = ' LABEL'; + $dados[] = ' FONT "arial"'; + $dados[] = ' SIZE 10'; + $dados[] = ' COLOR 0 0 0'; + $dados[] = ' MINDISTANCE 0'; + $dados[] = ' MINFEATURESIZE 0'; + $dados[] = ' OFFSET 0 0'; + $dados[] = ' OUTLINECOLOR 255 255 255'; + $dados[] = ' PARTIALS FALSE'; + $dados[] = ' POSITION AUTO'; + $dados[] = ' SHADOWSIZE 1 1'; + $dados[] = ' TYPE TRUETYPE'; + $dados[] = ' END'; + $dados[] = ' END'; + $dados[] = "END"; + } + $dados[] = "END"; + $fp = fopen($arq,"w"); + foreach ($dados as $dado){ + fwrite($fp,$dado."\n"); + } + } + return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer,"codigo_tipo_regiao"=>$codigo_tipo_regiao); + } + /** + * Complementa um mapfile resumido inserindo seus layers em um mapfile completo, contendo todos os elementos necessarios para uso + * Usado na geracao de WMS e outros servicos + * @param mapfile resumido + * @return nome do arquivo com o mapfile completo + */ + function mapfileCompleto($mapfile){ + $f = $this->base; + if($f == ""){ + include_once($this->locaplic."/classesphp/funcoes_gerais.php"); + $versao = versao(); + $versao = $versao["principal"]; + $f = ""; + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')){ + $f = $this->locaplic."/aplicmap/geral1windowsv".$versao.".map"; + } + else{ + if($f == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv'.$versao.'.map')){ + $f = "/var/www/i3geo/aplicmap/geral1debianv".$versao.".map"; + } + if($f == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){ + $f = "/var/www/html/i3geo/aplicmap/geral1fedorav".$versao.".map"; + } + if($f == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){ + $f = "/opt/www/html/i3geo/aplicmap/geral1v".$versao.".map"; + } + if($f == "") { + $f = $this->locaplic."/aplicmap/geral1v".$versao.".map"; + } + } + } + $mapa = ms_newMapObj($f); + $n = $mapa->numlayers; + for($i=0;$i<$n;$i++){ + $l = $mapa->getlayer($i); + $l->set("status",MS_DELETE); + } + $mapatemp = ms_newMapObj($mapfile); + $l = $mapatemp->getlayer(0); + + $l->set("status",MS_DEFAULT); + $novonome = str_replace(".map","completo.map",$mapfile); + //necessario para o kml + $mapa->setmetadata("ows_enable_request","*"); + $listaepsg = "EPSG:4618 EPSG:4291 EPSG:4326 EPSG:22521 EPSG:22522 EPSG:22523 EPSG:22524 EPSG:22525 EPSG:29101 EPSG:29119 EPSG:29120 EPSG:29121 EPSG:29122 EPSG:29177 EPSG:29178 EPSG:29179 EPSG:29180 EPSG:29181 EPSG:29182 EPSG:29183 EPSG:29184 EPSG:29185"; + $l->setmetadata("ows_srs",$listaepsg); + $temp = ms_newLayerObj($mapa,$l); + $mapa->save($novonome); + return $novonome; + } + /** + * Obtem os dados de uma medida de variavel + * @param id da medida + * @param filtro que sera concatenado ao sql + * @param 0|1 mostra ou nao todas as colunas da tabela com os dados + * @param coluna de agrupamento + * @param limite do numero de registros + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro + * @return execSQL + */ + function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){ + set_time_limit(0); + $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto); + $sqlf = $sql["sqlmapserver"]; + //remove marcadores geo + $sqlf = explode("/*SE*/",$sqlf); + $sqlf = explode("/*SG*/",$sqlf[1]); + $sqlf = $sqlf[0]." ".$sqlf[2]; + if($limite != ""){ + $sqlf .= " limit ".$limite; + } + $sqlf = str_replace(", FROM"," FROM",$sqlf); + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel); + //echo $sqlf;exit; + if(!empty($metaVariavel["codigo_estat_conexao"])){ + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true); + $dbhold = $this->dbh; + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); + $this->dbh = $dbh; + $res = $this->execSQL($sqlf); + $this->dbh = $dbhold; + return $res; + } + return false; + } + /** + * Lista as ocorrencias de valores em uma coluna de uma medida de variavel + * @param id da medida de variavel + * @param coluna + * @return execSQL + */ + function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){ + $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna); + $sqlf = $sqlf["sqlagrupamento"]; + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel); + if(!empty($metaVariavel["codigo_estat_conexao"])){ + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true); + $dbhold = $this->dbh; + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); + $this->dbh = $dbh; + $res = $this->execSQL($sqlf); + $this->dbh = $dbhold; + return $res; + } + return false; + } + /** + * Sumario estatistico de uma medida de variavel + * @param id da medida + * @param filtro a ser concatenado ao sql + * @param coluna de agrupamento + * @param limite numero maximo de registros que serao lidos do banco + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro + * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>) + */ + function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){ + if(!empty($agruparpor)){ + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto); + } + else{ + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto); + } + if($dados){ + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel); + $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]); + $agrupamento = ""; + $colunavalor = $metaVariavel["colunavalor"]; + foreach($dados as $d){ + if($d[$colunavalor]){ + $valores[] = $d[$colunavalor]; + } + } + if(!empty($agruparpor)){ + $agrupamento = array(); + foreach($dados as $d){ + $g = $d[$agruparpor]; + //var_dump($d);exit; + if(!empty($agrupamento[$g])){ + $agrupamento[$g] += $d[$colunavalor]; + } + else{ + $agrupamento[$g] = $d[$colunavalor]; + } + } + natsort($agrupamento); + } + $soma = ""; + $media = ""; + $min = ""; + $max = ""; + $quantidade = count($valores); + $sturges = 1 + (3.322 * (log10($quantidade))); + $quartis = array(); + if($un["permitesoma"] == "1"){ + $soma = array_sum($valores); + } + if($un["permitemedia"] == "1"){ + $media = $soma / $quantidade; + } + if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){ + sort($valores); + //var_dump($valores);exit; + $min = $valores[0]; + $max = $valores[$quantidade - 1]; + include_once(dirname(__FILE__)."/../../classesphp/classe_estatistica.php"); + $calc = new estatistica(); + $calc->calcula($valores); + $v = $calc->resultado; + //expressao para o mapfile + $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")"; + $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))"; + if($v["quartil3"] != 0){ + $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))"; + $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")"; + } + $nomes[] = "<= ".($v["quartil1"]); + $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]); + if($v["quartil3"] != 0){ + $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]); + $nomes[] = "> ".($v["quartil3"]); + } + $quartis = array( + "cortes"=>array( + "q1"=>$v['quartil1'], + "q2"=>$v['quartil2'], + "q3"=>$v['quartil3'] + ), + "expressoes"=>$expressao, + "nomes"=>$nomes + ); + } + $histograma = array_count_values($valores); + //echo "
".var_dump($quartis);exit;
+			return array(
+						"colunavalor"=>$colunavalor,
+						"soma"=>$soma,
+						"media"=>$media,
+						"menor"=>$min,
+						"maior"=>$max,
+						"quantidade"=>$quantidade,
+						"histograma"=>$histograma,
+						"grupos"=>$agrupamento,
+						"unidademedida"=>$un,
+						"quartis"=>$quartis,
+						"sturges"=>$sturges
+					);
+		}
+		return false;
+	}
+
+
+	/**
+	 * Lista os dados de um ou de todos os mapas cadastrados
+	 * @param id do mapa
+	 */
+	function listaMapas($id_mapa=""){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_mapa ";
+		if($id_mapa != ""){
+			$sql .= "WHERE id_mapa = $id_mapa ";
+		}
+		$sql .= "ORDER BY titulo";
+		return $this->execSQL($sql,$id_mapa);
+	}
+	/**
+	 * Lista os dados de um ou de todos os mapas grupos de um mapa
+	 * @param id do mapa
+	 * @param id do grupo
+	 */
+	function listaGruposMapa($id_mapa,$id_mapa_grupo){
+		if(!empty($id_mapa)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa = $id_mapa";
+		}
+		if(!empty($id_mapa_grupo)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa_grupo = $id_mapa_grupo";
+		}
+		$sql .= " ORDER BY titulo";
+		return $this->execSQL($sql,$id_mapa_grupo);
+	}
+	/**
+	 * Lista os dados de um ou de todos os temas de um grupo de um mapa
+	 * @param id do mapa
+	 * @param id do grupo
+	 * @param id do tema
+	 */
+	function listaTemasMapa($id_mapa_grupo,$id_mapa_tema){
+		if(!empty($id_mapa_grupo)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_grupo = $id_mapa_grupo";
+		}
+		if(!empty($id_mapa_tema)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_tema = $id_mapa_tema";
+		}
+		$sql .= " ORDER BY titulo";
+		return $this->execSQL($sql,$id_mapa_tema);
+	}
+	/**
+	 * Lista os dados de uma ou todas as unidades de medida cadastradas
+	 * @param codigo da unidade
+	 */
+	function listaUnidadeMedida($codigo_unidade_medida=""){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
+		if($codigo_unidade_medida != ""){
+			$sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
+		}
+		$sql .= "ORDER BY nome";
+		return $this->execSQL($sql,$codigo_unidade_medida);
+	}
+	/**
+	 * Lista os dados de uma ou todas as fontes cadastradas
+	 * @param id da fonte
+	 */
+	function listaFonteinfo($id_fonteinfo=""){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
+		if($id_fonteinfo != ""){
+			$sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
+		}
+		$sql .= "ORDER BY titulo";
+		return $this->execSQL($sql,$id_fonteinfo);
+	}
+	/**
+	 * Lista as fontes vinculadas a uma medida de variavel
+	 * @param id da medida de variavel
+	 */
+	function listaFonteinfoMedida($id_medida_variavel){
+		$sql = "SELECT i3geoestat_fonteinfo.* ";
+		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
+		$sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
+		$sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
+		$sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
+		$sql .= "ORDER BY titulo";
+		//echo $sql;exit;
+		return $this->execSQL($sql,$id_fonteinfo);
+	}
+	/**
+	 * Lista os dados de uma ou todas as variaveis cadastradas
+	 * @param codigo da variavel
+	 * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
+	 */
+	function listaVariavel($codigo_variavel="",$filtro_esquema=""){
+		$sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
+		if($codigo_variavel != ""){
+			$sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
+		}
+		if($filtro_esquema != ""){
+			$sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
+		}
+		$sql .= "ORDER BY a.nome";
+		//echo $sql;exit;
+		return $this->execSQL($sql,$codigo_variavel);
+	}
+	/**
+	 * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
+	 * @param id da medida de variavel
+	 * @param id da classificacao
+	 */
+	function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
+		if(!empty($id_medida_variavel)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
+		}
+		if(!empty($id_classificacao)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
+		}
+		return $this->execSQL($sql,$id_classificacao);
+	}
+	/**
+	 * Lista os dados de um ou todos os links de uma medida
+	 * @param id da medida
+	 * @param id do link
+	 */
+	function listaLinkMedida($id_medida_variavel,$id_link=""){
+		if(!empty($id_medida_variavel)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
+		}
+		if(!empty($id_link)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
+		}
+		return $this->execSQL($sql,$id_link);
+	}
+	/**
+	 * Lista os dados de uma ou todas as classes de uma classificacao
+	 * @param id da classificacao
+	 * @param id da classe
+	 */
+	function listaClasseClassificacao($id_classificacao,$id_classe=""){
+		if(!empty($id_classificacao)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
+		}
+		if(!empty($id_classe)){
+			$sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
+		}
+		return $this->execSQL($sql,$id_classe);
+	}
+	/**
+	 * Lista os dados de uma ou todas as medidas de variavel de uma variavel
+	 * @param codigo da variavel
+	 * @param id da medida de variavel
+	 */
+	function listaMedidaVariavel($codigo_variavel,$id_medida_variavel=""){
+		$sql = "SELECT i3geoestat_medida_variavel.*,i3geoestat_variavel.nome as nome_variavel,i3geoestat_unidade_medida.permitemedia,i3geoestat_unidade_medida.permitesoma,i3geoestat_unidade_medida.nome as unidade_medida ";
+		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
+		$sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
+		$sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
+		$sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
+		$sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
+		if($codigo_variavel != ""){
+			$sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
+			if($id_medida_variavel != ""){
+				$sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
+			}
+		}
+		elseif($id_medida_variavel != "") {
+			$sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
+		}
+		$sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
+		$res = $this->execSQL($sql,$id_medida_variavel);
+		$res = str_replace('"',"'",$res);
+		return $res;
+	}
+	/**
+	 * Lista as regioes vinculadas a uma medida de variavel
+	 * @param id da medida de vriavel
+	 */
+	function listaRegioesMedida($id_medida_variavel){
+		$variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
+		$codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
+		$regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
+		//var_dump($regioes);exit;
+		$agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
+		foreach($agregacoes as $a){
+			$regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
+		}
+		return $regioes;
+	}
+	/**
+	 * Lista os dados de uma conexao ou de todas
+	 * @param id da conexao
+	 * @param boolean inclui na lista a senha ou nao
+	 * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
+	 */
+	function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
+		if($senha == true){
+			$colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
+		}
+		else{
+			$colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
+		}
+		$sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
+		if($codigo_estat_conexao != ""){
+			$sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
+		}
+		$sql .= "ORDER BY bancodedados,host,usuario";
+		$res = $this->execSQL($sql,$codigo_estat_conexao);
+		//se achou e a requisico e para listar uma conexao, retorna o que for encontrado
+		$cres = count($res);
+		if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
+			return $res;
+		}
+		//caso contrario, e deve retornar todas as conexoes, inclui a fonte
+		if($codigo_estat_conexao == ""){
+			for($i=0; $i<$cres;$i++){
+				$res[$i]["fonte"] = "metaestat";
+			}
+		}
+		//obtem as conexoes definidas em ms_configgura.php
+		if($incluiPostgisMapa == true){
+			if(!isset($postgis_mapa)){
+				require(dirname(__FILE__)."/../../ms_configura.php");
+			}
+			if(!empty($postgis_mapa)){
+				foreach(array_keys($postgis_mapa) as $key){
+					$lista = explode(" ",$postgis_mapa[$key]);
+					$con = array();
+					foreach($lista as $l){
+						$teste = explode("=",$l);
+						$con[trim($teste[0])] = trim($teste[1]);
+					}
+					$c = array(
+						"codigo_estat_conexao" => $key,
+						"bancodedados" => $con["dbname"],
+						"host" => $con["host"],
+						"porta" => $con["port"],
+						"usuario" => $con["user"],
+						"fonte" => "ms_configura"
+					);
+					if($senha == true){
+						$c["senha"] = $con["password"];
+					}
+					$res[] = $c;
+					if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
+						return $c;
+					}
+				}
+			}
+		}
+		//echo "
";
+		//var_dump($res);exit;
+		return $res;
+	}
+	function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
+		//lista os parametros temporais
+		$parametros = $this->listaParametro($id_medida_variavel,"","",true,true);
+		echo "
";
+		//var_dump($parametros);exit;
+		//faz o sql para pegar os valores e definir a resolucao
+		//o tempo deve comecar sempre pelo ano
+		$data = array();
+		if($parametros[0]["tipo"] == 1){
+			//ano
+			$data[] = $prefixoAlias.$parametros[0]["coluna"];
+			$tipodata = "YYYY";
+			//mes
+			if(!empty($parametros[1])){
+				$data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
+				$tipodata = "YYYYMM";
+			}
+			else{
+				$data[] = "'-01'";
+			}
+			//dia
+			if(!empty($parametros[2])){
+				$data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
+				$tipodata = "YYYYMMDD";
+			}
+			else{
+				$data[] = "'-01'";
+			}
+			$data = implode("||",$data);
+			return "to_date($data,'$tipodata')";
+		}
+	}
+	/**
+	 * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
+	 * @param id da medida de variavel
+	 * @param id do parametro
+	 * @param id do pai (se definido, lista apenas os filhos deste)
+	 * @param bool indica se apenas parametros do tipo temporal serao retornados
+	 */
+	function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
+		$sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
+		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
+		$sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
+		$sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
+		if($id_medida_variavel != ""){
+			$sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
+			if($id_parametro_medida != ""){
+				$sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
+			}
+		}
+		elseif ($id_parametro_medida != ""){
+			$sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
+		}
+		if($id_pai != ""){
+			$sql .= " AND id_pai = $id_pai";
+		}
+		if($apenasTempo == true){
+			$tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
+			$sql .= $tempo;
+		}
+		if($ordenaPeloPai == true){
+			$sql .= " ORDER BY id_pai";
+		}
+		//echo $sql;exit;
+		return $this->execSQL($sql,$id_parametro_medida);
+	}
+	/**
+	 * Lista todos os parametros cadastrados
+	 */
+	function listaTodosParametros(){
+		$sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
+		$sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
+		$sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
+		$sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
+		$sql .= " ORDER BY nome";
+		return $this->execSQL($sql);
+	}
+	/**
+	 * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
+	 * @param id do parametro
+	 * @return array com os valores
+	 */
+	function listaValoresParametro($id_parametro_medida){
+		$parametro = $this->listaParametro("",$id_parametro_medida);
+		//$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
+		$sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
+		$nsm = array();
+		foreach($sm as $s){
+			$nsm[] = $s[$parametro["coluna"]];
+		}
+		return $nsm;
+	}
+	/**
+	 * Lista os dados de um ou todos os tipos de periodo cadastrados
+	 * @param id
+	 */
+	function listaTipoPeriodo($codigo_tipo_periodo=""){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
+		if($codigo_tipo_periodo != ""){
+			$sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
+		}
+		$sql .= "ORDER BY nome";
+		return $this->execSQL($sql,$codigo_tipo_periodo);
+	}
+	/**
+	 * Lista as propriedades da coluna com as geometrias de uma regiao geografica
+	 * @param codigo do tipo de regiao
+	 * @return array com os parametros, inclusive a dimensao (st_dimension)
+	 */
+	function listaPropGeoRegiao($codigo_tipo_regiao){
+		//st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
+		$regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
+		$c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
+		$dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
+		$c = $regiao["colunageo"];
+		$sql = "select st_dimension(".$regiao["colunageo"].") as st_dimension from ".$regiao["esquemadb"].".".$regiao["tabela"]." limit 1";
+		$q = $dbh->query($sql,PDO::FETCH_ASSOC);
+		$r = array();
+		if($q){
+			$r = $q->fetchAll();
+			$r = $r[0];
+		}
+		return $r;
+	}
+	/**
+	 * Lista os dados de uma ou todas as regioes cadastradas
+	 * @param codigo do tipo de regiao
+	 */
+	function listaTipoRegiao($codigo_tipo_regiao=""){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
+		if($codigo_tipo_regiao != ""){
+			$sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
+		}
+		$sql .= "ORDER BY nome_tipo_regiao";
+		return $this->execSQL($sql,$codigo_tipo_regiao);
+	}
+	/**
+	 * Obtem de um tipo de regiao a coluna do tipo serial
+	 * @param codigo do tipo de regiao
+	 */
+	function listaTipoRegiaoSerial($codigo_tipo_regiao){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
+		$regiao = $this->execSQL($sql,$codigo_tipo_regiao);
+		$nome_esquema = $regiao["esquemadb"];
+		$nome_tabela = $regiao["tabela"];
+		$sql = "SELECT a.attname as coluna FROM pg_class s JOIN pg_depend d ON d.objid = s.oid JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) JOIN pg_namespace n ON n.oid = s.relnamespace WHERE s.relkind = 'S' AND n.nspname = '$nome_esquema' AND t.relname = '$nome_tabela'";
+		$colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
+		$colunas = $colunas[0];
+		return $colunas["coluna"];
+	}
+	/**
+	 * Obtem de uma tabela a coluna do tipo serial
+	 * @param codigo do tipo de regiao
+	 */
+	function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
+		$sql = "SELECT a.attname as coluna FROM pg_class s JOIN pg_depend d ON d.objid = s.oid JOIN pg_class t ON d.objid = s.oid AND d.refobjid = t.oid JOIN pg_attribute a ON (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) JOIN pg_namespace n ON n.oid = s.relnamespace WHERE s.relkind = 'S' AND n.nspname = '$nome_esquema' AND t.relname = '$nome_tabela'";
+		$colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
+		$colunas = $colunas[0];
+		return $colunas["coluna"];
+	}
+	/**
+	 * Lista os dados de agregacao de uma regiao pai
+	 * @param codigo da regiao
+	 */
+	function listaHierarquiaRegioes($codigoregiaopai=""){
+		$sql = "select i3geoestat_agregaregiao.id_agregaregiao,i3geoestat_agregaregiao.colunaligacao_regiaopai,i3geoestat_tipo_regiao.codigo_tipo_regiao,i3geoestat_tipo_regiao.nome_tipo_regiao from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
+		$sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
+		$sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
+		if($codigoregiaopai != ""){
+			$sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
+		}
+		else{
+			$sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
+		}
+		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
+	 * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
+	 * @param codigo do tipo de regiao
+	 * @param codigo do tipo de regiao pai
+	 * @param identificador da regiao (registro) pai
+	 */
+	function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
+		//pega a tabela, esquema e conexao para acessar os dados da regiao
+		$regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
+		$c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
+		$dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
+		$c = $regiao["colunageo"];
+		$bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
+		$sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
+		if($valorregiaopai != ""){
+			$r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
+			$sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
+		}
+		$sql .= " order by ".$regiao["colunanomeregiao"];
+
+		$q = $dbh->query($sql,PDO::FETCH_ASSOC);
+		$r = array();
+		if($q){
+			$r = $q->fetchAll();
+		}
+		return $r;
+	}
+	/**
+	 * Lista os registros de uma tabela que e uma regiao
+	 * @param codigo do tipo de regiao
+	 */
+	function listaDadosGeometriaRegiao($codigo_tipo_regiao){
+		//pega a tabela, esquema e conexao para acessar os dados da regiao
+		$regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
+		$c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
+		$dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
+		$c = $regiao["colunageo"];
+		$s = "ST_dimension($c) as dimension ";
+		$sql = "select $s,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
+		$sql .= " limit 1";
+		$q = $dbh->query($sql,PDO::FETCH_ASSOC);
+		$r = array();
+		if($q){
+			$r = $q->fetchAll();
+		}
+		return $r[0];
+	}
+	/**
+	 * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
+	 * @param codigo do tipo de regiao
+	 * @param id da agregacao
+	 */
+	function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
+		$sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
+		if($id_agregaregiao != ""){
+			$sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
+		}
+		else{
+			if($codigo_tipo_regiao != ""){
+				$sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
+			}
+		}
+		$sql .= " ORDER BY colunaligacao_regiaopai";
+		//echo $sql;exit;
+		return $this->execSQL($sql,$id_agregaregiao);
+	}
+	/**
+	 * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
+	 * @param codigo do tipo de regiao
+	 * @param codigo do tipo de regiao que e pai
+	 */
+	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 ";
+		if($codigo_tipo_regiao != ""){
+			$sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
+		}
+		return $this->execSQL($sql,$codigo_tipo_regiao_pai);
+	}
+	/**
+	 * Lista os esquemas em um banco de dados
+	 * @param codigo da conexao
+	 * @return execSQLDB
+	 */
+	function esquemasConexao($codigo_estat_conexao){
+		return $this->execSQLDB($codigo_estat_conexao,"SELECT oid,nspname as esquema FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname NOT LIKE '%_schema%' group by nspname,oid order by nspname");
+	}
+	/**
+	 * Lista as tabelas de um esquema
+	 * @param codigo da conexao
+	 * @param nome do esquema
+	 * @param sim|nao exclui da lista as tabelas que contem geometria
+	 * @return execSQLDB
+	 */
+	function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
+		$sql = "SELECT table_name as tabela FROM information_schema.tables where table_schema = '$nome_esquema' AND table_schema NOT LIKE 'i3geo%' AND table_schema NOT LIKE 'pg_%' AND table_schema NOT LIKE '%_schema%'";
+		if(strtolower($excluigeom) == "sim"){
+			$sql = "SELECT c.table_name as tabela FROM information_schema.tables as c left join (SELECT distinct a.table_name FROM information_schema.tables as a left join information_schema.columns as b	on	a.table_name = b.table_name	where a.table_schema = '$nome_esquema' and	udt_name = 'geometry' ) as d on c.table_name = d.table_name where c.table_schema = '$nome_esquema'  AND c.table_schema NOT LIKE 'i3geo%' AND c.table_schema NOT LIKE 'pg_%' AND c.table_schema NOT LIKE '%_schema%' and d.table_name is null";
+		}
+		return $this->execSQLDB($codigo_estat_conexao,$sql);
+	}
+	/**
+	 * Lista as colunas de uma tabela
+	 * @param codigo da conexao
+	 * @param nome do esquema
+	 * @param nome da tabela
+	 * @param tipo de coluna (opcional)
+	 * @param tipo de tratamento do parametro tipo, pode ser =|!=
+	 * @return execSQLDB
+	 */
+	function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
+		$colunas = array();
+		$res = $this->execSQLDB($codigo_estat_conexao,"SELECT column_name as coluna,udt_name FROM information_schema.columns where table_schema = '$nome_esquema' and table_name = '$nome_tabela'");
+		if($tipo != ""){
+			$res = $this->execSQLDB($codigo_estat_conexao,"SELECT column_name as coluna,udt_name FROM information_schema.columns where table_schema = '$nome_esquema' and udt_name $tipotratamento '$tipo' and table_name = '$nome_tabela'");
+		}
+		foreach($res as $c){
+			$colunas[] = $c["coluna"];
+		}
+		return $colunas;
+	}
+	/**
+	 * Lista o comentario de uma tabela
+	 * @param codigo da conexao
+	 * @param nome do esquema
+	 * @param nome da tabela
+	 * @return execSQLDB
+	 */
+	function comentarioTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela){
+		$colunas = array();
+		$sql = "SELECT  pg_catalog.obj_description(c.oid, 'pg_class') AS comments FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace) WHERE n.nspname = '".$nome_esquema."' AND c.relname = '".$nome_tabela."'";
+		$res = $this->execSQLDB($codigo_estat_conexao,$sql);
+		if(count($res) > 0){
+			$res = $res[0];
+			$res = $res["comments"];
+		}
+		else{
+			$res = "";
+		}
+		if($res == null){
+			$res = "";
+		}
+		return $res;
+	}
+	/**
+	 * Lista os metadados de uma coluna
+	 * Os metadados sao obtidos do proprio PostgreSQL
+	 * @param codigo da conexao
+	 * @param nome do esquema
+	 * @param nome da tabela
+	 * @param nome da coluna (opcional)
+	 * @return execSQLDB
+	 */
+	function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
+		if($nome_coluna == ""){
+			return $this->execSQLDB($codigo_estat_conexao,"SELECT a.attnum,a.attname AS field,t.typname AS type,a.attlen AS length,a.atttypmod AS lengthvar,a.attnotnull AS notnull,p.nspname as esquema FROM pg_class c,pg_attribute a,pg_type t,pg_namespace p WHERE c.relname = '$nome_tabela' and p.nspname = '$nome_esquema' and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid and c.relnamespace = p.oid ORDER BY a.attname");
+		}
+		else{
+			$res = $this->execSQLDB($codigo_estat_conexao,"SELECT a.attnum,a.attname AS field,t.typname AS type,a.attlen AS length,a.atttypmod AS lengthvar,a.attnotnull AS notnull,p.nspname as esquema FROM pg_class c,pg_attribute a,pg_type t,pg_namespace p WHERE a.attname = '$nome_coluna' AND c.relname = '$nome_tabela' and p.nspname = '$nome_esquema' and a.attnum > 0 and a.attrelid = c.oid and a.atttypid = t.oid and c.relnamespace = p.oid ORDER BY a.attname");
+			return $res[0];
+		}
+	}
+	/**
+	 * Lista os dados de uma tabela
+	 * @param codigo da conexao
+	 * @param nome do esquema
+	 * @param nome da tabela
+	 * @param sim|nao inclui o WKT da geometria de colunas geo
+	 * @param (opcional) numero de registros que serao listados
+	 * @return execSQLDB
+	 */
+	function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
+		$desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
+		$colunas = array();
+		$colsql = array();
+		foreach($desccolunas as $d){
+			if($d["type"] != "geometry" && $d["type"] != "geography"){
+				$colunas[] = $d["field"];
+				$colsql[] = $d["field"];
+			}
+			elseif($geo == "sim"){
+				$colunas[] = $d["field"];
+				$colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
+			}
+		}
+		$sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
+		if($nreg != ""){
+			$sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
+		}
+		$dados = $this->execSQLDB($codigo_estat_conexao,$sql );
+		$linhas = array();
+		foreach($dados as $d){
+			$l = array();
+			foreach($colunas as $c){
+				$l[] = $d[$c];
+			}
+			$linhas[] = $l;
+		}
+		return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
+	}
+	/**
+	 * Relatorio completo com a lista de variaveis e medidas
+	 * @param codigo da variavel
+	 * @param sim|nao inclui dados detalhados
+	 * @return Array
+	 */
+	function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
+		$dados = array();
+		if($codigo_variavel != "" || !empty($codigo_variavel)){
+			$vs[] = $this->listaVariavel($codigo_variavel);
+		}
+		else{
+			$vs = $this->listaVariavel();
+		}
+		foreach($vs as $v){
+			$nivel1["id"] = $v["codigo_variavel"];
+			$nivel1["titulo"] = $v["nome"];
+			$nivel1["descricao"] = $v["descricao"];
+			$ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
+			$nivel1["filhos"] = array();
+			foreach($ms as $m){
+				$nivel2["id"] = $m["id_medida_variavel"];
+				$nivel2["titulo"] = $m["nomemedida"];
+				$unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
+				$unidade = "Unidade de medida: ".$unidade["nome"];
+				$periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
+				$periodo = "Período de tempo: ".$periodo["nome"];
+				$regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
+				$regiao = "Região: ".$regiao["nome_tipo_regiao"];
+				$nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
+				$nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
+				$nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
+				$nivel2["dadosgerenciais"] = "";
+				if($dadosGerenciais == "sim"){
+					$nivel2["dadosgerenciais"] = $m;
+				}
+				$nivel1["filhos"][] = $nivel2;
+			}
+			$dados[] = $nivel1;
+		}
+		return $dados;
+	}
+	/**
+	 * Cria um raltorio formatado em HTML
+	 * @param dados obtidos com relatorioCompleto
+	 * @param sim|nao inclui os dados detalhados
+	 * @return string
+	 */
+	function formataRelatorioHtml($dados,$detalhes="sim"){
+		$html[] = "
"; + $var_cor = "var_cor1"; + foreach($dados as $variavel){ + $html[] = "
"; + $html[] = "

".$variavel["titulo"]; + $html[] = "
".$variavel["descricao"]."

"; + $filhos = $variavel["filhos"]; + foreach($filhos as $f){ + $html[] = "

ID: ".$f["id"]." - ".$f["titulo"]."

"; + $html[] = "
"; + $html[] = "

".$f["descricao"]."

"; + if($detalhes == "sim"){ + $html[] = "

Fontes:

"; + foreach($f["fontes"] as $fonte){ + $html[] = "

".$fonte["titulo"]."

"; + } + $html[] = "

Links:

"; + foreach($f["links"] as $link){ + $html[] = "

".$link["nome"]."

"; + } + if($f["dadosgerenciais"] != ""){ + $html[] = ""; + $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", "; + $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", "; + $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", "; + $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", "; + $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", "; + $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico]; + $html[] = ""; + } + } + $html[] = "
"; + } + $html[] = "
"; + if($var_cor == "var_cor1"){ + $var_cor = "var_cor2"; + } + else{ + $var_cor = "var_cor1"; + } + } + $html[] = "


"; + return implode("",$html); + } + /** + * Cria um relatorio no formato XML + * @param dados obtidos com relatorioCompleto + * @return string + */ + function formataXML($dados){ + $chaves = array_keys($dados[0]); + if(count($chaves) == 0){ + $chaves = false; + } + $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL; + $xml .= '' . PHP_EOL; + //tenta descobrir o tipo de coluna + //$xml .= '' . PHP_EOL; + $xmldados = ""; + if($chaves){ + foreach($dados as $d){ + $xmldados .= "" . PHP_EOL; + foreach($chaves as $c){ + $xmldados .= "<".$c.">".$d[$c]."" . PHP_EOL; + } + $xmldados .= "" . PHP_EOL; + } + $tipos = array(); + $d = $dados[0]; + foreach($chaves as $c){ + if(is_numeric($d[$c])){ + $tipos[] = "java.lang.Integer"; + } + else{ + $tipos[] = "java.lang.String"; + } + } + $xml .= '' . PHP_EOL; + } + else{ + while (list($key, $val) = each($dados)) { + $xmldados .= "" . PHP_EOL; + $xmldados .= "".$key."" . PHP_EOL; + $xmldados .= "".$val."" . PHP_EOL; + $xmldados .= "" . PHP_EOL; + } + reset($dados); + $tipos = array(); + while (list($key, $val) = each($dados)) { + if(is_numeric($val)){ + $tipos[] = "java.lang.Integer"; + } + else{ + $tipos[] = "java.lang.String"; + } + if(is_numeric($key)){ + $tipos[] = "java.lang.Integer"; + } + else{ + $tipos[] = "java.lang.String"; + } + break; + } + $xml .= '' . PHP_EOL; + } + $xml .= $xmldados; + $xml .= '' . PHP_EOL; + return $xml; + } + /** + * Verifica se em um array existe uma chave com determinado valor + * @param Array + * @param nome da chave + * @param valor a ser buscado + * @return boolean + */ + function buscaNoArray($lista,$chave,$valor){ + foreach($lista as $l){ + if($l[$chave] == $valor){ + return true; + } + } + return false; + } + /** + * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude + * @param codigo do tipo de regiao + * @param longitude + * @param latitude + * @return array + */ + function xy2regiao($codigo_tipo_regiao,$x,$y){ + //pega a tabela, esquema e conexao para acessar os dados da regiao + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao); + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true); + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); + $sql = "select ".$regiao["identificador"]." as identificador_regiao,".$regiao["colunanomeregiao"]." as nomeregiao from i3geo_metaestat.".$regiao["tabela"]." WHERE ST_within(ST_GeomFromText('POINT($x $y)',".$regiao["srid"]."),".$regiao["colunageo"].")"; + $q = $dbh->query($sql,PDO::FETCH_ASSOC); + $r = $q->fetchAll(); + if(count($r) > 0){ + return $r[0]; + } + else{ + return ""; + } + } + /** + * Busca os dados de uma medida de variavel para uma regiao + * Identificador da regiao e o valor a ser encontrado na coluna de + * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao) + * @param identificador da regiao + * @param id da medida da variavel + * @return multitype:unknown multitype: string + */ + function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){ + $medida = $this->listaMedidaVariavel("",$id_medida_variavel); + $c = $this->listaConexao($medida["codigo_estat_conexao"],true); + if($medida["colunavalor"] == ""){ + return ""; + } + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]); + $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"]; + + $alias[] = $medida["nomemedida"]; + $colunas[] = $medida["colunavalor"]; + $alias[] = "idunico"; + $colunas[] = $medida["colunaidunico"]; + $descricao[] = $medida["unidade_medida"]; + $parametros = $this->listaParametro($id_medida_variavel); + foreach($parametros as $p){ + $colunassql[] = $p["coluna"]; + $alias[] = $p["nome"]; + $descricao[] = $p["descricao"]; + $colunas[] = $p["coluna"]; + } + + $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text "; + if($medida["filtro"] != ""){ + $sql .= " and ".$medida["filtro"]; + } + $q = $dbh->query($sql,PDO::FETCH_ASSOC); + $r = $q->fetchAll(); + return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao); + } + /** + * Converte um tipo de regiao em shapefile + * @param codigo do tipo de regiao + * @return nome do arquivo criado + */ + function regiao2shp($codigo_tipo_regiao){ + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao); + $dados = $this->obtemDadosTabelaDB($regiao["codigo_estat_conexao"],$regiao["esquemadb"],$regiao["tabela"],"sim"); + $tipol = $this->listaPropGeoRegiao($codigo_tipo_regiao); + include_once(dirname(__FILE__)."/../../classesphp/classe_shp.php"); + $s = new SHP(); + //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON + //echo MS_SHP_POINT.", ".MS_SHP_ARC.", ".MS_SHP_POLYGON.", ".MS_SHP_MULTIPOINT; + //1, 3, 5, 8 + $conv[0] = 1; + $conv[1] = 3; + $conv[2] = 5; + //cria as colunas + $cni = 0; + foreach($dados["colunas"] as $t){ + $temp = strtoupper($t["field"]); + if(strlen($temp) > 10){ + $temp = substr($temp,0,8).($cni++); + } + if($t["type"] == "varchar" || $t["type"] == "char" || $t["type"] == "character varying" || $t["type"] == "character" || $t["type"] == "text"){ + $def[] = array($temp,"C","254"); + } + else{ + if($t["lengthvar"] < 0){ + $t["lengthvar"] = 0; + } + $def[] = array($temp,"N", $t["length"],$t["lengthvar"]); + } + } + $nomeshp = $this->dir_tmp."/regiao$codigo_tipo_regiao"."_".$this->nomeRandomico(); + $dbaseExiste = false; + if(function_exists("dbase_create")){ + $dbaseExiste = true; + } + //para manipular dbf + if($dbaseExiste == false){ + include_once (dirname(__FILE__)."/../pacotes/phpxbase/api_conversion.php"); + $db = xbase_create($nomeshp.".dbf", $def); + } + else + {$db = dbase_create($nomeshp.".dbf", $def);} + $dbname = $nomeshp.".dbf"; + $reg = array(); + $novoshpf = ms_newShapefileObj($nomeshp.".shp", $conv[$tipol["st_dimension"]]); + $cols = $dados["colunas"]; + $nc = count($dados["colunas"]); + foreach($dados["linhas"] as $l){ + $reg = array(); + for($i=0;$i<$nc;$i++){ + if($cols[$i]["type"] != "geometry" && $cols[$i]["type"] != "geography"){ + $reg[] = $l[$i]; + } + else{ + $reg[] = 0; + if($cols[$i]["field"] == $regiao["colunageo"]){ + $shape = ms_shapeObjFromWkt($l[$i]); + } + } + } + $novoshpf->addShape($shape); + if($dbaseExiste == false){ + xbase_add_record($db,$reg); + } + else{ + dbase_add_record($db,$reg); + } + } + if($this->dbaseExiste == false){ + xbase_close($db); + } + else{ + dbase_close($db); + } + return $nomeshp; + } + /* + * Testa se os elementos de um array sao numericos + */ + function testaNumerico($valores){ + foreach ($valores as $valor) { + if(!empty($valor) && !is_numeric($valor)) { + echo "valor nao numerico"; + exit; + } + } + } +} +?> diff --git a/ms_configura.php b/ms_configura.php index c40d430..30ff748 100755 --- a/ms_configura.php +++ b/ms_configura.php @@ -132,7 +132,7 @@ $logTransacoes = false; Tipo: {array} */ -$i3geoEsquemasWL = array("public","i3geosaude"); +$i3geoEsquemasWL = array("publicy"); //TODO documentar moodle /* -- libgit2 0.21.2