Commit 10aa01ba2a3816fc480ae648c100d6d946d1655e

Authored by Edmar Moretti
1 parent 3010dad2

Inclusão de rotina para cálculo automático de intervalos de classe ao adicionar …

…camadas do sistema de metadados estatísticos. As classes são calculadas com base no método de quartis e as cores são escolhidas de uma paleta de 10 cores, baseadas em colorbrewer.
classesphp/classe_metaestatinfo.php
1   -<?php
2   -/**
3   - * Classe metaestatInfo
4   - * O construtor da classe faz o include do programa conexao.php que por sua vez faz o include
5   - * de i3geo/ms_configura.php. Com base nesses programas sao definidas algumas das variaveis globais
6   -*/
7   -class MetaestatInfo{
8   - /**
9   - * Nome do esquema no banco de dados utilizado para armazenar as tabelas
10   - * do sistema de admnistracao. Obtido de ms_configura.php
11   - */
12   - protected $esquemaadmin;
13   - /**
14   - * Objeto PDO obtido com new PDO com direito de leitura no banco de dados de administracao
15   - */
16   - public $dbh;
17   - /**
18   - * Indica se e necessario converter para UTF strings obtidas do banco de administracao
19   - */
20   - public $convUTF;
21   - /**
22   - * Pasta temporaria utilizada pelo mapserver
23   - */
24   - public $dir_tmp;
25   - /**
26   - * Pasta onde e feito o cache de imagens do i3Geo
27   - */
28   - public $nomecache;
29   - /**
30   - * Grava ou nao o log de transacoes
31   - */
32   - public $logTransacoes;
33   - /**
34   - * Construtor
35   - * Faz o include de conexao.php que por sua vez faz o include de i3geo/ms_configura.php
36   - */
37   - function __construct(){
38   - include(dirname(__FILE__)."/../admin/php/conexao.php");
39   - //vem do include
40   - $this->dir_tmp = $dir_tmp;
41   - $this->logTransacoes = $logTransacoes;
42   - $this->locaplic = $locaplic;
43   - $this->base = $base;
44   - if(!isset($convUTF)){
45   - $convUTF = true;
46   - }
47   - $this->convUTF = $convUTF;
48   - $this->dbh = $dbh;
49   - $this->esquemaadmin = "";
50   - if(!empty($esquemaadmin)){
51   - $this->esquemaadmin = str_replace(".","",$esquemaadmin).".";
52   - }
53   - $this->nomecache = $this->nomeCache();
54   - }
55   - function __destruct(){
56   - $this->fechaConexao();
57   - }
58   - /**
59   - * Cria um nome de arquivo concatenando $_request
60   - * @return string
61   - */
62   - function nomeCache(){
63   - return "AAAA".md5(implode("x",$_REQUEST));
64   - }
65   - /**
66   - * Cria um nome aleatorio
67   - * @param numero de caracteres
68   - * @return string
69   - */
70   - function nomeRandomico($n=10){
71   - $nomes = "";
72   - $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ';
73   - $max = 51;
74   - for($i=0; $i < $n; ++$i)
75   - {
76   - $nomes .= $a{mt_rand(0, $max)};
77   - }
78   - return $nomes;
79   - }
80   - /**
81   - * Fecha a conexao com o banco de dados de administracao
82   - */
83   - function fechaConexao(){
84   - $this->dbh = null;
85   - }
86   - /**
87   - * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao
88   - * Verifica se o parametro e um array ou um texto e executa converteTexto()
89   - * @param string|array
90   - * @return string|array
91   - */
92   - function converteTextoArray($texto){
93   - try {
94   - if(empty($texto) || (!is_array($texto) && strtoupper($texto) == "NULL")){
95   - return "";
96   - }
97   - if(!is_array($texto)){
98   - return $this->converteTexto($texto);
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   -
  1 +<?php
  2 +/**
  3 + * Classe metaestatInfo
  4 + * O construtor da classe faz o include do programa conexao.php que por sua vez faz o include
  5 + * de i3geo/ms_configura.php. Com base nesses programas sao definidas algumas das variaveis globais
  6 +*/
  7 +class MetaestatInfo{
  8 + /**
  9 + * Nome do esquema no banco de dados utilizado para armazenar as tabelas
  10 + * do sistema de admnistracao. Obtido de ms_configura.php
  11 + */
  12 + protected $esquemaadmin;
  13 + /**
  14 + * Objeto PDO obtido com new PDO com direito de leitura no banco de dados de administracao
  15 + */
  16 + public $dbh;
  17 + /**
  18 + * Indica se e necessario converter para UTF strings obtidas do banco de administracao
  19 + */
  20 + public $convUTF;
  21 + /**
  22 + * Pasta temporaria utilizada pelo mapserver
  23 + */
  24 + public $dir_tmp;
  25 + /**
  26 + * Pasta onde e feito o cache de imagens do i3Geo
  27 + */
  28 + public $nomecache;
  29 + /**
  30 + * Grava ou nao o log de transacoes
  31 + */
  32 + public $logTransacoes;
  33 + /**
  34 + * Construtor
  35 + * Faz o include de conexao.php que por sua vez faz o include de i3geo/ms_configura.php
  36 + */
  37 + function __construct(){
  38 + include(dirname(__FILE__)."/../admin/php/conexao.php");
  39 + //vem do include
  40 + $this->dir_tmp = $dir_tmp;
  41 + $this->logTransacoes = $logTransacoes;
  42 + $this->locaplic = $locaplic;
  43 + $this->base = $base;
  44 + if(!isset($convUTF)){
  45 + $convUTF = true;
  46 + }
  47 + $this->convUTF = $convUTF;
  48 + $this->dbh = $dbh;
  49 + $this->esquemaadmin = "";
  50 + if(!empty($esquemaadmin)){
  51 + $this->esquemaadmin = str_replace(".","",$esquemaadmin).".";
  52 + }
  53 + $this->nomecache = $this->nomeCache();
  54 + }
  55 + function __destruct(){
  56 + $this->fechaConexao();
  57 + }
  58 + /**
  59 + * Cria um nome de arquivo concatenando $_request
  60 + * @return string
  61 + */
  62 + function nomeCache(){
  63 + return "AAAA".md5(implode("x",$_REQUEST));
  64 + }
  65 + /**
  66 + * Cria um nome aleatorio
  67 + * @param numero de caracteres
  68 + * @return string
  69 + */
  70 + function nomeRandomico($n=10){
  71 + $nomes = "";
  72 + $a = 'azertyuiopqsdfghjklmwxcvbnABCDEFGHIJKLMNOPQRSTUVWXYZ';
  73 + $max = 51;
  74 + for($i=0; $i < $n; ++$i)
  75 + {
  76 + $nomes .= $a{mt_rand(0, $max)};
  77 + }
  78 + return $nomes;
  79 + }
  80 + /**
  81 + * Fecha a conexao com o banco de dados de administracao
  82 + */
  83 + function fechaConexao(){
  84 + $this->dbh = null;
  85 + }
  86 + /**
  87 + * Aplica a conversao de caracteres em um array ou string conforme o padrao do banco de administracao
  88 + * Verifica se o parametro e um array ou um texto e executa converteTexto()
  89 + * @param string|array
  90 + * @return string|array
  91 + */
  92 + function converteTextoArray($texto){
  93 + try {
  94 + if(empty($texto) || (!is_array($texto) && strtoupper($texto) == "NULL")){
  95 + return "";
  96 + }
  97 + if(!is_array($texto)){
  98 + return $this->converteTexto($texto);
  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 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   - }
  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 256 if($tipolayer != "point"){
257 257 $colunageo = $dadosgeo["colunageo"];
258 258 $titulo .= " (pol) ";
... ... @@ -261,44 +261,44 @@ class MetaestatInfo{
261 261 $colunageo = $dadosgeo["colunacentroide"];
262 262 $titulo .= " (pt) ";
263 263 }
264   - $titulo .= $dadosgeo["nome_tipo_regiao"];
265   -
  264 + $titulo .= $dadosgeo["nome_tipo_regiao"];
  265 +
266 266 $vis = $dadosgeo["colunasvisiveis"];
267 267 if(!empty($vis) && $suportaWMST == false){
268   - $vis = $vis.",".$dadosgeo["identificador"];
  268 + $vis = $vis.",".$dadosgeo["identificador"];
269 269 $vis = str_replace(" ",",",$vis);
270   - $vis = str_replace(",,",",",$vis);
271   - $vis = str_replace(";",",",$vis);
  270 + $vis = str_replace(",,",",",$vis);
  271 + $vis = str_replace(";",",",$vis);
272 272  
273 273 $colunasSemGeo = explode(",",$vis);
274   - $colunasSemGeo = array_unique($colunasSemGeo);
  274 + $colunasSemGeo = array_unique($colunasSemGeo);
275 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));
  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 279 $alias = str_replace(";",",",$alias);
280 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{
  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 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();
  293 + $colunasSemGeo = $this->colunasTabela($dadosgeo["codigo_estat_conexao"], $dadosgeo["esquemadb"], $dadosgeo["tabela"],"geometry","!=");
  294 + $alias = array();
295 295 if($suportaWMST == true){
296 296 $sqlWMST = $this->listaParametroTempo2CampoData($id_medida_variavel);
297 297 $colunasSemGeo[] = "dimtempo";
298   - }
299   - }
300   - //verifica o tipo de calculo para agragacao de valores
301   - $tipoconta = "";
  298 + }
  299 + }
  300 + //verifica o tipo de calculo para agragacao de valores
  301 + $tipoconta = "";
302 302 if($dados["permitesoma"] == 1 && $direto == false){
303 303 $tipoconta = "sum";
304 304 if($agregaregiao == true){
... ... @@ -310,764 +310,817 @@ class MetaestatInfo{
310 310 if($agregaregiao == true){
311 311 $titulo .= " - media";
312 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   - }
  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 351 $sqlIntermediario = "SELECT (j.valorcalculado) AS ".$nomeColunaValor.", __COLUNASSEMGEO__".
352 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   - }
  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 373 $temp = "SELECT regiao.".$dadosColunas[$idregiao]["colunaligacao_regiaopai"]." AS cod_regiao,sum(".$nomevalorcalculado.") AS valorcalculado ".
374 374 "FROM ".$tempDadosRegiao["esquemadb"].".".$tempDadosRegiao["tabela"]." AS regiao ".
375 375 "INNER JOIN ".
376 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   -
  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 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*/";
  389 + $sqlgeo = str_replace("__SQLDADOS__",$sqlDadosMedidaVariavel,$sqlIntermediario);
  390 + $colunasComGeo = $colunasSemGeo;
  391 + //$colunasComGeo[] = "/*SG*/st_setsrid(".$colunageo.",".$dadosgeo["srid"].") as ".$colunageo." /*SG*/";
392 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)){
  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 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   - }
  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 520 if($dg["dimension"] == 0){
521 521 $tipolayer = "point";
522   - }
  522 + }
523 523 if($dg["dimension"] == 1){
524 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"].'"';
  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($classes == false){
  537 + $valores = $this->dadosMedidaVariavel($id_medida_variavel,$filtro." AND ".$meta["colunavalor"]." > 0 ");
  538 + $valores = array_column($valores,$meta["colunavalor"]);
  539 + $item = $meta["colunavalor"];
  540 + $classes = array();
  541 + $cores = array();
  542 + //cores baseadas em colorbrewer
  543 + $cores[] = array(array(179,205,227),array(140,150,198),array(136,86,167),array(129,15,124));
  544 + $cores[] = array(array(178,226,226),array(102,194,164),array(44,162,95),array(0,109,44));
  545 + $cores[] = array(array(186,228,188),array(123,204,196),array(67,162,202),array(8,104,172));
  546 + $cores[] = array(array(253,204,138),array(252,141,89),array(227,74,51),array(179,0,0));
  547 + $cores[] = array(array(189,201,225),array(116,169,207),array(43,140,190),array(4,90,141));
  548 + $cores[] = array(array(189,201,225),array(103,169,207),array(28,144,153),array(1,108,89));
  549 + $cores[] = array(array(215,181,216),array(223,101,176),array(221,28,119),array(152,0,67));
  550 + $cores[] = array(array(251,180,185),array(247,104,161),array(197,27,138),array(122,1,119));
  551 + $cores[] = array(array(194,230,153),array(120,198,121),array(49,163,84),array(0,104,55));
  552 + $cores[] = array(array(255,255,178),array(254,204,92),array(253,141,60),array(240,59,32));
  553 + $cores = $cores[mt_rand(0,9)];
  554 + include_once("classe_estatistica.php");
  555 + $estat = new estatistica();
  556 + $estat->calcula($valores);
  557 + $calc = $estat->resultado;
  558 + $titulo = array();
  559 + //adiciona as classes novas
  560 + $expressao[] = "([".$item."]<=".($calc["quartil1"]).")";
  561 + $titulo[] = "Quartil 1: <=".$calc["quartil1"];
  562 + $expressao[] = "(([".$item."]>".($calc["quartil1"]).")and([".$item."]<=".($calc["quartil2"])."))";
  563 + $titulo[] = "Quartil 2: >".$calc["quartil1"]." e <= ".$calc["quartil2"];
  564 + if($calc["quartil3"] != 0){
  565 + $expressao[] = "(([".$item."]>".($calc["quartil2"]).")and([".$item."]<=".($calc["quartil3"])."))";
  566 + $titulo[] = "Quartil 3: >".$calc["quartil2"]." e <= ".$calc["quartil3"];
  567 + $expressao[] = "([".$item."]>".($calc["quartil3"]).")";
  568 + $titulo[] = "Quartil 4: >".$calc["quartil3"];
  569 + }
  570 + $classes[] = array(
  571 + "expressao"=>"([".$item."]= 0)",
  572 + "titulo"=>"0",
  573 + "verde"=>100,
  574 + "vermelho"=>100,
  575 + "azul"=>100
  576 + );
  577 + for ($i=0;$i < count($expressao);++$i){
  578 + $classes[] = array(
  579 + "expressao"=>$expressao[$i],
  580 + "titulo"=>$titulo[$i],
  581 + "verde"=>$cores[$i][1],
  582 + "vermelho"=>$cores[$i][0],
  583 + "azul"=>$cores[$i][2]
  584 + );
  585 + }
  586 + }
  587 + if(!empty($titulolayer)){
  588 + $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer));
  589 + }
  590 + else{
  591 + $titulolayer = mb_convert_encoding($sql["titulo"],"ISO-8859-1",mb_detect_encoding($sql["titulo"]));
  592 + }
  593 + //necessario para evitar problemas com ITENSDESC
  594 + $titulolayer = str_replace(","," ",$titulolayer);
  595 + $titulolayer = str_replace("=",": ",$titulolayer);
  596 + //pega os parametros caso seja um mapfile para WMS-time
  597 + if($suportaWMST == true){
  598 + $sqlMinMax = "select min(dimtempo) as min,max(dimtempo) as max from(".$sql["sql"].") as x";
  599 + $minmaxdata = $this->execSQLDB($meta["codigo_estat_conexao"],$sqlMinMax );
  600 + $fontemeta = $this->listaFonteinfoMedida($id_medida_variavel);
  601 + if(count($fontemeta) > 0){
  602 + $fontemeta = $fontemeta[0]["link"];
  603 + }
  604 + else{
  605 + $fontemeta = "";
  606 + }
  607 + }
  608 + $dados[] = "MAP";
  609 + $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"';
  610 + $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"';
  611 + //inclui os simbolos que podem ser definidos como imagens
  612 + foreach($classes as $classe){
  613 + if(!empty($classe["simbolo"])){
  614 + if(file_exists($classe["simbolo"])){
  615 + $dados[] = "SYMBOL";
  616 + $dados[] = ' NAME "'.$classe["simbolo"].'"';
  617 + $dados[] = ' TYPE pixmap';
  618 + $dados[] = ' IMAGE "'.$classe["simbolo"].'"';
  619 + $dados[] = "END";
  620 + }
  621 + }
  622 + }
  623 + $dados[] = "LAYER";
  624 + $dados[] = ' NAME "'.$this->nomecache.'"';
  625 + $dados[] = " TYPE $tipolayer";
  626 + $dados[] = ' DATA "'.$sqlf.'"';
  627 + $dados[] = ' CONNECTION "'.$conexao.'"';
  628 + $dados[] = ' CONNECTIONTYPE POSTGIS';
  629 + $dados[] = ' STATUS OFF';
  630 + $dados[] = ' TEMPLATE "none.htm"';
  631 + if($opacidade != ""){
  632 + $dados[] = ' OPACITY '.$opacidade;
  633 + }
  634 + $dados[] = ' METADATA';
  635 + $dados[] = ' TEMA "'.$titulolayer.'"';
  636 + $dados[] = ' tme "{\"titulo\":\"'.$titulolayer.'\",\"colnome\":\"'.$sql["nomeregiao"].'\",\"colsdata\":[\"'.$sql["colunavalor"].'\"],\"lmax\":\"8000\",\"amax\":\"500000\",\"outlinecolor\":\"-1,-1,-1\",\"numvertices\":\"4\",\"auto\":\"nao\",\"exec\":\"nao\"}"';
  637 +
  638 + $dados[] = ' TIP "'.$sql["colunavalor"].','.$sql["nomeregiao"].'"';
  639 + $dados[] = ' CLASSE "SIM"';
  640 + $dados[] = ' permitedownload "SIM"';
  641 + $dados[] = ' METAESTAT "SIM"';
  642 + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
  643 + $dados[] = ' METAESTAT_ID_MEDIDA_VARIAVEL "'.$id_medida_variavel.'"';
  644 + //marca se a tabela e editavel, verificando se esta no esquema padrao
  645 + if($meta["esquemadb"] == "i3geo_metaestat"){
  646 + $dados[] = ' EDITAVEL "SIM"';
  647 + $dados[] = ' COLUNAIDUNICO "'.$meta["colunaidunico"].'"';
  648 + $dados[] = ' TABELAEDITAVEL "'.$meta["tabela"].'"';
  649 + $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"';
  650 + }
  651 + if(count($sql["alias"]) > 0){
  652 + $dados[] = ' ITENS "'.implode(",",$sql["colunas"]).'"';
  653 + $dados[] = ' ITENSDESC "'.implode(",",$sql["alias"]).'"';
  654 + }
  655 + if($suportaWMST == true){
  656 + $dados[] = ' "wms_timeitem" "dimtempo"';
  657 + $dados[] = ' "wms_timeextent" "'.$minmaxdata[0]["min"]."/".$minmaxdata[0]["max"].'"';
  658 + $dados[] = ' "wms_timedefault" "'.$minmaxdata[0]["max"].'"';
606 659 $dados[] = ' "ows_metadataurl_href" "'.$fontemeta.'"';
607 660 $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   - }
  661 + $dados[] = ' "ows_metadataurl_format" "text/html" ';
  662 + }
  663 + $dados[] = ' END';
  664 + if($classes == ""){
  665 + $dados[] = ' CLASS';
  666 + $dados[] = ' NAME ""';
  667 + $dados[] = ' STYLE';
  668 + $dados[] = ' COLOR 200 0 0';
  669 + if(strtolower($tipolayer) == "point"){
  670 + $dados[] = ' SYMBOL "ponto"';
  671 + $dados[] = ' SIZE 5';
  672 + }
  673 + $dados[] = ' END';
  674 + $dados[] = ' END';
  675 + }
  676 + else{
  677 + foreach($classes as $classe){
  678 + //var_dump($classe);exit;
  679 + $dados[] = ' CLASS';
  680 + $dados[] = ' NAME "'.mb_convert_encoding($classe["titulo"],"ISO-8859-1",mb_detect_encoding($classe["titulo"])).'"';
  681 + if($classe["expressao"] != ""){
  682 + $expressao = str_replace('"',"'",$classe["expressao"]);
  683 + $dados[] = " EXPRESSION ".$expressao;
  684 + }
  685 + $dados[] = ' STYLE';
  686 + $dados[] = ' COLOR '.$classe["vermelho"].' '.$classe["verde"].' '.$classe["azul"];
  687 + if(!empty($classe["tamanho"])){
  688 + $dados[] = ' SIZE '.$classe["tamanho"];
  689 + }
  690 + elseif(strtolower($tipolayer) == "point"){
  691 + $dados[] = ' SIZE 5';
  692 + }
  693 + if(!empty($classe["simbolo"])){
  694 + $dados[] = ' SYMBOL '.$classe["simbolo"];
  695 + }
643 696 elseif(strtolower($tipolayer) == "point"){
644 697 $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 . $this->nomeRandomico(3) . ".map";
688   - }
689   -
690   - if(!file_exists($arq)){
691   -
692   - $tipolayer = "polygon";
  698 + }
  699 + if(!empty($classe["otamanho"])){
  700 + $dados[] = ' OUTLINEWIDTH '.$classe["otamanho"];
  701 + }
  702 + if(!empty($classe["overmelho"]) || $classe["overmelho"] == "0"){
  703 + $dados[] = ' OUTLINECOLOR '.$classe["overmelho"].' '.$classe["overde"].' '.$classe["oazul"];
  704 + }
  705 + $dados[] = ' END';
  706 + $dados[] = ' END';
  707 + }
  708 + }
  709 + $dados[] = "END";
  710 + $dados[] = "END";
  711 + $fp = fopen($arq,"w");
  712 + foreach ($dados as $dado){
  713 + fwrite($fp,$dado."\n");
  714 + }
  715 + }
  716 + return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer);
  717 + }
  718 + /**
  719 + * Cria um mapfile para visualizacao de regioes
  720 + * Inclui no arquivo o layer de acesso aos dados
  721 + * O mapfile contem apenas o layer
  722 + * O arquivo e armazenado em uma pasta temporaria
  723 + * Se o arquivo para a mesma regiao ja existir, tenta usa-lo ao inves de criar um novo
  724 + * @param codigo da regiao
  725 + * @param cor do outline do simbolo de desenho
  726 + * @param largura do simbolo
  727 + * @param sim|nao inclui ou nao os labels
  728 + * @param boolean remove o arquivo em cache e cria um novo
  729 + * @return array("mapfile"=>,"layer"=>,"titulolayer"=>,"codigo_tipo_regiao"=>)
  730 + */
  731 + function mapfileTipoRegiao($codigo_tipo_regiao,$outlinecolor="255,0,0",$width=1,$nomes="nao",$forcaArquivo=false){
  732 + //para permitir a inclusao de filtros, o fim do sql e marcado com /*FW*//*FW*/
  733 + //indicando onde deve comecar e terminar uma possivel clausula where
  734 + //Layers adicionados aqui sao marcados com o metadata METAESTAT "SIM"
  735 + //O codigo_tipo_regiao e marcado com o metadata METAESTAT_CODIGO_TIPO_REGIAO
  736 + if($forcaArquivo == false){
  737 + $arq = $this->dir_tmp."/".$this->nomecache.".map";
  738 + }
  739 + else{
  740 + $arq = $this->dir_tmp."/".$this->nomecache . $this->nomeRandomico(3) . ".map";
  741 + }
  742 +
  743 + if(!file_exists($arq)){
  744 +
  745 + $tipolayer = "polygon";
693 746 //define o tipo correto de layer
694   - $dg = $this->listaDadosGeometriaRegiao($codigo_tipo_regiao);
  747 + $dg = $this->listaDadosGeometriaRegiao($codigo_tipo_regiao);
695 748  
696 749 if(empty($tipolayer)){
697 750 $tipolayer = "polygon";
698   - }
  751 + }
699 752 if($dg["dimension"] == 0){
700 753 $tipolayer = "point";
701 754 }
702 755 if($dg["dimension"] == 1){
703 756 $tipolayer = "line";
704   - }
705   -
706   - $meta = $this->listaTipoRegiao($codigo_tipo_regiao);
707   - $titulolayer = $meta["nome_tipo_regiao"];
708   - $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer));
709   - $conexao = $this->listaConexao($meta["codigo_estat_conexao"],true);
710   - $conexao = "user=".$conexao["usuario"]." password=".$conexao["senha"]." dbname=".$conexao["bancodedados"]." host=".$conexao["host"]." port=".$conexao["porta"]."";
711   - $colunageo = $meta["colunageo"];
712   - $srid = $meta["srid"];
713   - //pega as colunas menos as do tipo geometry
714   - $colunastabela = $this->colunasTabela($meta["codigo_estat_conexao"],$meta["esquemadb"],$meta["tabela"],"geometry","!=");
715   - //define as colunas que serao mostradas no sql
716   - $vis = $meta["colunasvisiveis"];
717   - $colunaSerial = $this->listaTipoRegiaoSerial($codigo_tipo_regiao);
718   - if($vis != ""){
719   - $vis = str_replace(";",",",$vis);
720   - $vis = str_replace(",,",",",$vis);
721   - $vis = explode(",",$vis);
722   - $itens = $vis;//array
723   - $vis[] = $meta["identificador"];
724   - if(!empty($colunaSerial)){
725   - $vis[] = $colunaSerial;
726   - }
727   - $vis = array_unique($vis);
728   - $visiveis = array();
729   - //verifica se as colunas existem mesmo
730   - foreach($vis as $v){
731   - if(in_array($v,$colunastabela)){
732   - $visiveis[] = $v;
733   - }
734   - }
735   - $vis = implode(",",$visiveis);
736   - //apelidos
737   - $apelidos = $meta["apelidos"];
738   - if($apelidos == ""){
739   - $apelidos = "Nome";
740   - }
  757 + }
  758 +
  759 + $meta = $this->listaTipoRegiao($codigo_tipo_regiao);
  760 + $titulolayer = $meta["nome_tipo_regiao"];
  761 + $titulolayer = mb_convert_encoding($titulolayer,"ISO-8859-1",mb_detect_encoding($titulolayer));
  762 + $conexao = $this->listaConexao($meta["codigo_estat_conexao"],true);
  763 + $conexao = "user=".$conexao["usuario"]." password=".$conexao["senha"]." dbname=".$conexao["bancodedados"]." host=".$conexao["host"]." port=".$conexao["porta"]."";
  764 + $colunageo = $meta["colunageo"];
  765 + $srid = $meta["srid"];
  766 + //pega as colunas menos as do tipo geometry
  767 + $colunastabela = $this->colunasTabela($meta["codigo_estat_conexao"],$meta["esquemadb"],$meta["tabela"],"geometry","!=");
  768 + //define as colunas que serao mostradas no sql
  769 + $vis = $meta["colunasvisiveis"];
  770 + $colunaSerial = $this->listaTipoRegiaoSerial($codigo_tipo_regiao);
  771 + if($vis != ""){
  772 + $vis = str_replace(";",",",$vis);
  773 + $vis = str_replace(",,",",",$vis);
  774 + $vis = explode(",",$vis);
  775 + $itens = $vis;//array
  776 + $vis[] = $meta["identificador"];
  777 + if(!empty($colunaSerial)){
  778 + $vis[] = $colunaSerial;
  779 + }
  780 + $vis = array_unique($vis);
  781 + $visiveis = array();
  782 + //verifica se as colunas existem mesmo
  783 + foreach($vis as $v){
  784 + if(in_array($v,$colunastabela)){
  785 + $visiveis[] = $v;
  786 + }
  787 + }
  788 + $vis = implode(",",$visiveis);
  789 + //apelidos
  790 + $apelidos = $meta["apelidos"];
  791 + if($apelidos == ""){
  792 + $apelidos = "Nome";
  793 + }
741 794 $apelidos = str_replace(";",",",$apelidos);
742   - $apelidos = str_replace(",,",",",$apelidos);
  795 + $apelidos = str_replace(",,",",",$apelidos);
743 796 $apelidos = mb_convert_encoding($apelidos,"ISO-8859-1",mb_detect_encoding($apelidos));
744   - $apelidos = explode(",",$apelidos);
745   - if(!empty($colunaSerial)){
746   - $apelidos[] = $colunaSerial." (serial)";
  797 + $apelidos = explode(",",$apelidos);
  798 + if(!empty($colunaSerial)){
  799 + $apelidos[] = $colunaSerial." (serial)";
  800 + }
  801 + $apelidos = array_unique($apelidos);
  802 + }
  803 + else{
  804 + $itens = array();
  805 + $apelidos = array();
  806 + if(!empty($colunaSerial)){
  807 + $colunastabela[] = $colunaSerial;
  808 + $colunastabela = array_unique($colunastabela);
747 809 }
748   - $apelidos = array_unique($apelidos);
749   - }
750   - else{
751   - $itens = array();
752   - $apelidos = array();
753   - if(!empty($colunaSerial)){
754   - $colunastabela[] = $colunaSerial;
755   - $colunastabela = array_unique($colunastabela);
756   - }
757   - $vis = implode(",",$colunastabela);
758   - }
759   - $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;
760   - $sqlf = str_replace(",,",",",$sqlf);
761   - $outlinecolor = str_replace(","," ",$outlinecolor);
762   - $dados[] = "MAP";
763   - $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"';
764   - $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"';
765   - $dados[] = "LAYER";
766   - $dados[] = ' NAME "'.$this->nomecache.'"';
767   - $dados[] = " TYPE $tipolayer";
768   - $dados[] = ' DATA "'.$sqlf.'"';
769   - $dados[] = ' CONNECTION "'.$conexao.'"';
770   - $dados[] = ' CONNECTIONTYPE POSTGIS';
771   - $dados[] = ' TEMPLATE "none.htm"';
772   - $dados[] = ' STATUS OFF';
773   - $dados[] = ' METADATA';
774   - $dados[] = ' TEMA "'.$titulolayer.'"';
775   - $dados[] = ' CLASSE "SIM"';
776   - $dados[] = ' METAESTAT "SIM"';
777   - $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
  810 + $vis = implode(",",$colunastabela);
  811 + }
  812 + $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;
  813 + $sqlf = str_replace(",,",",",$sqlf);
  814 + $outlinecolor = str_replace(","," ",$outlinecolor);
  815 + $dados[] = "MAP";
  816 + $dados[] = 'SYMBOLSET "'.$this->locaplic.'/symbols/simbolosv6.sym"';
  817 + $dados[] = 'FONTSET "'.$this->locaplic.'/symbols/fontes.txt"';
  818 + $dados[] = "LAYER";
  819 + $dados[] = ' NAME "'.$this->nomecache.'"';
  820 + $dados[] = " TYPE $tipolayer";
  821 + $dados[] = ' DATA "'.$sqlf.'"';
  822 + $dados[] = ' CONNECTION "'.$conexao.'"';
  823 + $dados[] = ' CONNECTIONTYPE POSTGIS';
  824 + $dados[] = ' TEMPLATE "none.htm"';
  825 + $dados[] = ' STATUS OFF';
  826 + $dados[] = ' METADATA';
  827 + $dados[] = ' TEMA "'.$titulolayer.'"';
  828 + $dados[] = ' CLASSE "SIM"';
  829 + $dados[] = ' METAESTAT "SIM"';
  830 + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
