Commit 304cc8799f9156c6a7c626e44246fa709dc5ec22

Authored by Edmar Moretti
1 parent a99f2613

Criação de classe PHP com métodos que permitem extrair informações do banco de d…

…ados Postgres e do sistema de administração. Complementação do formulário de edição de regiões (sistema de metadados estatísticos) para inclusão de botões que obtém listas de valores, auxiliando o usuário no preenchimento dos campos.
admin/php/classe_metaestat.php
... ... @@ -92,7 +92,7 @@ class Metaestat{
92 92 $this->nomecache = $this->nomeCache();
93 93 }
94 94 function __destruct(){
95   - $this->fechaConexao;
  95 + $this->fechaConexao();
96 96 }
97 97 /**
98 98 * Cria um nome de arquivo concatenando $_request
... ...
admin1/js/bdexplorer.js 100644 → 100755
... ... @@ -4,6 +4,7 @@ if (typeof (i3GEOadmin) === 'undefined') {
4 4 i3GEOadmin.bdExplorer = {
5 5 popOverTemplate: '<div class="popover" style="width:100%; color: black; background-color:white;" role="tooltip"><div class="arrow"></div><div class="popover-content"></div></div>',
6 6 templateListaPopOver: '<a href="javascript:void(0)" data-name="{{{destino}}}" data-value="{{{valor}}}" class="list-group-item">{{{valor}}}</a>',
  7 + templateListaPopOver1: '<a href="javascript:void(0)" data-name="{{{destino}}}" data-value="{{{valor}}}" class="list-group-item">{{{chave}}}</a>',
7 8 popOver: function(destino, conteudo){
8 9 var pop = $("#modalGeral input[name='" + destino + "']").popover({
9 10 "content": conteudo,
... ... @@ -50,5 +51,94 @@ i3GEOadmin.bdExplorer = {
50 51 } else {
51 52 $(".popover").popover("destroy");
52 53 }
  54 + },
  55 + listaTabelas: function(codigo_estat_conexao,esquema,destino){
  56 + if($(".popover").length == 0){
  57 + $.post(
  58 + i3GEO.configura.locaplic + "/admin1/php/bdexplorer.php?funcao=listarTabelas",
  59 + "esquema=" + esquema + "&codigo_estat_conexao=" + codigo_estat_conexao
  60 + )
  61 + .done(
  62 + function(data, status){
  63 + var c = "", json = jQuery.parseJSON(data);
  64 + c = Mustache.to_html(
  65 + "{{#data}}" + i3GEOadmin.bdExplorer.templateListaPopOver + "{{/data}}",
  66 + {
  67 + "data":json,
  68 + "destino": destino,
  69 + "valor": function() {
  70 + return this;
  71 + }
  72 + }
  73 + );
  74 + i3GEOadmin.bdExplorer.popOver(destino,c);
  75 + }
  76 + )
  77 + .fail(
  78 + function(data){
  79 + i3GEOadmin.core.mostraErro(data.status + " " +data.statusText);
  80 + }
  81 + );
  82 + } else {
  83 + $(".popover").popover("destroy");
  84 + }
  85 + },
  86 + listaColunas: function(codigo_estat_conexao,esquema,tabela,destino){
  87 + if($(".popover").length == 0){
  88 + $.post(
  89 + i3GEO.configura.locaplic + "/admin1/php/bdexplorer.php?funcao=listarColunas",
  90 + "tabela=" + tabela + "&esquema=" + esquema + "&codigo_estat_conexao=" + codigo_estat_conexao
  91 + )
  92 + .done(
  93 + function(data, status){
  94 + var c = "", json = jQuery.parseJSON(data);
  95 + c = Mustache.to_html(
  96 + "{{#data}}" + i3GEOadmin.bdExplorer.templateListaPopOver + "{{/data}}",
  97 + {
  98 + "data":json,
  99 + "destino": destino,
  100 + "valor": function() {
  101 + return this;
  102 + }
  103 + }
  104 + );
  105 + i3GEOadmin.bdExplorer.popOver(destino,c);
  106 + }
  107 + )
  108 + .fail(
  109 + function(data){
  110 + i3GEOadmin.core.mostraErro(data.status + " " +data.statusText);
  111 + }
  112 + );
  113 + } else {
  114 + $(".popover").popover("destroy");
  115 + }
  116 + },
  117 + listaCodigosConexao: function(destino){
  118 + if($(".popover").length == 0){
  119 + $.post(
  120 + i3GEO.configura.locaplic + "/admin1/php/bdexplorer.php?funcao=listarCodigosConexao"
  121 + )
  122 + .done(
  123 + function(data, status){
  124 + var c = "", json = jQuery.parseJSON(data);
  125 + c = Mustache.to_html(
  126 + "{{#data}}" + i3GEOadmin.bdExplorer.templateListaPopOver1 + "{{/data}}",
  127 + {
  128 + "data":json,
  129 + "destino": destino
  130 + }
  131 + );
  132 + i3GEOadmin.bdExplorer.popOver(destino,c);
  133 + }
  134 + )
  135 + .fail(
  136 + function(data){
  137 + i3GEOadmin.core.mostraErro(data.status + " " +data.statusText);
  138 + }
  139 + );
  140 + } else {
  141 + $(".popover").popover("destroy");
  142 + }
53 143 }
54 144 };
55 145 \ No newline at end of file
... ...
admin1/metaestat/regioes/index.js
... ... @@ -257,7 +257,25 @@ Obt&amp;eacute;m a lista de regioes
257 257 //abre a pagina de edicao
258 258 window.location.href = "hierarquia/index.php?codigo_tipo_regiao=" + codigo_tipo_regiao;
259 259 },
  260 + listaCodigosConexao: function(destino){
  261 + i3GEOadmin.bdExplorer.listaCodigosConexao(destino);
  262 + },
260 263 listaEsquemas: function(destino){
261 264 i3GEOadmin.bdExplorer.listaEsquemas(destino);
  265 + },
  266 + listaTabelas: function(destino){
  267 + var esquema = $(".modal-body form input[name='esquemadb']").val();
  268 + var codigo_estat_conexao = $(".modal-body form input[name='codigo_estat_conexao']").val();
  269 + if(esquema != "" && codigo_estat_conexao != ""){
  270 + i3GEOadmin.bdExplorer.listaTabelas(codigo_estat_conexao,esquema,destino);
  271 + }
  272 + },
  273 + listaColunas: function(destino){
  274 + var codigo_estat_conexao = $(".modal-body form input[name='codigo_estat_conexao']").val();
  275 + var esquema = $(".modal-body form input[name='esquemadb']").val();
  276 + var tabela = $(".modal-body form input[name='tabela']").val();
  277 + if(esquema != "" && codigo_estat_conexao != ""){
  278 + i3GEOadmin.bdExplorer.listaColunas(codigo_estat_conexao,esquema,tabela,destino);
  279 + }
262 280 }
263 281 };
264 282 \ No newline at end of file
... ...
admin1/metaestat/regioes/templates/templateFormLista.php
... ... @@ -5,7 +5,7 @@
5 5 <div class="form-group form-group-lg">
6 6 <label class="col-md-5 control-label" for="nome_tipo_regiao" >{{{nome_tipo_regiaoTxt}}}</label>
7 7 <div class="col-md-7">
8   - <input title="{{{nome_tipo_regiaoTxt}}}" type="text" value="{{{nome_tipo_regiao}}}" class="form-control" name="nome_tipo_regiao" >
  8 + <input title="{{{nome_tipo_regiaoTxt}}}" type="text" value="{{{nome_tipo_regiao}}}" class="form-control" name="nome_tipo_regiao" required >
9 9 </div>
10 10 </div>
11 11 </div>
... ... @@ -25,8 +25,15 @@
25 25 <div class="form-group form-group-lg">
26 26 <label class="col-md-5 control-label" for="codigo_estat_conexao" >{{{codigo_estat_conexaoTxt}}}</label>
27 27 <div class="col-md-7">
28   - <input title="{{{codigo_estat_conexaoTxt}}}" type="text" value="{{{codigo_estat_conexao}}}" class="form-control" name="codigo_estat_conexao" >
29   - </div>
  28 + <div class="input-group">
  29 + <input title="{{{codigo_estat_conexaoTxt}}}" type="text" value="{{{codigo_estat_conexao}}}" class="form-control" name="codigo_estat_conexao" >
  30 + <div class="input-group-btn">
  31 + <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaCodigosConexao('codigo_estat_conexao')" href="javascript:void(0)">
  32 + <i class="material-icons md-18">list</i>
  33 + </a>
  34 + </div>
  35 + </div>
  36 + </div>
30 37 </div>
31 38 </div>
32 39 </div>
... ... @@ -36,7 +43,7 @@
36 43 <label class="col-md-5 control-label" for="esquemadb" >{{{esquemadbTxt}}}</label>
37 44 <div class="col-md-7">
38 45 <div class="input-group">
39   - <input title="{{{esquemadbTxt}}}" type="text" value="{{{esquemadb}}}" class="form-control" name="esquemadb" >
  46 + <input title="{{{esquemadbTxt}}}" type="text" value="{{{esquemadb}}}" class="form-control" name="esquemadb" required >
40 47 <div class="input-group-btn">
41 48 <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaEsquemas('esquemadb')" href="javascript:void(0)">
42 49 <i class="material-icons md-18">list</i>
... ... @@ -44,6 +51,7 @@
44 51 </div>
45 52 </div>
46 53 </div>
  54 + </div>
47 55 </div>
48 56 </div>
49 57 <div class="row">
... ... @@ -51,8 +59,15 @@
51 59 <div class="form-group form-group-lg">
52 60 <label class="col-md-5 control-label" for="tabela" >{{{tabelaTxt}}}</label>
53 61 <div class="col-md-7">
54   - <input title="{{{tabelaTxt}}}" type="text" value="{{{tabela}}}" class="form-control" name="tabela" >
55   - </div>
  62 + <div class="input-group">
  63 + <input title="{{{tabelaTxt}}}" type="text" value="{{{tabela}}}" class="form-control" name="tabela" required >
  64 + <div class="input-group-btn">
  65 + <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaTabelas('tabela')" href="javascript:void(0)">
  66 + <i class="material-icons md-18">list</i>
  67 + </a>
  68 + </div>
  69 + </div>
  70 + </div>
56 71 </div>
57 72 </div>
58 73 </div>
... ... @@ -61,8 +76,15 @@
61 76 <div class="form-group form-group-lg">
62 77 <label class="col-md-5 control-label" for="colunageo" >{{{colunageoTxt}}}</label>
63 78 <div class="col-md-7">
64   - <input title="{{{colunageoTxt}}}" type="text" value="{{{colunageo}}}" class="form-control" name="colunageo" >
65   - </div>
  79 + <div class="input-group">
  80 + <input title="{{{colunageoTxt}}}" type="text" value="{{{colunageo}}}" class="form-control" name="colunageo" required >
  81 + <div class="input-group-btn">
  82 + <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaColunas('colunageo')" href="javascript:void(0)">
  83 + <i class="material-icons md-18">list</i>
  84 + </a>
  85 + </div>
  86 + </div>
  87 + </div>
66 88 </div>
67 89 </div>
68 90 </div>
... ... @@ -81,8 +103,15 @@
81 103 <div class="form-group form-group-lg">
82 104 <label class="col-md-5 control-label" for="identificador" >{{{identificadorTxt}}}</label>
83 105 <div class="col-md-7">
84   - <input title="{{{identificadorTxt}}}" type="text" value="{{{identificador}}}" class="form-control" name="identificador" >
85   - </div>
  106 + <div class="input-group">
  107 + <input title="{{{identificadorTxt}}}" type="text" value="{{{identificador}}}" class="form-control" name="identificador" required >
  108 + <div class="input-group-btn">
  109 + <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaColunas('identificador')" href="javascript:void(0)">
  110 + <i class="material-icons md-18">list</i>
  111 + </a>
  112 + </div>
  113 + </div>
  114 + </div>
86 115 </div>
87 116 </div>
88 117 </div>
... ... @@ -91,8 +120,15 @@
91 120 <div class="form-group form-group-lg">
92 121 <label class="col-md-5 control-label" for="colunanomeregiao" >{{{colunanomeregiaoTxt}}}</label>
93 122 <div class="col-md-7">
94   - <input title="{{{colunanomeregiaoTxt}}}" type="text" value="{{{colunanomeregiao}}}" class="form-control" name="colunanomeregiao" >
95   - </div>
  123 + <div class="input-group">
  124 + <input title="{{{colunanomeregiaoTxt}}}" type="text" value="{{{identificador}}}" class="form-control" name="colunanomeregiao" required >
  125 + <div class="input-group-btn">
  126 + <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaColunas('colunanomeregiao')" href="javascript:void(0)">
  127 + <i class="material-icons md-18">list</i>
  128 + </a>
  129 + </div>
  130 + </div>
  131 + </div>
96 132 </div>
97 133 </div>
98 134 </div>
... ... @@ -111,8 +147,15 @@
111 147 <div class="form-group form-group-lg">
112 148 <label class="col-md-5 control-label" for="colunacentroide" >{{{colunacentroideTxt}}}</label>
113 149 <div class="col-md-7">
114   - <input title="{{{colunacentroideTxt}}}" type="text" value="{{{colunacentroide}}}" class="form-control" name="colunacentroide" >
115   - </div>
  150 + <div class="input-group">
  151 + <input title="{{{colunacentroideTxt}}}" type="text" value="{{{identificador}}}" class="form-control" name="colunacentroide" >
  152 + <div class="input-group-btn">
  153 + <a role="button" class="btn btn-danger btn-fab btn-fab-mini" style="height: 20px;min-width: 20px;width: 20px;" onclick="i3GEOadmin.regioes.listaColunas('colunacentroide')" href="javascript:void(0)">
  154 + <i class="material-icons md-18">list</i>
  155 + </a>
  156 + </div>
  157 + </div>
  158 + </div>
116 159 </div>
117 160 </div>
118 161 </div>
... ...
admin1/php/bdexplorer.php 100644 → 100755
1 1 <?php
2 2 /****************************************************************/
3   -////include (dirname ( __FILE__ ) . "/../../../ms_configura.php");
4 3 //
5 4 //checa login
6 5 //valida _GET e _POST, juntando em _GET
... ... @@ -10,13 +9,18 @@
10 9 include ("checaLogin.php");
11 10 \admin\php\login\checaLogin();
12 11 //funcoes de administracao
13   -include ($_SESSION["locaplic"]."/admin1/php/funcoesAdmin.php");
  12 +include ("funcoesAdmin.php");
14 13 //
15 14 //carrega outras funcoes e extensoes do PHP
16 15 //
17 16 include ($_SESSION["locaplic"]."/classesphp/carrega_ext.php");
18 17 include ($_SESSION["locaplic"]."/classesphp/classe_bdexplorer.php");
  18 +include ($_SESSION["locaplic"]."/classesphp/classe_metaestat.php");
19 19 /***************************************************************/
  20 +if (\admin\php\funcoesAdmin\verificaOperacaoSessao ( "admin/metaestat/geral" ) === false) {
  21 + header ( "HTTP/1.1 403 Vc nao pode realizar essa operacao" );
  22 + exit ();
  23 +}
