Commit 04af54e8b4638b5eb9cbbd299f085913cdcdd604

Authored by Edmar Moretti
2 parents 8a74f21b f462b8f7

Criação da classe PHP Bdexplorer para centralizar as operações de busca de dados…

… no sistema de metadados estatísticos e acesso ao banco de dados Postgres
admin/dicionario/atlas.js
@@ -14,10 +14,14 @@ i3GEOadmin.atlas.dicionario = { @@ -14,10 +14,14 @@ i3GEOadmin.atlas.dicionario = {
14 'txtAjudaAtlas' : [ { 14 'txtAjudaAtlas' : [ {
15 pt : "<p>O cadastro de Atlas &eacute; utilizado na interface 'Atlas' do i3geo. Essa interface pode ser vista em http://localhost/i3geo/atlas<p>Cada Atlas possu&iacute; uma lista de pranchas e cada prancha uma lista de temas e outros par&acirc;metros.<p>A montagem de cada Atlas &eacute; feito definindo-se os par&acirc;metros de cada n&iacute;vel hier&aacute;rquico, editando-se uma &aacute;rvore cuja raiz &eacute; cada Atlas, seguido pelas pranchas e temas.<p>Para cada Atlas e cada prancha pode ser definido um texto explicativo que ser&aacute; aberto ao iniciar o Atlas ou a prancha.", 15 pt : "<p>O cadastro de Atlas &eacute; utilizado na interface 'Atlas' do i3geo. Essa interface pode ser vista em http://localhost/i3geo/atlas<p>Cada Atlas possu&iacute; uma lista de pranchas e cada prancha uma lista de temas e outros par&acirc;metros.<p>A montagem de cada Atlas &eacute; feito definindo-se os par&acirc;metros de cada n&iacute;vel hier&aacute;rquico, editando-se uma &aacute;rvore cuja raiz &eacute; cada Atlas, seguido pelas pranchas e temas.<p>Para cada Atlas e cada prancha pode ser definido um texto explicativo que ser&aacute; aberto ao iniciar o Atlas ou a prancha.",
16 <<<<<<< HEAD 16 <<<<<<< HEAD
  17 +<<<<<<< HEAD
17 en : "", 18 en : "",
18 es : "<p>El registro del Atlas es utilizado en la interfaz 'Atlas' de i3Geo. Esta interfaz puede ser vista en http://localhost/i3geo/atlas<p>Cada Atlas posee pesta&ntilde;as, cada pesta&ntilde;a posee una lista de temas y otros par&aacute;metros.<p> El montaje de cada Atlas se realiza estableciendo los par&aacute;metros de cada nivel jer&aacute;rquico, editando un &aacute;rbol cuya ra&iacute;z es cada Atlas, seguido por las pesta&ntilde;as y temas.<p>Para cada Atlas y cada pesta&ntilde;a se puede definir un texto explicativo que puede ser abierto al iniciar el Atlas o la pesta&ntilde;a." 19 es : "<p>El registro del Atlas es utilizado en la interfaz 'Atlas' de i3Geo. Esta interfaz puede ser vista en http://localhost/i3geo/atlas<p>Cada Atlas posee pesta&ntilde;as, cada pesta&ntilde;a posee una lista de temas y otros par&aacute;metros.<p> El montaje de cada Atlas se realiza estableciendo los par&aacute;metros de cada nivel jer&aacute;rquico, editando un &aacute;rbol cuya ra&iacute;z es cada Atlas, seguido por las pesta&ntilde;as y temas.<p>Para cada Atlas y cada pesta&ntilde;a se puede definir un texto explicativo que puede ser abierto al iniciar el Atlas o la pesta&ntilde;a."
19 ======= 20 =======
20 en : "<p>The 'Atlas' interface of i3Geo is where you can record your atlases. You can access to this interface by http://localhost/i3geo/atlas<p>Each atlas contains tabs, each tab contains a list of themes and other parameters.<p> When you set up each atlas you must define the parameters of each hierarchical level, editing a tree whose root is ech atlas, followed by tabs and themes.<p> 21 en : "<p>The 'Atlas' interface of i3Geo is where you can record your atlases. You can access to this interface by http://localhost/i3geo/atlas<p>Each atlas contains tabs, each tab contains a list of themes and other parameters.<p> When you set up each atlas you must define the parameters of each hierarchical level, editing a tree whose root is ech atlas, followed by tabs and themes.<p>
  22 +=======
  23 + en : "<p>The 'Atlas' interface of i3Geo is where you can record your atlases. You can access to this interface by http://localhost/i3geo/atlas<p>Each atlas contains tabs, each tab contains a list of themes and other parameters.<p> When you set up each atlas you must define the parameters of each hierarchical level, editing a tree whose root is each atlas, followed by tabs and themes.<p>
  24 +>>>>>>> f462b8f7bf25c63b4b8ceb66562c21de7b2ab841
21 For each Atlas and tab you can put an explanatory text that can be visualized when an Atlas or tab is initialized.", 25 For each Atlas and tab you can put an explanatory text that can be visualized when an Atlas or tab is initialized.",
22 es : "<p>El registro del Atlas es utilizado en la interfaz 'Atlas' de i3Geo. Esta interfaz puede ser vista en http://localhost/i3geo/atlas<p>Cada Atlas posee pesta&ntilde;as, cada pesta&ntilde;a posee una lista de temas y otros par&aacute;metros.<p> 26 es : "<p>El registro del Atlas es utilizado en la interfaz 'Atlas' de i3Geo. Esta interfaz puede ser vista en http://localhost/i3geo/atlas<p>Cada Atlas posee pesta&ntilde;as, cada pesta&ntilde;a posee una lista de temas y otros par&aacute;metros.<p>
23 El montaje de cada Atlas se realiza estableciendo los par&aacute;metros de cada nivel jer&aacute;rquico, editando un &aacute;rbol cuya ra&iacute;z es cada Atlas, seguido por las pesta&ntilde;as y temas.<p>Para cada Atlas y cada pesta&ntilde;a se puede definir un texto explicativo que puede ser abierto al iniciar el Atlas o la pesta&ntilde;a." 27 El montaje de cada Atlas se realiza estableciendo los par&aacute;metros de cada nivel jer&aacute;rquico, editando un &aacute;rbol cuya ra&iacute;z es cada Atlas, seguido por las pesta&ntilde;as y temas.<p>Para cada Atlas y cada pesta&ntilde;a se puede definir un texto explicativo que puede ser abierto al iniciar el Atlas o la pesta&ntilde;a."
@@ -25,28 +29,28 @@ El montaje de cada Atlas se realiza estableciendo los par&amp;aacute;metros de cada @@ -25,28 +29,28 @@ El montaje de cada Atlas se realiza estableciendo los par&amp;aacute;metros de cada
25 } ], 29 } ],
26 'criaAtlas' : [ { 30 'criaAtlas' : [ {
27 pt : "Criar um novo atlas", 31 pt : "Criar um novo atlas",
28 - en : "",  
29 - es : "" 32 + en : "Create a new atlas",
  33 + es : "Crear un atlas nuevo"
30 } ], 34 } ],
31 'atlasExistente' : [ { 35 'atlasExistente' : [ {
32 pt : "Atlas existentes:", 36 pt : "Atlas existentes:",
33 - en : "",  
34 - es : "" 37 + en : "Existing atlas",
  38 + es : "Atlas existentes"
35 } ], 39 } ],
36 'msgNovoRegistro' : [ { 40 'msgNovoRegistro' : [ {
37 pt : " adicionando um novo registro", 41 pt : " adicionando um novo registro",
38 - en : "",  
39 - es : "" 42 + en : " adding a new record",
  43 + es : " agregando un registro nuevo"
40 } ], 44 } ],
41 'msgBuscaAtlas' : [ { 45 'msgBuscaAtlas' : [ {
42 pt : "buscando atlas...", 46 pt : "buscando atlas...",
43 - en : "",  
44 - es : "" 47 + en : "searching atlas",
  48 + es : "buscando atlas"
45 } ], 49 } ],
46 'adicionaTema' : [ { 50 'adicionaTema' : [ {
47 pt : "Adicionar novo tema:", 51 pt : "Adicionar novo tema:",
48 - en : "",  
49 - es : "" 52 + en : "Add new theme",
  53 + es : "Agregar un tema nuevo"
50 } ], 54 } ],
51 'editeTema' : [ { 55 'editeTema' : [ {
52 pt : "Edite para definir o tema!!!", 56 pt : "Edite para definir o tema!!!",
admin1/php/conexao.php
@@ -51,4 +51,4 @@ else { @@ -51,4 +51,4 @@ else {
51 } 51 }
52 $_SESSION["convUTF"] = $convUTF; 52 $_SESSION["convUTF"] = $convUTF;
53 unset ($convUTF); 53 unset ($convUTF);
54 -?> 54 +?>
55 \ No newline at end of file 55 \ No newline at end of file
classesphp/classe_bdexplorer.php 0 → 100755
@@ -0,0 +1,1299 @@ @@ -0,0 +1,1299 @@
  1 +<?php
  2 +/**
  3 + * Classe bdexplorer
  4 + *
  5 + * Contem funcoes que acessam o sistema de metadados estatisticos e o banco de dados de determinada conexao
  6 + * Permite listagens apenas quando o esquema estiver em ms_configura/i3geoEsquemasWL
  7 + *
  8 +*/
  9 +namespace i3geo\classesphp\bdexplorer;
  10 +class Bdexplorer{
  11 + /**
  12 + * Nome do esquema no banco de dados utilizado para armazenar as tabelas
  13 + * do sistema de admnistracao. Obtido de ms_configura.php
  14 + */
  15 + public $esquemaadmin;
  16 + /**
  17 + * Objeto PDO obtido com new PDO com direito de leitura no banco de dados de administracao
  18 + */
  19 + public $dbh;
  20 + /**
  21 + * Indica se e necessario converter para UTF strings obtidas do banco de administracao
  22 + */
  23 + public $convUTF;
  24 + /**
  25 + * Pasta temporaria utilizada pelo mapserver
  26 + */
  27 + public $dir_tmp;
  28 + /**
  29 + * Pasta onde e feito o cache de imagens do i3Geo
  30 + */
  31 + public $nomecache;
  32 + /**
  33 + * Lista branca de esquemas permitidos
  34 + */
  35 + public $i3geoEsquemasWL;
  36 + /**
  37 + * Construtor
  38 + * Faz o include de conexao.php que por sua vez faz o include de i3geo/ms_configura.php
  39 + */
  40 + function __construct($loc="",$dbh=""){
  41 + if(empty($loc)){
  42 + $loc = dirname(__FILE__)."/..";
  43 + }
  44 + include($loc."/ms_configura.php");
  45 + //vem do include
  46 + $this->dir_tmp = $dir_tmp;
  47 + $this->locaplic = $locaplic;
  48 + $this->base = $base;
  49 + $this->esquemaadmin = "";
  50 + if(!empty($esquemaadmin)){
  51 + $this->esquemaadmin = str_replace(".","",$esquemaadmin).".";
  52 + }
  53 + $this->nomecache = $this->nomeCache();
  54 + if(!isset($i3geoEsquemasWL) || !is_array($i3geoEsquemasWL)){
  55 + $this->i3geoEsquemasWL = array();
  56 + } else {
  57 + $this->i3geoEsquemasWL = $i3geoEsquemasWL;
  58 + }
  59 + //se a conexao nao vier como parametro, cria uma nova
  60 + if(empty($dbh)){
  61 + $this->conecta($conexaoadmin);
  62 + } else {
  63 + $this->dbh = $dbh;
  64 + if(!isset($convUTF)){
  65 + $this->convUTF = true;
  66 + } else {
  67 + $this->convUTF = $convUTF;
  68 + }
  69 + }
  70 + }
  71 + function __destruct(){
  72 + $this->fechaConexao();
  73 + }
  74 + function conecta($conexaoadmin){
  75 + if($conexaoadmin == ""){
  76 + //banco de dados sqlite default
  77 + $arquivosqlite = $this->locaplic."/admin/admin.db";
  78 + if(!file_exists($arquivosqlite)){
  79 + header ( "HTTP/1.1 500 O arquivo admin.db nao existe. Utilize i3geo/admin/criabanco.php para criar o banco de dados SQLITE." );
  80 + exit;
  81 + }
  82 + $conAdmin = "sqlite:$arquivosqlite";
  83 + $conAdminw = "sqlite:$arquivosqlite";
  84 + if(!extension_loaded("PDO")){
  85 + header ( "HTTP/1.1 500 PDO nao instalado" );
  86 + exit;
  87 + }
  88 + if (!extension_loaded( "pdo_sqlite")){
  89 + header ( "HTTP/1.1 500 pdo_sqlite nao instalado" );
  90 + exit;
  91 + }
  92 + if (!extension_loaded( "SQLite") && !extension_loaded( "sqlite3")){
  93 + header ( "HTTP/1.1 500 sqlite nao instalado" );
  94 + exit;
  95 + }
  96 + try {
  97 + $dbh = new PDO($conAdmin);
  98 + }
  99 + catch (PDOException $e) {
  100 + die();
  101 + }
  102 + }
  103 + else {
  104 + include($conexaoadmin);
  105 + if(isset($convUTF)){
  106 + $this->convUTF = $convUTF;
  107 + }
  108 + }
  109 + $this->dbh = $dbh;
  110 + }
  111 + function listaDeEsquemas(){
  112 + return $this->i3geoEsquemasWL;
  113 + }
  114 + function validaEsquemas($listaDeEsquemas){
  115 + $novaLista = array();
  116 + foreach($listaDeEsquemas as $e){
  117 + if(in_array($e,$this->i3geoEsquemasWL)){
  118 + $novaLista[] = $e;
  119 + }
  120 + }
  121 + return $novaLista;
  122 + }
  123 + /**
  124 + * Cria um nome de arquivo concatenando $_request
  125 + * @return string
  126 + */
  127 + function nomeCache(){
  128 + return "AAAA".md5(implode("x",$_REQUEST));
  129 + }
  130 + /**
  131 + * Cria um nome aleatorio
  132 + * @param numero de caracteres
  133 + * @return string
  134 + */
  135 + function nomeRandomico($n=10){
  136 + $nomes = "";
  137 + $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ';
  138 + $max = 51;
  139 + for($i=0; $i < $n; ++$i)
  140 + {
  141 + $nomes .= $a{mt_rand(0, $max)};
  142 + }
  143 + return $nomes;
  144 + }
  145 + /**
  146 + * Fecha a conexao com o banco de dados de administracao
  147 + */
  148 + function fechaConexao(){
  149 + $this->dbh = null;
  150 + }
  151 + /**
  152 + * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao
  153 + * Verifica se o parametro e um array ou um texto e executa converteTexto()
  154 + * @param string|array
  155 + * @return string|array
  156 + */
  157 + function converteTextoArray($texto){
  158 + try {
  159 + if(empty($texto) || strtoupper($texto) == "NULL"){
  160 + return "";
  161 + }
  162 + $chaves = array_keys($texto);
  163 + if($chaves[0] != "0"){
  164 + foreach($chaves as $chave){
  165 + $texto[$chave] = $this->converteTexto($texto[$chave]);
  166 + }
  167 + }
  168 + else{
  169 + $n = count($texto);
  170 + for($i=0;$i<$n;$i++){
  171 + $chaves = array_keys($texto[$i]);
  172 + foreach($chaves as $chave){
  173 + if(is_string($texto[$i][$chave])){
  174 + $t = $this->converteTexto($texto[$i][$chave]);
  175 + $texto[$i][$chave] = $t;
  176 + }
  177 + }
  178 + }
  179 + }
  180 + return $texto;
  181 + }
  182 + catch (Exception $e) {
  183 + return $texto;
  184 + }
  185 + }
  186 + /**
  187 + * Converte a codificacao de caracteres de uma string conforme o padrao do banco de admnistracao
  188 + * @param string
  189 + * @return string
  190 + */
  191 + function converteTexto($texto){
  192 + if($texto == "0"){
  193 + return "0";
  194 + }
  195 + if(empty($texto)){
  196 + return "";
  197 + }
  198 + if($this->convUTF == true){
  199 + $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"UTF-8");
  200 + }
  201 + else{
  202 + $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"ISO-8859-1");
  203 + }
  204 + return $texto;
  205 + }
  206 + /**
  207 + * Executa um SQL no banco de administracao
  208 + * Utiliza fetchAll() para obter os dados
  209 + * O resultado e processado por converteTextoArray se for desejado
  210 + * @param string sql
  211 + * @param se for vazio retorna todos os registros, caso contrario, retorna apenas o primeiro
  212 + * @param indica se deve ser feita a conversao de caracteres
  213 + * @return Array
  214 + */
  215 + function execSQL($sql,$id="",$convTexto=true){
  216 + $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql);
  217 + try {
  218 + $q = $this->dbh->query($sql,PDO::FETCH_ASSOC);
  219 + }
  220 + catch (PDOException $e) {
  221 + return "Error!: ";
  222 + }
  223 + if($q){
  224 + $r = $q->fetchAll();
  225 + if($convTexto == false){
  226 + return $r;
  227 + }
  228 + if($r){
  229 + if($id != ""){
  230 + if(count($r) == 1){
  231 + $r = $r[0];
  232 + }
  233 + else{
  234 + $r = array();
  235 + }
  236 + }
  237 + if($r != false && count($r) > 0){
  238 + $r = $this->converteTextoArray($r);
  239 + }
  240 + return $r;
  241 + }
  242 + else{
  243 + return array();
  244 + }
  245 + }
  246 + else{
  247 + return false;
  248 + }
  249 + }
  250 + /**
  251 + * Executa um SQL no banco de dados definido em uma conexao cadastrada no sistema de admnistracao
  252 + * @param codigo da conexao
  253 + * @param tring sql
  254 + * @return resultado de execSQL
  255 + */
  256 + function execSQLDB($codigo_estat_conexao,$sql){
  257 + $buscar = array("drop","update","insert","delete");
  258 + $sql = str_ireplace($buscar,"",$sql);
  259 + $c = $this->listaConexao($codigo_estat_conexao,true);
  260 + $dbhold = $this->dbh;
  261 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  262 + $this->dbh = $dbh;
  263 + $res = $this->execSQL($sql,"",false);
  264 + $this->dbh = $dbhold;
  265 + return $res;
  266 + }
  267 + /**
  268 + * Obtem os dados de uma medida de variavel
  269 + * @param id da medida
  270 + * @param filtro que sera concatenado ao sql
  271 + * @param 0|1 mostra ou nao todas as colunas da tabela com os dados
  272 + * @param coluna de agrupamento
  273 + * @param limite do numero de registros
  274 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  275 + * @return execSQL
  276 + */
  277 + function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){
  278 + set_time_limit(0);
  279 + $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto);
  280 + $sqlf = $sql["sqlmapserver"];
  281 + //remove marcadores geo
  282 + $sqlf = explode("/*SE*/",$sqlf);
  283 + $sqlf = explode("/*SG*/",$sqlf[1]);
  284 + $sqlf = $sqlf[0]." ".$sqlf[2];
  285 + if($limite != ""){
  286 + $sqlf .= " limit ".$limite;
  287 + }
  288 + $sqlf = str_replace(", FROM"," FROM",$sqlf);
  289 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  290 + //echo $sqlf;exit;
  291 + if(!empty($metaVariavel["codigo_estat_conexao"])){
  292 + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
  293 + $dbhold = $this->dbh;
  294 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  295 + $this->dbh = $dbh;
  296 + $res = $this->execSQL($sqlf);
  297 + $this->dbh = $dbhold;
  298 + return $res;
  299 + }
  300 + return false;
  301 + }
  302 + /**
  303 + * Lista as ocorrencias de valores em uma coluna de uma medida de variavel
  304 + * @param id da medida de variavel
  305 + * @param coluna
  306 + * @return execSQL
  307 + */
  308 + function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){
  309 + $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna);
  310 + $sqlf = $sqlf["sqlagrupamento"];
  311 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  312 + if(!empty($metaVariavel["codigo_estat_conexao"])){
  313 + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
  314 + $dbhold = $this->dbh;
  315 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  316 + $this->dbh = $dbh;
  317 + $res = $this->execSQL($sqlf);
  318 + $this->dbh = $dbhold;
  319 + return $res;
  320 + }
  321 + return false;
  322 + }
  323 + /**
  324 + * Sumario estatistico de uma medida de variavel
  325 + * @param id da medida
  326 + * @param filtro a ser concatenado ao sql
  327 + * @param coluna de agrupamento
  328 + * @param limite numero maximo de registros que serao lidos do banco
  329 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  330 + * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>)
  331 + */
  332 + function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){
  333 + if(!empty($agruparpor)){
  334 + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto);
  335 + }
  336 + else{
  337 + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto);
  338 + }
  339 + if($dados){
  340 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  341 + $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]);
  342 + $agrupamento = "";
  343 + $colunavalor = $metaVariavel["colunavalor"];
  344 + foreach($dados as $d){
  345 + if($d[$colunavalor]){
  346 + $valores[] = $d[$colunavalor];
  347 + }
  348 + }
  349 + if(!empty($agruparpor)){
  350 + $agrupamento = array();
  351 + foreach($dados as $d){
  352 + $g = $d[$agruparpor];
  353 + //var_dump($d);exit;
  354 + if(!empty($agrupamento[$g])){
  355 + $agrupamento[$g] += $d[$colunavalor];
  356 + }
  357 + else{
  358 + $agrupamento[$g] = $d[$colunavalor];
  359 + }
  360 + }
  361 + natsort($agrupamento);
  362 + }
  363 + $soma = "";
  364 + $media = "";
  365 + $min = "";
  366 + $max = "";
  367 + $quantidade = count($valores);
  368 + $sturges = 1 + (3.322 * (log10($quantidade)));
  369 + $quartis = array();
  370 + if($un["permitesoma"] == "1"){
  371 + $soma = array_sum($valores);
  372 + }
  373 + if($un["permitemedia"] == "1"){
  374 + $media = $soma / $quantidade;
  375 + }
  376 + if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){
  377 + sort($valores);
  378 + //var_dump($valores);exit;
  379 + $min = $valores[0];
  380 + $max = $valores[$quantidade - 1];
  381 + include_once(dirname(__FILE__)."/../../classesphp/classe_estatistica.php");
  382 + $calc = new estatistica();
  383 + $calc->calcula($valores);
  384 + $v = $calc->resultado;
  385 + //expressao para o mapfile
  386 + $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")";
  387 + $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))";
  388 + if($v["quartil3"] != 0){
  389 + $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))";
  390 + $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")";
  391 + }
  392 + $nomes[] = "<= ".($v["quartil1"]);
  393 + $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]);
  394 + if($v["quartil3"] != 0){
  395 + $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]);
  396 + $nomes[] = "> ".($v["quartil3"]);
  397 + }
  398 + $quartis = array(
  399 + "cortes"=>array(
  400 + "q1"=>$v['quartil1'],
  401 + "q2"=>$v['quartil2'],
  402 + "q3"=>$v['quartil3']
  403 + ),
  404 + "expressoes"=>$expressao,
  405 + "nomes"=>$nomes
  406 + );
  407 + }
  408 + $histograma = array_count_values($valores);
  409 + //echo "<pre>".var_dump($quartis);exit;
  410 + return array(
  411 + "colunavalor"=>$colunavalor,
  412 + "soma"=>$soma,
  413 + "media"=>$media,
  414 + "menor"=>$min,
  415 + "maior"=>$max,
  416 + "quantidade"=>$quantidade,
  417 + "histograma"=>$histograma,
  418 + "grupos"=>$agrupamento,
  419 + "unidademedida"=>$un,
  420 + "quartis"=>$quartis,
  421 + "sturges"=>$sturges
  422 + );
  423 + }
  424 + return false;
  425 + }
  426 + /**
  427 + * Lista os dados de um ou de todos os mapas cadastrados
  428 + * @param id do mapa
  429 + */
  430 + function listaMapas($id_mapa=""){
  431 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_mapa ";
  432 + if($id_mapa != ""){
  433 + $sql .= "WHERE id_mapa = $id_mapa ";
  434 + }
  435 + $sql .= "ORDER BY titulo";
  436 + return $this->execSQL($sql,$id_mapa);
  437 + }
  438 + /**
  439 + * Lista os dados de um ou de todos os mapas grupos de um mapa
  440 + * @param id do mapa
  441 + * @param id do grupo
  442 + */
  443 + function listaGruposMapa($id_mapa,$id_mapa_grupo){
  444 + if(!empty($id_mapa)){
  445 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa = $id_mapa";
  446 + }
  447 + if(!empty($id_mapa_grupo)){
  448 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa_grupo = $id_mapa_grupo";
  449 + }
  450 + $sql .= " ORDER BY titulo";
  451 + return $this->execSQL($sql,$id_mapa_grupo);
  452 + }
  453 + /**
  454 + * Lista os dados de um ou de todos os temas de um grupo de um mapa
  455 + * @param id do mapa
  456 + * @param id do grupo
  457 + * @param id do tema
  458 + */
  459 + function listaTemasMapa($id_mapa_grupo,$id_mapa_tema){
  460 + if(!empty($id_mapa_grupo)){
  461 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_grupo = $id_mapa_grupo";
  462 + }
  463 + if(!empty($id_mapa_tema)){
  464 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_tema = $id_mapa_tema";
  465 + }
  466 + $sql .= " ORDER BY titulo";
  467 + return $this->execSQL($sql,$id_mapa_tema);
  468 + }
  469 + /**
  470 + * Lista os dados de uma ou todas as unidades de medida cadastradas
  471 + * @param codigo da unidade
  472 + */
  473 + function listaUnidadeMedida($codigo_unidade_medida=""){
  474 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
  475 + if($codigo_unidade_medida != ""){
  476 + $sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
  477 + }
  478 + $sql .= "ORDER BY nome";
  479 + return $this->execSQL($sql,$codigo_unidade_medida);
  480 + }
  481 + /**
  482 + * Lista os dados de uma ou todas as fontes cadastradas
  483 + * @param id da fonte
  484 + */
  485 + function listaFonteinfo($id_fonteinfo=""){
  486 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
  487 + if($id_fonteinfo != ""){
  488 + $sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
  489 + }
  490 + $sql .= "ORDER BY titulo";
  491 + return $this->execSQL($sql,$id_fonteinfo);
  492 + }
  493 + /**
  494 + * Lista as fontes vinculadas a uma medida de variavel
  495 + * @param id da medida de variavel
  496 + */
  497 + function listaFonteinfoMedida($id_medida_variavel){
  498 + $sql = "SELECT i3geoestat_fonteinfo.* ";
  499 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
  500 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
  501 + $sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
  502 + $sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
  503 + $sql .= "ORDER BY titulo";
  504 + //echo $sql;exit;
  505 + return $this->execSQL($sql,$id_fonteinfo);
  506 + }
  507 + /**
  508 + * Lista os dados de uma ou todas as variaveis cadastradas
  509 + * @param codigo da variavel
  510 + * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
  511 + */
  512 + function listaVariavel($codigo_variavel="",$filtro_esquema=""){
  513 + $sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
  514 + if($codigo_variavel != ""){
  515 + $sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
  516 + }
  517 + if($filtro_esquema != ""){
  518 + $sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
  519 + }
  520 + $sql .= "ORDER BY a.nome";
  521 + //echo $sql;exit;
  522 + return $this->execSQL($sql,$codigo_variavel);
  523 + }
  524 + /**
  525 + * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
  526 + * @param id da medida de variavel
  527 + * @param id da classificacao
  528 + */
  529 + function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
  530 + if(!empty($id_medida_variavel)){
  531 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
  532 + }
  533 + if(!empty($id_classificacao)){
  534 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
  535 + }
  536 + return $this->execSQL($sql,$id_classificacao);
  537 + }
  538 + /**
  539 + * Lista os dados de um ou todos os links de uma medida
  540 + * @param id da medida
  541 + * @param id do link
  542 + */
  543 + function listaLinkMedida($id_medida_variavel,$id_link=""){
  544 + if(!empty($id_medida_variavel)){
  545 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
  546 + }
  547 + if(!empty($id_link)){
  548 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
  549 + }
  550 + return $this->execSQL($sql,$id_link);
  551 + }
  552 + /**
  553 + * Lista os dados de uma ou todas as classes de uma classificacao
  554 + * @param id da classificacao
  555 + * @param id da classe
  556 + */
  557 + function listaClasseClassificacao($id_classificacao,$id_classe=""){
  558 + if(!empty($id_classificacao)){
  559 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
  560 + }
  561 + if(!empty($id_classe)){
  562 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
  563 + }
  564 + return $this->execSQL($sql,$id_classe);
  565 + }
  566 + /**
  567 + * Lista os dados de uma ou todas as medidas de variavel de uma variavel
  568 + * @param codigo da variavel
  569 + * @param id da medida de variavel
  570 + */
  571 + function listaMedidaVariavel($codigo_variavel,$id_medida_variavel=""){
  572 + $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 ";
  573 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
  574 + $sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  575 + $sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
  576 + $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
  577 + $sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
  578 + if($codigo_variavel != ""){
  579 + $sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
  580 + if($id_medida_variavel != ""){
  581 + $sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
  582 + }
  583 + }
  584 + elseif($id_medida_variavel != "") {
  585 + $sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
  586 + }
  587 + $sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
  588 + $res = $this->execSQL($sql,$id_medida_variavel);
  589 + $res = str_replace('"',"'",$res);
  590 + return $res;
  591 + }
  592 + /**
  593 + * Lista as regioes vinculadas a uma medida de variavel
  594 + * @param id da medida de vriavel
  595 + */
  596 + function listaRegioesMedida($id_medida_variavel){
  597 + $variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  598 + $codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
  599 + $regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
  600 + //var_dump($regioes);exit;
  601 + $agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
  602 + foreach($agregacoes as $a){
  603 + $regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
  604 + }
  605 + return $regioes;
  606 + }
  607 + /**
  608 + * Lista os dados de uma conexao ou de todas
  609 + * @param id da conexao
  610 + * @param boolean inclui na lista a senha ou nao
  611 + * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
  612 + */
  613 + function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
  614 + if($senha == true){
  615 + $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
  616 + }
  617 + else{
  618 + $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
  619 + }
  620 + $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
  621 + if($codigo_estat_conexao != ""){
  622 + $sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
  623 + }
  624 + $sql .= "ORDER BY bancodedados,host,usuario";
  625 + $res = $this->execSQL($sql,$codigo_estat_conexao);
  626 + //se achou e a requisico e para listar uma conexao, retorna o que for encontrado
  627 + $cres = count($res);
  628 + if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
  629 + return $res;
  630 + }
  631 + //caso contrario, e deve retornar todas as conexoes, inclui a fonte
  632 + if($codigo_estat_conexao == ""){
  633 + for($i=0; $i<$cres;$i++){
  634 + $res[$i]["fonte"] = "metaestat";
  635 + }
  636 + }
  637 + //obtem as conexoes definidas em ms_configgura.php
  638 + if($incluiPostgisMapa == true){
  639 + if(!isset($postgis_mapa)){
  640 + require(dirname(__FILE__)."/../../ms_configura.php");
  641 + }
  642 + if(!empty($postgis_mapa)){
  643 + foreach(array_keys($postgis_mapa) as $key){
  644 + $lista = explode(" ",$postgis_mapa[$key]);
  645 + $con = array();
  646 + foreach($lista as $l){
  647 + $teste = explode("=",$l);
  648 + $con[trim($teste[0])] = trim($teste[1]);
  649 + }
  650 + $c = array(
  651 + "codigo_estat_conexao" => $key,
  652 + "bancodedados" => $con["dbname"],
  653 + "host" => $con["host"],
  654 + "porta" => $con["port"],
  655 + "usuario" => $con["user"],
  656 + "fonte" => "ms_configura"
  657 + );
  658 + if($senha == true){
  659 + $c["senha"] = $con["password"];
  660 + }
  661 + $res[] = $c;
  662 + if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
  663 + return $c;
  664 + }
  665 + }
  666 + }
  667 + }
  668 + //echo "<pre>";
  669 + //var_dump($res);exit;
  670 + return $res;
  671 + }
  672 + function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
  673 + //lista os parametros temporais
  674 + $parametros = $this->listaParametro($id_medida_variavel,"","",true,true);
  675 + echo "<pre>";
  676 + //var_dump($parametros);exit;
  677 + //faz o sql para pegar os valores e definir a resolucao
  678 + //o tempo deve comecar sempre pelo ano
  679 + $data = array();
  680 + if($parametros[0]["tipo"] == 1){
  681 + //ano
  682 + $data[] = $prefixoAlias.$parametros[0]["coluna"];
  683 + $tipodata = "YYYY";
  684 + //mes
  685 + if(!empty($parametros[1])){
  686 + $data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
  687 + $tipodata = "YYYYMM";
  688 + }
  689 + else{
  690 + $data[] = "'-01'";
  691 + }
  692 + //dia
  693 + if(!empty($parametros[2])){
  694 + $data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
  695 + $tipodata = "YYYYMMDD";
  696 + }
  697 + else{
  698 + $data[] = "'-01'";
  699 + }
  700 + $data = implode("||",$data);
  701 + return "to_date($data,'$tipodata')";
  702 + }
  703 + }
  704 + /**
  705 + * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
  706 + * @param id da medida de variavel
  707 + * @param id do parametro
  708 + * @param id do pai (se definido, lista apenas os filhos deste)
  709 + * @param bool indica se apenas parametros do tipo temporal serao retornados
  710 + */
  711 + function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
  712 + $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
  713 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
  714 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  715 + $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
  716 + if($id_medida_variavel != ""){
  717 + $sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
  718 + if($id_parametro_medida != ""){
  719 + $sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
  720 + }
  721 + }
  722 + elseif ($id_parametro_medida != ""){
  723 + $sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
  724 + }
  725 + if($id_pai != ""){
  726 + $sql .= " AND id_pai = $id_pai";
  727 + }
  728 + if($apenasTempo == true){
  729 + $tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
  730 + $sql .= $tempo;
  731 + }
  732 + if($ordenaPeloPai == true){
  733 + $sql .= " ORDER BY id_pai";
  734 + }
  735 + //echo $sql;exit;
  736 + return $this->execSQL($sql,$id_parametro_medida);
  737 + }
  738 + /**
  739 + * Lista todos os parametros cadastrados
  740 + */
  741 + function listaTodosParametros(){
  742 + $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
  743 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
  744 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  745 + $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
  746 + $sql .= " ORDER BY nome";
  747 + return $this->execSQL($sql);
  748 + }
  749 + /**
  750 + * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
  751 + * @param id do parametro
  752 + * @return array com os valores
  753 + */
  754 + function listaValoresParametro($id_parametro_medida){
  755 + $parametro = $this->listaParametro("",$id_parametro_medida);
  756 + //$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
  757 + $sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
  758 + $nsm = array();
  759 + foreach($sm as $s){
  760 + $nsm[] = $s[$parametro["coluna"]];
  761 + }
  762 + return $nsm;
  763 + }
  764 + /**
  765 + * Lista os dados de um ou todos os tipos de periodo cadastrados
  766 + * @param id
  767 + */
  768 + function listaTipoPeriodo($codigo_tipo_periodo=""){
  769 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
  770 + if($codigo_tipo_periodo != ""){
  771 + $sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
  772 + }
  773 + $sql .= "ORDER BY nome";
  774 + return $this->execSQL($sql,$codigo_tipo_periodo);
  775 + }
  776 + /**
  777 + * Lista as propriedades da coluna com as geometrias de uma regiao geografica
  778 + * @param codigo do tipo de regiao
  779 + * @return array com os parametros, inclusive a dimensao (st_dimension)
  780 + */
  781 + function listaPropGeoRegiao($codigo_tipo_regiao){
  782 + //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
  783 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  784 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  785 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  786 + $c = $regiao["colunageo"];
  787 + $sql = "select st_dimension(".$regiao["colunageo"].") as st_dimension from ".$regiao["esquemadb"].".".$regiao["tabela"]." limit 1";
  788 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  789 + $r = array();
  790 + if($q){
  791 + $r = $q->fetchAll();
  792 + $r = $r[0];
  793 + }
  794 + return $r;
  795 + }
  796 + /**
  797 + * Lista os dados de uma ou todas as regioes cadastradas
  798 + * @param codigo do tipo de regiao
  799 + */
  800 + function listaTipoRegiao($codigo_tipo_regiao=""){
  801 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
  802 + if($codigo_tipo_regiao != ""){
  803 + $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
  804 + }
  805 + $sql .= "ORDER BY nome_tipo_regiao";
  806 + return $this->execSQL($sql,$codigo_tipo_regiao);
  807 + }
  808 + /**
  809 + * Obtem de um tipo de regiao a coluna do tipo serial
  810 + * @param codigo do tipo de regiao
  811 + */
  812 + function listaTipoRegiaoSerial($codigo_tipo_regiao){
  813 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
  814 + $regiao = $this->execSQL($sql,$codigo_tipo_regiao);
  815 + $nome_esquema = $regiao["esquemadb"];
  816 + $nome_tabela = $regiao["tabela"];
  817 + $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'";
  818 + $colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
  819 + $colunas = $colunas[0];
  820 + return $colunas["coluna"];
  821 + }
  822 + /**
  823 + * Obtem de uma tabela a coluna do tipo serial
  824 + * @param codigo do tipo de regiao
  825 + */
  826 + function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
  827 + $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'";
  828 + $colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
  829 + $colunas = $colunas[0];
  830 + return $colunas["coluna"];
  831 + }
  832 + /**
  833 + * Lista os dados de agregacao de uma regiao pai
  834 + * @param codigo da regiao
  835 + */
  836 + function listaHierarquiaRegioes($codigoregiaopai=""){
  837 + $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 ";
  838 + $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  839 + $sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
  840 + if($codigoregiaopai != ""){
  841 + $sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
  842 + }
  843 + else{
  844 + $sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
  845 + }
  846 + return $this->execSQL($sql,"");
  847 + }
  848 + function listaHierarquia($codigoregiaopai=""){
  849 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao order by codigo_tipo_regiao";
  850 + return $this->execSQL($sql,"");
  851 + }
  852 + /**
  853 + * Lista os registros de um tipo de regiao
  854 + * Se for definido o pai, lista os valores da regiao que e filha
  855 + * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
  856 + * @param codigo do tipo de regiao
  857 + * @param codigo do tipo de regiao pai
  858 + * @param identificador da regiao (registro) pai
  859 + */
  860 + function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
  861 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  862 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  863 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  864 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  865 + $c = $regiao["colunageo"];
  866 + $bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
  867 + $sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
  868 + if($valorregiaopai != ""){
  869 + $r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
  870 + $sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
  871 + }
  872 + $sql .= " order by ".$regiao["colunanomeregiao"];
  873 +
  874 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  875 + $r = array();
  876 + if($q){
  877 + $r = $q->fetchAll();
  878 + }
  879 + return $r;
  880 + }
  881 + /**
  882 + * Lista os registros de uma tabela que e uma regiao
  883 + * @param codigo do tipo de regiao
  884 + */
  885 + function listaDadosGeometriaRegiao($codigo_tipo_regiao){
  886 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  887 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  888 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  889 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  890 + $c = $regiao["colunageo"];
  891 + $s = "ST_dimension($c) as dimension ";
  892 + $sql = "select $s,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
  893 + $sql .= " limit 1";
  894 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  895 + $r = array();
  896 + if($q){
  897 + $r = $q->fetchAll();
  898 + }
  899 + return $r[0];
  900 + }
  901 + /**
  902 + * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
  903 + * @param codigo do tipo de regiao
  904 + * @param id da agregacao
  905 + */
  906 + function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
  907 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  908 + if($id_agregaregiao != ""){
  909 + $sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
  910 + }
  911 + else{
  912 + if($codigo_tipo_regiao != ""){
  913 + $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
  914 + }
  915 + }
  916 + $sql .= " ORDER BY colunaligacao_regiaopai";
  917 + //echo $sql;exit;
  918 + return $this->execSQL($sql,$id_agregaregiao);
  919 + }
  920 + /**
  921 + * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
  922 + * @param codigo do tipo de regiao
  923 + * @param codigo do tipo de regiao que e pai
  924 + */
  925 + function listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiao_pai){
  926 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  927 + $sql .= "WHERE codigo_tipo_regiao_pai = $codigo_tipo_regiao_pai ";
  928 + if($codigo_tipo_regiao != ""){
  929 + $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
  930 + }
  931 + return $this->execSQL($sql,$codigo_tipo_regiao_pai);
  932 + }
  933 + /**
  934 + * Lista os esquemas em um banco de dados
  935 + * @param codigo da conexao
  936 + * @return execSQLDB
  937 + */
  938 + function esquemasConexao($codigo_estat_conexao){
  939 + 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");
  940 + }
  941 + /**
  942 + * Lista as tabelas de um esquema
  943 + * @param codigo da conexao
  944 + * @param nome do esquema
  945 + * @param sim|nao exclui da lista as tabelas que contem geometria
  946 + * @return execSQLDB
  947 + */
  948 + function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
  949 + $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%'";
  950 + if(strtolower($excluigeom) == "sim"){
  951 + $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";
  952 + }
  953 + return $this->execSQLDB($codigo_estat_conexao,$sql);
  954 + }
  955 + /**
  956 + * Lista as colunas de uma tabela
  957 + * @param codigo da conexao
  958 + * @param nome do esquema
  959 + * @param nome da tabela
  960 + * @param tipo de coluna (opcional)
  961 + * @param tipo de tratamento do parametro tipo, pode ser =|!=
  962 + * @return execSQLDB
  963 + */
  964 + function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
  965 + $colunas = array();
  966 + $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'");
  967 + if($tipo != ""){
  968 + $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'");
  969 + }
  970 + foreach($res as $c){
  971 + $colunas[] = $c["coluna"];
  972 + }
  973 + return $colunas;
  974 + }
  975 + /**
  976 + * Lista o comentario de uma tabela
  977 + * @param codigo da conexao
  978 + * @param nome do esquema
  979 + * @param nome da tabela
  980 + * @return execSQLDB
  981 + */
  982 + function comentarioTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela){
  983 + $colunas = array();
  984 + $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."'";
  985 + $res = $this->execSQLDB($codigo_estat_conexao,$sql);
  986 + if(count($res) > 0){
  987 + $res = $res[0];
  988 + $res = $res["comments"];
  989 + }
  990 + else{
  991 + $res = "";
  992 + }
  993 + if($res == null){
  994 + $res = "";
  995 + }
  996 + return $res;
  997 + }
  998 + /**
  999 + * Lista os metadados de uma coluna
  1000 + * Os metadados sao obtidos do proprio PostgreSQL
  1001 + * @param codigo da conexao
  1002 + * @param nome do esquema
  1003 + * @param nome da tabela
  1004 + * @param nome da coluna (opcional)
  1005 + * @return execSQLDB
  1006 + */
  1007 + function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
  1008 + if($nome_coluna == ""){
  1009 + 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");
  1010 + }
  1011 + else{
  1012 + $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");
  1013 + return $res[0];
  1014 + }
  1015 + }
  1016 + /**
  1017 + * Lista os dados de uma tabela
  1018 + * @param codigo da conexao
  1019 + * @param nome do esquema
  1020 + * @param nome da tabela
  1021 + * @param sim|nao inclui o WKT da geometria de colunas geo
  1022 + * @param (opcional) numero de registros que serao listados
  1023 + * @return execSQLDB
  1024 + */
  1025 + function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
  1026 + $desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
  1027 + $colunas = array();
  1028 + $colsql = array();
  1029 + foreach($desccolunas as $d){
  1030 + if($d["type"] != "geometry" && $d["type"] != "geography"){
  1031 + $colunas[] = $d["field"];
  1032 + $colsql[] = $d["field"];
  1033 + }
  1034 + elseif($geo == "sim"){
  1035 + $colunas[] = $d["field"];
  1036 + $colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
  1037 + }
  1038 + }
  1039 + $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
  1040 + if($nreg != ""){
  1041 + $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
  1042 + }
  1043 + $dados = $this->execSQLDB($codigo_estat_conexao,$sql );
  1044 + $linhas = array();
  1045 + foreach($dados as $d){
  1046 + $l = array();
  1047 + foreach($colunas as $c){
  1048 + $l[] = $d[$c];
  1049 + }
  1050 + $linhas[] = $l;
  1051 + }
  1052 + return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
  1053 + }
  1054 + /**
  1055 + * Relatorio completo com a lista de variaveis e medidas
  1056 + * @param codigo da variavel
  1057 + * @param sim|nao inclui dados detalhados
  1058 + * @return Array
  1059 + */
  1060 + function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
  1061 + $dados = array();
  1062 + if($codigo_variavel != "" || !empty($codigo_variavel)){
  1063 + $vs[] = $this->listaVariavel($codigo_variavel);
  1064 + }
  1065 + else{
  1066 + $vs = $this->listaVariavel();
  1067 + }
  1068 + foreach($vs as $v){
  1069 + $nivel1["id"] = $v["codigo_variavel"];
  1070 + $nivel1["titulo"] = $v["nome"];
  1071 + $nivel1["descricao"] = $v["descricao"];
  1072 + $ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
  1073 + $nivel1["filhos"] = array();
  1074 + foreach($ms as $m){
  1075 + $nivel2["id"] = $m["id_medida_variavel"];
  1076 + $nivel2["titulo"] = $m["nomemedida"];
  1077 + $unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
  1078 + $unidade = "Unidade de medida: ".$unidade["nome"];
  1079 + $periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
  1080 + $periodo = "Per&iacute;odo de tempo: ".$periodo["nome"];
  1081 + $regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
  1082 + $regiao = "Regi&atilde;o: ".$regiao["nome_tipo_regiao"];
  1083 + $nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
  1084 + $nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
  1085 + $nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
  1086 + $nivel2["dadosgerenciais"] = "";
  1087 + if($dadosGerenciais == "sim"){
  1088 + $nivel2["dadosgerenciais"] = $m;
  1089 + }
  1090 + $nivel1["filhos"][] = $nivel2;
  1091 + }
  1092 + $dados[] = $nivel1;
  1093 + }
  1094 + return $dados;
  1095 + }
  1096 + /**
  1097 + * Cria um raltorio formatado em HTML
  1098 + * @param dados obtidos com relatorioCompleto
  1099 + * @param sim|nao inclui os dados detalhados
  1100 + * @return string
  1101 + */
  1102 + function formataRelatorioHtml($dados,$detalhes="sim"){
  1103 + $html[] = "<div class='var_div_relatorio'>";
  1104 + $var_cor = "var_cor1";
  1105 + foreach($dados as $variavel){
  1106 + $html[] = "<div class='".$var_cor."'>";
  1107 + $html[] = "<h1 style=padding:3px; ><b>".$variavel["titulo"];
  1108 + $html[] = "</b><br><span style='color:rgb(100,100,100)'>".$variavel["descricao"]."</span></h1>";
  1109 + $filhos = $variavel["filhos"];
  1110 + foreach($filhos as $f){
  1111 + $html[] = "<h2 style='position:relative;left:10px;'>ID: <u>".$f["id"]."</u> - ".$f["titulo"]."</h2>";
  1112 + $html[] = "<div style='position:relative;padding-left:20px;'>";
  1113 + $html[] = "<p>".$f["descricao"]."</p>";
  1114 + if($detalhes == "sim"){
  1115 + $html[] = "<p><b>Fontes:</b></p>";
  1116 + foreach($f["fontes"] as $fonte){
  1117 + $html[] = "<p><a href='".$fonte["link"]."' >".$fonte["titulo"]."</a></p>";
  1118 + }
  1119 + $html[] = "<p><b>Links:</b></p>";
  1120 + foreach($f["links"] as $link){
  1121 + $html[] = "<p><a href='".$link["link"]."' >".$link["nome"]."</a></p>";
  1122 + }
  1123 + if($f["dadosgerenciais"] != ""){
  1124 + $html[] = "<span style='color:gray'>";
  1125 + $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", ";
  1126 + $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", ";
  1127 + $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", ";
  1128 + $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", ";
  1129 + $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", ";
  1130 + $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico];
  1131 + $html[] = "</span>";
  1132 + }
  1133 + }
  1134 + $html[] = "</div>";
  1135 + }
  1136 + $html[] = "</div>";
  1137 + if($var_cor == "var_cor1"){
  1138 + $var_cor = "var_cor2";
  1139 + }
  1140 + else{
  1141 + $var_cor = "var_cor1";
  1142 + }
  1143 + }
  1144 + $html[] = "</div><br><br>";
  1145 + return implode("",$html);
  1146 + }
  1147 + /**
  1148 + * Cria um relatorio no formato XML
  1149 + * @param dados obtidos com relatorioCompleto
  1150 + * @return string
  1151 + */
  1152 + function formataXML($dados){
  1153 + $chaves = array_keys($dados[0]);
  1154 + if(count($chaves) == 0){
  1155 + $chaves = false;
  1156 + }
  1157 + $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL;
  1158 + $xml .= '<result-set>' . PHP_EOL;
  1159 + //tenta descobrir o tipo de coluna
  1160 + //$xml .= '<!--java.lang.String,java.lang.Integer-->' . PHP_EOL;
  1161 + $xmldados = "";
  1162 + if($chaves){
  1163 + foreach($dados as $d){
  1164 + $xmldados .= "<row>" . PHP_EOL;
  1165 + foreach($chaves as $c){
  1166 + $xmldados .= "<".$c.">".$d[$c]."</".$c.">" . PHP_EOL;
  1167 + }
  1168 + $xmldados .= "</row>" . PHP_EOL;
  1169 + }
  1170 + $tipos = array();
  1171 + $d = $dados[0];
  1172 + foreach($chaves as $c){
  1173 + if(is_numeric($d[$c])){
  1174 + $tipos[] = "java.lang.Integer";
  1175 + }
  1176 + else{
  1177 + $tipos[] = "java.lang.String";
  1178 + }
  1179 + }
  1180 + $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
  1181 + }
  1182 + else{
  1183 + while (list($key, $val) = each($dados)) {
  1184 + $xmldados .= "<row>" . PHP_EOL;
  1185 + $xmldados .= "<nome>".$key."</nome>" . PHP_EOL;
  1186 + $xmldados .= "<valor>".$val."</valor>" . PHP_EOL;
  1187 + $xmldados .= "</row>" . PHP_EOL;
  1188 + }
  1189 + reset($dados);
  1190 + $tipos = array();
  1191 + while (list($key, $val) = each($dados)) {
  1192 + if(is_numeric($val)){
  1193 + $tipos[] = "java.lang.Integer";
  1194 + }
  1195 + else{
  1196 + $tipos[] = "java.lang.String";
  1197 + }
  1198 + if(is_numeric($key)){
  1199 + $tipos[] = "java.lang.Integer";
  1200 + }
  1201 + else{
  1202 + $tipos[] = "java.lang.String";
  1203 + }
  1204 + break;
  1205 + }
  1206 + $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
  1207 + }
  1208 + $xml .= $xmldados;
  1209 + $xml .= '</result-set>' . PHP_EOL;
  1210 + return $xml;
  1211 + }
  1212 + /**
  1213 + * Verifica se em um array existe uma chave com determinado valor
  1214 + * @param Array
  1215 + * @param nome da chave
  1216 + * @param valor a ser buscado
  1217 + * @return boolean
  1218 + */
  1219 + function buscaNoArray($lista,$chave,$valor){
  1220 + foreach($lista as $l){
  1221 + if($l[$chave] == $valor){
  1222 + return true;
  1223 + }
  1224 + }
  1225 + return false;
  1226 + }
  1227 + /**
  1228 + * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude
  1229 + * @param codigo do tipo de regiao
  1230 + * @param longitude
  1231 + * @param latitude
  1232 + * @return array
  1233 + */
  1234 + function xy2regiao($codigo_tipo_regiao,$x,$y){
  1235 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  1236 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1237 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1238 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1239 + $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"].")";
  1240 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1241 + $r = $q->fetchAll();
  1242 + if(count($r) > 0){
  1243 + return $r[0];
  1244 + }
  1245 + else{
  1246 + return "";
  1247 + }
  1248 + }
  1249 + /**
  1250 + * Busca os dados de uma medida de variavel para uma regiao
  1251 + * Identificador da regiao e o valor a ser encontrado na coluna de
  1252 + * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao)
  1253 + * @param identificador da regiao
  1254 + * @param id da medida da variavel
  1255 + * @return multitype:unknown multitype: string
  1256 + */
  1257 + function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){
  1258 + $medida = $this->listaMedidaVariavel("",$id_medida_variavel);
  1259 + $c = $this->listaConexao($medida["codigo_estat_conexao"],true);
  1260 + if($medida["colunavalor"] == ""){
  1261 + return "";
  1262 + }
  1263 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1264 + $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"];
  1265 +
  1266 + $alias[] = $medida["nomemedida"];
  1267 + $colunas[] = $medida["colunavalor"];
  1268 + $alias[] = "idunico";
  1269 + $colunas[] = $medida["colunaidunico"];
  1270 + $descricao[] = $medida["unidade_medida"];
  1271 + $parametros = $this->listaParametro($id_medida_variavel);
  1272 + foreach($parametros as $p){
  1273 + $colunassql[] = $p["coluna"];
  1274 + $alias[] = $p["nome"];
  1275 + $descricao[] = $p["descricao"];
  1276 + $colunas[] = $p["coluna"];
  1277 + }
  1278 +
  1279 + $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text ";
  1280 + if($medida["filtro"] != ""){
  1281 + $sql .= " and ".$medida["filtro"];
  1282 + }
  1283 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1284 + $r = $q->fetchAll();
  1285 + return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao);
  1286 + }
  1287 + /*
  1288 + * Testa se os elementos de um array sao numericos
  1289 + */
  1290 + function testaNumerico($valores){
  1291 + foreach ($valores as $valor) {
  1292 + if(!empty($valor) && !is_numeric($valor)) {
  1293 + echo "valor nao numerico";
  1294 + exit;
  1295 + }
  1296 + }
  1297 + }
  1298 +}
  1299 +?>