778 831 if(!empty($colunaSerial)){
779   - $dados[] = ' EDITAVEL "SIM"';
780   - $dados[] = ' COLUNAIDUNICO "'.$colunaSerial.'"';
  832 + $dados[] = ' EDITAVEL "SIM"';
  833 + $dados[] = ' COLUNAIDUNICO "'.$colunaSerial.'"';
781 834 $dados[] = ' TABELAEDITAVEL "'.$meta["tabela"].'"';
782   - $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"';
783   - $dados[] = ' COLUNAGEOMETRIA "'.$colunageo.'"';
784   - }
785   - $dados[] = ' TIP "'.$meta["colunanomeregiao"].'"';
786   - if(count($itens) == count($apelidos)){
787   - $dados[] = ' ITENS "'.implode(",",$itens).'"';
788   - $dados[] = ' ITENSDESC "'.implode(",",$apelidos).'"';
789   - }
790   -
791   - $dados[] = ' END';
792   - $dados[] = ' CLASS';
793   - $dados[] = ' NAME ""';
794   - $dados[] = ' STYLE';
795   - $dados[] = ' OUTLINECOLOR '.$outlinecolor;
796   -
797   - $dados[] = ' WIDTH '.$width;
  835 + $dados[] = ' ESQUEMATABELAEDITAVEL "'.$meta["esquemadb"].'"';
  836 + $dados[] = ' COLUNAGEOMETRIA "'.$colunageo.'"';
  837 + }
  838 + $dados[] = ' TIP "'.$meta["colunanomeregiao"].'"';
  839 + if(count($itens) == count($apelidos)){
  840 + $dados[] = ' ITENS "'.implode(",",$itens).'"';
  841 + $dados[] = ' ITENSDESC "'.implode(",",$apelidos).'"';
  842 + }
  843 +
  844 + $dados[] = ' END';
  845 + $dados[] = ' CLASS';
  846 + $dados[] = ' NAME ""';
  847 + $dados[] = ' STYLE';
  848 + $dados[] = ' OUTLINECOLOR '.$outlinecolor;
  849 +
  850 + $dados[] = ' WIDTH '.$width;