20 24 $funcao = strtoupper ( $funcao );
21 25 switch ($funcao) {
22 26 case "LISTARESQUEMAS" :
... ... @@ -28,6 +32,44 @@ switch ($funcao) {
28 32 \admin\php\funcoesAdmin\retornaJSON ( $dados );
29 33 }
30 34 break;
  35 + case "LISTARTABELAS" :
  36 + //pega os parametros de conexao
  37 + $mt = new \i3geo\classesphp\metaestat\Metaestat();
  38 + $parametros = $mt->listaConexao((int) $_POST["codigo_estat_conexao"],true,false);
  39 + $bd = new \i3geo\classesphp\bdexplorer\Bdexplorer($_SESSION["locaplic"],$parametros);
  40 + $dados = $bd->listaDeTabelas($_POST["esquema"]);
  41 + if ($dados === false) {
  42 + header ( "HTTP/1.1 500 erro ao consultar banco de dados" );
  43 + } else {
  44 + \admin\php\funcoesAdmin\retornaJSON ( $dados );
  45 + }
  46 + break;
  47 + case "LISTARCOLUNAS" :
  48 + //pega os parametros de conexao
  49 + $mt = new \i3geo\classesphp\metaestat\Metaestat();
  50 + $parametros = $mt->listaConexao((int) $_POST["codigo_estat_conexao"],true,false);
  51 + $bd = new \i3geo\classesphp\bdexplorer\Bdexplorer($_SESSION["locaplic"],$parametros);
  52 + $dados = $bd->listaDeColunas($_POST["esquema"],$_POST["tabela"]);
  53 + if ($dados === false) {
  54 + header ( "HTTP/1.1 500 erro ao consultar banco de dados" );
  55 + } else {
  56 + \admin\php\funcoesAdmin\retornaJSON ( $dados );
  57 + }
  58 + break;
  59 + case "LISTARCODIGOSCONEXAO" :
  60 + //pega os parametros de conexao
  61 + $mt = new \i3geo\classesphp\metaestat\Metaestat();
  62 + $dados = $mt->listaConexao("",false,false);
  63 + if ($dados === false) {
  64 + header ( "HTTP/1.1 500 erro ao consultar banco de dados" );
  65 + } else {
  66 + $kv = array();
  67 + foreach($dados as $d){
  68 + $kv[] = array("chave"=>$d["bancodedados"],"valor"=>$d["codigo_estat_conexao"]);
  69 + }
  70 + \admin\php\funcoesAdmin\retornaJSON ( $kv );
  71 + }
  72 + break;
31 73 default:
32 74 if(!empty ($funcao)) header ( "HTTP/1.1 500 erro funcao nao existe" );
33 75 break;
... ...
classesphp/classe_bdexplorer.php
... ... @@ -51,63 +51,30 @@ class Bdexplorer{
51 51 if(!empty($esquemaadmin)){
52 52 $this->esquemaadmin = str_replace(".","",$esquemaadmin).".";
53 53 }
54   - $this->nomecache = $this->nomeCache();
55 54 if(!isset($i3geoEsquemasWL) || !is_array($i3geoEsquemasWL)){
56 55 $this->i3geoEsquemasWL = array();
57 56 } else {
58 57 $this->i3geoEsquemasWL = $i3geoEsquemasWL;
59 58 }
60 59 //se a conexao nao vier como parametro, cria uma nova
61   - if(empty($dbh)){
62   - $this->conecta($conexaoadmin);
  60 + if(is_array($dbh)){
  61 + $this->dbh = $this->conecta($dbh);
63 62 } else {
64 63 $this->dbh = $dbh;
65   - if(!isset($convUTF)){
66   - $this->convUTF = true;
67   - } else {
68   - $this->convUTF = $convUTF;
69   - }
70 64 }
71 65 }
72 66 function __destruct(){
73 67 $this->fechaConexao();
74 68 }
75   - function conecta($conexaoadmin){
76   - if($conexaoadmin == ""){
77   - //banco de dados sqlite default
78   - $arquivosqlite = $this->locaplic."/admin/admin.db";
79   - if(!file_exists($arquivosqlite)){
80   - header ( "HTTP/1.1 500 O arquivo admin.db nao existe. Utilize i3geo/admin/criabanco.php para criar o banco de dados SQLITE." );
81   - exit;
82   - }
83   - $conAdmin = "sqlite:$arquivosqlite";
84   - $conAdminw = "sqlite:$arquivosqlite";
85   - if(!extension_loaded("PDO")){
86   - header ( "HTTP/1.1 500 PDO nao instalado" );
87   - exit;
88   - }
89   - if (!extension_loaded( "pdo_sqlite")){
90   - header ( "HTTP/1.1 500 pdo_sqlite nao instalado" );
91   - exit;
92   - }
93   - if (!extension_loaded( "SQLite") && !extension_loaded( "sqlite3")){
94   - header ( "HTTP/1.1 500 sqlite nao instalado" );
95   - exit;
96   - }
97   - try {
98   - $dbh = new PDO($conAdmin);
99   - }
100   - catch (PDOException $e) {
101   - die();
102   - }
103   - }
104   - else {
105   - include($conexaoadmin);
106   - if(isset($convUTF)){
107   - $this->convUTF = $convUTF;
108   - }
109   - }
110   - $this->dbh = $dbh;
  69 + function conecta($c){
  70 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  71 + return $dbh;
  72 + }
  73 + /**
  74 + * Fecha a conexao com o banco de dados de administracao
  75 + */
  76 + function fechaConexao(){
  77 + $this->dbh = null;
111 78 }
112 79 function listaDeEsquemas(){
113 80 return $this->i3geoEsquemasWL;
... ... @@ -121,1180 +88,46 @@ class Bdexplorer{
121 88 }
122 89 return $novaLista;
123 90 }
124   - /**
125   - * Cria um nome de arquivo concatenando $_request
126   - * @return string
127   - */
128   - function nomeCache(){
129   - return "AAAA".md5(implode("x",$_REQUEST));
130   - }
131   - /**
132   - * Cria um nome aleatorio
133   - * @param numero de caracteres
134   - * @return string
135   - */
136   - function nomeRandomico($n=10){
137   - $nomes = "";
138   - $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ';
139   - $max = 51;
140   - for($i=0; $i < $n; ++$i)
141   - {
142   - $nomes .= $a{mt_rand(0, $max)};
  91 + function validaEsquema($esquema){
  92 + $lista = $this->validaEsquemas(array($esquema));
  93 + if(count($lista) == 0){
  94 + return false;
  95 + } else {
  96 + return true;
143 97 }
144   - return $nomes;
145 98 }
146   - /**
147   - * Fecha a conexao com o banco de dados de administracao
148   - */
149   - function fechaConexao(){
150   - $this->dbh = null;
151   - }
152   - /**
153   - * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao
154   - * Verifica se o parametro e um array ou um texto e executa converteTexto()
155   - * @param string|array
156   - * @return string|array
157   - */
158   - function converteTextoArray($texto){
159   - try {
160   - if(empty($texto) || strtoupper($texto) == "NULL"){
161   - return "";
162   - }
163   - $chaves = array_keys($texto);
164   - if($chaves[0] != "0"){
165   - foreach($chaves as $chave){
166   - $texto[$chave] = $this->converteTexto($texto[$chave]);
167   - }
168   - }
169   - else{
170   - $n = count($texto);
171   - for($i=0;$i<$n;$i++){
172   - $chaves = array_keys($texto[$i]);
173   - foreach($chaves as $chave){
174   - if(is_string($texto[$i][$chave])){
175   - $t = $this->converteTexto($texto[$i][$chave]);
176   - $texto[$i][$chave] = $t;
177   - }
178   - }
179   - }
  99 + function listaDeTabelas($esquema){
  100 + $tabelas = array();
  101 + if($this->validaEsquema($esquema) == true){
  102 + $sql = "SELECT table_name as tabela FROM information_schema.tables where table_schema = '$esquema' AND table_schema NOT LIKE 'i3geo%' AND table_schema NOT LIKE 'pg_%' AND table_schema NOT LIKE '%_schema%'";
  103 + $res = $this->execSQL($sql);
  104 + foreach($res as $r){
  105 + $tabelas[] = $r["tabela"];
180 106 }
181   - return $texto;
182   - }
183   - catch (Exception $e) {
184   - return $texto;
185 107 }
  108 + return $tabelas;
186 109 }
187   - /**
188   - * Converte a codificacao de caracteres de uma string conforme o padrao do banco de admnistracao
189   - * @param string
190   - * @return string
191   - */
192   - function converteTexto($texto){
193   - if($texto == "0"){
194   - return "0";
195   - }
196   - if(empty($texto)){
197   - return "";
198   - }
199   - if($this->convUTF == true){
200   - $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"UTF-8");
201   - }
202   - else{
203   - $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"ISO-8859-1");
  110 + function listaDeColunas($esquema,$tabela){
  111 + $colunas = array();
  112 + if($this->validaEsquema($esquema) == true){
  113 + $sql = "SELECT column_name as coluna,udt_name FROM information_schema.columns where table_schema = '$esquema' and table_name = '$tabela'";
  114 + $res = $this->execSQL($sql);
  115 + foreach($res as $r){
  116 + $colunas[] = $r["coluna"];
  117 + }
204 118 }
205   - return $texto;
  119 + return $colunas;
206 120 }
207   - /**
208   - * Executa um SQL no banco de administracao
209   - * Utiliza fetchAll() para obter os dados
210   - * O resultado e processado por converteTextoArray se for desejado
211   - * @param string sql
212   - * @param se for vazio retorna todos os registros, caso contrario, retorna apenas o primeiro
213   - * @param indica se deve ser feita a conversao de caracteres
214   - * @return Array
215   - */
216   - function execSQL($sql,$id="",$convTexto=true){
  121 + function execSQL($sql){
217 122 $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql);
218 123 try {
219 124 $q = $this->dbh->query($sql,PDO::FETCH_ASSOC);
  125 + $q = $q->fetchAll();
  126 + return $q;
220 127 }
221 128 catch (PDOException $e) {
222 129 return "Error!: ";
223 130 }
224   - if($q){
225   - $r = $q->fetchAll();
226   - if($convTexto == false){
227   - return $r;
228   - }
229   - if($r){
230   - if($id != ""){
231   - if(count($r) == 1){
232   - $r = $r[0];
233   - }
234   - else{
235   - $r = array();
236   - }
237   - }
238   - if($r != false && count($r) > 0){
239   - $r = $this->converteTextoArray($r);
240   - }
241   - return $r;
242   - }
243   - else{
244   - return array();
245   - }
246   - }
247   - else{
248   - return false;
249   - }
250   - }
251   - /**
252   - * Executa um SQL no banco de dados definido em uma conexao cadastrada no sistema de admnistracao
253   - * @param codigo da conexao
254   - * @param tring sql
255   - * @return resultado de execSQL
256   - */
257   - function execSQLDB($codigo_estat_conexao,$sql){
258   - $buscar = array("drop","update","insert","delete");
259   - $sql = str_ireplace($buscar,"",$sql);
260   - $c = $this->listaConexao($codigo_estat_conexao,true);
261   - $dbhold = $this->dbh;
262   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
263   - $this->dbh = $dbh;
264   - $res = $this->execSQL($sql,"",false);
265   - $this->dbh = $dbhold;
266   - return $res;
267   - }
268   - /**
269   - * Obtem os dados de uma medida de variavel
270   - * @param id da medida
271   - * @param filtro que sera concatenado ao sql
272   - * @param 0|1 mostra ou nao todas as colunas da tabela com os dados
273   - * @param coluna de agrupamento
274   - * @param limite do numero de registros
275   - * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
276   - * @return execSQL
277   - */
278   - function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){
279   - set_time_limit(0);
280   - $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto);
281   - $sqlf = $sql["sqlmapserver"];
282   - //remove marcadores geo
283   - $sqlf = explode("/*SE*/",$sqlf);
284   - $sqlf = explode("/*SG*/",$sqlf[1]);
285   - $sqlf = $sqlf[0]." ".$sqlf[2];
286   - if($limite != ""){
287   - $sqlf .= " limit ".$limite;
288   - }
289   - $sqlf = str_replace(", FROM"," FROM",$sqlf);
290   - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
291   - //echo $sqlf;exit;
292   - if(!empty($metaVariavel["codigo_estat_conexao"])){
293   - $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
294   - $dbhold = $this->dbh;
295   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
296   - $this->dbh = $dbh;
297   - $res = $this->execSQL($sqlf);
298   - $this->dbh = $dbhold;
299   - return $res;
300   - }
301   - return false;
302   - }
303   - /**
304   - * Lista as ocorrencias de valores em uma coluna de uma medida de variavel
305   - * @param id da medida de variavel
306   - * @param coluna
307   - * @return execSQL
308   - */
309   - function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){
310   - $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna);
311   - $sqlf = $sqlf["sqlagrupamento"];
312   - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
313   - if(!empty($metaVariavel["codigo_estat_conexao"])){
314   - $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
315   - $dbhold = $this->dbh;
316   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
317   - $this->dbh = $dbh;
318   - $res = $this->execSQL($sqlf);
319   - $this->dbh = $dbhold;
320   - return $res;
321   - }
322   - return false;
323   - }
324   - /**
325   - * Sumario estatistico de uma medida de variavel
326   - * @param id da medida
327   - * @param filtro a ser concatenado ao sql
328   - * @param coluna de agrupamento
329   - * @param limite numero maximo de registros que serao lidos do banco
330   - * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
331   - * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>)
332   - */
333   - function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){
334   - if(!empty($agruparpor)){
335   - $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto);
336   - }
337   - else{
338   - $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto);
339   - }
340   - if($dados){
341   - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
342   - $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]);
343   - $agrupamento = "";
344   - $colunavalor = $metaVariavel["colunavalor"];
345   - foreach($dados as $d){
346   - if($d[$colunavalor]){
347   - $valores[] = $d[$colunavalor];
348   - }
349   - }
350   - if(!empty($agruparpor)){
351   - $agrupamento = array();
352   - foreach($dados as $d){
353   - $g = $d[$agruparpor];
354   - //var_dump($d);exit;
355   - if(!empty($agrupamento[$g])){
356   - $agrupamento[$g] += $d[$colunavalor];
357   - }
358   - else{
359   - $agrupamento[$g] = $d[$colunavalor];
360   - }
361   - }
362   - natsort($agrupamento);
363   - }
364   - $soma = "";
365   - $media = "";
366   - $min = "";
367   - $max = "";
368   - $quantidade = count($valores);
369   - $sturges = 1 + (3.322 * (log10($quantidade)));
370   - $quartis = array();
371   - if($un["permitesoma"] == "1"){
372   - $soma = array_sum($valores);
373   - }
374   - if($un["permitemedia"] == "1"){
375   - $media = $soma / $quantidade;
376   - }
377   - if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){
378   - sort($valores);
379   - //var_dump($valores);exit;
380   - $min = $valores[0];
381   - $max = $valores[$quantidade - 1];
382   - include_once(dirname(__FILE__)."/../../classesphp/classe_estatistica.php");
383   - $calc = new estatistica();
384   - $calc->calcula($valores);
385   - $v = $calc->resultado;
386   - //expressao para o mapfile
387   - $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")";
388   - $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))";
389   - if($v["quartil3"] != 0){
390   - $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))";
391   - $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")";
392   - }
393   - $nomes[] = "<= ".($v["quartil1"]);
394   - $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]);
395   - if($v["quartil3"] != 0){
396   - $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]);
397   - $nomes[] = "> ".($v["quartil3"]);
398   - }
399   - $quartis = array(
400   - "cortes"=>array(
401   - "q1"=>$v['quartil1'],
402   - "q2"=>$v['quartil2'],
403   - "q3"=>$v['quartil3']
404   - ),
405   - "expressoes"=>$expressao,
406   - "nomes"=>$nomes
407   - );
408   - }
409   - $histograma = array_count_values($valores);
410   - //echo "<pre>".var_dump($quartis);exit;
411   - return array(
412   - "colunavalor"=>$colunavalor,
413   - "soma"=>$soma,
414   - "media"=>$media,
415   - "menor"=>$min,
416   - "maior"=>$max,
417   - "quantidade"=>$quantidade,
418   - "histograma"=>$histograma,
419   - "grupos"=>$agrupamento,
420   - "unidademedida"=>$un,
421   - "quartis"=>$quartis,
422   - "sturges"=>$sturges
423   - );
424   - }
425   - return false;
426   - }
427   - /**
428   - * Lista os dados de um ou de todos os mapas cadastrados
429   - * @param id do mapa
430   - */
431   - function listaMapas($id_mapa=""){
432   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_mapa ";
433   - if($id_mapa != ""){
434   - $sql .= "WHERE id_mapa = $id_mapa ";
435   - }
436   - $sql .= "ORDER BY titulo";
437   - return $this->execSQL($sql,$id_mapa);
438   - }
439   - /**
440   - * Lista os dados de um ou de todos os mapas grupos de um mapa
441   - * @param id do mapa
442   - * @param id do grupo
443   - */
444   - function listaGruposMapa($id_mapa,$id_mapa_grupo){
445   - if(!empty($id_mapa)){
446   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa = $id_mapa";
447   - }
448   - if(!empty($id_mapa_grupo)){
449   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa_grupo = $id_mapa_grupo";
450   - }
451   - $sql .= " ORDER BY titulo";
452   - return $this->execSQL($sql,$id_mapa_grupo);
453   - }
454   - /**
455   - * Lista os dados de um ou de todos os temas de um grupo de um mapa
456   - * @param id do mapa
457   - * @param id do grupo
458   - * @param id do tema
459   - */
460   - function listaTemasMapa($id_mapa_grupo,$id_mapa_tema){
461   - if(!empty($id_mapa_grupo)){
462   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_grupo = $id_mapa_grupo";
463   - }
464   - if(!empty($id_mapa_tema)){
465   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_tema = $id_mapa_tema";
466   - }
467   - $sql .= " ORDER BY titulo";
468   - return $this->execSQL($sql,$id_mapa_tema);
469   - }
470   - /**
471   - * Lista os dados de uma ou todas as unidades de medida cadastradas
472   - * @param codigo da unidade
473   - */
474   - function listaUnidadeMedida($codigo_unidade_medida=""){
475   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
476   - if($codigo_unidade_medida != ""){
477   - $sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
478   - }
479   - $sql .= "ORDER BY nome";
480   - return $this->execSQL($sql,$codigo_unidade_medida);
481   - }
482   - /**
483   - * Lista os dados de uma ou todas as fontes cadastradas
484   - * @param id da fonte
485   - */
486   - function listaFonteinfo($id_fonteinfo=""){
487   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
488   - if($id_fonteinfo != ""){
489   - $sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
490   - }
491   - $sql .= "ORDER BY titulo";
492   - return $this->execSQL($sql,$id_fonteinfo);
493   - }
494   - /**
495   - * Lista as fontes vinculadas a uma medida de variavel
496   - * @param id da medida de variavel
497   - */
498   - function listaFonteinfoMedida($id_medida_variavel){
499   - $sql = "SELECT i3geoestat_fonteinfo.* ";
500   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
501   - $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
502   - $sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
503   - $sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
504   - $sql .= "ORDER BY titulo";
505   - //echo $sql;exit;
506   - return $this->execSQL($sql,$id_fonteinfo);
507   - }
508   - /**
509   - * Lista os dados de uma ou todas as variaveis cadastradas
510   - * @param codigo da variavel
511   - * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
512   - */
513   - function listaVariavel($codigo_variavel="",$filtro_esquema=""){
514   - $sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
515   - if($codigo_variavel != ""){
516   - $sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
517   - }
518   - if($filtro_esquema != ""){
519   - $sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
520   - }
521   - $sql .= "ORDER BY a.nome";
522   - //echo $sql;exit;
523   - return $this->execSQL($sql,$codigo_variavel);
524   - }
525   - /**
526   - * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
527   - * @param id da medida de variavel
528   - * @param id da classificacao
529   - */
530   - function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
531   - if(!empty($id_medida_variavel)){
532   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
533   - }
534   - if(!empty($id_classificacao)){
535   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
536   - }
537   - return $this->execSQL($sql,$id_classificacao);
538   - }
539   - /**
540   - * Lista os dados de um ou todos os links de uma medida
541   - * @param id da medida
542   - * @param id do link
543   - */
544   - function listaLinkMedida($id_medida_variavel,$id_link=""){
545   - if(!empty($id_medida_variavel)){
546   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
547   - }
548   - if(!empty($id_link)){
549   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
550   - }
551   - return $this->execSQL($sql,$id_link);
552   - }
553   - /**
554   - * Lista os dados de uma ou todas as classes de uma classificacao
555   - * @param id da classificacao
556   - * @param id da classe
557   - */
558   - function listaClasseClassificacao($id_classificacao,$id_classe=""){
559   - if(!empty($id_classificacao)){
560   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
561   - }
562   - if(!empty($id_classe)){
563   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
564   - }
565   - return $this->execSQL($sql,$id_classe);
566   - }
567   - /**
568   - * Lista os dados de uma ou todas as medidas de variavel de uma variavel
569   - * @param codigo da variavel
570   - * @param id da medida de variavel
571   - */
572   - function listaMedidaVariavel($codigo_variavel,$id_medida_variavel=""){
573   - $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 ";
574   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
575   - $sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
576   - $sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
577   - $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
578   - $sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
579   - if($codigo_variavel != ""){
580   - $sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
581   - if($id_medida_variavel != ""){
582   - $sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
583   - }
584   - }
585   - elseif($id_medida_variavel != "") {
586   - $sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
587   - }
588   - $sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
589   - $res = $this->execSQL($sql,$id_medida_variavel);
590   - $res = str_replace('"',"'",$res);
591   - return $res;
592   - }
593   - /**
594   - * Lista as regioes vinculadas a uma medida de variavel
595   - * @param id da medida de vriavel
596   - */
597   - function listaRegioesMedida($id_medida_variavel){
598   - $variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
599   - $codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
600   - $regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
601   - //var_dump($regioes);exit;
602   - $agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
603   - foreach($agregacoes as $a){
604   - $regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
605   - }
606   - return $regioes;
607   - }
608   - /**
609   - * Lista os dados de uma conexao ou de todas
610   - * @param id da conexao
611   - * @param boolean inclui na lista a senha ou nao
612   - * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
613   - */
614   - function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
615   - if($senha == true){
616   - $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
617   - }
618   - else{
619   - $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
620   - }
621   - $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
622   - if($codigo_estat_conexao != ""){
623   - $sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
624   - }
625   - $sql .= "ORDER BY bancodedados,host,usuario";
626   - $res = $this->execSQL($sql,$codigo_estat_conexao);
627   - //se achou e a requisico e para listar uma conexao, retorna o que for encontrado
628   - $cres = count($res);
629   - if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
630   - return $res;
631   - }
632   - //caso contrario, e deve retornar todas as conexoes, inclui a fonte
633   - if($codigo_estat_conexao == ""){
634   - for($i=0; $i<$cres;$i++){
635   - $res[$i]["fonte"] = "metaestat";
636   - }
637   - }
638   - //obtem as conexoes definidas em ms_configgura.php
639   - if($incluiPostgisMapa == true){
640   - if(!isset($postgis_mapa)){
641   - require(dirname(__FILE__)."/../../ms_configura.php");
642   - }
643   - if(!empty($postgis_mapa)){
644   - foreach(array_keys($postgis_mapa) as $key){
645   - $lista = explode(" ",$postgis_mapa[$key]);
646   - $con = array();
647   - foreach($lista as $l){
648   - $teste = explode("=",$l);
649   - $con[trim($teste[0])] = trim($teste[1]);
650   - }
651   - $c = array(
652   - "codigo_estat_conexao" => $key,
653   - "bancodedados" => $con["dbname"],
654   - "host" => $con["host"],
655   - "porta" => $con["port"],
656   - "usuario" => $con["user"],
657   - "fonte" => "ms_configura"
658   - );
659   - if($senha == true){
660   - $c["senha"] = $con["password"];
661   - }
662   - $res[] = $c;
663   - if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
664   - return $c;
665   - }
666   - }
667   - }
668   - }
669   - //echo "<pre>";
670   - //var_dump($res);exit;
671   - return $res;
672   - }
673   - function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
674   - //lista os parametros temporais
675   - $parametros = $this->listaParametro($id_medida_variavel,"","",true,true);
676   - echo "<pre>";
677   - //var_dump($parametros);exit;
678   - //faz o sql para pegar os valores e definir a resolucao
679   - //o tempo deve comecar sempre pelo ano
680   - $data = array();
681   - if($parametros[0]["tipo"] == 1){
682   - //ano
683   - $data[] = $prefixoAlias.$parametros[0]["coluna"];
684   - $tipodata = "YYYY";
685   - //mes
686   - if(!empty($parametros[1])){
687   - $data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
688   - $tipodata = "YYYYMM";
689   - }
690   - else{
691   - $data[] = "'-01'";
692   - }
693   - //dia
694   - if(!empty($parametros[2])){
695   - $data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
696   - $tipodata = "YYYYMMDD";
697   - }
698   - else{
699   - $data[] = "'-01'";
700   - }
701   - $data = implode("||",$data);
702   - return "to_date($data,'$tipodata')";
703   - }
704   - }
705   - /**
706   - * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
707   - * @param id da medida de variavel
708   - * @param id do parametro
709   - * @param id do pai (se definido, lista apenas os filhos deste)
710   - * @param bool indica se apenas parametros do tipo temporal serao retornados
711   - */
712   - function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
713   - $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
714   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
715   - $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
716   - $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
717   - if($id_medida_variavel != ""){
718   - $sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
719   - if($id_parametro_medida != ""){
720   - $sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
721   - }
722   - }
723   - elseif ($id_parametro_medida != ""){
724   - $sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
725   - }
726   - if($id_pai != ""){
727   - $sql .= " AND id_pai = $id_pai";
728   - }
729   - if($apenasTempo == true){
730   - $tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
731   - $sql .= $tempo;
732   - }
733   - if($ordenaPeloPai == true){
734   - $sql .= " ORDER BY id_pai";
735   - }
736   - //echo $sql;exit;
737   - return $this->execSQL($sql,$id_parametro_medida);
738   - }
739   - /**
740   - * Lista todos os parametros cadastrados
741   - */
742   - function listaTodosParametros(){
743   - $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
744   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
745   - $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
746   - $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
747   - $sql .= " ORDER BY nome";
748   - return $this->execSQL($sql);
749   - }
750   - /**
751   - * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
752   - * @param id do parametro
753   - * @return array com os valores
754   - */
755   - function listaValoresParametro($id_parametro_medida){
756   - $parametro = $this->listaParametro("",$id_parametro_medida);
757   - //$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
758   - $sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
759   - $nsm = array();
760   - foreach($sm as $s){
761   - $nsm[] = $s[$parametro["coluna"]];
762   - }
763   - return $nsm;
764   - }
765   - /**
766   - * Lista os dados de um ou todos os tipos de periodo cadastrados
767   - * @param id
768   - */
769   - function listaTipoPeriodo($codigo_tipo_periodo=""){
770   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
771   - if($codigo_tipo_periodo != ""){
772   - $sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
773   - }
774   - $sql .= "ORDER BY nome";
775   - return $this->execSQL($sql,$codigo_tipo_periodo);
776   - }
777   - /**
778   - * Lista as propriedades da coluna com as geometrias de uma regiao geografica
779   - * @param codigo do tipo de regiao
780   - * @return array com os parametros, inclusive a dimensao (st_dimension)
781   - */
782   - function listaPropGeoRegiao($codigo_tipo_regiao){
783   - //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
784   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
785   - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
786   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
787   - $c = $regiao["colunageo"];
788   - $sql = "select st_dimension(".$regiao["colunageo"].") as st_dimension from ".$regiao["esquemadb"].".".$regiao["tabela"]." limit 1";
789   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
790   - $r = array();
791   - if($q){
792   - $r = $q->fetchAll();
793   - $r = $r[0];
794   - }
795   - return $r;
796   - }
797   - /**
798   - * Lista os dados de uma ou todas as regioes cadastradas
799   - * @param codigo do tipo de regiao
800   - */
801   - function listaTipoRegiao($codigo_tipo_regiao=""){
802   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
803   - if($codigo_tipo_regiao != ""){
804   - $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
805   - }
806   - $sql .= "ORDER BY nome_tipo_regiao";
807   - return $this->execSQL($sql,$codigo_tipo_regiao);
808   - }
809   - /**
810   - * Obtem de um tipo de regiao a coluna do tipo serial
811   - * @param codigo do tipo de regiao
812   - */
813   - function listaTipoRegiaoSerial($codigo_tipo_regiao){
814   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
815   - $regiao = $this->execSQL($sql,$codigo_tipo_regiao);
816   - $nome_esquema = $regiao["esquemadb"];
817   - $nome_tabela = $regiao["tabela"];
818   - $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'";
819   - $colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
820   - $colunas = $colunas[0];
821   - return $colunas["coluna"];
822   - }
823   - /**
824   - * Obtem de uma tabela a coluna do tipo serial
825   - * @param codigo do tipo de regiao
826   - */
827   - function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
828   - $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'";
829   - $colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
830   - $colunas = $colunas[0];
831   - return $colunas["coluna"];
832   - }
833   - /**
834   - * Lista os dados de agregacao de uma regiao pai
835   - * @param codigo da regiao
836   - */
837   - function listaHierarquiaRegioes($codigoregiaopai=""){
838   - $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 ";
839   - $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
840   - $sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
841   - if($codigoregiaopai != ""){
842   - $sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
843   - }
844   - else{
845   - $sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
846   - }
847   - return $this->execSQL($sql,"");
848   - }
849   - function listaHierarquia($codigoregiaopai=""){
850   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao order by codigo_tipo_regiao";
851   - return $this->execSQL($sql,"");
852   - }
853   - /**
854   - * Lista os registros de um tipo de regiao
855   - * Se for definido o pai, lista os valores da regiao que e filha
856   - * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
857   - * @param codigo do tipo de regiao
858   - * @param codigo do tipo de regiao pai
859   - * @param identificador da regiao (registro) pai
860   - */
861   - function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
862   - //pega a tabela, esquema e conexao para acessar os dados da regiao
863   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
864   - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
865   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
866   - $c = $regiao["colunageo"];
867   - $bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
868   - $sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
869   - if($valorregiaopai != ""){
870   - $r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
871   - $sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
872   - }
873   - $sql .= " order by ".$regiao["colunanomeregiao"];
874   -
875   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
876   - $r = array();
877   - if($q){
878   - $r = $q->fetchAll();
879   - }
880   - return $r;
881   - }
882   - /**
883   - * Lista os registros de uma tabela que e uma regiao
884   - * @param codigo do tipo de regiao
885   - */
886   - function listaDadosGeometriaRegiao($codigo_tipo_regiao){
887   - //pega a tabela, esquema e conexao para acessar os dados da regiao
888   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
889   - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
890   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
891   - $c = $regiao["colunageo"];
892   - $s = "ST_dimension($c) as dimension ";
893   - $sql = "select $s,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
894   - $sql .= " limit 1";
895   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
896   - $r = array();
897   - if($q){
898   - $r = $q->fetchAll();
899   - }
900   - return $r[0];
901   - }
902   - /**
903   - * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
904   - * @param codigo do tipo de regiao
905   - * @param id da agregacao
906   - */
907   - function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
908   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
909   - if($id_agregaregiao != ""){
910   - $sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
911   - }
912   - else{
913   - if($codigo_tipo_regiao != ""){
914   - $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
915   - }
916   - }
917   - $sql .= " ORDER BY colunaligacao_regiaopai";
918   - //echo $sql;exit;
919   - return $this->execSQL($sql,$id_agregaregiao);
920   - }
921   - /**
922   - * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
923   - * @param codigo do tipo de regiao
924   - * @param codigo do tipo de regiao que e pai
925   - */
926   - function listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiao_pai){
927   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
928   - $sql .= "WHERE codigo_tipo_regiao_pai = $codigo_tipo_regiao_pai ";
929   - if($codigo_tipo_regiao != ""){
930   - $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
931   - }
932   - return $this->execSQL($sql,$codigo_tipo_regiao_pai);
933   - }
934   - /**
935   - * Lista os esquemas em um banco de dados
936   - * @param codigo da conexao
937   - * @return execSQLDB
938   - */
939   - function esquemasConexao($codigo_estat_conexao){
940   - 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");
941   - }
942   - /**
943   - * Lista as tabelas de um esquema
944   - * @param codigo da conexao
945   - * @param nome do esquema
946   - * @param sim|nao exclui da lista as tabelas que contem geometria
947   - * @return execSQLDB
948   - */
949   - function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
950   - $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%'";
951   - if(strtolower($excluigeom) == "sim"){
952   - $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";
953   - }
954   - return $this->execSQLDB($codigo_estat_conexao,$sql);
955   - }
956   - /**
957   - * Lista as colunas de uma tabela
958   - * @param codigo da conexao
959   - * @param nome do esquema
960   - * @param nome da tabela
961   - * @param tipo de coluna (opcional)
962   - * @param tipo de tratamento do parametro tipo, pode ser =|!=
963   - * @return execSQLDB
964   - */
965   - function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
966   - $colunas = array();
967   - $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'");
968   - if($tipo != ""){
969   - $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'");
970   - }
971   - foreach($res as $c){
972   - $colunas[] = $c["coluna"];
973   - }
974   - return $colunas;
975   - }
976   - /**
977   - * Lista o comentario de uma tabela
978   - * @param codigo da conexao
979   - * @param nome do esquema
980   - * @param nome da tabela
981   - * @return execSQLDB
982   - */
983   - function comentarioTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela){
984   - $colunas = array();
985   - $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."'";
986   - $res = $this->execSQLDB($codigo_estat_conexao,$sql);
987   - if(count($res) > 0){
988   - $res = $res[0];
989   - $res = $res["comments"];
990   - }
991   - else{
992   - $res = "";
993   - }
994   - if($res == null){
995   - $res = "";
996   - }
997   - return $res;
998   - }
999   - /**
1000   - * Lista os metadados de uma coluna
1001   - * Os metadados sao obtidos do proprio PostgreSQL
1002   - * @param codigo da conexao
1003   - * @param nome do esquema
1004   - * @param nome da tabela
1005   - * @param nome da coluna (opcional)
1006   - * @return execSQLDB
1007   - */
1008   - function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
1009   - if($nome_coluna == ""){
1010   - 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");
1011   - }
1012   - else{
1013   - $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");
1014   - return $res[0];
1015   - }
1016   - }
1017   - /**
1018   - * Lista os dados de uma tabela
1019   - * @param codigo da conexao
1020   - * @param nome do esquema
1021   - * @param nome da tabela
1022   - * @param sim|nao inclui o WKT da geometria de colunas geo
1023   - * @param (opcional) numero de registros que serao listados
1024   - * @return execSQLDB
1025   - */
1026   - function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
1027   - $desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
1028   - $colunas = array();
1029   - $colsql = array();
1030   - foreach($desccolunas as $d){
1031   - if($d["type"] != "geometry" && $d["type"] != "geography"){
1032   - $colunas[] = $d["field"];
1033   - $colsql[] = $d["field"];
1034   - }
1035   - elseif($geo == "sim"){
1036   - $colunas[] = $d["field"];
1037   - $colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
1038   - }
1039   - }
1040   - $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
1041   - if($nreg != ""){
1042   - $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
1043   - }
1044   - $dados = $this->execSQLDB($codigo_estat_conexao,$sql );
1045   - $linhas = array();
1046   - foreach($dados as $d){
1047   - $l = array();
1048   - foreach($colunas as $c){
1049   - $l[] = $d[$c];
1050   - }
1051   - $linhas[] = $l;
1052   - }
1053   - return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
1054   - }
1055   - /**
1056   - * Relatorio completo com a lista de variaveis e medidas
1057   - * @param codigo da variavel
1058   - * @param sim|nao inclui dados detalhados
1059   - * @return Array
1060   - */
1061   - function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
1062   - $dados = array();
1063   - if($codigo_variavel != "" || !empty($codigo_variavel)){
1064   - $vs[] = $this->listaVariavel($codigo_variavel);
1065   - }
1066   - else{
1067   - $vs = $this->listaVariavel();
1068   - }
1069   - foreach($vs as $v){
1070   - $nivel1["id"] = $v["codigo_variavel"];
1071   - $nivel1["titulo"] = $v["nome"];
1072   - $nivel1["descricao"] = $v["descricao"];
1073   - $ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
1074   - $nivel1["filhos"] = array();
1075   - foreach($ms as $m){
1076   - $nivel2["id"] = $m["id_medida_variavel"];
1077   - $nivel2["titulo"] = $m["nomemedida"];
1078   - $unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
1079   - $unidade = "Unidade de medida: ".$unidade["nome"];
1080   - $periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
1081   - $periodo = "Per&iacute;odo de tempo: ".$periodo["nome"];
1082   - $regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
1083   - $regiao = "Regi&atilde;o: ".$regiao["nome_tipo_regiao"];
1084   - $nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
1085   - $nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
1086   - $nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
1087   - $nivel2["dadosgerenciais"] = "";
1088   - if($dadosGerenciais == "sim"){
1089   - $nivel2["dadosgerenciais"] = $m;
1090   - }
1091   - $nivel1["filhos"][] = $nivel2;
1092   - }
1093   - $dados[] = $nivel1;
1094   - }
1095   - return $dados;
1096   - }
1097   - /**
1098   - * Cria um raltorio formatado em HTML
1099   - * @param dados obtidos com relatorioCompleto
1100   - * @param sim|nao inclui os dados detalhados
1101   - * @return string
1102   - */
1103   - function formataRelatorioHtml($dados,$detalhes="sim"){
1104   - $html[] = "<div class='var_div_relatorio'>";
1105   - $var_cor = "var_cor1";
1106   - foreach($dados as $variavel){
1107   - $html[] = "<div class='".$var_cor."'>";
1108   - $html[] = "<h1 style=padding:3px; ><b>".$variavel["titulo"];
1109   - $html[] = "</b><br><span style='color:rgb(100,100,100)'>".$variavel["descricao"]."</span></h1>";
1110   - $filhos = $variavel["filhos"];
1111   - foreach($filhos as $f){
1112   - $html[] = "<h2 style='position:relative;left:10px;'>ID: <u>".$f["id"]."</u> - ".$f["titulo"]."</h2>";
1113   - $html[] = "<div style='position:relative;padding-left:20px;'>";
1114   - $html[] = "<p>".$f["descricao"]."</p>";
1115   - if($detalhes == "sim"){
1116   - $html[] = "<p><b>Fontes:</b></p>";
1117   - foreach($f["fontes"] as $fonte){
1118   - $html[] = "<p><a href='".$fonte["link"]."' >".$fonte["titulo"]."</a></p>";
1119   - }
1120   - $html[] = "<p><b>Links:</b></p>";
1121   - foreach($f["links"] as $link){
1122   - $html[] = "<p><a href='".$link["link"]."' >".$link["nome"]."</a></p>";
1123   - }
1124   - if($f["dadosgerenciais"] != ""){
1125   - $html[] = "<span style='color:gray'>";
1126   - $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", ";
1127   - $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", ";
1128   - $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", ";
1129   - $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", ";
1130   - $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", ";
1131   - $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico];
1132   - $html[] = "</span>";
1133   - }
1134   - }
1135   - $html[] = "</div>";
1136   - }
1137   - $html[] = "</div>";
1138   - if($var_cor == "var_cor1"){
1139   - $var_cor = "var_cor2";
1140   - }
1141   - else{
1142   - $var_cor = "var_cor1";
1143   - }
1144   - }
1145   - $html[] = "</div><br><br>";
1146   - return implode("",$html);
1147   - }
1148   - /**
1149   - * Cria um relatorio no formato XML
1150   - * @param dados obtidos com relatorioCompleto
1151   - * @return string
1152   - */
1153   - function formataXML($dados){
1154   - $chaves = array_keys($dados[0]);
1155   - if(count($chaves) == 0){
1156   - $chaves = false;
1157   - }
1158   - $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL;
1159   - $xml .= '<result-set>' . PHP_EOL;
1160   - //tenta descobrir o tipo de coluna
1161   - //$xml .= '<!--java.lang.String,java.lang.Integer-->' . PHP_EOL;
1162   - $xmldados = "";
1163   - if($chaves){
1164   - foreach($dados as $d){
1165   - $xmldados .= "<row>" . PHP_EOL;
1166   - foreach($chaves as $c){
1167   - $xmldados .= "<".$c.">".$d[$c]."</".$c.">" . PHP_EOL;
1168   - }
1169   - $xmldados .= "</row>" . PHP_EOL;
1170   - }
1171   - $tipos = array();
1172   - $d = $dados[0];
1173   - foreach($chaves as $c){
1174   - if(is_numeric($d[$c])){
1175   - $tipos[] = "java.lang.Integer";
1176   - }
1177   - else{
1178   - $tipos[] = "java.lang.String";
1179   - }
1180   - }
1181   - $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
1182   - }
1183   - else{
1184   - while (list($key, $val) = each($dados)) {
1185   - $xmldados .= "<row>" . PHP_EOL;
1186   - $xmldados .= "<nome>".$key."</nome>" . PHP_EOL;
1187   - $xmldados .= "<valor>".$val."</valor>" . PHP_EOL;
1188   - $xmldados .= "</row>" . PHP_EOL;
1189   - }
1190   - reset($dados);
1191   - $tipos = array();
1192   - while (list($key, $val) = each($dados)) {
1193   - if(is_numeric($val)){
1194   - $tipos[] = "java.lang.Integer";
1195   - }
1196   - else{
1197   - $tipos[] = "java.lang.String";
1198   - }
1199   - if(is_numeric($key)){
1200   - $tipos[] = "java.lang.Integer";
1201   - }
1202   - else{
1203   - $tipos[] = "java.lang.String";
1204   - }
1205   - break;
1206   - }
1207   - $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
1208   - }
1209   - $xml .= $xmldados;
1210   - $xml .= '</result-set>' . PHP_EOL;
1211   - return $xml;
1212   - }
1213   - /**
1214   - * Verifica se em um array existe uma chave com determinado valor
1215   - * @param Array
1216   - * @param nome da chave
1217   - * @param valor a ser buscado
1218   - * @return boolean
1219   - */
1220   - function buscaNoArray($lista,$chave,$valor){
1221   - foreach($lista as $l){
1222   - if($l[$chave] == $valor){
1223   - return true;
1224   - }
1225   - }
1226   - return false;
1227   - }
1228   - /**
1229   - * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude
1230   - * @param codigo do tipo de regiao
1231   - * @param longitude
1232   - * @param latitude
1233   - * @return array
1234   - */
1235   - function xy2regiao($codigo_tipo_regiao,$x,$y){
1236   - //pega a tabela, esquema e conexao para acessar os dados da regiao
1237   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
1238   - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
1239   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
1240   - $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"].")";
1241   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
1242   - $r = $q->fetchAll();
1243   - if(count($r) > 0){
1244   - return $r[0];
1245   - }
1246   - else{
1247   - return "";
1248   - }
1249   - }
1250   - /**
1251   - * Busca os dados de uma medida de variavel para uma regiao
1252   - * Identificador da regiao e o valor a ser encontrado na coluna de
1253   - * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao)
1254   - * @param identificador da regiao
1255   - * @param id da medida da variavel
1256   - * @return multitype:unknown multitype: string
1257   - */
1258   - function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){
1259   - $medida = $this->listaMedidaVariavel("",$id_medida_variavel);
1260   - $c = $this->listaConexao($medida["codigo_estat_conexao"],true);
1261   - if($medida["colunavalor"] == ""){
1262   - return "";
1263   - }
1264   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
1265   - $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"];
1266   -
1267   - $alias[] = $medida["nomemedida"];
1268   - $colunas[] = $medida["colunavalor"];
1269   - $alias[] = "idunico";
1270   - $colunas[] = $medida["colunaidunico"];
1271   - $descricao[] = $medida["unidade_medida"];
1272   - $parametros = $this->listaParametro($id_medida_variavel);
1273   - foreach($parametros as $p){
1274   - $colunassql[] = $p["coluna"];
1275   - $alias[] = $p["nome"];
1276   - $descricao[] = $p["descricao"];
1277   - $colunas[] = $p["coluna"];
1278   - }
1279   -
1280   - $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text ";
1281   - if($medida["filtro"] != ""){
1282   - $sql .= " and ".$medida["filtro"];
1283   - }
1284   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
1285   - $r = $q->fetchAll();
1286   - return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao);
1287   - }
1288   - /*
1289   - * Testa se os elementos de um array sao numericos
1290   - */
1291   - function testaNumerico($valores){
1292   - foreach ($valores as $valor) {
1293   - if(!empty($valor) && !is_numeric($valor)) {
1294   - echo "valor nao numerico";
1295   - exit;
1296   - }
1297   - }
1298 131 }
1299 132 }
1300 133 ?>
... ...
classesphp/classe_metaestat.php 0 → 100755
... ... @@ -0,0 +1,2017 @@
  1 +<?php
  2 +namespace i3geo\classesphp\metaestat;
  3 +use PDO;
  4 +/**
  5 + * Classe metaestat
  6 + * O construtor da classe faz o include do programa conexao.php que por sua vez faz o include
  7 + * de i3geo/ms_configura.php. Com base nesses programas sao definidas algumas das variaveis globais
  8 +*/
  9 +class Metaestat{
  10 + /**
  11 + * Nome do esquema no banco de dados utilizado para armazenar as tabelas
  12 + * do sistema de admnistracao. Obtido de ms_configura.php
  13 + */
  14 + protected $esquemaadmin;
  15 + /**
  16 + * Objeto PDO obtido com new PDO com direito de leitura no banco de dados de administracao
  17 + */
  18 + public $dbh;
  19 + /**
  20 + * Indica se e necessario converter para UTF strings obtidas do banco de administracao
  21 + */
  22 + public $convUTF;
  23 + /**
  24 + * Pasta temporaria utilizada pelo mapserver
  25 + */
  26 + public $dir_tmp;
  27 + /**
  28 + * Pasta onde e feito o cache de imagens do i3Geo
  29 + */
  30 + public $nomecache;
  31 + /**
  32 + * Grava ou nao o log de transacoes
  33 + */
  34 + public $logTransacoes;
  35 + /**
  36 + * Construtor
  37 + * Faz o include de conexao.php que por sua vez faz o include de i3geo/ms_configura.php
  38 + */
  39 + function __construct(){
  40 + error_reporting(0);
  41 + include(dirname(__FILE__)."/../admin/php/conexao.php");
  42 + //vem do include
  43 + $this->dir_tmp = $dir_tmp;
  44 + $this->logTransacoes = $logTransacoes;
  45 + $this->locaplic = $locaplic;
  46 + $this->base = $base;
  47 + if(!isset($convUTF)){
  48 + $convUTF = true;
  49 + }
  50 + $this->convUTF = $convUTF;
  51 + $this->dbh = $dbh;
  52 + $this->esquemaadmin = "";
  53 + if(!empty($esquemaadmin)){
  54 + $this->esquemaadmin = str_replace(".","",$esquemaadmin).".";
  55 + }
  56 + $this->nomecache = $this->nomeCache();
  57 + }
  58 + function __destruct(){
  59 + $this->fechaConexao();
  60 + }
  61 + /**
  62 + * Cria um nome de arquivo concatenando $_request
  63 + * @return string
  64 + */
  65 + function nomeCache(){
  66 + return "AAAA".md5(implode("x",$_REQUEST));
  67 + }
  68 + /**
  69 + * Cria um nome aleatorio
  70 + * @param numero de caracteres
  71 + * @return string
  72 + */
  73 + function nomeRandomico($n=10){
  74 + $nomes = "";
  75 + $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ';
  76 + $max = 51;
  77 + for($i=0; $i < $n; ++$i)
  78 + {
  79 + $nomes .= $a{mt_rand(0, $max)};
  80 + }
  81 + return $nomes;
  82 + }
  83 + /**
  84 + * Fecha a conexao com o banco de dados de administracao
  85 + */
  86 + function fechaConexao(){
  87 + $this->dbh = null;
  88 + }
  89 + /**
  90 + * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao
  91 + * Verifica se o parametro e um array ou um texto e executa converteTexto()
  92 + * @param string|array
  93 + * @return string|array
  94 + */
  95 + function converteTextoArray($texto){
  96 + try {
  97 + if(empty($texto) || strtoupper($texto) == "NULL"){
  98 + return "";
  99 + }
  100 + $chaves = array_keys($texto);
  101 + if($chaves[0] != "0"){
  102 + foreach($chaves as $chave){
  103 + $texto[$chave] = $this->converteTexto($texto[$chave]);
  104 + }
  105 + }
  106 + else{
  107 + $n = count($texto);
  108 + for($i=0;$i<$n;$i++){
  109 + $chaves = array_keys($texto[$i]);
  110 + foreach($chaves as $chave){
  111 + if(is_string($texto[$i][$chave])){
  112 + $t = $this->converteTexto($texto[$i][$chave]);
  113 + $texto[$i][$chave] = $t;
  114 + }
  115 + }
  116 + }
  117 + }
  118 + return $texto;
  119 + }
  120 + catch (Exception $e) {
  121 + return $texto;
  122 + }
  123 + }
  124 + /**
  125 + * Converte a codificacao de caracteres de uma string conforme o padrao do banco de admnistracao
  126 + * @param string
  127 + * @return string
  128 + */
  129 + function converteTexto($texto){
  130 + if($texto == "0"){
  131 + return "0";
  132 + }
  133 + if(empty($texto)){
  134 + return "";
  135 + }
  136 + if($this->convUTF == true){
  137 + $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"UTF-8");
  138 + }
  139 + else{
  140 + $texto = mb_convert_encoding($texto,mb_detect_encoding($texto),"ISO-8859-1");
  141 + }
  142 + return $texto;
  143 + }
  144 + /**
  145 + * Executa um SQL no banco de administracao
  146 + * Utiliza fetchAll() para obter os dados
  147 + * O resultado e processado por converteTextoArray se for desejado
  148 + * @param string sql
  149 + * @param se for vazio retorna todos os registros, caso contrario, retorna apenas o primeiro
  150 + * @param indica se deve ser feita a conversao de caracteres
  151 + * @return Array
  152 + */
  153 + function execSQL($sql,$id="",$convTexto=true){
  154 + $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql);
  155 + try {
  156 + $q = $this->dbh->query($sql,PDO::FETCH_ASSOC);
  157 + }
  158 + catch (PDOException $e) {
  159 + return "Error!: ";
  160 + }
  161 + if($q){
  162 + $r = $q->fetchAll();
  163 + if($convTexto == false){
  164 + return $r;
  165 + }
  166 + if($r){
  167 + if($id != ""){
  168 + if(count($r) == 1){
  169 + $r = $r[0];
  170 + }
  171 + else{
  172 + $r = array();
  173 + }
  174 + }
  175 + if($r != false && count($r) > 0){
  176 + $r = $this->converteTextoArray($r);
  177 + }
  178 + return $r;
  179 + }
  180 + else{
  181 + return array();
  182 + }
  183 + }
  184 + else{
  185 + return false;
  186 + }
  187 + }
  188 + /**
  189 + * Executa um SQL no banco de dados definido em uma conexao cadastrada no sistema de admnistracao
  190 + * @param codigo da conexao
  191 + * @param tring sql
  192 + * @return resultado de execSQL
  193 + */
  194 + function execSQLDB($codigo_estat_conexao,$sql){
  195 + $buscar = array("drop","update","insert","delete");
  196 + $sql = str_ireplace($buscar,"",$sql);
  197 + $c = $this->listaConexao($codigo_estat_conexao,true);
  198 + $dbhold = $this->dbh;
  199 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  200 + $this->dbh = $dbh;
  201 + $res = $this->execSQL($sql,"",false);
  202 + $this->dbh = $dbhold;
  203 + return $res;
  204 + }
  205 + /**
  206 + * Monta o sql que permite acessar os dados de uma media de uma variavel
  207 + * @param id da medida da variavel
  208 + * @param inclui todas as colunas da tabela com os dados ou nao
  209 + * @param coluna que sera usada para agrupar os dados
  210 + * @param tipo de layer. Usado para escolher qual coluna com as geometrias sera incluida no sql
  211 + * @param codigo do tipo de regiao. Se nao for definido, utiliza-se o default da variavel
  212 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  213 + * @return array("sqlagrupamento"=>,"sql"=>,"sqlmapserver"=>,"filtro"=>,"colunas"=>,"alias"=>,"colunavalor"=>,"titulo"=>,"nomeregiao"=>)
  214 + */
  215 + function sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor="",$tipolayer="polygon",$codigo_tipo_regiao = "",$suportaWMST = false,$filtro = "",$direto=false){
  216 + //
  217 + //o sql que faz acesso aos dados e marcado com /*SE*//*SE*/ na string que sera usada nos mapfiles
  218 + //a parte que contem referencias a coluna com a geometria e marcada com /*SG*//*SG*/
  219 + //
  220 + //registros da medida da variavel
  221 + $dados = $this->listaMedidaVariavel("",$id_medida_variavel);
  222 +
  223 + if(!empty($dados["filtro"])){
  224 + if($filtro == ""){
  225 + $filtro = $dados["filtro"];
  226 + }
  227 + else{
  228 + $filtro = $filtro." AND (".$dados["filtro"].")";
  229 + }
  230 + }
  231 +
  232 + //parametros da medida da variavel
  233 + $parametrosMedida = array();
  234 + $pp = $this->listaParametro($id_medida_variavel,"",0);
  235 + foreach($pp as $p){
  236 + $parametrosMedida[] = $p["coluna"];
  237 + }
  238 +
  239 + //titulo da medida de variavel
  240 + $titulo = $dados["nomemedida"];
  241 + //indica se os dados devem ser agregados a uma regiao de nivel superior
  242 + $agregaregiao = false;
  243 + //nome da coluna que contem os limites geograficos da regiao desejada pelo usuario
  244 + $colunageo = "";
  245 +
  246 + //se a regiao definida para a medida da variavel for diferente da regiao indicada pelo usuario
  247 + //significa que a regiao indicada pelo usuario e uma agragacao
  248 + if($codigo_tipo_regiao != "" && $dados["codigo_tipo_regiao"] != $codigo_tipo_regiao){
  249 + $agregaregiao = true;
  250 + //guarda os dados da regiao que agrega a regiao original da medida variavel
  251 + $dadosgeo = $this->listaTipoRegiao($codigo_tipo_regiao);
  252 + }
  253 + else{
  254 + $dadosgeo = $this->listaTipoRegiao($dados["codigo_tipo_regiao"]);
  255 + }
  256 + if($tipolayer != "point"){
  257 + $colunageo = $dadosgeo["colunageo"];
  258 + $titulo .= " (pol) ";
  259 + }
  260 + else{
  261 + $colunageo = $dadosgeo["colunacentroide"];
  262 + $titulo .= " (pt) ";
  263 + }
  264 + $titulo .= $dadosgeo["nome_tipo_regiao"];
  265 +
  266 + $vis = $dadosgeo["colunasvisiveis"];
  267 + if(!empty($vis) && $suportaWMST == false){
  268 + $vis = $vis.",".$dadosgeo["identificador"];
  269 + $vis = str_replace(" ",",",$vis);
  270 + $vis = str_replace(",,",",",$vis);
  271 + $vis = str_replace(";",",",$vis);
  272 +
  273 + $colunasSemGeo = explode(",",$vis);
  274 + $colunasSemGeo = array_unique($colunasSemGeo);
  275 +
  276 + if($dadosgeo["apelidos"] != ""){
  277 + $alias = "Valor,".$dadosgeo["apelidos"].",".$dadosgeo["identificador"];
  278 + $alias = mb_convert_encoding($alias,"ISO-8859-1",mb_detect_encoding($alias));
  279 + $alias = str_replace(";",",",$alias);
  280 + $alias = str_replace(",,",",",$alias);
  281 + $alias = explode(",",$alias);
  282 + $alias = array_unique($alias);
  283 + }
  284 + else{
  285 + $alias = $colunasSemGeo;
  286 + }
  287 + if(count($alias)-1 != count($colunasSemGeo)){
  288 + $alias = array();
  289 + }
  290 + }
  291 + else{
  292 + //colunas da tabela geometria sem as colunas GEOMETRY
  293 + $colunasSemGeo = $this->colunasTabela($dadosgeo["codigo_estat_conexao"], $dadosgeo["esquemadb"], $dadosgeo["tabela"],"geometry","!=");
  294 + $alias = array();
  295 + if($suportaWMST == true){
  296 + $sqlWMST = $this->listaParametroTempo2CampoData($id_medida_variavel);
  297 + $colunasSemGeo[] = "dimtempo";
  298 + }
  299 + }
  300 + //verifica o tipo de calculo para agragacao de valores
  301 + $tipoconta = "";
  302 + if($dados["permitesoma"] == 1 && $direto == false){
  303 + $tipoconta = "sum";
  304 + if($agregaregiao == true){
  305 + $titulo .= " - soma";
  306 + }
  307 + }
  308 + elseif($dados["permitemedia"] == 1 && $direto == false){
  309 + $tipoconta = "avg";
  310 + if($agregaregiao == true){
  311 + $titulo .= " - media";
  312 + }
  313 + }
  314 +
  315 + //obtem o SQL que faz o acesso aos dados da media da variavel
  316 + if($dados["colunavalor"] == ""){
  317 + $nomevalorcalculado = "'1'::numeric";
  318 + }
  319 + else{
  320 + $nomevalorcalculado = $dados["colunavalor"];
  321 + }
  322 +
  323 + $sqlDadosMedidaVariavel = "SELECT ".$dados["colunaidgeo"]." AS cod_regiao,$tipoconta(".$nomevalorcalculado.") AS valorcalculado FROM ".$dados["esquemadb"].".".$dados["tabela"];
  324 + if($suportaWMST == true && $direto == false){
  325 + $sqlDadosMedidaVariavel = "SELECT $sqlWMST as dimtempo,".$dados["colunaidgeo"]." AS cod_regiao,".$nomevalorcalculado." AS valorcalculado FROM ".$dados["esquemadb"].".".$dados["tabela"];
  326 + }
  327 + if(!empty ($filtro) && $direto == false){
  328 + $sqlDadosMedidaVariavel .= " WHERE ".$filtro . " AND ".$nomevalorcalculado." IS NOT NULL ";
  329 + }
  330 + else{
  331 + $sqlDadosMedidaVariavel .= " WHERE ".$nomevalorcalculado." IS NOT NULL ";
  332 + }
  333 + if($suportaWMST != true && $direto == false){
  334 + $sqlDadosMedidaVariavel .= " /*FA*//*FA*/ /*FAT*//*FAT*/ GROUP BY cod_regiao ";
  335 + }
  336 + $sqlagrupamento = "";
  337 + //sql que retorna a lista de ocorrencias agrupados de uma coluna especifica
  338 + if(!empty($agruparpor) && $direto == false){
  339 + $sqlagrupamento = " SELECT $agruparpor FROM ".$dados["esquemadb"].".".$dados["tabela"];
  340 + if(!empty ($filtro)){
  341 + $sqlagrupamento .= " WHERE ".$filtro;
  342 + }
  343 + $sqlagrupamento .= " /*FA*//*FA*/ /*FAT*//*FAT*/ GROUP BY ".$agruparpor." ORDER BY ".$agruparpor;
  344 + }
  345 + if($dados["colunavalor"] == ""){
  346 + $nomeColunaValor = "contagem";
  347 + }
  348 + else{
  349 + $nomeColunaValor = $dados["colunavalor"];
  350 + }
  351 + $sqlIntermediario = "SELECT (j.valorcalculado) AS ".$nomeColunaValor.", __COLUNASSEMGEO__".
  352 + " FROM ".$dadosgeo["esquemadb"].".".$dadosgeo["tabela"]." AS regiao ".
  353 + " INNER JOIN ( __SQLDADOS__ ) ".
  354 + " AS j ON j.cod_regiao::text = regiao.".$dadosgeo["identificador"]."::text";
  355 + //inclui os sqls de regioes de niveis inferiores
  356 + if($agregaregiao == true && $direto == false){
  357 + $hierarquia = $this->regiaoFilhaAoPai($dados["codigo_tipo_regiao"],$codigo_tipo_regiao);
  358 + $caminho = $hierarquia["caminho"];
  359 + $dadosColunas = $hierarquia["colunas"];
  360 + //var_dump($hierarquia);exit;
  361 + if(count($caminho) > 0){
  362 + $caminho = array_reverse($caminho);
  363 + foreach($caminho as $idregiao){
  364 + if($idregiao != $codigo_tipo_regiao){//a regiao pai ja esta no sql
  365 + $tempDadosRegiao = $this->listaTipoRegiao($idregiao);
  366 + //para contador forcado
  367 + if($dados["colunavalor"] == ""){
  368 + $nomevalorcalculado = "'1'::numeric";
  369 + }
  370 + else{
  371 + $nomevalorcalculado = "j.valorcalculado";
  372 + }
  373 + $temp = "SELECT regiao.".$dadosColunas[$idregiao]["colunaligacao_regiaopai"]." AS cod_regiao,sum(".$nomevalorcalculado.") AS valorcalculado ".
  374 + "FROM ".$tempDadosRegiao["esquemadb"].".".$tempDadosRegiao["tabela"]." AS regiao ".
  375 + "INNER JOIN ".
  376 + "( __SQLDADOS__ )".
  377 + " AS j ON j.cod_regiao::text = regiao.".$tempDadosRegiao["identificador"]."::text GROUP BY regiao.".$dadosColunas[$idregiao]["colunaligacao_regiaopai"];
  378 + $sqlIntermediario = str_replace("__SQLDADOS__",$temp,$sqlIntermediario);
  379 + }
  380 + }
  381 + }
  382 + }
  383 + //sql final que retorna os dados
  384 + //contem todas as colunas da tabela regiao, menos as que contem geometria
  385 + $sql = str_replace("__SQLDADOS__",$sqlDadosMedidaVariavel,$sqlIntermediario);
  386 + $sql = str_replace("__COLUNASSEMGEO__",implode(",",$colunasSemGeo),$sql);
  387 +
  388 + //sql para o mapserver
  389 + $sqlgeo = str_replace("__SQLDADOS__",$sqlDadosMedidaVariavel,$sqlIntermediario);
  390 + $colunasComGeo = $colunasSemGeo;
  391 + //$colunasComGeo[] = "/*SG*/st_setsrid(".$colunageo.",".$dadosgeo["srid"].") as ".$colunageo." /*SG*/";
  392 + $colunasComGeo[] = "/*SG*/".$colunageo." as ".$colunageo." /*SG*/";
  393 + $sqlgeo = str_replace("__COLUNASSEMGEO__",implode(",",$colunasComGeo),$sqlgeo);
  394 + $sqlgeo = $colunageo." from /*SE*/(".$sqlgeo." /*FR*//*FR*/ )/*SE*/ as foo using unique ".$dadosgeo["identificador"]." using srid=".$dadosgeo["srid"];
  395 +
  396 + //o SQL com os dados contem um filtro ou nao?
  397 + $contemfiltro = false;
  398 + if(!empty($filtro) && $direto == false){
  399 + $contemfiltro = true;
  400 + $titulo .= " ".$filtro;
  401 + }
  402 + //adiciona a coluna com os valores no inicio do array()
  403 + $colunasSemGeo = array_merge(array($dados["colunavalor"]),$colunasSemGeo);
  404 + $buscar = array("drop","update","insert","create","alter","delete");
  405 + $sql = str_ireplace($buscar,"",$sql);
  406 + $sqlagrupamento = str_ireplace($buscar,"",$sqlagrupamento);
  407 + $sqlgeo = str_ireplace($buscar,"",$sqlgeo);
  408 + return array(
  409 + "nomeregiao"=>$dadosgeo["colunanomeregiao"],
  410 + "titulo"=>$titulo,
  411 + "colunavalor"=>$dados["colunavalor"],
  412 + "sqlagrupamento"=>$sqlagrupamento,
  413 + "sql"=>$sql,
  414 + "sqlmapserver"=>$sqlgeo,
  415 + "filtro"=>$contemfiltro,
  416 + "colunas"=>$colunasSemGeo,
  417 + "alias"=>$alias,
  418 + "srid"=>$dadosgeo["srid"]
  419 + );
  420 + }
  421 + /**
  422 + * Retorna os ids das regioes que permitem partir de uma regiao filha chegar a uma regiao pai
  423 + * Usado para descobrir que regioes devem ser sequencialmente agregadas
  424 + * @param partir da regiao
  425 + * @param chegar na regiao
  426 + * @return array lista de ids de regioes sequenciais do filho ate chegar ao pai indicado
  427 + */
  428 + function regiaoFilhaAoPai($codigo_tipo_regiao,$codigo_tipo_regiao_pai=""){
  429 + $pais = $this->listaAgregaRegiao($codigo_tipo_regiao);
  430 + $caminho = array($codigo_tipo_regiao);
  431 + $colunas = array();
  432 + if(count($pais) == 0){
  433 + return $caminho;
  434 + }
  435 + foreach($pais as $pai){
  436 + $caminho[] = $pai["codigo_tipo_regiao_pai"];
  437 + $colunas[$pai["codigo_tipo_regiao"]] = $pai;
  438 + if($pai["codigo_tipo_regiao_pai"] == $codigo_tipo_regiao_pai){
  439 + return array("caminho"=>$caminho,"colunas"=>$colunas);
  440 + }
  441 + }
  442 + return array("caminho"=>$caminho,"colunas"=>$colunas);
  443 + }
  444 + function hierarquiaPath($node){
  445 + $query="select codigo_tipo_regiao_pai as parent from ".$this->esquemaadmin."i3geoestat_agregaregiao WHERE codigo_tipo_regiao = $node";
  446 + $result=$this->execSQL($query,"",false);
  447 + $row = $result[0];
  448 + // save the path in this array
  449 + $path = array();
  450 + // only continue if this $node isn't the root node
  451 + // (that's the node with no parent)
  452 + if ($row['parent']!='') {
  453 + // the last part of the path to $node, is the name
  454 + // of the parent of $node
  455 + $path[] = $row['parent'];
  456 + // we should add the path to the parent of this node
  457 + // to the path
  458 + $path = array_merge($this->hierarquiaPath($row['parent']), $path);
  459 + }
  460 + // return the path
  461 + sort($path);
  462 + return $path;
  463 + }
  464 + /**
  465 + * Cria um arquivo mapfile para uma medida de variavel
  466 + * Inclui no arquivo o layer de acesso aos dados
  467 + * O mapfile contem apenas o layer
  468 + * O arquivo e armazenado em uma pasta temporaria
  469 + * O sql e obtido com o metodo sqlMedidaVariavel
  470 + * @param id da medida da variavel
  471 + * @param filtro que sera concatenado ao sql padrao da medida
  472 + * @param 0|1 indica se todas as colunas da tabela original dos dados sera incluida no sql
  473 + * @param tipo de layer
  474 + * @param titulo do layer
  475 + * @param id da classificacao cadastrada,se for vazio usa o primeiro
  476 + * @param coluna que sera usada como agrupamento no sql
  477 + * @param codigo do tipo de regiao cadastrada
  478 + * @param valor de opacidade do layer
  479 + * @param o layer deve suportar WMS-T ou nao
  480 + * @param faz o cache do mapfile
  481 + * @return array("mapfile"=>,"layer"=>,"titulolayer"=>)
  482 + */
  483 + function mapfileMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$tipolayer="polygon",$titulolayer="",$id_classificacao="",$agruparpor="",$codigo_tipo_regiao="",$opacidade="",$suportaWMST=false,$cachemapfile=true){
  484 + //para permitir a inclusao de filtros, o fim do sql e marcado com /*FW*//*FW*/
  485 + //indicando onde deve comecar e terminar uma possivel clausula where
  486 + //ou com /*FA*//*FA*/
  487 + //para marcar que deve ser utilizado AND ao adicionar o filtro
  488 + //utiliza-se da mesma forma /*FAT*//*FAT*/ e /*FWT*//*FWT*/ para os filtros de tempo
  489 + //Layers adicionados aqui sao marcados com o metadata METAESTAT "SIM"
  490 + //O codigo_tipo_regiao e marcado com o metadata METAESTAT_CODIGO_TIPO_REGIAO
  491 + //O id da medida da variavel e marcado com o metadata METAESTAT_ID_MEDIDA_VARIAVEL
  492 + //outros metadados tambem sao utilizados, veja em admin/php/editormapfile.php
  493 + $arq = $this->dir_tmp."/".$this->nomecache.".map";
  494 + if(!file_exists($arq)){
  495 + $meta = $this->listaMedidaVariavel("",$id_medida_variavel);
  496 + //evita agregar regioes qd nao e necessario
  497 + if($meta["codigo_tipo_regiao"] == $codigo_tipo_regiao || empty($codigo_tipo_regiao) ){
  498 + $agruparpor = "";
  499 + }
  500 + $dconexao = $this->listaConexao($meta["codigo_estat_conexao"],true);
  501 + $conexao = "user=".$dconexao["usuario"]." password=".$dconexao["senha"]." dbname=".$dconexao["bancodedados"]." host=".$dconexao["host"]." port=".$dconexao["porta"]."";
  502 + $sql = $this->sqlMedidaVariavel(
  503 + $id_medida_variavel,
  504 + $todasascolunas,
  505 + $agruparpor,
  506 + $tipolayer,
  507 + $codigo_tipo_regiao,
  508 + $suportaWMST,
  509 + $filtro
  510 + );
  511 + if(empty($codigo_tipo_regiao)){
  512 + $d = $this->listaMedidaVariavel("",$id_medida_variavel);
  513 + $codigo_tipo_regiao = $d["codigo_tipo_regiao"];
  514 + }
  515 + //define o tipo correto de layer
  516 + $dg = $this->listaDadosGeometriaRegiao($codigo_tipo_regiao);
  517 + if(empty($tipolayer)){
  518 + $tipolayer = "polygon";
  519 + }
  520 + if($dg["dimension"] == 0){
  521 + $tipolayer = "point";
  522 + }
  523 + if($dg["dimension"] == 1){
  524 + $tipolayer = "line";
  525 + }
  526 + $sqlf = $sql["sqlmapserver"];
  527 +
  528 + $classes = "";
  529 + if(!empty($id_classificacao)){
  530 + $classes = $this->listaClasseClassificacao($id_classificacao);
  531 + }
  532 + else{
  533 + $classificacoes = $this->listaClassificacaoMedida($id_medida_variavel);
  534 + $classes = $this->listaClasseClassificacao($classificacoes[0]["id_classificacao"]);
  535 + }
  536 + if(!empty($titulolayer)){
  537 + $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer));
  538 + }
  539 + else{
  540 + $titulolayer = mb_convert_encoding($sql["titulo"],"ISO-8859-1",mb_detect_encoding($sql["titulo"]));
  541 + }
  542 + //necessario para evitar problemas com ITENSDESC
  543 + $titulolayer = str_replace(","," ",$titulolayer);
  544 + $titulolayer = str_replace("=",": ",$titulolayer);
  545 + //pega os parametros caso seja um mapfile para WMS-time
  546 + if($suportaWMST == true){
  547 + $sqlMinMax = "select min(dimtempo) as min,max(dimtempo) as max from(".$sql["sql"].") as x";
  548 + $minmaxdata = $this->execSQLDB($meta["codigo_estat_conexao"],$sqlMinMax );
  549 + $fontemeta = $this->listaFonteinfoMedida($id_medida_variavel);
  550 + if(count($fontemeta) > 0){
  551 + $fontemeta = $fontemeta[0]["link"];
  552 + }
  553 + else{
  554 + $fontemeta = "";
  555 + }
  556 + }
  557 + $dados[] = "MAP";
  558 + $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"';
  559 + $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"';
  560 + //inclui os simbolos que podem ser definidos como imagens
  561 + foreach($classes as $classe){
  562 + if(file_exists($classe["simbolo"])){
  563 + $dados[] = "SYMBOL";
  564 + $dados[] = ' NAME "'.$classe["simbolo"].'"';
  565 + $dados[] = ' TYPE pixmap';
  566 + $dados[] = ' IMAGE "'.$classe["simbolo"].'"';
  567 + $dados[] = "END";
  568 + }
  569 + }
  570 + $dados[] = "LAYER";
  571 + $dados[] = ' NAME "'.$this->nomecache.'"';
  572 + $dados[] = " TYPE $tipolayer";
  573 + $dados[] = ' DATA "'.$sqlf.'"';
  574 + $dados[] = ' CONNECTION "'.$conexao.'"';
  575 + $dados[] = ' CONNECTIONTYPE POSTGIS';
  576 + $dados[] = ' STATUS OFF';
  577 + $dados[] = ' TEMPLATE "none.htm"';
  578 + if($opacidade != ""){
  579 + $dados[] = ' OPACITY '.$opacidade;
  580 + }
  581 + $dados[] = ' METADATA';
  582 + $dados[] = ' TEMA "'.$titulolayer.'"';
  583 + $dados[] = ' tme "{\"titulo\":\"'.$titulolayer.'\",\"colnome\":\"'.$sql["nomeregiao"].'\",\"colsdata\":[\"'.$sql["colunavalor"].'\"],\"lmax\":\"8000\",\"amax\":\"500000\",\"outlinecolor\":\"-1,-1,-1\",\"numvertices\":\"4\",\"auto\":\"nao\",\"exec\":\"nao\"}"';
  584 +
  585 + $dados[] = ' TIP "'.$sql["colunavalor"].','.$sql["nomeregiao"].'"';
  586 + $dados[] = ' CLASSE "SIM"';
  587 + $dados[] = ' permitedownload "SIM"';
  588 + $dados[] = ' METAESTAT "SIM"';
  589 + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
  590 + $dados[] = ' METAESTAT_ID_MEDIDA_VARIAVEL "'.$id_medida_variavel.'"';
  591 + //marca se a tabela e editavel, verificando se esta no esquema padrao
  592 + if($meta["esquemadb"] == "i3geo_metaestat"){
  593 + $dados[] = ' EDITAVEL "SIM"';
  594 + $dados[] = ' COLUNAIDUNICO "'.$meta["colunaidunico"].'"';
  595 + $dados[] = ' TABELAEDITAVEL "'.$meta["tabela"].'"';
  596 + $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"';
  597 + }
  598 + if(count($sql["alias"]) > 0){
  599 + $dados[] = ' ITENS "'.implode(",",$sql["colunas"]).'"';
  600 + $dados[] = ' ITENSDESC "'.implode(",",$sql["alias"]).'"';
  601 + }
  602 + if($suportaWMST == true){
  603 + $dados[] = ' "wms_timeitem" "dimtempo"';
  604 + $dados[] = ' "wms_timeextent" "'.$minmaxdata[0]["min"]."/".$minmaxdata[0]["max"].'"';
  605 + $dados[] = ' "wms_timedefault" "'.$minmaxdata[0]["max"].'"';
  606 + $dados[] = ' "ows_metadataurl_href" "'.$fontemeta.'"';
  607 + $dados[] = ' "ows_metadataurl_type" "TC211" ';
  608 + $dados[] = ' "ows_metadataurl_format" "text/html" ';
  609 + }
  610 + $dados[] = ' END';
  611 + if($classes == ""){
  612 + $dados[] = ' CLASS';
  613 + $dados[] = ' NAME ""';
  614 + $dados[] = ' STYLE';
  615 + $dados[] = ' COLOR 200 0 0';
  616 + if(strtolower($tipolayer) == "point"){
  617 + $dados[] = ' SYMBOL "ponto"';
  618 + $dados[] = ' SIZE 5';
  619 + }
  620 + $dados[] = ' END';
  621 + $dados[] = ' END';
  622 + }
  623 + else{
  624 + foreach($classes as $classe){
  625 + //var_dump($classe);exit;
  626 + $dados[] = ' CLASS';
  627 + $dados[] = ' NAME "'.mb_convert_encoding($classe["titulo"],"ISO-8859-1",mb_detect_encoding($classe["titulo"])).'"';
  628 + if($classe["expressao"] != ""){
  629 + $expressao = str_replace('"',"'",$classe["expressao"]);
  630 + $dados[] = " EXPRESSION ".$expressao;
  631 + }
  632 + $dados[] = ' STYLE';
  633 + $dados[] = ' COLOR '.$classe["vermelho"].' '.$classe["verde"].' '.$classe["azul"];
  634 + if(!empty($classe["tamanho"])){
  635 + $dados[] = ' SIZE '.$classe["tamanho"];
  636 + }
  637 + elseif(strtolower($tipolayer) == "point"){
  638 + $dados[] = ' SIZE 5';
  639 + }
  640 + if(!empty($classe["simbolo"])){
  641 + $dados[] = ' SYMBOL '.$classe["simbolo"];
  642 + }
  643 + elseif(strtolower($tipolayer) == "point"){
  644 + $dados[] = ' SYMBOL ponto';
  645 + }
  646 + if(!empty($classe["otamanho"])){
  647 + $dados[] = ' OUTLINEWIDTH '.$classe["otamanho"];
  648 + }
  649 + if(!empty($classe["overmelho"]) || $classe["overmelho"] == "0"){
  650 + $dados[] = ' OUTLINECOLOR '.$classe["overmelho"].' '.$classe["overde"].' '.$classe["oazul"];
  651 + }
  652 + $dados[] = ' END';
  653 + $dados[] = ' END';
  654 + }
  655 + }
  656 + $dados[] = "END";
  657 + $dados[] = "END";
  658 + $fp = fopen($arq,"w");
  659 + foreach ($dados as $dado){
  660 + fwrite($fp,$dado."\n");
  661 + }
  662 + }
  663 + return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer);
  664 + }
  665 + /**
  666 + * Cria um mapfile para visualizacao de regioes
  667 + * Inclui no arquivo o layer de acesso aos dados
  668 + * O mapfile contem apenas o layer
  669 + * O arquivo e armazenado em uma pasta temporaria
  670 + * Se o arquivo para a mesma regiao ja existir, tenta usa-lo ao inves de criar um novo
  671 + * @param codigo da regiao
  672 + * @param cor do outline do simbolo de desenho
  673 + * @param largura do simbolo
  674 + * @param sim|nao inclui ou nao os labels
  675 + * @param boolean remove o arquivo em cache e cria um novo
  676 + * @return array("mapfile"=>,"layer"=>,"titulolayer"=>,"codigo_tipo_regiao"=>)
  677 + */
  678 + function mapfileTipoRegiao($codigo_tipo_regiao,$outlinecolor="255,0,0",$width=1,$nomes="nao",$forcaArquivo=false){
  679 + //para permitir a inclusao de filtros, o fim do sql e marcado com /*FW*//*FW*/
  680 + //indicando onde deve comecar e terminar uma possivel clausula where
  681 + //Layers adicionados aqui sao marcados com o metadata METAESTAT "SIM"
  682 + //O codigo_tipo_regiao e marcado com o metadata METAESTAT_CODIGO_TIPO_REGIAO
  683 + if($forcaArquivo == false){
  684 + $arq = $this->dir_tmp."/".$this->nomecache.".map";
  685 + }
  686 + else{
  687 + $arq = $this->dir_tmp."/".$this->nomecache.nomeRandomico(3).".map";
  688 + }
  689 + if(!file_exists($arq)){
  690 + $tipolayer = "polygon";
  691 + //define o tipo correto de layer
  692 + $dg = $this->listaDadosGeometriaRegiao($codigo_tipo_regiao);
  693 + if(empty($tipolayer)){
  694 + $tipolayer = "polygon";
  695 + }
  696 + if($dg["dimension"] == 0){
  697 + $tipolayer = "point";
  698 + }
  699 + if($dg["dimension"] == 1){
  700 + $tipolayer = "line";
  701 + }
  702 + $meta = $this->listaTipoRegiao($codigo_tipo_regiao);
  703 + $titulolayer = $meta["nome_tipo_regiao"];
  704 + $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer));
  705 + $conexao = $this->listaConexao($meta["codigo_estat_conexao"],true);
  706 + $conexao = "user=".$conexao["usuario"]." password=".$conexao["senha"]." dbname=".$conexao["bancodedados"]." host=".$conexao["host"]." port=".$conexao["porta"]."";
  707 + $colunageo = $meta["colunageo"];
  708 + $srid = $meta["srid"];
  709 + //pega as colunas menos as do tipo geometry
  710 + $colunastabela = $this->colunasTabela($meta["codigo_estat_conexao"],$meta["esquemadb"],$meta["tabela"],"geometry","!=");
  711 + //define as colunas que serao mostradas no sql
  712 + $vis = $meta["colunasvisiveis"];
  713 + $colunaSerial = $this->listaTipoRegiaoSerial($codigo_tipo_regiao);
  714 + if($vis != ""){
  715 + $vis = str_replace(";",",",$vis);
  716 + $vis = str_replace(",,",",",$vis);
  717 + $vis = explode(",",$vis);
  718 + $itens = $vis;//array
  719 + $vis[] = $meta["identificador"];
  720 + if(!empty($colunaSerial)){
  721 + $vis[] = $colunaSerial;
  722 + }
  723 + $vis = array_unique($vis);
  724 + $visiveis = array();
  725 + //verifica se as colunas existem mesmo
  726 + foreach($vis as $v){
  727 + if(in_array($v,$colunastabela)){
  728 + $visiveis[] = $v;
  729 + }
  730 + }
  731 + $vis = implode(",",$visiveis);
  732 + //apelidos
  733 + $apelidos = $meta["apelidos"];
  734 + if($apelidos == ""){
  735 + $apelidos = "Nome";
  736 + }
  737 + $apelidos = str_replace(";",",",$apelidos);
  738 + $apelidos = str_replace(",,",",",$apelidos);
  739 + $apelidos = mb_convert_encoding($apelidos,"ISO-8859-1",mb_detect_encoding($apelidos));
  740 + $apelidos = explode(",",$apelidos);
  741 + if(!empty($colunaSerial)){
  742 + $apelidos[] = $colunaSerial." (serial)";
  743 + }
  744 + $apelidos = array_unique($apelidos);
  745 + }
  746 + else{
  747 + $itens = array();
  748 + $apelidos = array();
  749 + if(!empty($colunaSerial)){
  750 + $colunastabela[] = $colunaSerial;
  751 + $colunastabela = array_unique($colunastabela);
  752 + }
  753 + $vis = implode(",",$colunastabela);
  754 + }
  755 + $sqlf = $colunageo." from (select st_setsrid(".$colunageo.",".$srid.") as $colunageo,$vis from ".$meta["esquemadb"].".".$meta["tabela"]." /*FW*//*FW*/) as foo using unique ".$meta["identificador"]." using srid=".$srid;
  756 + $sqlf = str_replace(",,",",",$sqlf);
  757 + $outlinecolor = str_replace(","," ",$outlinecolor);
  758 + $dados[] = "MAP";
  759 + $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"';
  760 + $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"';
  761 + $dados[] = "LAYER";
  762 + $dados[] = ' NAME "'.$this->nomecache.'"';
  763 + $dados[] = " TYPE $tipolayer";
  764 + $dados[] = ' DATA "'.$sqlf.'"';
  765 + $dados[] = ' CONNECTION "'.$conexao.'"';
  766 + $dados[] = ' CONNECTIONTYPE POSTGIS';
  767 + $dados[] = ' TEMPLATE "none.htm"';
  768 + $dados[] = ' STATUS OFF';
  769 + $dados[] = ' METADATA';
  770 + $dados[] = ' TEMA "'.$titulolayer.'"';
  771 + $dados[] = ' CLASSE "SIM"';
  772 + $dados[] = ' METAESTAT "SIM"';
  773 + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
  774 + if(!empty($colunaSerial)){
  775 + $dados[] = ' EDITAVEL "SIM"';
  776 + $dados[] = ' COLUNAIDUNICO "'.$colunaSerial.'"';
  777 + $dados[] = ' TABELAEDITAVEL "'.$meta["tabela"].'"';
  778 + $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"';
  779 + $dados[] = ' COLUNAGEOMETRIA "'.$colunageo.'"';
  780 + }
  781 + $dados[] = ' TIP "'.$meta["colunanomeregiao"].'"';
  782 + if(count($itens) == count($apelidos)){
  783 + $dados[] = ' ITENS "'.implode(",",$itens).'"';
  784 + $dados[] = ' ITENSDESC "'.implode(",",$apelidos).'"';
  785 + }
  786 +
  787 + $dados[] = ' END';
  788 + $dados[] = ' CLASS';
  789 + $dados[] = ' NAME ""';
  790 + $dados[] = ' STYLE';
  791 + $dados[] = ' OUTLINECOLOR '.$outlinecolor;
  792 +
  793 + $dados[] = ' WIDTH '.$width;
  794 + if(strtolower($tipolayer) == "point"){
  795 + $dados[] = ' SYMBOL "ponto"';
  796 + $dados[] = ' SIZE 5';
  797 + $dados[] = ' COLOR 0 0 0 ';
  798 + }
  799 + else{
  800 + $dados[] = ' COLOR -1 -1 -1';
  801 + }
  802 + $dados[] = ' END';
  803 + //$dados[] = ' STYLE';
  804 + //$dados[] = ' OUTLINECOLOR -1 -1 -1';
  805 + //$dados[] = ' COLOR 255 255 255';
  806 + //$dados[] = ' OPACITY 20';
  807 + //$dados[] = ' END';
  808 + $dados[] = ' END';
  809 + $dados[] = "END";
  810 + //toponimia
  811 + if($nomes == "sim"){
  812 + $dados[] = "LAYER";
  813 + $dados[] = ' NAME "'.$this->nomecache.'_anno"';
  814 + $dados[] = " TYPE ANNOTATION";
  815 + $dados[] = ' DATA "'.$sqlf.'"';
  816 + $dados[] = ' CONNECTION "'.$conexao.'"';
  817 + $dados[] = ' CONNECTIONTYPE POSTGIS';
  818 + $dados[] = ' TEMPLATE "none.htm"';
  819 + $dados[] = ' STATUS OFF';
  820 + $dados[] = ' LABELITEM "'.$meta["colunanomeregiao"].'"';
  821 + $dados[] = ' METADATA';
  822 + $dados[] = ' TEMA "'.$titulolayer.' (nomes)"';
  823 + $dados[] = ' CLASSE "SIM"';
  824 + $dados[] = ' METAESTAT "SIM"';
  825 + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
  826 + $dados[] = ' END';
  827 + $dados[] = ' CLASS';
  828 + $dados[] = ' NAME ""';
  829 + $dados[] = ' LABEL';
  830 + $dados[] = ' FONT "arial"';
  831 + $dados[] = ' SIZE 10';
  832 + $dados[] = ' COLOR 0 0 0';
  833 + $dados[] = ' MINDISTANCE 0';
  834 + $dados[] = ' MINFEATURESIZE 0';
  835 + $dados[] = ' OFFSET 0 0';
  836 + $dados[] = ' OUTLINECOLOR 255 255 255';
  837 + $dados[] = ' PARTIALS FALSE';
  838 + $dados[] = ' POSITION AUTO';
  839 + $dados[] = ' SHADOWSIZE 1 1';
  840 + $dados[] = ' TYPE TRUETYPE';
  841 + $dados[] = ' END';
  842 + $dados[] = ' END';
  843 + $dados[] = "END";
  844 + }
  845 + $dados[] = "END";
  846 + $fp = fopen($arq,"w");
  847 + foreach ($dados as $dado){
  848 + fwrite($fp,$dado."\n");
  849 + }
  850 + }
  851 + return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer,"codigo_tipo_regiao"=>$codigo_tipo_regiao);
  852 + }
  853 + /**
  854 + * Complementa um mapfile resumido inserindo seus layers em um mapfile completo, contendo todos os elementos necessarios para uso
  855 + * Usado na geracao de WMS e outros servicos
  856 + * @param mapfile resumido
  857 + * @return nome do arquivo com o mapfile completo
  858 + */
  859 + function mapfileCompleto($mapfile){
  860 + $f = $this->base;
  861 + if($f == ""){
  862 + include_once($this->locaplic."/classesphp/funcoes_gerais.php");
  863 + $versao = versao();
  864 + $versao = $versao["principal"];
  865 + $f = "";
  866 + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')){
  867 + $f = $this->locaplic."/aplicmap/geral1windowsv".$versao.".map";
  868 + }
  869 + else{
  870 + if($f == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv'.$versao.'.map')){
  871 + $f = "/var/www/i3geo/aplicmap/geral1debianv".$versao.".map";
  872 + }
  873 + if($f == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
  874 + $f = "/var/www/html/i3geo/aplicmap/geral1fedorav".$versao.".map";
  875 + }
  876 + if($f == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
  877 + $f = "/opt/www/html/i3geo/aplicmap/geral1v".$versao.".map";
  878 + }
  879 + if($f == "") {
  880 + $f = $this->locaplic."/aplicmap/geral1v".$versao.".map";
  881 + }
  882 + }
  883 + }
  884 + $mapa = ms_newMapObj($f);
  885 + $n = $mapa->numlayers;
  886 + for($i=0;$i<$n;$i++){
  887 + $l = $mapa->getlayer($i);
  888 + $l->set("status",MS_DELETE);
  889 + }
  890 + $mapatemp = ms_newMapObj($mapfile);
  891 + $l = $mapatemp->getlayer(0);
  892 +
  893 + $l->set("status",MS_DEFAULT);
  894 + $novonome = str_replace(".map","completo.map",$mapfile);
  895 + //necessario para o kml
  896 + $mapa->setmetadata("ows_enable_request","*");
  897 + $listaepsg = "EPSG:4618 EPSG:4291 EPSG:4326 EPSG:22521 EPSG:22522 EPSG:22523 EPSG:22524 EPSG:22525 EPSG:29101 EPSG:29119 EPSG:29120 EPSG:29121 EPSG:29122 EPSG:29177 EPSG:29178 EPSG:29179 EPSG:29180 EPSG:29181 EPSG:29182 EPSG:29183 EPSG:29184 EPSG:29185";
  898 + $l->setmetadata("ows_srs",$listaepsg);
  899 + $temp = ms_newLayerObj($mapa,$l);
  900 + $mapa->save($novonome);
  901 + return $novonome;
  902 + }
  903 + /**
  904 + * Obtem os dados de uma medida de variavel
  905 + * @param id da medida
  906 + * @param filtro que sera concatenado ao sql
  907 + * @param 0|1 mostra ou nao todas as colunas da tabela com os dados
  908 + * @param coluna de agrupamento
  909 + * @param limite do numero de registros
  910 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  911 + * @return execSQL
  912 + */
  913 + function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){
  914 + set_time_limit(0);
  915 + $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto);
  916 + $sqlf = $sql["sqlmapserver"];
  917 + //remove marcadores geo
  918 + $sqlf = explode("/*SE*/",$sqlf);
  919 + $sqlf = explode("/*SG*/",$sqlf[1]);
  920 + $sqlf = $sqlf[0]." ".$sqlf[2];
  921 + if($limite != ""){
  922 + $sqlf .= " limit ".$limite;
  923 + }
  924 + $sqlf = str_replace(", FROM"," FROM",$sqlf);
  925 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  926 + //echo $sqlf;exit;
  927 + if(!empty($metaVariavel["codigo_estat_conexao"])){
  928 + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
  929 + $dbhold = $this->dbh;
  930 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  931 + $this->dbh = $dbh;
  932 + $res = $this->execSQL($sqlf);
  933 + $this->dbh = $dbhold;
  934 + return $res;
  935 + }
  936 + return false;
  937 + }
  938 + /**
  939 + * Lista as ocorrencias de valores em uma coluna de uma medida de variavel
  940 + * @param id da medida de variavel
  941 + * @param coluna
  942 + * @return execSQL
  943 + */
  944 + function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){
  945 + $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna);
  946 + $sqlf = $sqlf["sqlagrupamento"];
  947 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  948 + if(!empty($metaVariavel["codigo_estat_conexao"])){
  949 + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
  950 + $dbhold = $this->dbh;
  951 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  952 + $this->dbh = $dbh;
  953 + $res = $this->execSQL($sqlf);
  954 + $this->dbh = $dbhold;
  955 + return $res;
  956 + }
  957 + return false;
  958 + }
  959 + /**
  960 + * Sumario estatistico de uma medida de variavel
  961 + * @param id da medida
  962 + * @param filtro a ser concatenado ao sql
  963 + * @param coluna de agrupamento
  964 + * @param limite numero maximo de registros que serao lidos do banco
  965 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  966 + * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>)
  967 + */
  968 + function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){
  969 + if(!empty($agruparpor)){
  970 + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto);
  971 + }
  972 + else{
  973 + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto);
  974 + }
  975 + if($dados){
  976 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  977 + $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]);
  978 + $agrupamento = "";
  979 + $colunavalor = $metaVariavel["colunavalor"];
  980 + foreach($dados as $d){
  981 + if($d[$colunavalor]){
  982 + $valores[] = $d[$colunavalor];
  983 + }
  984 + }
  985 + if(!empty($agruparpor)){
  986 + $agrupamento = array();
  987 + foreach($dados as $d){
  988 + $g = $d[$agruparpor];
  989 + //var_dump($d);exit;
  990 + if(!empty($agrupamento[$g])){
  991 + $agrupamento[$g] += $d[$colunavalor];
  992 + }
  993 + else{
  994 + $agrupamento[$g] = $d[$colunavalor];
  995 + }
  996 + }
  997 + natsort($agrupamento);
  998 + }
  999 + $soma = "";
  1000 + $media = "";
  1001 + $min = "";
  1002 + $max = "";
  1003 + $quantidade = count($valores);
  1004 + $sturges = 1 + (3.322 * (log10($quantidade)));
  1005 + $quartis = array();
  1006 + if($un["permitesoma"] == "1"){
  1007 + $soma = array_sum($valores);
  1008 + }
  1009 + if($un["permitemedia"] == "1"){
  1010 + $media = $soma / $quantidade;
  1011 + }
  1012 + if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){
  1013 + sort($valores);
  1014 + //var_dump($valores);exit;
  1015 + $min = $valores[0];
  1016 + $max = $valores[$quantidade - 1];
  1017 + include_once(dirname(__FILE__)."/../../classesphp/classe_estatistica.php");
  1018 + $calc = new estatistica();
  1019 + $calc->calcula($valores);
  1020 + $v = $calc->resultado;
  1021 + //expressao para o mapfile
  1022 + $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")";
  1023 + $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))";
  1024 + if($v["quartil3"] != 0){
  1025 + $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))";
  1026 + $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")";
  1027 + }
  1028 + $nomes[] = "<= ".($v["quartil1"]);
  1029 + $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]);
  1030 + if($v["quartil3"] != 0){
  1031 + $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]);
  1032 + $nomes[] = "> ".($v["quartil3"]);
  1033 + }
  1034 + $quartis = array(
  1035 + "cortes"=>array(
  1036 + "q1"=>$v['quartil1'],
  1037 + "q2"=>$v['quartil2'],
  1038 + "q3"=>$v['quartil3']
  1039 + ),
  1040 + "expressoes"=>$expressao,
  1041 + "nomes"=>$nomes
  1042 + );
  1043 + }
  1044 + $histograma = array_count_values($valores);
  1045 + //echo "<pre>".var_dump($quartis);exit;
  1046 + return array(
  1047 + "colunavalor"=>$colunavalor,
  1048 + "soma"=>$soma,
  1049 + "media"=>$media,
  1050 + "menor"=>$min,
  1051 + "maior"=>$max,
  1052 + "quantidade"=>$quantidade,
  1053 + "histograma"=>$histograma,
  1054 + "grupos"=>$agrupamento,
  1055 + "unidademedida"=>$un,
  1056 + "quartis"=>$quartis,
  1057 + "sturges"=>$sturges
  1058 + );
  1059 + }
  1060 + return false;
  1061 + }
  1062 +
  1063 +
  1064 + /**
  1065 + * Lista os dados de um ou de todos os mapas cadastrados
  1066 + * @param id do mapa
  1067 + */
  1068 + function listaMapas($id_mapa=""){
  1069 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_mapa ";
  1070 + if($id_mapa != ""){
  1071 + $sql .= "WHERE id_mapa = $id_mapa ";
  1072 + }
  1073 + $sql .= "ORDER BY titulo";
  1074 + return $this->execSQL($sql,$id_mapa);
  1075 + }
  1076 + /**
  1077 + * Lista os dados de um ou de todos os mapas grupos de um mapa
  1078 + * @param id do mapa
  1079 + * @param id do grupo
  1080 + */
  1081 + function listaGruposMapa($id_mapa,$id_mapa_grupo){
  1082 + if(!empty($id_mapa)){
  1083 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa = $id_mapa";
  1084 + }
  1085 + if(!empty($id_mapa_grupo)){
  1086 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa_grupo = $id_mapa_grupo";
  1087 + }
  1088 + $sql .= " ORDER BY titulo";
  1089 + return $this->execSQL($sql,$id_mapa_grupo);
  1090 + }
  1091 + /**
  1092 + * Lista os dados de um ou de todos os temas de um grupo de um mapa
  1093 + * @param id do mapa
  1094 + * @param id do grupo
  1095 + * @param id do tema
  1096 + */
  1097 + function listaTemasMapa($id_mapa_grupo,$id_mapa_tema){
  1098 + if(!empty($id_mapa_grupo)){
  1099 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_grupo = $id_mapa_grupo";
  1100 + }
  1101 + if(!empty($id_mapa_tema)){
  1102 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_tema = $id_mapa_tema";
  1103 + }
  1104 + $sql .= " ORDER BY titulo";
  1105 + return $this->execSQL($sql,$id_mapa_tema);
  1106 + }
  1107 + /**
  1108 + * Lista os dados de uma ou todas as unidades de medida cadastradas
  1109 + * @param codigo da unidade
  1110 + */
  1111 + function listaUnidadeMedida($codigo_unidade_medida=""){
  1112 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
  1113 + if($codigo_unidade_medida != ""){
  1114 + $sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
  1115 + }
  1116 + $sql .= "ORDER BY nome";
  1117 + return $this->execSQL($sql,$codigo_unidade_medida);
  1118 + }
  1119 + /**
  1120 + * Lista os dados de uma ou todas as fontes cadastradas
  1121 + * @param id da fonte
  1122 + */
  1123 + function listaFonteinfo($id_fonteinfo=""){
  1124 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
  1125 + if($id_fonteinfo != ""){
  1126 + $sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
  1127 + }
  1128 + $sql .= "ORDER BY titulo";
  1129 + return $this->execSQL($sql,$id_fonteinfo);
  1130 + }
  1131 + /**
  1132 + * Lista as fontes vinculadas a uma medida de variavel
  1133 + * @param id da medida de variavel
  1134 + */
  1135 + function listaFonteinfoMedida($id_medida_variavel){
  1136 + $sql = "SELECT i3geoestat_fonteinfo.* ";
  1137 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
  1138 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
  1139 + $sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
  1140 + $sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
  1141 + $sql .= "ORDER BY titulo";
  1142 + //echo $sql;exit;
  1143 + return $this->execSQL($sql,$id_fonteinfo);
  1144 + }
  1145 + /**
  1146 + * Lista os dados de uma ou todas as variaveis cadastradas
  1147 + * @param codigo da variavel
  1148 + * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
  1149 + */
  1150 + function listaVariavel($codigo_variavel="",$filtro_esquema=""){
  1151 + $sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
  1152 + if($codigo_variavel != ""){
  1153 + $sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
  1154 + }
  1155 + if($filtro_esquema != ""){
  1156 + $sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
  1157 + }
  1158 + $sql .= "ORDER BY a.nome";
  1159 + //echo $sql;exit;
  1160 + return $this->execSQL($sql,$codigo_variavel);
  1161 + }
  1162 + /**
  1163 + * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
  1164 + * @param id da medida de variavel
  1165 + * @param id da classificacao
  1166 + */
  1167 + function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
  1168 + if(!empty($id_medida_variavel)){
  1169 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
  1170 + }
  1171 + if(!empty($id_classificacao)){
  1172 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
  1173 + }
  1174 + return $this->execSQL($sql,$id_classificacao);
  1175 + }
  1176 + /**
  1177 + * Lista os dados de um ou todos os links de uma medida
  1178 + * @param id da medida
  1179 + * @param id do link
  1180 + */
  1181 + function listaLinkMedida($id_medida_variavel,$id_link=""){
  1182 + if(!empty($id_medida_variavel)){
  1183 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
  1184 + }
  1185 + if(!empty($id_link)){
  1186 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
  1187 + }
  1188 + return $this->execSQL($sql,$id_link);
  1189 + }
  1190 + /**
  1191 + * Lista os dados de uma ou todas as classes de uma classificacao
  1192 + * @param id da classificacao
  1193 + * @param id da classe
  1194 + */
  1195 + function listaClasseClassificacao($id_classificacao,$id_classe=""){
  1196 + if(!empty($id_classificacao)){
  1197 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
  1198 + }
  1199 + if(!empty($id_classe)){
  1200 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
  1201 + }
  1202 + return $this->execSQL($sql,$id_classe);
  1203 + }
  1204 + /**
  1205 + * Lista os dados de uma ou todas as medidas de variavel de uma variavel
  1206 + * @param codigo da variavel
  1207 + * @param id da medida de variavel
  1208 + */
  1209 + function listaMedidaVariavel($codigo_variavel,$id_medida_variavel=""){
  1210 + $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 ";
  1211 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
  1212 + $sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  1213 + $sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
  1214 + $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
  1215 + $sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
  1216 + if($codigo_variavel != ""){
  1217 + $sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
  1218 + if($id_medida_variavel != ""){
  1219 + $sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
  1220 + }
  1221 + }
  1222 + elseif($id_medida_variavel != "") {
  1223 + $sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
  1224 + }
  1225 + $sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
  1226 + $res = $this->execSQL($sql,$id_medida_variavel);
  1227 + $res = str_replace('"',"'",$res);
  1228 + return $res;
  1229 + }
  1230 + /**
  1231 + * Lista as regioes vinculadas a uma medida de variavel
  1232 + * @param id da medida de vriavel
  1233 + */
  1234 + function listaRegioesMedida($id_medida_variavel){
  1235 + $variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  1236 + $codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
  1237 + $regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
  1238 + //var_dump($regioes);exit;
  1239 + $agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
  1240 + foreach($agregacoes as $a){
  1241 + $regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
  1242 + }
  1243 + return $regioes;
  1244 + }
  1245 + /**
  1246 + * Lista os dados de uma conexao ou de todas
  1247 + * @param id da conexao
  1248 + * @param boolean inclui na lista a senha ou nao
  1249 + * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
  1250 + */
  1251 + function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
  1252 + if($senha == true){
  1253 + $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
  1254 + }
  1255 + else{
  1256 + $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
  1257 + }
  1258 + $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
  1259 + if($codigo_estat_conexao != ""){
  1260 + $sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
  1261 + }
  1262 + $sql .= "ORDER BY bancodedados,host,usuario";
  1263 + $res = $this->execSQL($sql,$codigo_estat_conexao);
  1264 + //se achou e a requisico e para listar uma conexao, retorna o que for encontrado
  1265 + $cres = count($res);
  1266 + if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
  1267 + return $res;
  1268 + }
  1269 + //caso contrario, e deve retornar todas as conexoes, inclui a fonte
  1270 + if($codigo_estat_conexao == ""){
  1271 + for($i=0; $i<$cres;$i++){
  1272 + $res[$i]["fonte"] = "metaestat";
  1273 + }
  1274 + }
  1275 + //obtem as conexoes definidas em ms_configgura.php
  1276 + if($incluiPostgisMapa == true){
  1277 + if(!isset($postgis_mapa)){
  1278 + require(dirname(__FILE__)."/../../ms_configura.php");
  1279 + }
  1280 + if(!empty($postgis_mapa)){
  1281 + foreach(array_keys($postgis_mapa) as $key){
  1282 + $lista = explode(" ",$postgis_mapa[$key]);
  1283 + $con = array();
  1284 + foreach($lista as $l){
  1285 + $teste = explode("=",$l);
  1286 + $con[trim($teste[0])] = trim($teste[1]);
  1287 + }
  1288 + $c = array(
  1289 + "codigo_estat_conexao" => $key,
  1290 + "bancodedados" => $con["dbname"],
  1291 + "host" => $con["host"],
  1292 + "porta" => $con["port"],
  1293 + "usuario" => $con["user"],
  1294 + "fonte" => "ms_configura"
  1295 + );
  1296 + if($senha == true){
  1297 + $c["senha"] = $con["password"];
  1298 + }
  1299 + $res[] = $c;
  1300 + if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
  1301 + return $c;
  1302 + }
  1303 + }
  1304 + }
  1305 + }
  1306 + //echo "<pre>";
  1307 + //var_dump($res);exit;
  1308 + return $res;
  1309 + }
  1310 + function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
  1311 + //lista os parametros temporais
  1312 + $parametros = $this->listaParametro($id_medida_variavel,"","",true,true);
  1313 + echo "<pre>";
  1314 + //var_dump($parametros);exit;
  1315 + //faz o sql para pegar os valores e definir a resolucao
  1316 + //o tempo deve comecar sempre pelo ano
  1317 + $data = array();
  1318 + if($parametros[0]["tipo"] == 1){
  1319 + //ano
  1320 + $data[] = $prefixoAlias.$parametros[0]["coluna"];
  1321 + $tipodata = "YYYY";
  1322 + //mes
  1323 + if(!empty($parametros[1])){
  1324 + $data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
  1325 + $tipodata = "YYYYMM";
  1326 + }
  1327 + else{
  1328 + $data[] = "'-01'";
  1329 + }
  1330 + //dia
  1331 + if(!empty($parametros[2])){
  1332 + $data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
  1333 + $tipodata = "YYYYMMDD";
  1334 + }
  1335 + else{
  1336 + $data[] = "'-01'";
  1337 + }
  1338 + $data = implode("||",$data);
  1339 + return "to_date($data,'$tipodata')";
  1340 + }
  1341 + }
  1342 + /**
  1343 + * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
  1344 + * @param id da medida de variavel
  1345 + * @param id do parametro
  1346 + * @param id do pai (se definido, lista apenas os filhos deste)
  1347 + * @param bool indica se apenas parametros do tipo temporal serao retornados
  1348 + */
  1349 + function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
  1350 + $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
  1351 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
  1352 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  1353 + $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
  1354 + if($id_medida_variavel != ""){
  1355 + $sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
  1356 + if($id_parametro_medida != ""){
  1357 + $sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
  1358 + }
  1359 + }
  1360 + elseif ($id_parametro_medida != ""){
  1361 + $sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
  1362 + }
  1363 + if($id_pai != ""){
  1364 + $sql .= " AND id_pai = $id_pai";
  1365 + }
  1366 + if($apenasTempo == true){
  1367 + $tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
  1368 + $sql .= $tempo;
  1369 + }
  1370 + if($ordenaPeloPai == true){
  1371 + $sql .= " ORDER BY id_pai";
  1372 + }
  1373 + //echo $sql;exit;
  1374 + return $this->execSQL($sql,$id_parametro_medida);
  1375 + }
  1376 + /**
  1377 + * Lista todos os parametros cadastrados
  1378 + */
  1379 + function listaTodosParametros(){
  1380 + $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
  1381 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
  1382 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  1383 + $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
  1384 + $sql .= " ORDER BY nome";
  1385 + return $this->execSQL($sql);
  1386 + }
  1387 + /**
  1388 + * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
  1389 + * @param id do parametro
  1390 + * @return array com os valores
  1391 + */
  1392 + function listaValoresParametro($id_parametro_medida){
  1393 + $parametro = $this->listaParametro("",$id_parametro_medida);
  1394 + //$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
  1395 + $sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
  1396 + $nsm = array();
  1397 + foreach($sm as $s){
  1398 + $nsm[] = $s[$parametro["coluna"]];
  1399 + }
  1400 + return $nsm;
  1401 + }
  1402 + /**
  1403 + * Lista os dados de um ou todos os tipos de periodo cadastrados
  1404 + * @param id
  1405 + */
  1406 + function listaTipoPeriodo($codigo_tipo_periodo=""){
  1407 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
  1408 + if($codigo_tipo_periodo != ""){
  1409 + $sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
  1410 + }
  1411 + $sql .= "ORDER BY nome";
  1412 + return $this->execSQL($sql,$codigo_tipo_periodo);
  1413 + }
  1414 + /**
  1415 + * Lista as propriedades da coluna com as geometrias de uma regiao geografica
  1416 + * @param codigo do tipo de regiao
  1417 + * @return array com os parametros, inclusive a dimensao (st_dimension)
  1418 + */
  1419 + function listaPropGeoRegiao($codigo_tipo_regiao){
  1420 + //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
  1421 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1422 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1423 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1424 + $c = $regiao["colunageo"];
  1425 + $sql = "select st_dimension(".$regiao["colunageo"].") as st_dimension from ".$regiao["esquemadb"].".".$regiao["tabela"]." limit 1";
  1426 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1427 + $r = array();
  1428 + if($q){
  1429 + $r = $q->fetchAll();
  1430 + $r = $r[0];
  1431 + }
  1432 + return $r;
  1433 + }
  1434 + /**
  1435 + * Lista os dados de uma ou todas as regioes cadastradas
  1436 + * @param codigo do tipo de regiao
  1437 + */
  1438 + function listaTipoRegiao($codigo_tipo_regiao=""){
  1439 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
  1440 + if($codigo_tipo_regiao != ""){
  1441 + $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
  1442 + }
  1443 + $sql .= "ORDER BY nome_tipo_regiao";
  1444 + return $this->execSQL($sql,$codigo_tipo_regiao);
  1445 + }
  1446 + /**
  1447 + * Obtem de um tipo de regiao a coluna do tipo serial
  1448 + * @param codigo do tipo de regiao
  1449 + */
  1450 + function listaTipoRegiaoSerial($codigo_tipo_regiao){
  1451 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
  1452 + $regiao = $this->execSQL($sql,$codigo_tipo_regiao);
  1453 + $nome_esquema = $regiao["esquemadb"];
  1454 + $nome_tabela = $regiao["tabela"];
  1455 + $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'";
  1456 + $colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
  1457 + $colunas = $colunas[0];
  1458 + return $colunas["coluna"];
  1459 + }
  1460 + /**
  1461 + * Obtem de uma tabela a coluna do tipo serial
  1462 + * @param codigo do tipo de regiao
  1463 + */
  1464 + function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
  1465 + $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'";
  1466 + $colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
  1467 + $colunas = $colunas[0];
  1468 + return $colunas["coluna"];
  1469 + }
  1470 + /**
  1471 + * Lista os dados de agregacao de uma regiao pai
  1472 + * @param codigo da regiao
  1473 + */
  1474 + function listaHierarquiaRegioes($codigoregiaopai=""){
  1475 + $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 ";
  1476 + $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  1477 + $sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
  1478 + if($codigoregiaopai != ""){
  1479 + $sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
  1480 + }
  1481 + else{
  1482 + $sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
  1483 + }
  1484 + return $this->execSQL($sql,"");
  1485 + }
  1486 + function listaHierarquia($codigoregiaopai=""){
  1487 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao order by codigo_tipo_regiao";
  1488 + return $this->execSQL($sql,"");
  1489 + }
  1490 + /**
  1491 + * Lista os registros de um tipo de regiao
  1492 + * Se for definido o pai, lista os valores da regiao que e filha
  1493 + * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
  1494 + * @param codigo do tipo de regiao
  1495 + * @param codigo do tipo de regiao pai
  1496 + * @param identificador da regiao (registro) pai
  1497 + */
  1498 + function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
  1499 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  1500 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1501 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1502 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1503 + $c = $regiao["colunageo"];
  1504 + $bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
  1505 + $sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
  1506 + if($valorregiaopai != ""){
  1507 + $r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
  1508 + $sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
  1509 + }
  1510 + $sql .= " order by ".$regiao["colunanomeregiao"];
  1511 +
  1512 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1513 + $r = array();
  1514 + if($q){
  1515 + $r = $q->fetchAll();
  1516 + }
  1517 + return $r;
  1518 + }
  1519 + /**
  1520 + * Lista os registros de uma tabela que e uma regiao
  1521 + * @param codigo do tipo de regiao
  1522 + */
  1523 + function listaDadosGeometriaRegiao($codigo_tipo_regiao){
  1524 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  1525 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1526 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1527 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1528 + $c = $regiao["colunageo"];
  1529 + $s = "ST_dimension($c) as dimension ";
  1530 + $sql = "select $s,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
  1531 + $sql .= " limit 1";
  1532 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1533 + $r = array();
  1534 + if($q){
  1535 + $r = $q->fetchAll();
  1536 + }
  1537 + return $r[0];
  1538 + }
  1539 + /**
  1540 + * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
  1541 + * @param codigo do tipo de regiao
  1542 + * @param id da agregacao
  1543 + */
  1544 + function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
  1545 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  1546 + if($id_agregaregiao != ""){
  1547 + $sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
  1548 + }
  1549 + else{
  1550 + if($codigo_tipo_regiao != ""){
  1551 + $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
  1552 + }
  1553 + }
  1554 + $sql .= " ORDER BY colunaligacao_regiaopai";
  1555 + //echo $sql;exit;
  1556 + return $this->execSQL($sql,$id_agregaregiao);
  1557 + }
  1558 + /**
  1559 + * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
  1560 + * @param codigo do tipo de regiao
  1561 + * @param codigo do tipo de regiao que e pai
  1562 + */
  1563 + function listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiao_pai){
  1564 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  1565 + $sql .= "WHERE codigo_tipo_regiao_pai = $codigo_tipo_regiao_pai ";
  1566 + if($codigo_tipo_regiao != ""){
  1567 + $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
  1568 + }
  1569 + return $this->execSQL($sql,$codigo_tipo_regiao_pai);
  1570 + }
  1571 + /**
  1572 + * Lista os esquemas em um banco de dados
  1573 + * @param codigo da conexao
  1574 + * @return execSQLDB
  1575 + */
  1576 + function esquemasConexao($codigo_estat_conexao){
  1577 + 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");
  1578 + }
  1579 + /**
  1580 + * Lista as tabelas de um esquema
  1581 + * @param codigo da conexao
  1582 + * @param nome do esquema
  1583 + * @param sim|nao exclui da lista as tabelas que contem geometria
  1584 + * @return execSQLDB
  1585 + */
  1586 + function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
  1587 + $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%'";
  1588 + if(strtolower($excluigeom) == "sim"){
  1589 + $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";
  1590 + }
  1591 + return $this->execSQLDB($codigo_estat_conexao,$sql);
  1592 + }
  1593 + /**
  1594 + * Lista as colunas de uma tabela
  1595 + * @param codigo da conexao
  1596 + * @param nome do esquema
  1597 + * @param nome da tabela
  1598 + * @param tipo de coluna (opcional)
  1599 + * @param tipo de tratamento do parametro tipo, pode ser =|!=
  1600 + * @return execSQLDB
  1601 + */
  1602 + function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
  1603 + $colunas = array();
  1604 + $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'");
  1605 + if($tipo != ""){
  1606 + $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'");
  1607 + }
  1608 + foreach($res as $c){
  1609 + $colunas[] = $c["coluna"];
  1610 + }
  1611 + return $colunas;
  1612 + }
  1613 + /**
  1614 + * Lista o comentario de uma tabela
  1615 + * @param codigo da conexao
  1616 + * @param nome do esquema
  1617 + * @param nome da tabela
  1618 + * @return execSQLDB
  1619 + */
  1620 + function comentarioTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela){
  1621 + $colunas = array();
  1622 + $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."'";
  1623 + $res = $this->execSQLDB($codigo_estat_conexao,$sql);
  1624 + if(count($res) > 0){
  1625 + $res = $res[0];
  1626 + $res = $res["comments"];
  1627 + }
  1628 + else{
  1629 + $res = "";
  1630 + }
  1631 + if($res == null){
  1632 + $res = "";
  1633 + }
  1634 + return $res;
  1635 + }
  1636 + /**
  1637 + * Lista os metadados de uma coluna
  1638 + * Os metadados sao obtidos do proprio PostgreSQL
  1639 + * @param codigo da conexao
  1640 + * @param nome do esquema
  1641 + * @param nome da tabela
  1642 + * @param nome da coluna (opcional)
  1643 + * @return execSQLDB
  1644 + */
  1645 + function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
  1646 + if($nome_coluna == ""){
  1647 + 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");
  1648 + }
  1649 + else{
  1650 + $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");
  1651 + return $res[0];
  1652 + }
  1653 + }
  1654 + /**
  1655 + * Lista os dados de uma tabela
  1656 + * @param codigo da conexao
  1657 + * @param nome do esquema
  1658 + * @param nome da tabela
  1659 + * @param sim|nao inclui o WKT da geometria de colunas geo
  1660 + * @param (opcional) numero de registros que serao listados
  1661 + * @return execSQLDB
  1662 + */
  1663 + function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
  1664 + $desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
  1665 + $colunas = array();
  1666 + $colsql = array();
  1667 + foreach($desccolunas as $d){
  1668 + if($d["type"] != "geometry" && $d["type"] != "geography"){
  1669 + $colunas[] = $d["field"];
  1670 + $colsql[] = $d["field"];
  1671 + }
  1672 + elseif($geo == "sim"){
  1673 + $colunas[] = $d["field"];
  1674 + $colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
  1675 + }
  1676 + }
  1677 + $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
  1678 + if($nreg != ""){
  1679 + $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
  1680 + }
  1681 + $dados = $this->execSQLDB($codigo_estat_conexao,$sql );
  1682 + $linhas = array();
  1683 + foreach($dados as $d){
  1684 + $l = array();
  1685 + foreach($colunas as $c){
  1686 + $l[] = $d[$c];
  1687 + }
  1688 + $linhas[] = $l;
  1689 + }
  1690 + return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
  1691 + }
  1692 + /**
  1693 + * Relatorio completo com a lista de variaveis e medidas
  1694 + * @param codigo da variavel
  1695 + * @param sim|nao inclui dados detalhados
  1696 + * @return Array
  1697 + */
  1698 + function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
  1699 + $dados = array();
  1700 + if($codigo_variavel != "" || !empty($codigo_variavel)){
  1701 + $vs[] = $this->listaVariavel($codigo_variavel);
  1702 + }
  1703 + else{
  1704 + $vs = $this->listaVariavel();
  1705 + }
  1706 + foreach($vs as $v){
  1707 + $nivel1["id"] = $v["codigo_variavel"];
  1708 + $nivel1["titulo"] = $v["nome"];
  1709 + $nivel1["descricao"] = $v["descricao"];
  1710 + $ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
  1711 + $nivel1["filhos"] = array();
  1712 + foreach($ms as $m){
  1713 + $nivel2["id"] = $m["id_medida_variavel"];
  1714 + $nivel2["titulo"] = $m["nomemedida"];
  1715 + $unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
  1716 + $unidade = "Unidade de medida: ".$unidade["nome"];
  1717 + $periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
  1718 + $periodo = "Per&iacute;odo de tempo: ".$periodo["nome"];
  1719 + $regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
  1720 + $regiao = "Regi&atilde;o: ".$regiao["nome_tipo_regiao"];
  1721 + $nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
  1722 + $nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
  1723 + $nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
  1724 + $nivel2["dadosgerenciais"] = "";
  1725 + if($dadosGerenciais == "sim"){
  1726 + $nivel2["dadosgerenciais"] = $m;
  1727 + }
  1728 + $nivel1["filhos"][] = $nivel2;
  1729 + }
  1730 + $dados[] = $nivel1;
  1731 + }
  1732 + return $dados;
  1733 + }
  1734 + /**
  1735 + * Cria um raltorio formatado em HTML
  1736 + * @param dados obtidos com relatorioCompleto
  1737 + * @param sim|nao inclui os dados detalhados
  1738 + * @return string
  1739 + */
  1740 + function formataRelatorioHtml($dados,$detalhes="sim"){
  1741 + $html[] = "<div class='var_div_relatorio'>";
  1742 + $var_cor = "var_cor1";
  1743 + foreach($dados as $variavel){
  1744 + $html[] = "<div class='".$var_cor."'>";
  1745 + $html[] = "<h1 style=padding:3px; ><b>".$variavel["titulo"];
  1746 + $html[] = "</b><br><span style='color:rgb(100,100,100)'>".$variavel["descricao"]."</span></h1>";
  1747 + $filhos = $variavel["filhos"];
  1748 + foreach($filhos as $f){
  1749 + $html[] = "<h2 style='position:relative;left:10px;'>ID: <u>".$f["id"]."</u> - ".$f["titulo"]."</h2>";
  1750 + $html[] = "<div style='position:relative;padding-left:20px;'>";
  1751 + $html[] = "<p>".$f["descricao"]."</p>";
  1752 + if($detalhes == "sim"){
  1753 + $html[] = "<p><b>Fontes:</b></p>";
  1754 + foreach($f["fontes"] as $fonte){
  1755 + $html[] = "<p><a href='".$fonte["link"]."' >".$fonte["titulo"]."</a></p>";
  1756 + }
  1757 + $html[] = "<p><b>Links:</b></p>";
  1758 + foreach($f["links"] as $link){
  1759 + $html[] = "<p><a href='".$link["link"]."' >".$link["nome"]."</a></p>";
  1760 + }
  1761 + if($f["dadosgerenciais"] != ""){
  1762 + $html[] = "<span style='color:gray'>";
  1763 + $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", ";
  1764 + $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", ";
  1765 + $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", ";
  1766 + $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", ";
  1767 + $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", ";
  1768 + $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico];
  1769 + $html[] = "</span>";
  1770 + }
  1771 + }
  1772 + $html[] = "</div>";
  1773 + }
  1774 + $html[] = "</div>";
  1775 + if($var_cor == "var_cor1"){
  1776 + $var_cor = "var_cor2";
  1777 + }
  1778 + else{
  1779 + $var_cor = "var_cor1";
  1780 + }
  1781 + }
  1782 + $html[] = "</div><br><br>";
  1783 + return implode("",$html);
  1784 + }
  1785 + /**
  1786 + * Cria um relatorio no formato XML
  1787 + * @param dados obtidos com relatorioCompleto
  1788 + * @return string
  1789 + */
  1790 + function formataXML($dados){
  1791 + $chaves = array_keys($dados[0]);
  1792 + if(count($chaves) == 0){
  1793 + $chaves = false;
  1794 + }
  1795 + $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL;
  1796 + $xml .= '<result-set>' . PHP_EOL;
  1797 + //tenta descobrir o tipo de coluna
  1798 + //$xml .= '<!--java.lang.String,java.lang.Integer-->' . PHP_EOL;
  1799 + $xmldados = "";
  1800 + if($chaves){
  1801 + foreach($dados as $d){
  1802 + $xmldados .= "<row>" . PHP_EOL;
  1803 + foreach($chaves as $c){
  1804 + $xmldados .= "<".$c.">".$d[$c]."</".$c.">" . PHP_EOL;
  1805 + }
  1806 + $xmldados .= "</row>" . PHP_EOL;
  1807 + }
  1808 + $tipos = array();
  1809 + $d = $dados[0];
  1810 + foreach($chaves as $c){
  1811 + if(is_numeric($d[$c])){
  1812 + $tipos[] = "java.lang.Integer";
  1813 + }
  1814 + else{
  1815 + $tipos[] = "java.lang.String";
  1816 + }
  1817 + }
  1818 + $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
  1819 + }
  1820 + else{
  1821 + while (list($key, $val) = each($dados)) {
  1822 + $xmldados .= "<row>" . PHP_EOL;
  1823 + $xmldados .= "<nome>".$key."</nome>" . PHP_EOL;
  1824 + $xmldados .= "<valor>".$val."</valor>" . PHP_EOL;
  1825 + $xmldados .= "</row>" . PHP_EOL;
  1826 + }
  1827 + reset($dados);
  1828 + $tipos = array();
  1829 + while (list($key, $val) = each($dados)) {
  1830 + if(is_numeric($val)){
  1831 + $tipos[] = "java.lang.Integer";
  1832 + }
  1833 + else{
  1834 + $tipos[] = "java.lang.String";
  1835 + }
  1836 + if(is_numeric($key)){
  1837 + $tipos[] = "java.lang.Integer";
  1838 + }
  1839 + else{
  1840 + $tipos[] = "java.lang.String";
  1841 + }
  1842 + break;
  1843 + }
  1844 + $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
  1845 + }
  1846 + $xml .= $xmldados;
  1847 + $xml .= '</result-set>' . PHP_EOL;
  1848 + return $xml;
  1849 + }
  1850 + /**
  1851 + * Verifica se em um array existe uma chave com determinado valor
  1852 + * @param Array
  1853 + * @param nome da chave
  1854 + * @param valor a ser buscado
  1855 + * @return boolean
  1856 + */
  1857 + function buscaNoArray($lista,$chave,$valor){
  1858 + foreach($lista as $l){
  1859 + if($l[$chave] == $valor){
  1860 + return true;
  1861 + }
  1862 + }
  1863 + return false;
  1864 + }
  1865 + /**
  1866 + * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude
  1867 + * @param codigo do tipo de regiao
  1868 + * @param longitude
  1869 + * @param latitude
  1870 + * @return array
  1871 + */
  1872 + function xy2regiao($codigo_tipo_regiao,$x,$y){
  1873 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  1874 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1875 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1876 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1877 + $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"].")";
  1878 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1879 + $r = $q->fetchAll();
  1880 + if(count($r) > 0){
  1881 + return $r[0];
  1882 + }
  1883 + else{
  1884 + return "";
  1885 + }
  1886 + }
  1887 + /**
  1888 + * Busca os dados de uma medida de variavel para uma regiao
  1889 + * Identificador da regiao e o valor a ser encontrado na coluna de
  1890 + * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao)
  1891 + * @param identificador da regiao
  1892 + * @param id da medida da variavel
  1893 + * @return multitype:unknown multitype: string
  1894 + */
  1895 + function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){
  1896 + $medida = $this->listaMedidaVariavel("",$id_medida_variavel);
  1897 + $c = $this->listaConexao($medida["codigo_estat_conexao"],true);
  1898 + if($medida["colunavalor"] == ""){
  1899 + return "";
  1900 + }
  1901 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1902 + $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"];
  1903 +
  1904 + $alias[] = $medida["nomemedida"];
  1905 + $colunas[] = $medida["colunavalor"];
  1906 + $alias[] = "idunico";
  1907 + $colunas[] = $medida["colunaidunico"];
  1908 + $descricao[] = $medida["unidade_medida"];
  1909 + $parametros = $this->listaParametro($id_medida_variavel);
  1910 + foreach($parametros as $p){
  1911 + $colunassql[] = $p["coluna"];
  1912 + $alias[] = $p["nome"];
  1913 + $descricao[] = $p["descricao"];
  1914 + $colunas[] = $p["coluna"];
  1915 + }
  1916 +
  1917 + $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text ";
  1918 + if($medida["filtro"] != ""){
  1919 + $sql .= " and ".$medida["filtro"];
  1920 + }
  1921 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1922 + $r = $q->fetchAll();
  1923 + return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao);
  1924 + }
  1925 + /**
  1926 + * Converte um tipo de regiao em shapefile
  1927 + * @param codigo do tipo de regiao
  1928 + * @return nome do arquivo criado
  1929 + */
  1930 + function regiao2shp($codigo_tipo_regiao){
  1931 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1932 + $dados = $this->obtemDadosTabelaDB($regiao["codigo_estat_conexao"],$regiao["esquemadb"],$regiao["tabela"],"sim");
  1933 + $tipol = $this->listaPropGeoRegiao($codigo_tipo_regiao);
  1934 + include_once(dirname(__FILE__)."/../../classesphp/classe_shp.php");
  1935 + $s = new SHP();
  1936 + //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
  1937 + //echo MS_SHP_POINT.", ".MS_SHP_ARC.", ".MS_SHP_POLYGON.", ".MS_SHP_MULTIPOINT;
  1938 + //1, 3, 5, 8
  1939 + $conv[0] = 1;
  1940 + $conv[1] = 3;
  1941 + $conv[2] = 5;
  1942 + //cria as colunas
  1943 + $cni = 0;
  1944 + foreach($dados["colunas"] as $t){
  1945 + $temp = strtoupper($t["field"]);
  1946 + if(strlen($temp) > 10){
  1947 + $temp = substr($temp,0,8).($cni++);
  1948 + }
  1949 + if($t["type"] == "varchar" || $t["type"] == "char" || $t["type"] == "character varying" || $t["type"] == "character" || $t["type"] == "text"){
  1950 + $def[] = array($temp,"C","254");
  1951 + }
  1952 + else{
  1953 + if($t["lengthvar"] < 0){
  1954 + $t["lengthvar"] = 0;
  1955 + }
  1956 + $def[] = array($temp,"N", $t["length"],$t["lengthvar"]);
  1957 + }
  1958 + }
  1959 + $nomeshp = $this->dir_tmp."/regiao$codigo_tipo_regiao"."_".$this->nomeRandomico();
  1960 + $dbaseExiste = false;
  1961 + if(function_exists("dbase_create")){
  1962 + $dbaseExiste = true;
  1963 + }
  1964 + //para manipular dbf
  1965 + if($dbaseExiste == false){
  1966 + include_once (dirname(__FILE__)."/../pacotes/phpxbase/api_conversion.php");
  1967 + $db = xbase_create($nomeshp.".dbf", $def);
  1968 + }
  1969 + else
  1970 + {$db = dbase_create($nomeshp.".dbf", $def);}
  1971 + $dbname = $nomeshp.".dbf";
  1972 + $reg = array();
  1973 + $novoshpf = ms_newShapefileObj($nomeshp.".shp", $conv[$tipol["st_dimension"]]);
  1974 + $cols = $dados["colunas"];
  1975 + $nc = count($dados["colunas"]);
  1976 + foreach($dados["linhas"] as $l){
  1977 + $reg = array();
  1978 + for($i=0;$i<$nc;$i++){
  1979 + if($cols[$i]["type"] != "geometry" && $cols[$i]["type"] != "geography"){
  1980 + $reg[] = $l[$i];
  1981 + }
  1982 + else{
  1983 + $reg[] = 0;
  1984 + if($cols[$i]["field"] == $regiao["colunageo"]){
  1985 + $shape = ms_shapeObjFromWkt($l[$i]);
  1986 + }
  1987 + }
  1988 + }
  1989 + $novoshpf->addShape($shape);
  1990 + if($dbaseExiste == false){
  1991 + xbase_add_record($db,$reg);
  1992 + }
  1993 + else{
  1994 + dbase_add_record($db,$reg);
  1995 + }
  1996 + }
  1997 + if($this->dbaseExiste == false){
  1998 + xbase_close($db);
  1999 + }
  2000 + else{
  2001 + dbase_close($db);
  2002 + }
  2003 + return $nomeshp;
  2004 + }
  2005 + /*
  2006 + * Testa se os elementos de um array sao numericos
  2007 + */
  2008 + function testaNumerico($valores){
  2009 + foreach ($valores as $valor) {
  2010 + if(!empty($valor) && !is_numeric($valor)) {
  2011 + echo "valor nao numerico";
  2012 + exit;
  2013 + }
  2014 + }
  2015 + }
  2016 +}
  2017 +?>
... ...
ms_configura.php
... ... @@ -132,7 +132,7 @@ $logTransacoes = false;
132 132 Tipo:
133 133 {array}
134 134 */
135   -$i3geoEsquemasWL = array("public","i3geosaude");
  135 +$i3geoEsquemasWL = array("publicy");
136 136  
137 137 //TODO documentar moodle
138 138 /*
... ...