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 14 'txtAjudaAtlas' : [ {
15 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 16 <<<<<<< HEAD
  17 +<<<<<<< HEAD
17 18 en : "",
18 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 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 25 For each Atlas and tab you can put an explanatory text that can be visualized when an Atlas or tab is initialized.",
22 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 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 29 } ],
26 30 'criaAtlas' : [ {
27 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 35 'atlasExistente' : [ {
32 36 pt : "Atlas existentes:",
33   - en : "",
34   - es : ""
  37 + en : "Existing atlas",
  38 + es : "Atlas existentes"
35 39 } ],
36 40 'msgNovoRegistro' : [ {
37 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 45 'msgBuscaAtlas' : [ {
42 46 pt : "buscando atlas...",
43   - en : "",
44   - es : ""
  47 + en : "searching atlas",
  48 + es : "buscando atlas"
45 49 } ],
46 50 'adicionaTema' : [ {
47 51 pt : "Adicionar novo tema:",
48   - en : "",
49   - es : ""
  52 + en : "Add new theme",
  53 + es : "Agregar un tema nuevo"
50 54 } ],
51 55 'editeTema' : [ {
52 56 pt : "Edite para definir o tema!!!",
... ...
admin1/php/conexao.php
... ... @@ -51,4 +51,4 @@ else {
51 51 }
52 52 $_SESSION["convUTF"] = $convUTF;
53 53 unset ($convUTF);
54   -?>
  54 +?>
55 55 \ No newline at end of file
... ...
classesphp/classe_bdexplorer.php 0 → 100755
... ... @@ -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 +?>
... ...