798 851 if(strtolower($tipolayer) == "point"){
799 852 $dados[] = ' SYMBOL "ponto"';
800   - $dados[] = ' SIZE 5';
  853 + $dados[] = ' SIZE 5';
801 854 $dados[] = ' COLOR 0 0 0 ';
802   - }
803   - else{
804   - $dados[] = ' COLOR -1 -1 -1';
805   - }
806   - $dados[] = ' END';
807   - //$dados[] = ' STYLE';
808   - //$dados[] = ' OUTLINECOLOR -1 -1 -1';
809   - //$dados[] = ' COLOR 255 255 255';
810   - //$dados[] = ' OPACITY 20';
811   - //$dados[] = ' END';
812   - $dados[] = ' END';
813   - $dados[] = "END";
814   - //toponimia
815   - if($nomes == "sim"){
816   - $dados[] = "LAYER";
817   - $dados[] = ' NAME "'.$this->nomecache.'_anno"';
818   - $dados[] = " TYPE ANNOTATION";
819   - $dados[] = ' DATA "'.$sqlf.'"';
820   - $dados[] = ' CONNECTION "'.$conexao.'"';
821   - $dados[] = ' CONNECTIONTYPE POSTGIS';
822   - $dados[] = ' TEMPLATE "none.htm"';
823   - $dados[] = ' STATUS OFF';
824   - $dados[] = ' LABELITEM "'.$meta["colunanomeregiao"].'"';
825   - $dados[] = ' METADATA';
826   - $dados[] = ' TEMA "'.$titulolayer.' (nomes)"';
827   - $dados[] = ' CLASSE "SIM"';
828   - $dados[] = ' METAESTAT "SIM"';
829   - $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
830   - $dados[] = ' END';
831   - $dados[] = ' CLASS';
832   - $dados[] = ' NAME ""';
833   - $dados[] = ' LABEL';
834   - $dados[] = ' FONT "arial"';
835   - $dados[] = ' SIZE 10';
836   - $dados[] = ' COLOR 0 0 0';
837   - $dados[] = ' MINDISTANCE 0';
838   - $dados[] = ' MINFEATURESIZE 0';
839   - $dados[] = ' OFFSET 0 0';
840   - $dados[] = ' OUTLINECOLOR 255 255 255';
841   - $dados[] = ' PARTIALS FALSE';
842   - $dados[] = ' POSITION AUTO';
843   - $dados[] = ' SHADOWSIZE 1 1';
844   - $dados[] = ' TYPE TRUETYPE';
845   - $dados[] = ' END';
846   - $dados[] = ' END';
847   - $dados[] = "END";
848   - }
849   - $dados[] = "END";
850   - $fp = fopen($arq,"w");
851   - foreach ($dados as $dado){
852   - fwrite($fp,$dado."\n");
853   - }
854   - }
855   - return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer,"codigo_tipo_regiao"=>$codigo_tipo_regiao);
856   - }
857   - /**
858   - * Complementa um mapfile resumido inserindo seus layers em um mapfile completo, contendo todos os elementos necessarios para uso
859   - * Usado na geracao de WMS e outros servicos
860   - * @param mapfile resumido
861   - * @return nome do arquivo com o mapfile completo
862   - */
863   - function mapfileCompleto($mapfile){
864   - $f = $this->base;
865   - if($f == ""){
866   - include_once($this->locaplic."/classesphp/funcoes_gerais.php");
867   - $versao = versao();
868   - $versao = $versao["principal"];
869   - $f = "";
870   - if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')){
871   - $f = $this->locaplic."/aplicmap/geral1windowsv".$versao.".map";
872   - }
873   - else{
874   - if($f == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv'.$versao.'.map')){
875   - $f = "/var/www/i3geo/aplicmap/geral1debianv".$versao.".map";
876   - }
877   - if($f == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
878   - $f = "/var/www/html/i3geo/aplicmap/geral1fedorav".$versao.".map";
879   - }
880   - if($f == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
881   - $f = "/opt/www/html/i3geo/aplicmap/geral1v".$versao.".map";
882   - }
883   - if($f == "") {
884   - $f = $this->locaplic."/aplicmap/geral1v".$versao.".map";
885   - }
886   - }
887   - }
888   - $mapa = ms_newMapObj($f);
889   - $n = $mapa->numlayers;
890   - for($i=0;$i<$n;$i++){
891   - $l = $mapa->getlayer($i);
892   - $l->set("status",MS_DELETE);
893   - }
894   - $mapatemp = ms_newMapObj($mapfile);
895   - $l = $mapatemp->getlayer(0);
896   -
897   - $l->set("status",MS_DEFAULT);
898   - $novonome = str_replace(".map","completo.map",$mapfile);
899   - //necessario para o kml
900   - $mapa->setmetadata("ows_enable_request","*");
901   - $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";
902   - $l->setmetadata("ows_srs",$listaepsg);
903   - $temp = ms_newLayerObj($mapa,$l);
904   - $mapa->save($novonome);
905   - return $novonome;
906   - }
907   - /**
908   - * Obtem os dados de uma medida de variavel
909   - * @param id da medida
910   - * @param filtro que sera concatenado ao sql
911   - * @param 0|1 mostra ou nao todas as colunas da tabela com os dados
912   - * @param coluna de agrupamento
913   - * @param limite do numero de registros
914   - * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
915   - * @return execSQL
916   - */
917   - function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){
918   - set_time_limit(0);
919   - $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto);
920   - $sqlf = $sql["sqlmapserver"];
921   - //remove marcadores geo
922   - $sqlf = explode("/*SE*/",$sqlf);
923   - $sqlf = explode("/*SG*/",$sqlf[1]);
924   - $sqlf = $sqlf[0]." ".$sqlf[2];
925   - if($limite != ""){
926   - $sqlf .= " limit ".$limite;
927   - }
928   - $sqlf = str_replace(", FROM"," FROM",$sqlf);
929   - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
930   - //echo $sqlf;exit;
931   - if(!empty($metaVariavel["codigo_estat_conexao"])){
932   - $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
933   - $dbhold = $this->dbh;
934   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
935   - $this->dbh = $dbh;
936   - $res = $this->execSQL($sqlf);
937   - $this->dbh = $dbhold;
938   - return $res;
939   - }
940   - return false;
941   - }
942   - /**
943   - * Lista as ocorrencias de valores em uma coluna de uma medida de variavel
944   - * @param id da medida de variavel
945   - * @param coluna
946   - * @return execSQL
947   - */
948   - function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){
949   - $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna);
950   - $sqlf = $sqlf["sqlagrupamento"];
951   - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
952   - if(!empty($metaVariavel["codigo_estat_conexao"])){
953   - $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
954   - $dbhold = $this->dbh;
955   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
956   - $this->dbh = $dbh;
957   - $res = $this->execSQL($sqlf);
958   - $this->dbh = $dbhold;
959   - return $res;
960   - }
961   - return false;
962   - }
963   - /**
964   - * Sumario estatistico de uma medida de variavel
965   - * @param id da medida
966   - * @param filtro a ser concatenado ao sql
967   - * @param coluna de agrupamento
968   - * @param limite numero maximo de registros que serao lidos do banco
969   - * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
970   - * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>)
971   - */
972   - function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){
973   - if(!empty($agruparpor)){
974   - $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto);
975   - }
976   - else{
977   - $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto);
978   - }
979   - if($dados){
980   - $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
981   - $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]);
982   - $agrupamento = "";
983   - $colunavalor = $metaVariavel["colunavalor"];
984   - foreach($dados as $d){
985   - if($d[$colunavalor]){
986   - $valores[] = $d[$colunavalor];
987   - }
988   - }
989   - if(!empty($agruparpor)){
990   - $agrupamento = array();
991   - foreach($dados as $d){
992   - $g = $d[$agruparpor];
993   - //var_dump($d);exit;
994   - if(!empty($agrupamento[$g])){
995   - $agrupamento[$g] += $d[$colunavalor];
996   - }
997   - else{
998   - $agrupamento[$g] = $d[$colunavalor];
999   - }
1000   - }
1001   - natsort($agrupamento);
1002   - }
1003   - $soma = "";
1004   - $media = "";
1005   - $min = "";
1006   - $max = "";
1007   - $quantidade = count($valores);
  855 + }
  856 + else{
  857 + $dados[] = ' COLOR -1 -1 -1';
  858 + }
  859 + $dados[] = ' END';
  860 + //$dados[] = ' STYLE';
  861 + //$dados[] = ' OUTLINECOLOR -1 -1 -1';
  862 + //$dados[] = ' COLOR 255 255 255';
  863 + //$dados[] = ' OPACITY 20';
  864 + //$dados[] = ' END';
  865 + $dados[] = ' END';
  866 + $dados[] = "END";
  867 + //toponimia
  868 + if($nomes == "sim"){
  869 + $dados[] = "LAYER";
  870 + $dados[] = ' NAME "'.$this->nomecache.'_anno"';
  871 + $dados[] = " TYPE ANNOTATION";
  872 + $dados[] = ' DATA "'.$sqlf.'"';
  873 + $dados[] = ' CONNECTION "'.$conexao.'"';
  874 + $dados[] = ' CONNECTIONTYPE POSTGIS';
  875 + $dados[] = ' TEMPLATE "none.htm"';
  876 + $dados[] = ' STATUS OFF';
  877 + $dados[] = ' LABELITEM "'.$meta["colunanomeregiao"].'"';
  878 + $dados[] = ' METADATA';
  879 + $dados[] = ' TEMA "'.$titulolayer.' (nomes)"';
  880 + $dados[] = ' CLASSE "SIM"';
  881 + $dados[] = ' METAESTAT "SIM"';
  882 + $dados[] = ' METAESTAT_CODIGO_TIPO_REGIAO "'.$codigo_tipo_regiao.'"';
  883 + $dados[] = ' END';
  884 + $dados[] = ' CLASS';
  885 + $dados[] = ' NAME ""';
  886 + $dados[] = ' LABEL';
  887 + $dados[] = ' FONT "arial"';
  888 + $dados[] = ' SIZE 10';
  889 + $dados[] = ' COLOR 0 0 0';
  890 + $dados[] = ' MINDISTANCE 0';
  891 + $dados[] = ' MINFEATURESIZE 0';
  892 + $dados[] = ' OFFSET 0 0';
  893 + $dados[] = ' OUTLINECOLOR 255 255 255';
  894 + $dados[] = ' PARTIALS FALSE';
  895 + $dados[] = ' POSITION AUTO';
  896 + $dados[] = ' SHADOWSIZE 1 1';
  897 + $dados[] = ' TYPE TRUETYPE';
  898 + $dados[] = ' END';
  899 + $dados[] = ' END';
  900 + $dados[] = "END";
  901 + }
  902 + $dados[] = "END";
  903 + $fp = fopen($arq,"w");
  904 + foreach ($dados as $dado){
  905 + fwrite($fp,$dado."\n");
  906 + }
  907 + }
  908 + return array("mapfile"=>$arq,"layer"=>$this->nomecache,"titulolayer"=>$titulolayer,"codigo_tipo_regiao"=>$codigo_tipo_regiao);
  909 + }
  910 + /**
  911 + * Complementa um mapfile resumido inserindo seus layers em um mapfile completo, contendo todos os elementos necessarios para uso
  912 + * Usado na geracao de WMS e outros servicos
  913 + * @param mapfile resumido
  914 + * @return nome do arquivo com o mapfile completo
  915 + */
  916 + function mapfileCompleto($mapfile){
  917 + $f = $this->base;
  918 + if($f == ""){
  919 + include_once($this->locaplic."/classesphp/funcoes_gerais.php");
  920 + $versao = versao();
  921 + $versao = $versao["principal"];
  922 + $f = "";
  923 + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')){
  924 + $f = $this->locaplic."/aplicmap/geral1windowsv".$versao.".map";
  925 + }
  926 + else{
  927 + if($f == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv'.$versao.'.map')){
  928 + $f = "/var/www/i3geo/aplicmap/geral1debianv".$versao.".map";
  929 + }
  930 + if($f == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
  931 + $f = "/var/www/html/i3geo/aplicmap/geral1fedorav".$versao.".map";
  932 + }
  933 + if($f == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
  934 + $f = "/opt/www/html/i3geo/aplicmap/geral1v".$versao.".map";
  935 + }
  936 + if($f == "") {
  937 + $f = $this->locaplic."/aplicmap/geral1v".$versao.".map";
  938 + }
  939 + }
  940 + }
  941 + $mapa = ms_newMapObj($f);
  942 + $n = $mapa->numlayers;
  943 + for($i=0;$i<$n;$i++){
  944 + $l = $mapa->getlayer($i);
  945 + $l->set("status",MS_DELETE);
  946 + }
  947 + $mapatemp = ms_newMapObj($mapfile);
  948 + $l = $mapatemp->getlayer(0);
  949 +
  950 + $l->set("status",MS_DEFAULT);
  951 + $novonome = str_replace(".map","completo.map",$mapfile);
  952 + //necessario para o kml
  953 + $mapa->setmetadata("ows_enable_request","*");
  954 + $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";
  955 + $l->setmetadata("ows_srs",$listaepsg);
  956 + $temp = ms_newLayerObj($mapa,$l);
  957 + $mapa->save($novonome);
  958 + return $novonome;
  959 + }
  960 + /**
  961 + * Obtem os dados de uma medida de variavel
  962 + * @param id da medida
  963 + * @param filtro que sera concatenado ao sql
  964 + * @param 0|1 mostra ou nao todas as colunas da tabela com os dados
  965 + * @param coluna de agrupamento
  966 + * @param limite do numero de registros
  967 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  968 + * @return execSQL
  969 + */
  970 + function dadosMedidaVariavel($id_medida_variavel,$filtro="",$todasascolunas = 0,$agruparpor = "",$limite="",$direto=false){
  971 + set_time_limit(0);
  972 + $sql = $this->sqlMedidaVariavel($id_medida_variavel,$todasascolunas,$agruparpor,"polygon","",false,$filtro,$direto);
  973 + $sqlf = $sql["sqlmapserver"];
  974 + //remove marcadores geo
  975 + $sqlf = explode("/*SE*/",$sqlf);
  976 + $sqlf = explode("/*SG*/",$sqlf[1]);
  977 + $sqlf = $sqlf[0]." ".$sqlf[2];
  978 + if($limite != ""){
  979 + $sqlf .= " limit ".$limite;
  980 + }
  981 + $sqlf = str_replace(", FROM"," FROM",$sqlf);
  982 + //echo $sqlf;exit;
  983 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  984 + if(!empty($metaVariavel["codigo_estat_conexao"])){
  985 + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
  986 + $dbhold = $this->dbh;
  987 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  988 + $this->dbh = $dbh;
  989 + $res = $this->execSQL($sqlf);
  990 + $this->dbh = $dbhold;
  991 + return $res;
  992 + }
  993 + return false;
  994 + }
  995 + /**
  996 + * Lista as ocorrencias de valores em uma coluna de uma medida de variavel
  997 + * @param id da medida de variavel
  998 + * @param coluna
  999 + * @return execSQL
  1000 + */
  1001 + function valorUnicoMedidaVariavel($id_medida_variavel,$coluna){
  1002 + $sqlf = $this->sqlMedidaVariavel($id_medida_variavel,0,$coluna);
  1003 + $sqlf = $sqlf["sqlagrupamento"];
  1004 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  1005 + if(!empty($metaVariavel["codigo_estat_conexao"])){
  1006 + $c = $this->listaConexao($metaVariavel["codigo_estat_conexao"],true);
  1007 + $dbhold = $this->dbh;
  1008 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1009 + $this->dbh = $dbh;
  1010 + $res = $this->execSQL($sqlf);
  1011 + $this->dbh = $dbhold;
  1012 + return $res;
  1013 + }
  1014 + return false;
  1015 + }
  1016 + /**
  1017 + * Sumario estatistico de uma medida de variavel
  1018 + * @param id da medida
  1019 + * @param filtro a ser concatenado ao sql
  1020 + * @param coluna de agrupamento
  1021 + * @param limite numero maximo de registros que serao lidos do banco
  1022 + * @param le os dados diretamente da tabela sem nenhum tipo de agrupamento, seja por data ou outro parametro
  1023 + * @return array("colunavalor"=>,"soma"=>,"media"=>,"menor"=>,"maior"=>,"quantidade"=>,"histograma"=>,"grupos"=>,"unidademedida"=>,"quartis"=>)
  1024 + */
  1025 + function sumarioMedidaVariavel($id_medida_variavel,$filtro="",$agruparpor="",$limite="",$direto=false){
  1026 + if(!empty($agruparpor)){
  1027 + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,1,"",$limite,$direto);
  1028 + }
  1029 + else{
  1030 + $dados = $this->dadosMedidaVariavel($id_medida_variavel,$filtro,0,"",$limite,$direto);
  1031 + }
  1032 + if($dados){
  1033 + $metaVariavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  1034 + $un = $this->listaUnidadeMedida($metaVariavel["codigo_unidade_medida"]);
  1035 + $agrupamento = "";
  1036 + $colunavalor = $metaVariavel["colunavalor"];
  1037 + foreach($dados as $d){
  1038 + if($d[$colunavalor]){
  1039 + $valores[] = $d[$colunavalor];
  1040 + }
  1041 + }
  1042 + if(!empty($agruparpor)){
  1043 + $agrupamento = array();
  1044 + foreach($dados as $d){
  1045 + $g = $d[$agruparpor];
  1046 + //var_dump($d);exit;
  1047 + if(!empty($agrupamento[$g])){
  1048 + $agrupamento[$g] += $d[$colunavalor];
  1049 + }
  1050 + else{
  1051 + $agrupamento[$g] = $d[$colunavalor];
  1052 + }
  1053 + }
  1054 + natsort($agrupamento);
  1055 + }
  1056 + $soma = "";
  1057 + $media = "";
  1058 + $min = "";
  1059 + $max = "";
  1060 + $quantidade = count($valores);
1008 1061 $sturges = 1 + (3.322 * (log10($quantidade)));
1009   - $quartis = array();
1010   - if($un["permitesoma"] == "1"){
1011   - $soma = array_sum($valores);
1012   - }
1013   - if($un["permitemedia"] == "1"){
1014   - $media = $soma / $quantidade;
1015   - }
1016   - if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){
1017   - sort($valores);
1018   - //var_dump($valores);exit;
1019   - $min = $valores[0];
1020   - $max = $valores[$quantidade - 1];
1021   - include_once(dirname(__FILE__)."/classesphp/classe_estatistica.php");
1022   - $calc = new estatistica();
1023   - $calc->calcula($valores);
1024   - $v = $calc->resultado;
1025   - //expressao para o mapfile
1026   - $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")";
1027   - $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))";
1028   - if($v["quartil3"] != 0){
1029   - $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))";
1030   - $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")";
1031   - }
1032   - $nomes[] = "<= ".($v["quartil1"]);
1033   - $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]);
1034   - if($v["quartil3"] != 0){
1035   - $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]);
1036   - $nomes[] = "> ".($v["quartil3"]);
1037   - }
1038   - $quartis = array(
1039   - "cortes"=>array(
1040   - "q1"=>$v['quartil1'],
1041   - "q2"=>$v['quartil2'],
1042   - "q3"=>$v['quartil3']
1043   - ),
1044   - "expressoes"=>$expressao,
1045   - "nomes"=>$nomes
1046   - );
1047   - }
1048   - $histograma = array_count_values($valores);
1049   - //echo "<pre>".var_dump($quartis);exit;
1050   - return array(
1051   - "colunavalor"=>$colunavalor,
1052   - "soma"=>$soma,
1053   - "media"=>$media,
1054   - "menor"=>$min,
1055   - "maior"=>$max,
1056   - "quantidade"=>$quantidade,
1057   - "histograma"=>$histograma,
1058   - "grupos"=>$agrupamento,
1059   - "unidademedida"=>$un,
1060   - "quartis"=>$quartis,
1061   - "sturges"=>$sturges
1062   - );
1063   - }
1064   - return false;
1065   - }
1066   -
1067   -
1068   - /**
1069   - * Lista os dados de um ou de todos os mapas cadastrados
1070   - * @param id do mapa
  1062 + $quartis = array();
  1063 + if($un["permitesoma"] == "1"){
  1064 + $soma = array_sum($valores);
  1065 + }
  1066 + if($un["permitemedia"] == "1"){
  1067 + $media = $soma / $quantidade;
  1068 + }
  1069 + if($un["permitesoma"] == "1" || $un["permitemedia"] == "1"){
  1070 + sort($valores);
  1071 + //var_dump($valores);exit;
  1072 + $min = $valores[0];
  1073 + $max = $valores[$quantidade - 1];
  1074 + include_once(dirname(__FILE__)."/classesphp/classe_estatistica.php");
  1075 + $calc = new estatistica();
  1076 + $calc->calcula($valores);
  1077 + $v = $calc->resultado;
  1078 + //expressao para o mapfile
  1079 + $expressao[] = "([".$colunavalor."]<=".($v["quartil1"]).")";
  1080 + $expressao[] = "(([".$colunavalor."]>".($v["quartil1"]).")and([".$colunavalor."]<=".($v["quartil2"])."))";
  1081 + if($v["quartil3"] != 0){
  1082 + $expressao[] = "(([".$colunavalor."]>".($v["quartil2"]).")and([".$colunavalor."]<=".($v["quartil3"])."))";
  1083 + $expressao[] = "([".$colunavalor."]>".($v["quartil3"]).")";
  1084 + }
  1085 + $nomes[] = "<= ".($v["quartil1"]);
  1086 + $nomes[] = "> ".($v["quartil1"])." e <= ".($v["quartil2"]);
  1087 + if($v["quartil3"] != 0){
  1088 + $nomes[] = "> ".($v["quartil2"])." e <= ".($v["quartil3"]);
  1089 + $nomes[] = "> ".($v["quartil3"]);
  1090 + }
  1091 + $quartis = array(
  1092 + "cortes"=>array(
  1093 + "q1"=>$v['quartil1'],
  1094 + "q2"=>$v['quartil2'],
  1095 + "q3"=>$v['quartil3']
  1096 + ),
  1097 + "expressoes"=>$expressao,
  1098 + "nomes"=>$nomes
  1099 + );
  1100 + }
  1101 + $histograma = array_count_values($valores);
  1102 + //echo "<pre>".var_dump($quartis);exit;
  1103 + return array(
  1104 + "colunavalor"=>$colunavalor,
  1105 + "soma"=>$soma,
  1106 + "media"=>$media,
  1107 + "menor"=>$min,
  1108 + "maior"=>$max,
  1109 + "quantidade"=>$quantidade,
  1110 + "histograma"=>$histograma,
  1111 + "grupos"=>$agrupamento,
  1112 + "unidademedida"=>$un,
  1113 + "quartis"=>$quartis,
  1114 + "sturges"=>$sturges
  1115 + );
  1116 + }
  1117 + return false;
  1118 + }
  1119 +
  1120 +
  1121 + /**
  1122 + * Lista os dados de um ou de todos os mapas cadastrados
  1123 + * @param id do mapa
1071 1124 */
1072 1125 function listaMapas($id_mapa=""){
1073 1126 $sql = "select * from ".$this->esquemaadmin."i3geoestat_mapa ";
... ... @@ -1076,11 +1129,11 @@ class MetaestatInfo{
1076 1129 }
1077 1130 $sql .= "ORDER BY titulo";
1078 1131 return $this->execSQL($sql,$id_mapa);
1079   - }
1080   - /**
1081   - * Lista os dados de um ou de todos os mapas grupos de um mapa
1082   - * @param id do mapa
1083   - * @param id do grupo
  1132 + }
  1133 + /**
  1134 + * Lista os dados de um ou de todos os mapas grupos de um mapa
  1135 + * @param id do mapa
  1136 + * @param id do grupo
1084 1137 */
1085 1138 function listaGruposMapa($id_mapa,$id_mapa_grupo){
1086 1139 if(!empty($id_mapa)){
... ... @@ -1088,16 +1141,16 @@ class MetaestatInfo{
1088 1141 }
1089 1142 if(!empty($id_mapa_grupo)){
1090 1143 $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_grupo WHERE id_mapa_grupo = $id_mapa_grupo";
1091   - }
  1144 + }
1092 1145 $sql .= " ORDER BY titulo";
1093 1146 return $this->execSQL($sql,$id_mapa_grupo);
1094   - }
1095   - /**
1096   - * Lista os dados de um ou de todos os temas de um grupo de um mapa
1097   - * @param id do mapa
1098   - * @param id do grupo
1099   - * @param id do tema
1100   - */
  1147 + }
  1148 + /**
  1149 + * Lista os dados de um ou de todos os temas de um grupo de um mapa
  1150 + * @param id do mapa
  1151 + * @param id do grupo
  1152 + * @param id do tema
  1153 + */
