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,7 +92,7 @@ class Metaestat{
92 $this->nomecache = $this->nomeCache(); 92 $this->nomecache = $this->nomeCache();
93 } 93 }
94 function __destruct(){ 94 function __destruct(){
95 - $this->fechaConexao; 95 + $this->fechaConexao();
96 } 96 }
97 /** 97 /**
98 * Cria um nome de arquivo concatenando $_request 98 * Cria um nome de arquivo concatenando $_request
admin1/js/bdexplorer.js 100644 → 100755
@@ -4,6 +4,7 @@ if (typeof (i3GEOadmin) === 'undefined') { @@ -4,6 +4,7 @@ if (typeof (i3GEOadmin) === 'undefined') {
4 i3GEOadmin.bdExplorer = { 4 i3GEOadmin.bdExplorer = {
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>', 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 templateListaPopOver: '<a href="javascript:void(0)" data-name="{{{destino}}}" data-value="{{{valor}}}" class="list-group-item">{{{valor}}}</a>', 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 popOver: function(destino, conteudo){ 8 popOver: function(destino, conteudo){
8 var pop = $("#modalGeral input[name='" + destino + "']").popover({ 9 var pop = $("#modalGeral input[name='" + destino + "']").popover({
9 "content": conteudo, 10 "content": conteudo,
@@ -50,5 +51,94 @@ i3GEOadmin.bdExplorer = { @@ -50,5 +51,94 @@ i3GEOadmin.bdExplorer = {
50 } else { 51 } else {
51 $(".popover").popover("destroy"); 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 \ No newline at end of file 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,7 +257,25 @@ Obt&amp;eacute;m a lista de regioes
257 //abre a pagina de edicao 257 //abre a pagina de edicao
258 window.location.href = "hierarquia/index.php?codigo_tipo_regiao=" + codigo_tipo_regiao; 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 listaEsquemas: function(destino){ 263 listaEsquemas: function(destino){
261 i3GEOadmin.bdExplorer.listaEsquemas(destino); 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 \ No newline at end of file 282 \ No newline at end of file
admin1/metaestat/regioes/templates/templateFormLista.php
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <div class="form-group form-group-lg"> 5 <div class="form-group form-group-lg">
6 <label class="col-md-5 control-label" for="nome_tipo_regiao" >{{{nome_tipo_regiaoTxt}}}</label> 6 <label class="col-md-5 control-label" for="nome_tipo_regiao" >{{{nome_tipo_regiaoTxt}}}</label>
7 <div class="col-md-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 </div> 9 </div>
10 </div> 10 </div>
11 </div> 11 </div>
@@ -25,8 +25,15 @@ @@ -25,8 +25,15 @@
25 <div class="form-group form-group-lg"> 25 <div class="form-group form-group-lg">
26 <label class="col-md-5 control-label" for="codigo_estat_conexao" >{{{codigo_estat_conexaoTxt}}}</label> 26 <label class="col-md-5 control-label" for="codigo_estat_conexao" >{{{codigo_estat_conexaoTxt}}}</label>
27 <div class="col-md-7"> 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 </div> 37 </div>
31 </div> 38 </div>
32 </div> 39 </div>
@@ -36,7 +43,7 @@ @@ -36,7 +43,7 @@
36 <label class="col-md-5 control-label" for="esquemadb" >{{{esquemadbTxt}}}</label> 43 <label class="col-md-5 control-label" for="esquemadb" >{{{esquemadbTxt}}}</label>
37 <div class="col-md-7"> 44 <div class="col-md-7">
38 <div class="input-group"> 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 <div class="input-group-btn"> 47 <div class="input-group-btn">
41 <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)"> 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 <i class="material-icons md-18">list</i> 49 <i class="material-icons md-18">list</i>
@@ -44,6 +51,7 @@ @@ -44,6 +51,7 @@
44 </div> 51 </div>
45 </div> 52 </div>
46 </div> 53 </div>
  54 + </div>
47 </div> 55 </div>
48 </div> 56 </div>
49 <div class="row"> 57 <div class="row">
@@ -51,8 +59,15 @@ @@ -51,8 +59,15 @@
51 <div class="form-group form-group-lg"> 59 <div class="form-group form-group-lg">
52 <label class="col-md-5 control-label" for="tabela" >{{{tabelaTxt}}}</label> 60 <label class="col-md-5 control-label" for="tabela" >{{{tabelaTxt}}}</label>
53 <div class="col-md-7"> 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 </div> 71 </div>
57 </div> 72 </div>
58 </div> 73 </div>
@@ -61,8 +76,15 @@ @@ -61,8 +76,15 @@
61 <div class="form-group form-group-lg"> 76 <div class="form-group form-group-lg">
62 <label class="col-md-5 control-label" for="colunageo" >{{{colunageoTxt}}}</label> 77 <label class="col-md-5 control-label" for="colunageo" >{{{colunageoTxt}}}</label>
63 <div class="col-md-7"> 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 </div> 88 </div>
67 </div> 89 </div>
68 </div> 90 </div>
@@ -81,8 +103,15 @@ @@ -81,8 +103,15 @@
81 <div class="form-group form-group-lg"> 103 <div class="form-group form-group-lg">
82 <label class="col-md-5 control-label" for="identificador" >{{{identificadorTxt}}}</label> 104 <label class="col-md-5 control-label" for="identificador" >{{{identificadorTxt}}}</label>
83 <div class="col-md-7"> 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 </div> 115 </div>
87 </div> 116 </div>
88 </div> 117 </div>
@@ -91,8 +120,15 @@ @@ -91,8 +120,15 @@
91 <div class="form-group form-group-lg"> 120 <div class="form-group form-group-lg">
92 <label class="col-md-5 control-label" for="colunanomeregiao" >{{{colunanomeregiaoTxt}}}</label> 121 <label class="col-md-5 control-label" for="colunanomeregiao" >{{{colunanomeregiaoTxt}}}</label>
93 <div class="col-md-7"> 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 </div> 132 </div>
97 </div> 133 </div>
98 </div> 134 </div>
@@ -111,8 +147,15 @@ @@ -111,8 +147,15 @@
111 <div class="form-group form-group-lg"> 147 <div class="form-group form-group-lg">
112 <label class="col-md-5 control-label" for="colunacentroide" >{{{colunacentroideTxt}}}</label> 148 <label class="col-md-5 control-label" for="colunacentroide" >{{{colunacentroideTxt}}}</label>
113 <div class="col-md-7"> 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 </div> 159 </div>
117 </div> 160 </div>
118 </div> 161 </div>
admin1/php/bdexplorer.php 100644 → 100755
1 <?php 1 <?php
2 /****************************************************************/ 2 /****************************************************************/
3 -////include (dirname ( __FILE__ ) . "/../../../ms_configura.php");  
4 // 3 //
5 //checa login 4 //checa login
6 //valida _GET e _POST, juntando em _GET 5 //valida _GET e _POST, juntando em _GET
@@ -10,13 +9,18 @@ @@ -10,13 +9,18 @@
10 include ("checaLogin.php"); 9 include ("checaLogin.php");
11 \admin\php\login\checaLogin(); 10 \admin\php\login\checaLogin();
12 //funcoes de administracao 11 //funcoes de administracao
13 -include ($_SESSION["locaplic"]."/admin1/php/funcoesAdmin.php"); 12 +include ("funcoesAdmin.php");
14 // 13 //
15 //carrega outras funcoes e extensoes do PHP 14 //carrega outras funcoes e extensoes do PHP
16 // 15 //
17 include ($_SESSION["locaplic"]."/classesphp/carrega_ext.php"); 16 include ($_SESSION["locaplic"]."/classesphp/carrega_ext.php");
18 include ($_SESSION["locaplic"]."/classesphp/classe_bdexplorer.php"); 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 $funcao = strtoupper ( $funcao ); 24 $funcao = strtoupper ( $funcao );
21 switch ($funcao) { 25 switch ($funcao) {
22 case "LISTARESQUEMAS" : 26 case "LISTARESQUEMAS" :
@@ -28,6 +32,44 @@ switch ($funcao) { @@ -28,6 +32,44 @@ switch ($funcao) {
28 \admin\php\funcoesAdmin\retornaJSON ( $dados ); 32 \admin\php\funcoesAdmin\retornaJSON ( $dados );
29 } 33 }
30 break; 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 default: 73 default:
32 if(!empty ($funcao)) header ( "HTTP/1.1 500 erro funcao nao existe" ); 74 if(!empty ($funcao)) header ( "HTTP/1.1 500 erro funcao nao existe" );
33 break; 75 break;
classesphp/classe_bdexplorer.php
@@ -51,63 +51,30 @@ class Bdexplorer{ @@ -51,63 +51,30 @@ class Bdexplorer{
51 if(!empty($esquemaadmin)){ 51 if(!empty($esquemaadmin)){
52 $this->esquemaadmin = str_replace(".","",$esquemaadmin)."."; 52 $this->esquemaadmin = str_replace(".","",$esquemaadmin).".";
53 } 53 }
54 - $this->nomecache = $this->nomeCache();  
55 if(!isset($i3geoEsquemasWL) || !is_array($i3geoEsquemasWL)){ 54 if(!isset($i3geoEsquemasWL) || !is_array($i3geoEsquemasWL)){
56 $this->i3geoEsquemasWL = array(); 55 $this->i3geoEsquemasWL = array();
57 } else { 56 } else {
58 $this->i3geoEsquemasWL = $i3geoEsquemasWL; 57 $this->i3geoEsquemasWL = $i3geoEsquemasWL;
59 } 58 }
60 //se a conexao nao vier como parametro, cria uma nova 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 } else { 62 } else {
64 $this->dbh = $dbh; 63 $this->dbh = $dbh;
65 - if(!isset($convUTF)){  
66 - $this->convUTF = true;  
67 - } else {  
68 - $this->convUTF = $convUTF;  
69 - }  
70 } 64 }
71 } 65 }
72 function __destruct(){ 66 function __destruct(){
73 $this->fechaConexao(); 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 function listaDeEsquemas(){ 79 function listaDeEsquemas(){
113 return $this->i3geoEsquemasWL; 80 return $this->i3geoEsquemasWL;
@@ -121,1180 +88,46 @@ class Bdexplorer{ @@ -121,1180 +88,46 @@ class Bdexplorer{
121 } 88 }
122 return $novaLista; 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 $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql); 122 $sql = str_ireplace(array("update","delete","insert","--","drop",";"),"",$sql);
218 try { 123 try {
219 $q = $this->dbh->query($sql,PDO::FETCH_ASSOC); 124 $q = $this->dbh->query($sql,PDO::FETCH_ASSOC);
  125 + $q = $q->fetchAll();
  126 + return $q;
220 } 127 }
221 catch (PDOException $e) { 128 catch (PDOException $e) {
222 return "Error!: "; 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 @@ @@ -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,7 +132,7 @@ $logTransacoes = false;
132 Tipo: 132 Tipo:
133 {array} 133 {array}
134 */ 134 */
135 -$i3geoEsquemasWL = array("public","i3geosaude"); 135 +$i3geoEsquemasWL = array("publicy");
136 136
137 //TODO documentar moodle 137 //TODO documentar moodle
138 /* 138 /*