1101 1154 function listaTemasMapa($id_mapa_grupo,$id_mapa_tema){
1102 1155 if(!empty($id_mapa_grupo)){
1103 1156 $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_mapa_tema WHERE id_mapa_grupo = $id_mapa_grupo";
... ... @@ -1107,276 +1160,276 @@ class MetaestatInfo{
1107 1160 }
1108 1161 $sql .= " ORDER BY titulo";
1109 1162 return $this->execSQL($sql,$id_mapa_tema);
1110   - }
1111   - /**
1112   - * Lista os dados de uma ou todas as unidades de medida cadastradas
1113   - * @param codigo da unidade
1114   - */
1115   - function listaUnidadeMedida($codigo_unidade_medida=""){
1116   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
1117   - if($codigo_unidade_medida != ""){
1118   - $sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
1119   - }
1120   - $sql .= "ORDER BY nome";
1121   - return $this->execSQL($sql,$codigo_unidade_medida);
1122   - }
1123   - /**
1124   - * Lista os dados de uma ou todas as fontes cadastradas
1125   - * @param id da fonte
1126   - */
1127   - function listaFonteinfo($id_fonteinfo=""){
1128   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
1129   - if($id_fonteinfo != ""){
1130   - $sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
1131   - }
1132   - $sql .= "ORDER BY titulo";
1133   - return $this->execSQL($sql,$id_fonteinfo);
1134   - }
1135   - /**
1136   - * Lista as fontes vinculadas a uma medida de variavel
1137   - * @param id da medida de variavel
1138   - */
1139   - function listaFonteinfoMedida($id_medida_variavel){
1140   - $sql = "SELECT i3geoestat_fonteinfo.* ";
1141   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
1142   - $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
1143   - $sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
1144   - $sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
1145   - $sql .= "ORDER BY titulo";
1146   - //echo $sql;exit;
1147   - return $this->execSQL($sql,$id_fonteinfo);
1148   - }
1149   - /**
1150   - * Lista os dados de uma ou todas as variaveis cadastradas
1151   - * @param codigo da variavel
1152   - * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
1153   - */
1154   - function listaVariavel($codigo_variavel="",$filtro_esquema=""){
1155   - $sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
1156   - if($codigo_variavel != ""){
1157   - $sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
1158   - }
1159   - if($filtro_esquema != ""){
1160   - $sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
1161   - }
1162   - $sql .= "ORDER BY a.nome";
1163   - //echo $sql;exit;
1164   - return $this->execSQL($sql,$codigo_variavel);
1165   - }
1166   - /**
1167   - * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
1168   - * @param id da medida de variavel
1169   - * @param id da classificacao
1170   - */
1171   - function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
1172   - if(!empty($id_medida_variavel)){
1173   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
1174   - }
1175   - if(!empty($id_classificacao)){
1176   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
1177   - }
1178   - return $this->execSQL($sql,$id_classificacao);
1179   - }
1180   - /**
1181   - * Lista os dados de um ou todos os links de uma medida
1182   - * @param id da medida
1183   - * @param id do link
1184   - */
1185   - function listaLinkMedida($id_medida_variavel,$id_link=""){
1186   - if(!empty($id_medida_variavel)){
1187   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
1188   - }
1189   - if(!empty($id_link)){
1190   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
1191   - }
1192   - return $this->execSQL($sql,$id_link);
1193   - }
1194   - /**
1195   - * Lista os dados de uma ou todas as classes de uma classificacao
1196   - * @param id da classificacao
1197   - * @param id da classe
1198   - */
1199   - function listaClasseClassificacao($id_classificacao,$id_classe=""){
1200   - if(!empty($id_classificacao)){
1201   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
1202   - }
1203   - if(!empty($id_classe)){
1204   - $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
1205   - }
1206   - return $this->execSQL($sql,$id_classe);
1207   - }
1208   - /**
1209   - * Lista os dados de uma ou todas as medidas de variavel de uma variavel
1210   - * @param codigo da variavel
1211   - * @param id da medida de variavel
1212   - */
1213   - function listaMedidaVariavel($codigo_variavel="",$id_medida_variavel=""){
1214   - $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 ";
1215   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
1216   - $sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
1217   - $sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
1218   - $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
1219   - $sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
1220   - if($codigo_variavel != ""){
1221   - $sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
1222   - if($id_medida_variavel != ""){
1223   - $sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
1224   - }
1225   - }
1226   - elseif($id_medida_variavel != "") {
1227   - $sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
1228   - }
1229   - $sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
1230   - $res = $this->execSQL($sql,$id_medida_variavel);
1231   - $res = str_replace('"',"'",$res);
1232   - return $res;
1233   - }
1234   - /**
1235   - * Lista as regioes vinculadas a uma medida de variavel
1236   - * @param id da medida de vriavel
1237   - */
1238   - function listaRegioesMedida($id_medida_variavel){
1239   - $variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
1240   - $codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
1241   - $regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
1242   - //var_dump($regioes);exit;
1243   - $agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
1244   - foreach($agregacoes as $a){
1245   - $regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
1246   - }
1247   - return $regioes;
1248   - }
1249   - /**
1250   - * Lista os dados de uma conexao ou de todas
1251   - * @param id da conexao
1252   - * @param boolean inclui na lista a senha ou nao
1253   - * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
1254   - */
1255   - function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
1256   - if($senha == true){
1257   - $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
1258   - }
1259   - else{
1260   - $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
1261   - }
1262   - $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
1263   - if($codigo_estat_conexao != ""){
1264   - $sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
1265   - }
1266   - $sql .= "ORDER BY bancodedados,host,usuario";
1267   - $res = $this->execSQL($sql,$codigo_estat_conexao);
1268   - //se achou e a requisico e para listar uma conexao, retorna o que for encontrado
1269   - $cres = count($res);
1270   - if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
1271   - return $res;
1272   - }
1273   - //caso contrario, e deve retornar todas as conexoes, inclui a fonte
1274   - if($codigo_estat_conexao == ""){
1275   - for($i=0; $i<$cres;$i++){
1276   - $res[$i]["fonte"] = "metaestat";
1277   - }
1278   - }
1279   - //obtem as conexoes definidas em ms_configgura.php
1280   - if($incluiPostgisMapa == true){
1281   - if(!isset($postgis_mapa)){
1282   - include(dirname(__FILE__)."/../ms_configura.php");
1283   - }
1284   - if(!empty($postgis_mapa)){
1285   - foreach(array_keys($postgis_mapa) as $key){
1286   - $lista = explode(" ",$postgis_mapa[$key]);
1287   - $con = array();
1288   - foreach($lista as $l){
1289   - $teste = explode("=",$l);
1290   - $con[trim($teste[0])] = trim($teste[1]);
1291   - }
1292   - $c = array(
1293   - "codigo_estat_conexao" => $key,
1294   - "bancodedados" => $con["dbname"],
1295   - "host" => $con["host"],
1296   - "porta" => $con["port"],
1297   - "usuario" => $con["user"],
1298   - "fonte" => "ms_configura"
1299   - );
1300   - if($senha == true){
1301   - $c["senha"] = $con["password"];
1302   - }
1303   - $res[] = $c;
1304   - if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
1305   - return $c;
1306   - }
1307   - }
1308   - }
1309   - }
1310   - //echo "<pre>";
1311   - //var_dump($res);exit;
1312   - return $res;
1313   - }
1314   - function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
1315   - //lista os parametros temporais
  1163 + }
  1164 + /**
  1165 + * Lista os dados de uma ou todas as unidades de medida cadastradas
  1166 + * @param codigo da unidade
  1167 + */
  1168 + function listaUnidadeMedida($codigo_unidade_medida=""){
  1169 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_unidade_medida ";
  1170 + if($codigo_unidade_medida != ""){
  1171 + $sql .= "WHERE codigo_unidade_medida = $codigo_unidade_medida ";
  1172 + }
  1173 + $sql .= "ORDER BY nome";
  1174 + return $this->execSQL($sql,$codigo_unidade_medida);
  1175 + }
  1176 + /**
  1177 + * Lista os dados de uma ou todas as fontes cadastradas
  1178 + * @param id da fonte
  1179 + */
  1180 + function listaFonteinfo($id_fonteinfo=""){
  1181 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_fonteinfo ";
  1182 + if($id_fonteinfo != ""){
  1183 + $sql .= "WHERE id_fonteinfo = $id_fonteinfo ";
  1184 + }
  1185 + $sql .= "ORDER BY titulo";
  1186 + return $this->execSQL($sql,$id_fonteinfo);
  1187 + }
  1188 + /**
  1189 + * Lista as fontes vinculadas a uma medida de variavel
  1190 + * @param id da medida de variavel
  1191 + */
  1192 + function listaFonteinfoMedida($id_medida_variavel){
  1193 + $sql = "SELECT i3geoestat_fonteinfo.* ";
  1194 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_fonteinfo ";
  1195 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_fonteinfo_medida ";
  1196 + $sql .= "ON i3geoestat_fonteinfo.id_fonteinfo = i3geoestat_fonteinfo_medida.id_fonteinfo ";
  1197 + $sql .= "WHERE i3geoestat_fonteinfo_medida.id_medida_variavel = $id_medida_variavel ";
  1198 + $sql .= "ORDER BY titulo";
  1199 + //echo $sql;exit;
  1200 + return $this->execSQL($sql,$id_fonteinfo);
  1201 + }
  1202 + /**
  1203 + * Lista os dados de uma ou todas as variaveis cadastradas
  1204 + * @param codigo da variavel
  1205 + * @param mostra apenas as variaveis cujas tabelas ficam nesse esquema
  1206 + */
  1207 + function listaVariavel($codigo_variavel="",$filtro_esquema=""){
  1208 + $sql = "select DISTINCT a.* from ".$this->esquemaadmin."i3geoestat_variavel as a ";
  1209 + if($codigo_variavel != ""){
  1210 + $sql .= "WHERE a.codigo_variavel = $codigo_variavel ";
  1211 + }
  1212 + if($filtro_esquema != ""){
  1213 + $sql .= ", ".$this->esquemaadmin."i3geoestat_medida_variavel as b WHERE a.codigo_variavel = b.codigo_variavel and b.esquemadb = '$filtro_esquema' ";
  1214 + }
  1215 + $sql .= "ORDER BY a.nome";
  1216 + //echo $sql;exit;
  1217 + return $this->execSQL($sql,$codigo_variavel);
  1218 + }
  1219 + /**
  1220 + * Lista os dados de uma ou todas as classificacoes de uma medida de variavel
  1221 + * @param id da medida de variavel
  1222 + * @param id da classificacao
  1223 + */
  1224 + function listaClassificacaoMedida($id_medida_variavel,$id_classificacao=""){
  1225 + if(!empty($id_medida_variavel)){
  1226 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_medida_variavel = $id_medida_variavel";
  1227 + }
  1228 + if(!empty($id_classificacao)){
  1229 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classificacao WHERE id_classificacao = $id_classificacao";
  1230 + }
  1231 + return $this->execSQL($sql,$id_classificacao);
  1232 + }
  1233 + /**
  1234 + * Lista os dados de um ou todos os links de uma medida
  1235 + * @param id da medida
  1236 + * @param id do link
  1237 + */
  1238 + function listaLinkMedida($id_medida_variavel,$id_link=""){
  1239 + if(!empty($id_medida_variavel)){
  1240 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_medida_variavel = $id_medida_variavel";
  1241 + }
  1242 + if(!empty($id_link)){
  1243 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_medida_variavel_link WHERE id_link = $id_link";
  1244 + }
  1245 + return $this->execSQL($sql,$id_link);
  1246 + }
  1247 + /**
  1248 + * Lista os dados de uma ou todas as classes de uma classificacao
  1249 + * @param id da classificacao
  1250 + * @param id da classe
  1251 + */
  1252 + function listaClasseClassificacao($id_classificacao,$id_classe=""){
  1253 + if(!empty($id_classificacao)){
  1254 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classificacao = $id_classificacao";
  1255 + }
  1256 + if(!empty($id_classe)){
  1257 + $sql = "SELECT * from ".$this->esquemaadmin."i3geoestat_classes WHERE id_classe = $id_classe";
  1258 + }
  1259 + return $this->execSQL($sql,$id_classe);
  1260 + }
  1261 + /**
  1262 + * Lista os dados de uma ou todas as medidas de variavel de uma variavel
  1263 + * @param codigo da variavel
  1264 + * @param id da medida de variavel
  1265 + */
  1266 + function listaMedidaVariavel($codigo_variavel="",$id_medida_variavel=""){
  1267 + $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 ";
  1268 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_variavel ";
  1269 + $sql .= "JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  1270 + $sql .= "ON i3geoestat_variavel.codigo_variavel = i3geoestat_medida_variavel.codigo_variavel ";
  1271 + $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_unidade_medida ";
  1272 + $sql .= "ON i3geoestat_unidade_medida.codigo_unidade_medida = i3geoestat_medida_variavel.codigo_unidade_medida ";
  1273 + if($codigo_variavel != ""){
  1274 + $sql .= "WHERE i3geoestat_variavel.codigo_variavel = $codigo_variavel ";
  1275 + if($id_medida_variavel != ""){
  1276 + $sql .= "AND i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
  1277 + }
  1278 + }
  1279 + elseif($id_medida_variavel != "") {
  1280 + $sql .= "WHERE i3geoestat_medida_variavel.id_medida_variavel = $id_medida_variavel ";
  1281 + }
  1282 + $sql .= "ORDER BY i3geoestat_medida_variavel.nomemedida";
  1283 + $res = $this->execSQL($sql,$id_medida_variavel);
  1284 + $res = str_replace('"',"'",$res);
  1285 + return $res;
  1286 + }
  1287 + /**
  1288 + * Lista as regioes vinculadas a uma medida de variavel
  1289 + * @param id da medida de vriavel
  1290 + */
  1291 + function listaRegioesMedida($id_medida_variavel){
  1292 + $variavel = $this->listaMedidaVariavel("",$id_medida_variavel);
  1293 + $codigo_tipo_regiao = $variavel["codigo_tipo_regiao"];
  1294 + $regioes[] = $this->listaTipoRegiao($codigo_tipo_regiao);
  1295 + //var_dump($regioes);exit;
  1296 + $agregacoes = $this->listaAgregaRegiao($codigo_tipo_regiao);
  1297 + foreach($agregacoes as $a){
  1298 + $regioes[] = $this->listaTipoRegiao($a["codigo_tipo_regiao_pai"]);
  1299 + }
  1300 + return $regioes;
  1301 + }
  1302 + /**
  1303 + * Lista os dados de uma conexao ou de todas
  1304 + * @param id da conexao
  1305 + * @param boolean inclui na lista a senha ou nao
  1306 + * @param boolean inclui as conexoes definidas em postgis_mapa (ms_configura.php)
  1307 + */
  1308 + function listaConexao($codigo_estat_conexao="",$senha=false,$incluiPostgisMapa=true){
  1309 + if($senha == true){
  1310 + $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario, senha";
  1311 + }
  1312 + else{
  1313 + $colunas = "codigo_estat_conexao, bancodedados, host, porta, usuario";
  1314 + }
  1315 + $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_conexao ";
  1316 + if($codigo_estat_conexao != ""){
  1317 + $sql .= "WHERE codigo_estat_conexao = $codigo_estat_conexao ";
  1318 + }
  1319 + $sql .= "ORDER BY bancodedados,host,usuario";
  1320 + $res = $this->execSQL($sql,$codigo_estat_conexao);
  1321 + //se achou e a requisico e para listar uma conexao, retorna o que for encontrado
  1322 + $cres = count($res);
  1323 + if($cres > 0 && $codigo_estat_conexao != "" && !empty($cres[0]["dbname"])){
  1324 + return $res;
  1325 + }
  1326 + //caso contrario, e deve retornar todas as conexoes, inclui a fonte
  1327 + if($codigo_estat_conexao == ""){
  1328 + for($i=0; $i<$cres;$i++){
  1329 + $res[$i]["fonte"] = "metaestat";
  1330 + }
  1331 + }
  1332 + //obtem as conexoes definidas em ms_configgura.php
  1333 + if($incluiPostgisMapa == true){
  1334 + if(!isset($postgis_mapa)){
  1335 + include(dirname(__FILE__)."/../ms_configura.php");
  1336 + }
  1337 + if(!empty($postgis_mapa)){
  1338 + foreach(array_keys($postgis_mapa) as $key){
  1339 + $lista = explode(" ",$postgis_mapa[$key]);
  1340 + $con = array();
  1341 + foreach($lista as $l){
  1342 + $teste = explode("=",$l);
  1343 + $con[trim($teste[0])] = trim($teste[1]);
  1344 + }
  1345 + $c = array(
  1346 + "codigo_estat_conexao" => $key,
  1347 + "bancodedados" => $con["dbname"],
  1348 + "host" => $con["host"],
  1349 + "porta" => $con["port"],
  1350 + "usuario" => $con["user"],
  1351 + "fonte" => "ms_configura"
  1352 + );
  1353 + if($senha == true){
  1354 + $c["senha"] = $con["password"];
  1355 + }
  1356 + $res[] = $c;
  1357 + if($codigo_estat_conexao != "" && $codigo_estat_conexao == $key){
  1358 + return $c;
  1359 + }
  1360 + }
  1361 + }
  1362 + }
  1363 + //echo "<pre>";
  1364 + //var_dump($res);exit;
  1365 + return $res;
  1366 + }
  1367 + function listaParametroTempo2CampoData($id_medida_variavel,$prefixoAlias = ""){
  1368 + //lista os parametros temporais
1316 1369 $parametros = $this->listaParametro($id_medida_variavel,"","",true,true);
1317   - echo "<pre>";
1318   - //var_dump($parametros);exit;
1319   - //faz o sql para pegar os valores e definir a resolucao
1320   - //o tempo deve comecar sempre pelo ano
  1370 + echo "<pre>";
  1371 + //var_dump($parametros);exit;
  1372 + //faz o sql para pegar os valores e definir a resolucao
  1373 + //o tempo deve comecar sempre pelo ano
1321 1374 $data = array();
1322   - if($parametros[0]["tipo"] == 1){
1323   - //ano
1324   - $data[] = $prefixoAlias.$parametros[0]["coluna"];
1325   - $tipodata = "YYYY";
1326   - //mes
1327   - if(!empty($parametros[1])){
1328   - $data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
1329   - $tipodata = "YYYYMM";
1330   - }
1331   - else{
1332   - $data[] = "'-01'";
1333   - }
1334   - //dia
  1375 + if($parametros[0]["tipo"] == 1){
  1376 + //ano
  1377 + $data[] = $prefixoAlias.$parametros[0]["coluna"];
  1378 + $tipodata = "YYYY";
  1379 + //mes
  1380 + if(!empty($parametros[1])){
  1381 + $data[] = "'-'".$prefixoAlias.$parametros[1]["coluna"];
  1382 + $tipodata = "YYYYMM";
  1383 + }
  1384 + else{
  1385 + $data[] = "'-01'";
  1386 + }
  1387 + //dia
1335 1388 if(!empty($parametros[2])){
1336   - $data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
  1389 + $data[] = "'-'".$prefixoAlias.$parametros[2]["coluna"];
1337 1390 $tipodata = "YYYYMMDD";
1338   - }
  1391 + }
1339 1392 else{
1340 1393 $data[] = "'-01'";
1341   - }
1342   - $data = implode("||",$data);
1343   - return "to_date($data,'$tipodata')";
1344   - }
1345   - }
1346   - /**
1347   - * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
1348   - * @param id da medida de variavel
1349   - * @param id do parametro
1350   - * @param id do pai (se definido, lista apenas os filhos deste)
1351   - * @param bool indica se apenas parametros do tipo temporal serao retornados
1352   - */
1353   - function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
1354   - $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
1355   - $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
1356   - $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
1357   - $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
1358   - if($id_medida_variavel != ""){
1359   - $sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
1360   - if($id_parametro_medida != ""){
1361   - $sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
1362   - }
1363   - }
1364   - elseif ($id_parametro_medida != ""){
1365   - $sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
1366   - }
1367   - if($id_pai != ""){
1368   - $sql .= " AND id_pai = $id_pai";
1369   - }
1370   - if($apenasTempo == true){
1371   - $tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
1372   - $sql .= $tempo;
1373   - }
1374   - if($ordenaPeloPai == true){
1375   - $sql .= " ORDER BY id_pai";
1376   - }
1377   - //echo $sql;exit;
1378   - return $this->execSQL($sql,$id_parametro_medida);
1379   - }
  1394 + }
  1395 + $data = implode("||",$data);
  1396 + return "to_date($data,'$tipodata')";
  1397 + }
  1398 + }
  1399 + /**
  1400 + * Lista os dados de um ou de todos os parametros relacionados a uma medida de variavel
  1401 + * @param id da medida de variavel
  1402 + * @param id do parametro
  1403 + * @param id do pai (se definido, lista apenas os filhos deste)
  1404 + * @param bool indica se apenas parametros do tipo temporal serao retornados
  1405 + */
  1406 + function listaParametro($id_medida_variavel,$id_parametro_medida="",$id_pai="",$apenasTempo=false,$ordenaPeloPai=false){
  1407 + $sql = "SELECT i3geoestat_parametro_medida.*,i3geoestat_medida_variavel.* ";
  1408 + $sql .= "FROM ".$this->esquemaadmin."i3geoestat_parametro_medida ";
  1409 + $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
  1410 + $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
  1411 + if($id_medida_variavel != ""){
  1412 + $sql .= "WHERE i3geoestat_parametro_medida.id_medida_variavel = $id_medida_variavel ";
  1413 + if($id_parametro_medida != ""){
  1414 + $sql .= "AND i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
  1415 + }
  1416 + }
  1417 + elseif ($id_parametro_medida != ""){
  1418 + $sql .= "WHERE i3geoestat_parametro_medida.id_parametro_medida = $id_parametro_medida ";
  1419 + }
  1420 + if($id_pai != ""){
  1421 + $sql .= " AND id_pai = $id_pai";
  1422 + }
  1423 + if($apenasTempo == true){
  1424 + $tempo = " AND i3geoestat_parametro_medida.tipo > 0 AND i3geoestat_parametro_medida.tipo < 5 ";
  1425 + $sql .= $tempo;
  1426 + }
  1427 + if($ordenaPeloPai == true){
  1428 + $sql .= " ORDER BY id_pai";
  1429 + }
  1430 + //echo $sql;exit;
  1431 + return $this->execSQL($sql,$id_parametro_medida);
  1432 + }
1380 1433 /**
1381 1434 * Lista todos os parametros cadastrados
1382 1435 */
... ... @@ -1386,43 +1439,43 @@ class MetaestatInfo{
1386 1439 $sql .= "INNER JOIN ".$this->esquemaadmin."i3geoestat_medida_variavel ";
1387 1440 $sql .= "ON i3geoestat_parametro_medida.id_medida_variavel = i3geoestat_medida_variavel.id_medida_variavel ";
1388 1441 $sql .= " ORDER BY nome";
1389   - return $this->execSQL($sql);
1390   - }
1391   - /**
1392   - * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
1393   - * @param id do parametro
1394   - * @return array com os valores
1395   - */
1396   - function listaValoresParametro($id_parametro_medida){
1397   - $parametro = $this->listaParametro("",$id_parametro_medida);
1398   - //$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
1399   - $sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
1400   - $nsm = array();
1401   - foreach($sm as $s){
1402   - $nsm[] = $s[$parametro["coluna"]];
1403   - }
1404   - return $nsm;
1405   - }
1406   - /**
1407   - * Lista os dados de um ou todos os tipos de periodo cadastrados
1408   - * @param id
1409   - */
1410   - function listaTipoPeriodo($codigo_tipo_periodo=""){
1411   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
1412   - if($codigo_tipo_periodo != ""){
1413   - $sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
1414   - }
1415   - $sql .= "ORDER BY nome";
1416   - return $this->execSQL($sql,$codigo_tipo_periodo);
1417   - }
1418   - /**
1419   - * Lista as propriedades da coluna com as geometrias de uma regiao geografica
1420   - * @param codigo do tipo de regiao
1421   - * @return array com os parametros, inclusive a dimensao (st_dimension)
1422   - */
  1442 + return $this->execSQL($sql);
  1443 + }
  1444 + /**
  1445 + * Lista os valores (unicos) que ocorrem em um parametro de uma medida de variavel
  1446 + * @param id do parametro
  1447 + * @return array com os valores
  1448 + */
  1449 + function listaValoresParametro($id_parametro_medida){
  1450 + $parametro = $this->listaParametro("",$id_parametro_medida);
  1451 + //$medida = $this->listaMedidaVariavel("",$parametro["id_medida_variavel"]);
  1452 + $sm = $this->valorUnicoMedidaVariavel($parametro["id_medida_variavel"],$parametro["coluna"]);
  1453 + $nsm = array();
  1454 + foreach($sm as $s){
  1455 + $nsm[] = $s[$parametro["coluna"]];
  1456 + }
  1457 + return $nsm;
  1458 + }
  1459 + /**
  1460 + * Lista os dados de um ou todos os tipos de periodo cadastrados
  1461 + * @param id
  1462 + */
  1463 + function listaTipoPeriodo($codigo_tipo_periodo=""){
  1464 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_periodo ";
  1465 + if($codigo_tipo_periodo != ""){
  1466 + $sql .= "WHERE codigo_tipo_periodo = $codigo_tipo_periodo ";
  1467 + }
  1468 + $sql .= "ORDER BY nome";
  1469 + return $this->execSQL($sql,$codigo_tipo_periodo);
  1470 + }
  1471 + /**
  1472 + * Lista as propriedades da coluna com as geometrias de uma regiao geografica
  1473 + * @param codigo do tipo de regiao
  1474 + * @return array com os parametros, inclusive a dimensao (st_dimension)
  1475 + */
1423 1476 function listaPropGeoRegiao($codigo_tipo_regiao){
1424   - //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
1425   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1477 + //st_dimension returns 0 for POINT, 1 for LINESTRING, 2 for POLYGON
  1478 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
1426 1479 $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
1427 1480 $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
1428 1481 $c = $regiao["colunageo"];
... ... @@ -1430,107 +1483,107 @@ class MetaestatInfo{
1430 1483 $q = $dbh->query($sql,PDO::FETCH_ASSOC);
1431 1484 $r = array();
1432 1485 if($q){
1433   - $r = $q->fetchAll();
  1486 + $r = $q->fetchAll();
1434 1487 $r = $r[0];
1435 1488 }
1436 1489 return $r;
1437   - }
1438   - /**
1439   - * Lista os dados de uma ou todas as regioes cadastradas
1440   - * @param codigo do tipo de regiao
1441   - */
1442   - function listaTipoRegiao($codigo_tipo_regiao="",$completo=true){
1443   - if($completo == true){
1444   - $colunas = "*";
1445   - } else {
1446   - $colunas = "codigo_tipo_regiao,nome_tipo_regiao,descricao_tipo_regiao";
1447   - }
1448   - $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
1449   - if($codigo_tipo_regiao != ""){
1450   - $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
1451   - }
1452   - $sql .= "ORDER BY nome_tipo_regiao";
1453   - return $this->execSQL($sql,$codigo_tipo_regiao);
1454   - }
  1490 + }
  1491 + /**
  1492 + * Lista os dados de uma ou todas as regioes cadastradas
  1493 + * @param codigo do tipo de regiao
  1494 + */
  1495 + function listaTipoRegiao($codigo_tipo_regiao="",$completo=true){
  1496 + if($completo == true){
  1497 + $colunas = "*";
  1498 + } else {
  1499 + $colunas = "codigo_tipo_regiao,nome_tipo_regiao,descricao_tipo_regiao";
  1500 + }
  1501 + $sql = "select $colunas from ".$this->esquemaadmin."i3geoestat_tipo_regiao ";
  1502 + if($codigo_tipo_regiao != ""){
  1503 + $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
  1504 + }
  1505 + $sql .= "ORDER BY nome_tipo_regiao";
  1506 + return $this->execSQL($sql,$codigo_tipo_regiao);
  1507 + }
1455 1508 /**
1456 1509 * Obtem de um tipo de regiao a coluna do tipo serial
1457 1510 * @param codigo do tipo de regiao
1458 1511 */
1459 1512 function listaTipoRegiaoSerial($codigo_tipo_regiao){
1460 1513 $sql = "select * from ".$this->esquemaadmin."i3geoestat_tipo_regiao WHERE codigo_tipo_regiao = $codigo_tipo_regiao ";
1461   - $regiao = $this->execSQL($sql,$codigo_tipo_regiao);
1462   - $nome_esquema = $regiao["esquemadb"];
1463   - $nome_tabela = $regiao["tabela"];
1464   - $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'";
1465   - $colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
1466   - $colunas = $colunas[0];
  1514 + $regiao = $this->execSQL($sql,$codigo_tipo_regiao);
  1515 + $nome_esquema = $regiao["esquemadb"];
  1516 + $nome_tabela = $regiao["tabela"];
  1517 + $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'";
  1518 + $colunas = $this->execSQLDB($regiao["codigo_estat_conexao"],$sql);
  1519 + $colunas = $colunas[0];
1467 1520 return $colunas["coluna"];
1468   - }
1469   - /**
1470   - * Obtem de uma tabela a coluna do tipo serial
1471   - * @param codigo do tipo de regiao
1472   - */
1473   - function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
1474   - $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'";
1475   - $colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
1476   - $colunas = $colunas[0];
1477   - return $colunas["coluna"];
1478   - }
1479   - /**
1480   - * Lista os dados de agregacao de uma regiao pai
1481   - * @param codigo da regiao
1482   - */
1483   - function listaHierarquiaRegioes($codigoregiaopai=""){
1484   - $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 ";
1485   - $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
1486   - $sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
1487   - if($codigoregiaopai != ""){
1488   - $sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
1489   - }
1490   - else{
1491   - $sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
1492   - }
1493   - return $this->execSQL($sql,"");
1494   - }
  1521 + }
  1522 + /**
  1523 + * Obtem de uma tabela a coluna do tipo serial
  1524 + * @param codigo do tipo de regiao
  1525 + */
  1526 + function listaTabelaSerial($codigo_estat_conexao,$nome_esquema,$nome_tabela){
  1527 + $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'";
  1528 + $colunas = $this->execSQLDB($codigo_estat_conexao,$sql);
  1529 + $colunas = $colunas[0];
  1530 + return $colunas["coluna"];
  1531 + }
  1532 + /**
  1533 + * Lista os dados de agregacao de uma regiao pai
  1534 + * @param codigo da regiao
  1535 + */
  1536 + function listaHierarquiaRegioes($codigoregiaopai=""){
  1537 + $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 ";
  1538 + $sql .= "LEFT JOIN ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  1539 + $sql .= "ON i3geoestat_tipo_regiao.codigo_tipo_regiao = i3geoestat_agregaregiao.codigo_tipo_regiao ";
  1540 + if($codigoregiaopai != ""){
  1541 + $sql .= " WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao_pai = $codigoregiaopai";
  1542 + }
  1543 + else{
  1544 + $sql .= "WHERE ".$this->esquemaadmin."i3geoestat_agregaregiao.codigo_tipo_regiao IS NULL";
  1545 + }
  1546 + return $this->execSQL($sql,"");
  1547 + }
1495 1548 function listaHierarquia($codigoregiaopai=""){
1496 1549 $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao order by codigo_tipo_regiao";
1497 1550 return $this->execSQL($sql,"");
1498   - }
1499   - /**
1500   - * Lista os registros de um tipo de regiao
1501   - * Se for definido o pai, lista os valores da regiao que e filha
1502   - * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
1503   - * @param codigo do tipo de regiao
1504   - * @param codigo do tipo de regiao pai
1505   - * @param identificador da regiao (registro) pai
1506   - */
1507   - function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
1508   - //pega a tabela, esquema e conexao para acessar os dados da regiao
1509   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
1510   - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
1511   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
1512   - $c = $regiao["colunageo"];
1513   - $bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
1514   - $sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
1515   - if($valorregiaopai != ""){
1516   - $r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
1517   - $sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
1518   - }
1519   - $sql .= " order by ".$regiao["colunanomeregiao"];
1520   -
1521   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
1522   - $r = array();
1523   - if($q){
1524   - $r = $q->fetchAll();
1525   - }
1526   - return $r;
1527   - }
1528   - /**
1529   - * Lista os registros de uma tabela que e uma regiao
1530   - * @param codigo do tipo de regiao
1531   - */
  1551 + }
  1552 + /**
  1553 + * Lista os registros de um tipo de regiao
  1554 + * Se for definido o pai, lista os valores da regiao que e filha
  1555 + * Nesse caso e necessario definir o identificador da regiao pai para obter os registros na regiao filha
  1556 + * @param codigo do tipo de regiao
  1557 + * @param codigo do tipo de regiao pai
  1558 + * @param identificador da regiao (registro) pai
  1559 + */
  1560 + function listaDadosRegiao($codigo_tipo_regiao,$codigo_tipo_regiaopai="",$valorregiaopai=""){
  1561 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  1562 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1563 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1564 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1565 + $c = $regiao["colunageo"];
  1566 + $bbox = "ST_XMin($c)||' '||ST_YMin($c)||' '||ST_XMax($c)||' '||ST_YMax($c) as ext ";
  1567 + $sql = "select $bbox,".$regiao["colunanomeregiao"]." as nome_regiao,".$regiao["identificador"]." as identificador_regiao from ".$regiao["esquemadb"].".".$regiao["tabela"];
  1568 + if($valorregiaopai != ""){
  1569 + $r = $this->listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiaopai);
  1570 + $sql .= " WHERE ".$r["colunaligacao_regiaopai"]."::text = '$valorregiaopai'";
  1571 + }
  1572 + $sql .= " order by ".$regiao["colunanomeregiao"];
  1573 +
  1574 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1575 + $r = array();
  1576 + if($q){
  1577 + $r = $q->fetchAll();
  1578 + }
  1579 + return $r;
  1580 + }
  1581 + /**
  1582 + * Lista os registros de uma tabela que e uma regiao
  1583 + * @param codigo do tipo de regiao
  1584 + */
1532 1585 function listaDadosGeometriaRegiao($codigo_tipo_regiao){
1533   - //pega a tabela, esquema e conexao para acessar os dados da regiao
  1586 + //pega a tabela, esquema e conexao para acessar os dados da regiao
1534 1587 $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
1535 1588 $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
1536 1589 $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
... ... @@ -1544,81 +1597,81 @@ class MetaestatInfo{
1544 1597 $r = $q->fetchAll();
1545 1598 }
1546 1599 return $r[0];
1547   - }
1548   - /**
1549   - * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
1550   - * @param codigo do tipo de regiao
1551   - * @param id da agregacao
1552   - */
1553   - function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
1554   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
1555   - if($id_agregaregiao != ""){
1556   - $sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
1557   - }
1558   - else{
1559   - if($codigo_tipo_regiao != ""){
1560   - $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
1561   - }
1562   - }
1563   - $sql .= " ORDER BY colunaligacao_regiaopai";
1564   - //echo $sql;exit;
1565   - return $this->execSQL($sql,$id_agregaregiao);
1566   - }
1567   - /**
1568   - * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
1569   - * @param codigo do tipo de regiao
1570   - * @param codigo do tipo de regiao que e pai
1571   - */
1572   - function listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiao_pai){
1573   - $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
1574   - $sql .= "WHERE codigo_tipo_regiao_pai = $codigo_tipo_regiao_pai ";
1575   - if($codigo_tipo_regiao != ""){
1576   - $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
1577   - }
1578   - return $this->execSQL($sql,$codigo_tipo_regiao_pai);
1579   - }
1580   - /**
1581   - * Lista os esquemas em um banco de dados
1582   - * @param codigo da conexao
1583   - * @return execSQLDB
1584   - */
1585   - function esquemasConexao($codigo_estat_conexao){
1586   - 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");
1587   - }
1588   - /**
1589   - * Lista as tabelas de um esquema
1590   - * @param codigo da conexao
1591   - * @param nome do esquema
1592   - * @param sim|nao exclui da lista as tabelas que contem geometria
1593   - * @return execSQLDB
1594   - */
1595   - function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
1596   - $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%'";
1597   - if(strtolower($excluigeom) == "sim"){
1598   - $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";
1599   - }
1600   - return $this->execSQLDB($codigo_estat_conexao,$sql);
1601   - }
1602   - /**
1603   - * Lista as colunas de uma tabela
1604   - * @param codigo da conexao
1605   - * @param nome do esquema
1606   - * @param nome da tabela
1607   - * @param tipo de coluna (opcional)
1608   - * @param tipo de tratamento do parametro tipo, pode ser =|!=
1609   - * @return execSQLDB
1610   - */
1611   - function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
1612   - $colunas = array();
1613   - $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'");
1614   - if($tipo != ""){
1615   - $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'");
1616   - }
1617   - foreach($res as $c){
1618   - $colunas[] = $c["coluna"];
1619   - }
1620   - return $colunas;
1621   - }
  1600 + }
  1601 + /**
  1602 + * Lista uma ou todas as agregacoes de regioes existentes para um tipo de regiao
  1603 + * @param codigo do tipo de regiao
  1604 + * @param id da agregacao
  1605 + */
  1606 + function listaAgregaRegiao($codigo_tipo_regiao="",$id_agregaregiao=""){
  1607 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  1608 + if($id_agregaregiao != ""){
  1609 + $sql .= "WHERE id_agregaregiao = $id_agregaregiao ";
  1610 + }
  1611 + else{
  1612 + if($codigo_tipo_regiao != ""){
  1613 + $sql .= "WHERE codigo_tipo_regiao = $codigo_tipo_regiao";
  1614 + }
  1615 + }
  1616 + $sql .= " ORDER BY colunaligacao_regiaopai";
  1617 + //echo $sql;exit;
  1618 + return $this->execSQL($sql,$id_agregaregiao);
  1619 + }
  1620 + /**
  1621 + * Lista uma ou todas as agregacoes de regioes filhas de um tipo de regiao
  1622 + * @param codigo do tipo de regiao
  1623 + * @param codigo do tipo de regiao que e pai
  1624 + */
  1625 + function listaAgregaRegiaoFilho($codigo_tipo_regiao,$codigo_tipo_regiao_pai){
  1626 + $sql = "select * from ".$this->esquemaadmin."i3geoestat_agregaregiao ";
  1627 + $sql .= "WHERE codigo_tipo_regiao_pai = $codigo_tipo_regiao_pai ";
  1628 + if($codigo_tipo_regiao != ""){
  1629 + $sql .= "AND codigo_tipo_regiao = $codigo_tipo_regiao";
  1630 + }
  1631 + return $this->execSQL($sql,$codigo_tipo_regiao_pai);
  1632 + }
  1633 + /**
  1634 + * Lista os esquemas em um banco de dados
  1635 + * @param codigo da conexao
  1636 + * @return execSQLDB
  1637 + */
  1638 + function esquemasConexao($codigo_estat_conexao){
  1639 + 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");
  1640 + }
  1641 + /**
  1642 + * Lista as tabelas de um esquema
  1643 + * @param codigo da conexao
  1644 + * @param nome do esquema
  1645 + * @param sim|nao exclui da lista as tabelas que contem geometria
  1646 + * @return execSQLDB
  1647 + */
  1648 + function tabelasEsquema($codigo_estat_conexao,$nome_esquema,$excluigeom=""){
  1649 + $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%'";
  1650 + if(strtolower($excluigeom) == "sim"){
  1651 + $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";
  1652 + }
  1653 + return $this->execSQLDB($codigo_estat_conexao,$sql);
  1654 + }
  1655 + /**
  1656 + * Lista as colunas de uma tabela
  1657 + * @param codigo da conexao
  1658 + * @param nome do esquema
  1659 + * @param nome da tabela
  1660 + * @param tipo de coluna (opcional)
  1661 + * @param tipo de tratamento do parametro tipo, pode ser =|!=
  1662 + * @return execSQLDB
  1663 + */
  1664 + function colunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$tipo="",$tipotratamento="="){
  1665 + $colunas = array();
  1666 + $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'");
  1667 + if($tipo != ""){
  1668 + $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'");
  1669 + }
  1670 + foreach($res as $c){
  1671 + $colunas[] = $c["coluna"];
  1672 + }
  1673 + return $colunas;
  1674 + }
1622 1675 /**
1623 1676 * Lista o comentario de uma tabela
1624 1677 * @param codigo da conexao
... ... @@ -1627,317 +1680,317 @@ class MetaestatInfo{
1627 1680 * @return execSQLDB
1628 1681 */
1629 1682 function comentarioTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela){
1630   - $colunas = array();
  1683 + $colunas = array();
1631 1684 $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."'";
1632 1685 $res = $this->execSQLDB($codigo_estat_conexao,$sql);
1633   - if(count($res) > 0){
1634   - $res = $res[0];
1635   - $res = $res["comments"];
1636   - }
1637   - else{
1638   - $res = "";
1639   - }
1640   - if($res == null){
1641   - $res = "";
1642   - }
  1686 + if(count($res) > 0){
  1687 + $res = $res[0];
  1688 + $res = $res["comments"];
  1689 + }
  1690 + else{
  1691 + $res = "";
  1692 + }
  1693 + if($res == null){
  1694 + $res = "";
  1695 + }
1643 1696 return $res;
1644   - }
1645   - /**
1646   - * Lista os metadados de uma coluna
1647   - * Os metadados sao obtidos do proprio PostgreSQL
1648   - * @param codigo da conexao
1649   - * @param nome do esquema
1650   - * @param nome da tabela
1651   - * @param nome da coluna (opcional)
1652   - * @return execSQLDB
1653   - */
1654   - function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
1655   - if($nome_coluna == ""){
1656   - 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");
1657   - }
1658   - else{
1659   - $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");
1660   - return $res[0];
1661   - }
1662   - }
1663   - /**
1664   - * Lista os dados de uma tabela
1665   - * @param codigo da conexao
1666   - * @param nome do esquema
1667   - * @param nome da tabela
1668   - * @param sim|nao inclui o WKT da geometria de colunas geo
1669   - * @param (opcional) numero de registros que serao listados
1670   - * @return execSQLDB
1671   - */
1672   - function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
1673   - $desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
1674   - $colunas = array();
1675   - $colsql = array();
1676   - foreach($desccolunas as $d){
1677   - if($d["type"] != "geometry" && $d["type"] != "geography"){
1678   - $colunas[] = $d["field"];
1679   - $colsql[] = $d["field"];
1680   - }
1681   - elseif($geo == "sim"){
  1697 + }
  1698 + /**
  1699 + * Lista os metadados de uma coluna
  1700 + * Os metadados sao obtidos do proprio PostgreSQL
  1701 + * @param codigo da conexao
  1702 + * @param nome do esquema
  1703 + * @param nome da tabela
  1704 + * @param nome da coluna (opcional)
  1705 + * @return execSQLDB
  1706 + */
  1707 + function descreveColunasTabela($codigo_estat_conexao,$nome_esquema,$nome_tabela,$nome_coluna=""){
  1708 + if($nome_coluna == ""){
  1709 + 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");
  1710 + }
  1711 + else{
  1712 + $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");
  1713 + return $res[0];
  1714 + }
  1715 + }
  1716 + /**
  1717 + * Lista os dados de uma tabela
  1718 + * @param codigo da conexao
  1719 + * @param nome do esquema
  1720 + * @param nome da tabela
  1721 + * @param sim|nao inclui o WKT da geometria de colunas geo
  1722 + * @param (opcional) numero de registros que serao listados
  1723 + * @return execSQLDB
  1724 + */
  1725 + function obtemDadosTabelaDB($codigo_estat_conexao,$nome_esquema,$nome_tabela,$geo="nao",$nreg=""){
  1726 + $desccolunas = $this->descreveColunasTabela($codigo_estat_conexao, $nome_esquema, $nome_tabela);
  1727 + $colunas = array();
  1728 + $colsql = array();
  1729 + foreach($desccolunas as $d){
  1730 + if($d["type"] != "geometry" && $d["type"] != "geography"){
  1731 + $colunas[] = $d["field"];
  1732 + $colsql[] = $d["field"];
  1733 + }
  1734 + elseif($geo == "sim"){
1682 1735 $colunas[] = $d["field"];
1683   - $colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
1684   - }
1685   - }
1686   - $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
1687   - if($nreg != ""){
1688   - $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
1689   - }
1690   - $dados = $this->execSQLDB($codigo_estat_conexao,$sql );
1691   - $linhas = array();
1692   - foreach($dados as $d){
1693   - $l = array();
1694   - foreach($colunas as $c){
1695   - $l[] = $d[$c];
1696   - }
1697   - $linhas[] = $l;
1698   - }
1699   - return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
1700   - }
1701   - /**
1702   - * Relatorio completo com a lista de variaveis e medidas
1703   - * @param codigo da variavel
1704   - * @param sim|nao inclui dados detalhados
1705   - * @return Array
1706   - */
1707   - function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
1708   - $dados = array();
1709   - if($codigo_variavel != "" || !empty($codigo_variavel)){
1710   - $vs[] = $this->listaVariavel($codigo_variavel);
1711   - }
1712   - else{
1713   - $vs = $this->listaVariavel();
1714   - }
1715   - foreach($vs as $v){
1716   - $nivel1["id"] = $v["codigo_variavel"];
1717   - $nivel1["titulo"] = $v["nome"];
1718   - $nivel1["descricao"] = $v["descricao"];
1719   - $ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
1720   - $nivel1["filhos"] = array();
1721   - foreach($ms as $m){
1722   - $nivel2["id"] = $m["id_medida_variavel"];
1723   - $nivel2["titulo"] = $m["nomemedida"];
1724   - $unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
1725   - $unidade = "Unidade de medida: ".$unidade["nome"];
1726   - $periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
1727   - $periodo = "Per&iacute;odo de tempo: ".$periodo["nome"];
1728   - $regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
1729   - $regiao = "Regi&atilde;o: ".$regiao["nome_tipo_regiao"];
1730   - $nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
1731   - $nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
1732   - $nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
1733   - $nivel2["dadosgerenciais"] = "";
1734   - if($dadosGerenciais == "sim"){
1735   - $nivel2["dadosgerenciais"] = $m;
1736   - }
1737   - $nivel1["filhos"][] = $nivel2;
1738   - }
1739   - $dados[] = $nivel1;
1740   - }
1741   - return $dados;
1742   - }
1743   - /**
1744   - * Cria um raltorio formatado em HTML
1745   - * @param dados obtidos com relatorioCompleto
1746   - * @param sim|nao inclui os dados detalhados
1747   - * @return string
1748   - */
1749   - function formataRelatorioHtml($dados,$detalhes="sim"){
1750   - $html[] = "<div class='var_div_relatorio'>";
1751   - $var_cor = "var_cor1";
1752   - foreach($dados as $variavel){
1753   - $html[] = "<div class='".$var_cor."'>";
1754   - $html[] = "<h1 style=padding:3px; ><b>".$variavel["titulo"];
1755   - $html[] = "</b><br><span style='color:rgb(100,100,100)'>".$variavel["descricao"]."</span></h1>";
1756   - $filhos = $variavel["filhos"];
1757   - foreach($filhos as $f){
1758   - $html[] = "<h2 style='position:relative;left:10px;'>ID: <u>".$f["id"]."</u> - ".$f["titulo"]."</h2>";
1759   - $html[] = "<div style='position:relative;padding-left:20px;'>";
1760   - $html[] = "<p>".$f["descricao"]."</p>";
1761   - if($detalhes == "sim"){
1762   - $html[] = "<p><b>Fontes:</b></p>";
1763   - foreach($f["fontes"] as $fonte){
1764   - $html[] = "<p><a href='".$fonte["link"]."' >".$fonte["titulo"]."</a></p>";
1765   - }
1766   - $html[] = "<p><b>Links:</b></p>";
1767   - foreach($f["links"] as $link){
1768   - $html[] = "<p><a href='".$link["link"]."' >".$link["nome"]."</a></p>";
1769   - }
1770   - if($f["dadosgerenciais"] != ""){
1771   - $html[] = "<span style='color:gray'>";
1772   - $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", ";
1773   - $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", ";
1774   - $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", ";
1775   - $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", ";
1776   - $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", ";
1777   - $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico];
1778   - $html[] = "</span>";
1779   - }
1780   - }
1781   - $html[] = "</div>";
1782   - }
1783   - $html[] = "</div>";
1784   - if($var_cor == "var_cor1"){
1785   - $var_cor = "var_cor2";
1786   - }
1787   - else{
1788   - $var_cor = "var_cor1";
1789   - }
1790   - }
1791   - $html[] = "</div><br><br>";
1792   - return implode("",$html);
1793   - }
1794   - /**
1795   - * Cria um relatorio no formato XML
1796   - * @param dados obtidos com relatorioCompleto
1797   - * @return string
1798   - */
1799   - function formataXML($dados){
1800   - $chaves = array_keys($dados[0]);
1801   - if(count($chaves) == 0){
1802   - $chaves = false;
1803   - }
1804   - $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL;
1805   - $xml .= '<result-set>' . PHP_EOL;
1806   - //tenta descobrir o tipo de coluna
1807   - //$xml .= '<!--java.lang.String,java.lang.Integer-->' . PHP_EOL;
1808   - $xmldados = "";
1809   - if($chaves){
1810   - foreach($dados as $d){
1811   - $xmldados .= "<row>" . PHP_EOL;
1812   - foreach($chaves as $c){
1813   - $xmldados .= "<".$c.">".$d[$c]."</".$c.">" . PHP_EOL;
1814   - }
1815   - $xmldados .= "</row>" . PHP_EOL;
1816   - }
1817   - $tipos = array();
1818   - $d = $dados[0];
1819   - foreach($chaves as $c){
1820   - if(is_numeric($d[$c])){
1821   - $tipos[] = "java.lang.Integer";
1822   - }
1823   - else{
1824   - $tipos[] = "java.lang.String";
1825   - }
1826   - }
1827   - $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
1828   - }
1829   - else{
1830   - while (list($key, $val) = each($dados)) {
1831   - $xmldados .= "<row>" . PHP_EOL;
1832   - $xmldados .= "<nome>".$key."</nome>" . PHP_EOL;
1833   - $xmldados .= "<valor>".$val."</valor>" . PHP_EOL;
1834   - $xmldados .= "</row>" . PHP_EOL;
1835   - }
1836   - reset($dados);
1837   - $tipos = array();
1838   - while (list($key, $val) = each($dados)) {
1839   - if(is_numeric($val)){
1840   - $tipos[] = "java.lang.Integer";
1841   - }
1842   - else{
1843   - $tipos[] = "java.lang.String";
1844   - }
1845   - if(is_numeric($key)){
1846   - $tipos[] = "java.lang.Integer";
1847   - }
1848   - else{
1849   - $tipos[] = "java.lang.String";
1850   - }
1851   - break;
1852   - }
1853   - $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
1854   - }
1855   - $xml .= $xmldados;
1856   - $xml .= '</result-set>' . PHP_EOL;
1857   - return $xml;
1858   - }
1859   - /**
1860   - * Verifica se em um array existe uma chave com determinado valor
1861   - * @param Array
1862   - * @param nome da chave
1863   - * @param valor a ser buscado
1864   - * @return boolean
1865   - */
1866   - function buscaNoArray($lista,$chave,$valor){
1867   - foreach($lista as $l){
1868   - if($l[$chave] == $valor){
1869   - return true;
1870   - }
1871   - }
1872   - return false;
1873   - }
1874   - /**
1875   - * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude
1876   - * @param codigo do tipo de regiao
1877   - * @param longitude
1878   - * @param latitude
1879   - * @return array
1880   - */
1881   - function xy2regiao($codigo_tipo_regiao,$x,$y){
1882   - //pega a tabela, esquema e conexao para acessar os dados da regiao
1883   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
1884   - $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
1885   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
1886   - $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"].")";
1887   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
1888   - $r = $q->fetchAll();
1889   - if(count($r) > 0){
1890   - return $r[0];
1891   - }
1892   - else{
1893   - return "";
1894   - }
1895   - }
1896   - /**
1897   - * Busca os dados de uma medida de variavel para uma regiao
1898   - * Identificador da regiao e o valor a ser encontrado na coluna de
1899   - * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao)
1900   - * @param identificador da regiao
1901   - * @param id da medida da variavel
1902   - * @return multitype:unknown multitype: string
1903   - */
1904   - function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){
1905   - $medida = $this->listaMedidaVariavel("",$id_medida_variavel);
1906   - $c = $this->listaConexao($medida["codigo_estat_conexao"],true);
1907   - if($medida["colunavalor"] == ""){
1908   - return "";
1909   - }
1910   - $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
1911   - $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"];
1912   -
1913   - $alias[] = $medida["nomemedida"];
1914   - $colunas[] = $medida["colunavalor"];
1915   - $alias[] = "idunico";
1916   - $colunas[] = $medida["colunaidunico"];
1917   - $descricao[] = $medida["unidade_medida"];
1918   - $parametros = $this->listaParametro($id_medida_variavel);
1919   - foreach($parametros as $p){
1920   - $colunassql[] = $p["coluna"];
1921   - $alias[] = $p["nome"];
1922   - $descricao[] = $p["descricao"];
1923   - $colunas[] = $p["coluna"];
1924   - }
1925   -
1926   - $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text ";
1927   - if($medida["filtro"] != ""){
1928   - $sql .= " and ".$medida["filtro"];
1929   - }
1930   - $q = $dbh->query($sql,PDO::FETCH_ASSOC);
1931   - $r = $q->fetchAll();
1932   - return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao);
1933   - }
1934   - /**
1935   - * Converte um tipo de regiao em shapefile
1936   - * @param codigo do tipo de regiao
1937   - * @return nome do arquivo criado
1938   - */
  1736 + $colsql[] = "ST_AsText(".$d["field"].") as ".$d["field"];
  1737 + }
  1738 + }
  1739 + $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela;
  1740 + if($nreg != ""){
  1741 + $sql = "SELECT ".implode(",",$colsql)." from ".$nome_esquema.".".$nome_tabela." limit $nreg";
  1742 + }
  1743 + $dados = $this->execSQLDB($codigo_estat_conexao,$sql );
  1744 + $linhas = array();
  1745 + foreach($dados as $d){
  1746 + $l = array();
  1747 + foreach($colunas as $c){
  1748 + $l[] = $d[$c];
  1749 + }
  1750 + $linhas[] = $l;
  1751 + }
  1752 + return array("nomescolunas"=>$colunas,"colunas"=>$desccolunas,"linhas"=>$linhas);
  1753 + }
  1754 + /**
  1755 + * Relatorio completo com a lista de variaveis e medidas
  1756 + * @param codigo da variavel
  1757 + * @param sim|nao inclui dados detalhados
  1758 + * @return Array
  1759 + */
  1760 + function relatorioCompleto($codigo_variavel="",$dadosGerenciais="nao"){
  1761 + $dados = array();
  1762 + if($codigo_variavel != "" || !empty($codigo_variavel)){
  1763 + $vs[] = $this->listaVariavel($codigo_variavel);
  1764 + }
  1765 + else{
  1766 + $vs = $this->listaVariavel();
  1767 + }
  1768 + foreach($vs as $v){
  1769 + $nivel1["id"] = $v["codigo_variavel"];
  1770 + $nivel1["titulo"] = $v["nome"];
  1771 + $nivel1["descricao"] = $v["descricao"];
  1772 + $ms = $this->listaMedidaVariavel($v["codigo_variavel"]);
  1773 + $nivel1["filhos"] = array();
  1774 + foreach($ms as $m){
  1775 + $nivel2["id"] = $m["id_medida_variavel"];
  1776 + $nivel2["titulo"] = $m["nomemedida"];
  1777 + $unidade = $this->listaUnidadeMedida($m["codigo_unidade_medida"]);
  1778 + $unidade = "Unidade de medida: ".$unidade["nome"];
  1779 + $periodo = $this->listaTipoPeriodo($m["codigo_tipo_periodo"]);
  1780 + $periodo = "Per&iacute;odo de tempo: ".$periodo["nome"];
  1781 + $regiao = $this->listaTipoRegiao($m["codigo_tipo_regiao"]);
  1782 + $regiao = "Regi&atilde;o: ".$regiao["nome_tipo_regiao"];
  1783 + $nivel2["descricao"] = $unidade.", ".$periodo.", ".$regiao;
  1784 + $nivel2["fontes"] = $this->listaFonteinfoMedida($m["id_medida_variavel"]);
  1785 + $nivel2["links"] = $this->listaLinkMedida($m["id_medida_variavel"]);
  1786 + $nivel2["dadosgerenciais"] = "";
  1787 + if($dadosGerenciais == "sim"){
  1788 + $nivel2["dadosgerenciais"] = $m;
  1789 + }
  1790 + $nivel1["filhos"][] = $nivel2;
  1791 + }
  1792 + $dados[] = $nivel1;
  1793 + }
  1794 + return $dados;
  1795 + }
  1796 + /**
  1797 + * Cria um raltorio formatado em HTML
  1798 + * @param dados obtidos com relatorioCompleto
  1799 + * @param sim|nao inclui os dados detalhados
  1800 + * @return string
  1801 + */
  1802 + function formataRelatorioHtml($dados,$detalhes="sim"){
  1803 + $html[] = "<div class='var_div_relatorio'>";
  1804 + $var_cor = "var_cor1";
  1805 + foreach($dados as $variavel){
  1806 + $html[] = "<div class='".$var_cor."'>";
  1807 + $html[] = "<h1 style=padding:3px; ><b>".$variavel["titulo"];
  1808 + $html[] = "</b><br><span style='color:rgb(100,100,100)'>".$variavel["descricao"]."</span></h1>";
  1809 + $filhos = $variavel["filhos"];
  1810 + foreach($filhos as $f){
  1811 + $html[] = "<h2 style='position:relative;left:10px;'>ID: <u>".$f["id"]."</u> - ".$f["titulo"]."</h2>";
  1812 + $html[] = "<div style='position:relative;padding-left:20px;'>";
  1813 + $html[] = "<p>".$f["descricao"]."</p>";
  1814 + if($detalhes == "sim"){
  1815 + $html[] = "<p><b>Fontes:</b></p>";
  1816 + foreach($f["fontes"] as $fonte){
  1817 + $html[] = "<p><a href='".$fonte["link"]."' >".$fonte["titulo"]."</a></p>";
  1818 + }
  1819 + $html[] = "<p><b>Links:</b></p>";
  1820 + foreach($f["links"] as $link){
  1821 + $html[] = "<p><a href='".$link["link"]."' >".$link["nome"]."</a></p>";
  1822 + }
  1823 + if($f["dadosgerenciais"] != ""){
  1824 + $html[] = "<span style='color:gray'>";
  1825 + $html[] = "esquemadb = ".$f["dadosgerenciais"][esquemadb].", ";
  1826 + $html[] = "tabela = ".$f["dadosgerenciais"][tabela].", ";
  1827 + $html[] = "colunavalor = ".$f["dadosgerenciais"][colunavalor].", ";
  1828 + $html[] = "colunaidgeo = ".$f["dadosgerenciais"][colunaidgeo].", ";
  1829 + $html[] = "filtro = ".$f["dadosgerenciais"][filtro].", ";
  1830 + $html[] = "colunaidunico = ".$f["dadosgerenciais"][colunaidunico];
  1831 + $html[] = "</span>";
  1832 + }
  1833 + }
  1834 + $html[] = "</div>";
  1835 + }
  1836 + $html[] = "</div>";
  1837 + if($var_cor == "var_cor1"){
  1838 + $var_cor = "var_cor2";
  1839 + }
  1840 + else{
  1841 + $var_cor = "var_cor1";
  1842 + }
  1843 + }
  1844 + $html[] = "</div><br><br>";
  1845 + return implode("",$html);
  1846 + }
  1847 + /**
  1848 + * Cria um relatorio no formato XML
  1849 + * @param dados obtidos com relatorioCompleto
  1850 + * @return string
  1851 + */
  1852 + function formataXML($dados){
  1853 + $chaves = array_keys($dados[0]);
  1854 + if(count($chaves) == 0){
  1855 + $chaves = false;
  1856 + }
  1857 + $xml = "<"."\x3F"."xml version='1.0' encoding='UTF-8' "."\x3F".">" . PHP_EOL;
  1858 + $xml .= '<result-set>' . PHP_EOL;
  1859 + //tenta descobrir o tipo de coluna
  1860 + //$xml .= '<!--java.lang.String,java.lang.Integer-->' . PHP_EOL;
  1861 + $xmldados = "";
  1862 + if($chaves){
  1863 + foreach($dados as $d){
  1864 + $xmldados .= "<row>" . PHP_EOL;
  1865 + foreach($chaves as $c){
  1866 + $xmldados .= "<".$c.">".$d[$c]."</".$c.">" . PHP_EOL;
  1867 + }
  1868 + $xmldados .= "</row>" . PHP_EOL;
  1869 + }
  1870 + $tipos = array();
  1871 + $d = $dados[0];
  1872 + foreach($chaves as $c){
  1873 + if(is_numeric($d[$c])){
  1874 + $tipos[] = "java.lang.Integer";
  1875 + }
  1876 + else{
  1877 + $tipos[] = "java.lang.String";
  1878 + }
  1879 + }
  1880 + $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
  1881 + }
  1882 + else{
  1883 + while (list($key, $val) = each($dados)) {
  1884 + $xmldados .= "<row>" . PHP_EOL;
  1885 + $xmldados .= "<nome>".$key."</nome>" . PHP_EOL;
  1886 + $xmldados .= "<valor>".$val."</valor>" . PHP_EOL;
  1887 + $xmldados .= "</row>" . PHP_EOL;
  1888 + }
  1889 + reset($dados);
  1890 + $tipos = array();
  1891 + while (list($key, $val) = each($dados)) {
  1892 + if(is_numeric($val)){
  1893 + $tipos[] = "java.lang.Integer";
  1894 + }
  1895 + else{
  1896 + $tipos[] = "java.lang.String";
  1897 + }
  1898 + if(is_numeric($key)){
  1899 + $tipos[] = "java.lang.Integer";
  1900 + }
  1901 + else{
  1902 + $tipos[] = "java.lang.String";
  1903 + }
  1904 + break;
  1905 + }
  1906 + $xml .= '<!--'.implode($tipos,",").'-->' . PHP_EOL;
  1907 + }
  1908 + $xml .= $xmldados;
  1909 + $xml .= '</result-set>' . PHP_EOL;
  1910 + return $xml;
  1911 + }
  1912 + /**
  1913 + * Verifica se em um array existe uma chave com determinado valor
  1914 + * @param Array
  1915 + * @param nome da chave
  1916 + * @param valor a ser buscado
  1917 + * @return boolean
  1918 + */
  1919 + function buscaNoArray($lista,$chave,$valor){
  1920 + foreach($lista as $l){
  1921 + if($l[$chave] == $valor){
  1922 + return true;
  1923 + }
  1924 + }
  1925 + return false;
  1926 + }
  1927 + /**
  1928 + * Obtem o valor de um registro de uma tabela de regiao com base na coordenada de longitude e latitude
  1929 + * @param codigo do tipo de regiao
  1930 + * @param longitude
  1931 + * @param latitude
  1932 + * @return array
  1933 + */
  1934 + function xy2regiao($codigo_tipo_regiao,$x,$y){
  1935 + //pega a tabela, esquema e conexao para acessar os dados da regiao
  1936 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1937 + $c = $this->listaConexao($regiao["codigo_estat_conexao"],true);
  1938 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1939 + $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"].")";
  1940 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1941 + $r = $q->fetchAll();
  1942 + if(count($r) > 0){
  1943 + return $r[0];
  1944 + }
  1945 + else{
  1946 + return "";
  1947 + }
  1948 + }
  1949 + /**
  1950 + * Busca os dados de uma medida de variavel para uma regiao
  1951 + * Identificador da regiao e o valor a ser encontrado na coluna de
  1952 + * ligacao da tabela da medida da variavel com a tabela com as localidades (tipo de regiao)
  1953 + * @param identificador da regiao
  1954 + * @param id da medida da variavel
  1955 + * @return multitype:unknown multitype: string
  1956 + */
  1957 + function listaAtributosMedidaVariavelRegiao ($identificador_regiao,$id_medida_variavel){
  1958 + $medida = $this->listaMedidaVariavel("",$id_medida_variavel);
  1959 + $c = $this->listaConexao($medida["codigo_estat_conexao"],true);
  1960 + if($medida["colunavalor"] == ""){
  1961 + return "";
  1962 + }
  1963 + $dbh = new PDO('pgsql:dbname='.$c["bancodedados"].';user='.$c["usuario"].';password='.$c["senha"].';host='.$c["host"].';port='.$c["porta"]);
  1964 + $colunassql[] = $medida["colunavalor"].",".$medida["colunaidunico"];
  1965 +
  1966 + $alias[] = $medida["nomemedida"];
  1967 + $colunas[] = $medida["colunavalor"];
  1968 + $alias[] = "idunico";
  1969 + $colunas[] = $medida["colunaidunico"];
  1970 + $descricao[] = $medida["unidade_medida"];
  1971 + $parametros = $this->listaParametro($id_medida_variavel);
  1972 + foreach($parametros as $p){
  1973 + $colunassql[] = $p["coluna"];
  1974 + $alias[] = $p["nome"];
  1975 + $descricao[] = $p["descricao"];
  1976 + $colunas[] = $p["coluna"];
  1977 + }
  1978 +
  1979 + $sql = "select ".implode(",",$colunassql)." from ".$medida["esquemadb"].".".$medida["tabela"]." WHERE ".$medida["colunaidgeo"]."::text = ".$identificador_regiao."::text ";
  1980 + if($medida["filtro"] != ""){
  1981 + $sql .= " and ".$medida["filtro"];
  1982 + }
  1983 + $q = $dbh->query($sql,PDO::FETCH_ASSOC);
  1984 + $r = $q->fetchAll();
  1985 + return array("dados"=>$r,"aliascolunas"=>$alias,"colunas"=>$colunas,"descricao"=>$descricao);
  1986 + }
  1987 + /**
  1988 + * Converte um tipo de regiao em shapefile
  1989 + * @param codigo do tipo de regiao
  1990 + * @return nome do arquivo criado
  1991 + */
1939 1992 function regiao2shp($codigo_tipo_regiao){
1940   - $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
  1993 + $regiao = $this->listaTipoRegiao($codigo_tipo_regiao);
1941 1994 $dados = $this->obtemDadosTabelaDB($regiao["codigo_estat_conexao"],$regiao["esquemadb"],$regiao["tabela"],"sim");
1942 1995 $tipol = $this->listaPropGeoRegiao($codigo_tipo_regiao);
1943 1996 include_once(dirname(__FILE__)."/classesphp/classe_shp.php");
... ... @@ -1948,28 +2001,28 @@ class MetaestatInfo{
1948 2001 $conv[0] = 1;
1949 2002 $conv[1] = 3;
1950 2003 $conv[2] = 5;
1951   - //cria as colunas
  2004 + //cria as colunas
1952 2005 $cni = 0;
1953   - foreach($dados["colunas"] as $t){
1954   - $temp = strtoupper($t["field"]);
  2006 + foreach($dados["colunas"] as $t){
  2007 + $temp = strtoupper($t["field"]);
1955 2008 if(strlen($temp) > 10){
1956   - $temp = substr($temp,0,8).($cni++);
1957   - }
  2009 + $temp = substr($temp,0,8).($cni++);
  2010 + }
1958 2011 if($t["type"] == "varchar" || $t["type"] == "char" || $t["type"] == "character varying" || $t["type"] == "character" || $t["type"] == "text"){
1959   - $def[] = array($temp,"C","254");
  2012 + $def[] = array($temp,"C","254");
1960 2013 }
1961 2014 else{
1962 2015 if($t["lengthvar"] < 0){
1963 2016 $t["lengthvar"] = 0;
1964 2017 }
1965 2018 $def[] = array($temp,"N", $t["length"],$t["lengthvar"]);
1966   - }
1967   - }
1968   - $nomeshp = $this->dir_tmp."/regiao$codigo_tipo_regiao"."_".$this->nomeRandomico();
  2019 + }
  2020 + }
  2021 + $nomeshp = $this->dir_tmp."/regiao$codigo_tipo_regiao"."_".$this->nomeRandomico();
1969 2022 $dbaseExiste = false;
1970   - if(function_exists("dbase_create")){
1971   - $dbaseExiste = true;
1972   - }
  2023 + if(function_exists("dbase_create")){
  2024 + $dbaseExiste = true;
  2025 + }
1973 2026 //para manipular dbf
1974 2027 if($dbaseExiste == false){
1975 2028 include_once (dirname(__FILE__)."/../pacotes/phpxbase/api_conversion.php");
... ... @@ -1979,30 +2032,30 @@ class MetaestatInfo{
1979 2032 {$db = dbase_create($nomeshp.".dbf", $def);}
1980 2033 $dbname = $nomeshp.".dbf";
1981 2034 $reg = array();
1982   - $novoshpf = ms_newShapefileObj($nomeshp.".shp", $conv[$tipol["st_dimension"]]);
1983   - $cols = $dados["colunas"];
1984   - $nc = count($dados["colunas"]);
1985   - foreach($dados["linhas"] as $l){
1986   - $reg = array();
1987   - for($i=0;$i<$nc;$i++){
1988   - if($cols[$i]["type"] != "geometry" && $cols[$i]["type"] != "geography"){
1989   - $reg[] = $l[$i];
1990   - }
1991   - else{
1992   - $reg[] = 0;
1993   - if($cols[$i]["field"] == $regiao["colunageo"]){
  2035 + $novoshpf = ms_newShapefileObj($nomeshp.".shp", $conv[$tipol["st_dimension"]]);
  2036 + $cols = $dados["colunas"];
  2037 + $nc = count($dados["colunas"]);
  2038 + foreach($dados["linhas"] as $l){
  2039 + $reg = array();
  2040 + for($i=0;$i<$nc;$i++){
  2041 + if($cols[$i]["type"] != "geometry" && $cols[$i]["type"] != "geography"){
  2042 + $reg[] = $l[$i];
  2043 + }
  2044 + else{
  2045 + $reg[] = 0;
  2046 + if($cols[$i]["field"] == $regiao["colunageo"]){
1994 2047 $shape = ms_shapeObjFromWkt($l[$i]);
1995   - }
1996   - }
1997   - }
  2048 + }
  2049 + }
  2050 + }
1998 2051 $novoshpf->addShape($shape);
1999 2052 if($dbaseExiste == false){
2000 2053 xbase_add_record($db,$reg);
2001 2054 }
2002 2055 else{
2003 2056 dbase_add_record($db,$reg);
2004   - }
2005   - }
  2057 + }
  2058 + }
2006 2059 if($this->dbaseExiste == false){
2007 2060 xbase_close($db);
2008 2061 }
... ... @@ -2010,17 +2063,17 @@ class MetaestatInfo{
2010 2063 dbase_close($db);
2011 2064 }
2012 2065 return $nomeshp;
2013   - }
2014   - /*
2015   - * Testa se os elementos de um array sao numericos
2016   - */
2017   - function testaNumerico($valores){
2018   - foreach ($valores as $valor) {
2019   - if(!empty($valor) && !is_numeric($valor)) {
2020   - echo "valor nao numerico";
2021   - exit;
2022   - }
2023   - }
2024   - }
2025   -}
2026   -?>
  2066 + }
  2067 + /*
  2068 + * Testa se os elementos de um array sao numericos
  2069 + */
  2070 + function testaNumerico($valores){
  2071 + foreach ($valores as $valor) {
  2072 + if(!empty($valor) && !is_numeric($valor)) {
  2073 + echo "valor nao numerico";
  2074 + exit;
  2075 + }
  2076 + }
  2077 + }
  2078 +}
  2079 +?>
... ...
classesphp/metaestat_controle.php
... ... @@ -171,7 +171,11 @@ switch (strtoupper ( $funcao )) {
171 171 break;
172 172 case "LISTACLASSIFICACAOMEDIDA" :
173 173 $m = new MetaestatInfo ();
174   - retornaJSON ( $m->listaClassificacaoMedida ( $_pg ["id_medida_variavel"], $_pg ["id_classificacao"] ) );
  174 + $lista = $m->listaClassificacaoMedida ( $_pg ["id_medida_variavel"], $_pg ["id_classificacao"] );
  175 + if(count($lista) == 0){
  176 + $lista = array(array("id_classificacao"=>"","nome"=>"default"));
  177 + }
  178 + retornaJSON ( $lista );
175 179 exit ();
176 180 break;
177 181 case "MAPFILEMEDIDAVARIAVEL" :
... ...
ferramentas/metaestat/template_mst.html
1 1 <div class="metaestat" style="margin-left: 5px;">
2 2 <!-- usar span pq div tem Important -->
3   - <div class="affix" style="width:270px" data-spy="affix" data-target="#i3geoCartoParametros_corpo" >
  3 + <div class="affix" style="width: 290px;z-index: 1000000;background-color:#477596 !IMPORTANT;" data-spy="affix" data-target="#i3geoCartoParametros_corpo" >
4 4 <span style="display:block;visibility:hidden" id="aguardeMetaestat">
5 5 <span class="progress" style="display:block; height:5px;width:100%;margin:0px;">
6 6 <span class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" style="margin:0px;width:100%">
... ...
ferramentas/metaestat/templatesimples_mst.html
1 1 <div class="metaestat" style="margin-left: 5px;">
2 2 <!-- usar span pq div tem Important -->
3   - <div class="affix" style="width:270px" data-spy="affix" data-target="#i3geoCartoParametros_corpo" >
  3 + <div class="affix" style="width: 290px;z-index: 1000000;background-color:#477596 !IMPORTANT;" data-spy="affix" data-target="#i3geoCartoParametros_corpo" >
4 4 <span style="display:block;visibility:hidden" id="aguardeMetaestat">
5 5 <span class="progress" style="display:block; height:5px;width:100%;margin:0px;">
6 6 <span class="progress-bar progress-bar-success progress-bar-striped active" role="progressbar" style="margin:0px;width:100%">
... ...