/* Title: Editor vetorial de limites de regiões do sistema METAESTAT Utilizado em i3geo/metaestat/editorlimites.php Utiliza a API do Google Maps e pacotes/wicket/wicket.js (que cria o objeto Wkt com funcoes para processamento de Wkt) Arquivo: i3geo/ferramentas/metaestat/editorlimites.js Licenca: GPL2 i3Geo Interface Integrada de Ferramentas de Geoprocessamento para Internet Direitos Autorais Reservados (c) 2006 Ministério do Meio Ambiente Brasil Desenvolvedor: Edmar Moretti edmar.moretti@gmail.com Esse programa utiliza parcialmente os codigos da aplicacao calculadora de carbono desenvolvido pelo IPAM - Instituto de Pesquisa Ambiental da Amazonia Este programa e software livre; voce pode redistribui-lo e/ou modifica-lo sob os termos da Licenca Publica Geral GNU conforme publicada pela Free Software Foundation; Este programa e distribuido na expectativa de que seja util, porem, SEM NENHUMA GARANTIA; nem mesmo a garantia implicita de COMERCIABILIDADE OU ADEQUACAO A UMA FINALIDADE ESPECIFICA. Consulte a Licenca Publica Geral do GNU para mais detalhes. Voce deve ter recebido uma copia da Licenca Publica Geral do GNU junto com este programa; se nao, escreva para a Free Software Foundation, Inc., no endereco 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. */ if(typeof(i3GEOF) === 'undefined'){ var i3GEOF = {}; } /* Classe: i3GEOF.editorlimites Funções de edição vetorial utilizadas pelo editor de regiões do sistema METAESTAT */ i3GEOF.editorlimites = { iconePonto: function(sel){ if(sel){ return i3GEO.configura.locaplic+"/imagens/google/symbol_middot_y.png"; } else{ return i3GEO.configura.locaplic+"/imagens/google/symbol_middot.png"; } }, /** * Objeto DOM com a imagem de aguarde existente no cabecalho da janela * */ aguarde: "", /** * Guarda o Id do DIV que recebera o conteudo HTML do editor */ iddiv: "", /** * Objeto criado com new google.maps.drawing.DrawingManager */ drawingManager: "", selectedShape: null, /** * Array que guarda todos os objetos que estao atualmente no mapa * E atualizado toda vez que uma figura e acrescentada ou removida */ shapes: [], /** * guarda o mapeamento entre o codigo da regiao e o codigo do layer adicionado ao mapa */ regioestemas:{}, /** * Guarda o mapeamento entre o codigo da regiao e o codigo do layer adicionado ao mapa */ temasregioes:{}, /** * Guarda os dados descritivos sobre cada regiao obtidos na formacao no combo de escolha de regioes */ descregioes:[], /** * Inicia o editor * * Cria o objeto da API do Google Maps com new google.maps.drawing.DrawingManager * A janela flutuante que recebera os componentes do editor ja deve estar aberta (veja editorlimites.php) * Executa i3GEOF.editorlimites.html * * @param Id do DIV que recebera o conteudo HTML do editor */ inicia: function(iddiv){ var i,n,ics; //mensagem i3GEO.janela.tempoMsg("Atenção: apenas tabelas no esquema i3geo_metaestat podem ser editadas."); i3GEOF.editorlimites.iddiv = iddiv; $i(iddiv).innerHTML = i3GEOF.editorlimites.html(); ics = $i(iddiv).getElementsByTagName("button"); n = ics.length; i3GEO.barraDeBotoes.ativaBotoes(); i3GEOF.editorlimites.comboRegiaoEditavel(); for(i=0;i' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + '
'; //combo para escolher a regiao return ins; }, /** * Atualiza a ferramenta quando a janela flutuante tem seu foco ativado */ ativaFoco: function(){ i3GEO.util.mudaCursor(i3GEO.configura.cursores,"crosshair",i3GEO.Interface.IDMAPA,i3GEO.configura.locaplic); i3GEO.barraDeBotoes.ativaIcone("pan"); i3GEOF.editorlimites.mudaicone(); i3GEO.Interface.googlemaps.recalcPar(); }, /** * Marca uma figura como selecionada * @param objeto shape que sera marcado */ setSelection: function(shape){ if(shape.setEditable){ shape.setEditable(!shape.editable); } else{ shape.editable = true; shape.setIcon({url: i3GEOF.editorlimites.iconePonto(true)}); } }, /** * Marca todas as figuras como nao selecionadas * As figuras existentes no mapa sao mantidas na variavel i3GEOF.editorlimites.shapes */ clearSelection: function(){ var i, n = i3GEOF.editorlimites.shapes.length; for(i=0;i 0){ if(naoconfirma === false){ var x = window.confirm("Remove as figuras selecionadas?"); } else{ x = true; } if(x){ for(i=0;i', i; ins += ""; if(onde){ onde.innerHTML = ins; } return ins; }; i3GEO.php.listaTipoRegiao(temp,codigo_tipo_regiao); }, /** * Funcao ativada no evento onchange do combo criado com comboRegiaoEditavel * Executa i3GEO.php.mapfileTipoRegiao */ comboRegiaoEditavelOnchange: function(combo){ if(combo.value === ""){ return; } i3GEOF.editorlimites.editarAtributos.desativa(); var temp = function(retorno){ if(i3GEO.arvoreDeCamadas.pegaTema(retorno.layer) == ""){ i3GEO.php.adtema(i3GEO.atualiza,retorno.mapfile); //guarda o codigo e relaciona com a regiao i3GEOF.editorlimites.regioestemas["a"+$i("i3geoCartoRegioesEditaveis").value] = retorno.layer; i3GEOF.editorlimites.temasregioes[retorno.layer] = $i("i3geoCartoRegioesEditaveis").value; } }; i3GEO.php.mapfileTipoRegiao(temp,combo.value); }, /** * Altera as bordas dos icones e desativa eventos * Desativa todos os botoes e ativa o indicado * @param objeto DOM que representa o botao que sera focado */ mudaicone: function(botao){ var c = $i(i3GEOF.editorlimites.iddiv), ci = c.getElementsByTagName("img"), n = ci.length, i; for(i=0;i 0){ i3GEOF.editorlimites.deleteSelectedShape(true); } pol = new google.maps.Marker({ position: new google.maps.LatLng(obj.getPosition().ob,obj.getPosition().pb), map: i3GeoMap, icon: { url: i3GEOF.editorlimites.iconePonto(false) }, clickable: true, zIndex: 1, draggable: true, tema: tema, colunaid: colunaid, valorid: valorid, colunanome: colunanome, valornome: valornome, editable: false }); google.maps.event.addListener(pol, 'click', function() { i3GEOF.editorlimites.setSelection(pol); }); i3GEOF.editorlimites.shapes.push(pol); return; } }, /** * Salva um poligono no banco de dados */ salvaLimite: { /** * Inicia a ferramenta definindo as funcoes dos botoes * Executa i3GEOF.editorlimites.salvaLimite.criaJanelaFlutuante */ inicia: function(){ if(i3GEO.login.verificaCookieLogin() === false){ i3GEO.janela.tempoMsg("Você precisa fazer login para usar essa opção"); return; } var s = i3GEOF.editorlimites.selectedShapes(), n = s.length, janela = YAHOO.i3GEO.janela.manager.find("salvaLimite"); if(janela){ janela.destroy(); } if(n == 1){ s = s[0]; i3GEOF.editorlimites.salvaLimite.criaJanelaFlutuante(i3GEOF.editorlimites.salvaLimite.html( s.colunaid, s.valorid, s.colunanome, s.valornome )); new YAHOO.widget.Button( "i3GEOFmetaestati3GEOF.editorlimitesBotao1", {onclick:{fn: function(){ i3GEOF.editorlimites.salvaLimite.gravaDados(true); }}} ); new YAHOO.widget.Button( "i3GEOFmetaestati3GEOF.editorlimitesBotao2", {onclick:{fn: function(){ i3GEOF.editorlimites.salvaLimite.gravaDados(false); }}} ); new YAHOO.widget.Button( "i3GEOFmetaestati3GEOF.editorlimitesBotao3", {onclick:{fn: function(){ i3GEOF.editorlimites.salvaLimite.excluiPoligono(); }}} ); } else{ i3GEO.janela.tempoMsg("Selecione uma figura"); } }, /** * Monta o HTML para o formulario que permite salvar os dados */ html:function(colunaIdElemento,valorIdElemento,colunaNomeElemento,valorNomeElemento){ var ins = '' + '

Se o valor do código for vazio, será criado um novo elemento. Caso contrário, os valores atualmente registrados serão atualizados.

' + '

Edite os atributos:

' + '' + '' + '' + '' + '

Código:

' + '

' + '

Nome:

' + '

' + '

Escolha a operação desejada:

' + '' + ' ' + '

'; return ins; }, /** * Cria a janela flutuante para receber os componentes da ferramenta * @param html com o conteudo da ferramenta */ criaJanelaFlutuante: function(html){ var titulo,cabecalho,minimiza,janela; cabecalho = function(){}; minimiza = function(){ i3GEO.janela.minimiza("salvaLimite"); }; titulo = "Salva limite   "; janela = i3GEO.janela.cria( "300px", "265px", "", "", "", titulo, "salvaLimite", true, "hd", cabecalho, minimiza ); $i("salvaLimite_corpo").style.backgroundColor = "white"; $i("salvaLimite_corpo").innerHTML = html; YAHOO.util.Event.addListener(janela[0].close, "click", i3GEOF.editorlimites.mudaicone); }, /** * Aplica a operacao de salvar os dados no banco para o shape selecionado * Executa admin/php/metaestat.php?funcao=mantemDadosRegiao * @param boolean indica se as coordenadas serao salvas tambem */ gravaDados: function(comwkt){ if(i3GEO.login.verificaCookieLogin() === false){ i3GEO.janela.tempoMsg("Você precisa fazer login para usar essa opção"); return; } if(!window.confirm("Grava mesmo os dados?")){ return; } var p,codigo_tipo_regiao = $i("i3geoCartoRegioesEditaveis").value, identificadornovo = $i("inputIdentificadorNovoElemento").value, identificador = $i("inputIdentificadorElemento").value, nome = $i("inputNomeNovoElemento").value, wkt = "", temp = function(retorno){ i3GEOF.editorlimites.deleteSelectedShape(true); var janela = YAHOO.i3GEO.janela.manager.find("salvaLimite"); if(janela){ janela.destroy(); } i3GEO.Interface.redesenha(); }; if(comwkt === true){ wkt = i3GEOF.editorlimites.toWKT(i3GEOF.editorlimites.selectedShapes()[0]); } else{ if(identificadornovo === identificador && $i("inputNomeElemento").value === nome){ i3GEO.janela.tempoMsg("Valores iguais ao original"); return; } } p = i3GEO.configura.locaplic+"/admin/php/metaestat.php?funcao=mantemDadosRegiao&tipo="; cpJSON.call(p,"foo",temp,"&codigo_tipo_regiao="+codigo_tipo_regiao+"&identificadornovo="+identificadornovo+"&identificador="+identificador+"&nome="+nome+"&wkt="+wkt); }, /** * Exclui um registro do banco de dados * Executa admin/php/metaestat.php?funcao=mantemDadosRegiao&tipo=excluir */ excluiPoligono: function(){ if(i3GEO.login.verificaCookieLogin() === false){ i3GEO.janela.tempoMsg("Você precisa fazer login para usar essa opção"); return; } if(!window.confirm("Exclui mesmo o poligono?")){ return; } var codigo_tipo_regiao = $i("i3geoCartoRegioesEditaveis").value, identificador = $i("inputIdentificadorElemento").value, temp = function(retorno){ i3GEOF.editorlimites.deleteSelectedShape(true); var janela = YAHOO.i3GEO.janela.manager.find("salvaLimite"); if(janela){ janela.destroy(); } i3GEO.Interface.redesenha(); }, p = i3GEO.configura.locaplic+"/admin/php/metaestat.php?funcao=mantemDadosRegiao&tipo=excluir"; cpJSON.call(p,"foo",temp,"&codigo_tipo_regiao="+codigo_tipo_regiao+"&identificador="+identificador); } }, /** *Funcoes que controlam o processo de edicao de atributos de um shape */ editarAtributos: { aliascolunas: "", //guarda os nomes das colunas e seus aliases para permitir a criacao de novos registros x: "", y: "", /** * Ativa a ferramenta * Define os eventos de onclick para abrir formulario quando o usuario clica no mapa * Para cada regiao sao obtidas todas as variaveis cadastradas * Executa i3GEOF.editorlimites.editarAtributos.criaJanelaFlutuante * Executa i3GEOF.editorlimites.editarAtributos.comboVariaveis(); */ ativa: function(botao){ if($i("i3geoCartoRegioesEditaveis").value == ""){ i3GEO.janela.tempoMsg("Escolha uma regiao"); return; } i3GEOF.editorlimites.mudaicone(botao); if(i3GEO.eventos.MOUSECLIQUE.toString().search("i3GEOF.editorlimites.editarAtributos.captura()") < 0) {i3GEO.eventos.MOUSECLIQUE.push("i3GEOF.editorlimites.editarAtributos.captura()");} var janela = YAHOO.i3GEO.janela.manager.find("editaAtributos"); if(janela){ $i("editarAtributosForm").innerHTML = ""; } else{ i3GEOF.editorlimites.editarAtributos.criaJanelaFlutuante(i3GEOF.editorlimites.editarAtributos.html()); i3GEOF.editorlimites.editarAtributos.comboVariaveis(); } }, /** * Fecha a janela de edicao */ desativa: function(){ var janela = YAHOO.i3GEO.janela.manager.find("editaAtributos"); if(janela){ janela.destroy(); } }, criaJanelaFlutuante: function(html){ var janela,titulo,cabecalho,minimiza; cabecalho = function(){}; minimiza = function(){ i3GEO.janela.minimiza("editaAtributos"); }; titulo = "Atributos   "; janela = i3GEO.janela.cria( "250px", "265px", "", "", "", titulo, "editaAtributos", false, "hd", cabecalho, minimiza ); $i("editaAtributos_corpo").style.backgroundColor = "white"; $i("editaAtributos_corpo").innerHTML = html; i3GEO.janela.tempoMsg("Após escolher a medida da variável, clique no mapa para escolher o limite geográfico."); YAHOO.util.Event.addListener(janela[0].close, "click", i3GEOF.editorlimites.mudaicone); }, /** * Fornece o HTML com os objetos que receberao os componentes da ferramenta * @return html */ html: function(){ var ins = '' + '

' + '

' + '

' + '

' + ''; return ins; }, /** * Monta um combo para escolha de uma variavel que sera editada * Executa i3GEO.php.listaVariavel */ comboVariaveis: function(){ var temp = function(dados){ var i,n = dados.length, ins = ''; ins += '

Escolha uma variável para editar

'; ins += ""; $i("editarAtributosVariaveis").innerHTML = ins; }; i3GEO.php.listaVariavel(temp,"i3geo_metaestat"); }, /** * Monta um combo com as medidas de uma variavel * Executa i3GEO.php.listaMedidaVariavel * @param objeto DOM do tipo select que contem a lista de variaveis */ comboMedidasVariavel: function(comboMedidas){ var temp = function(dados){ var i,n = dados.length, ins = ''; ins += '

Escolha uma medida da variável para editar

'; ins += ""; $i("editarAtributosMedidasVariavel").innerHTML = ins; }; if(comboMedidas.value !== ""){ i3GEO.php.listaMedidaVariavel(comboMedidas.value,temp); } }, /** * Captura os atributos de um elemento do mapa * Executa i3GEOF.editorlimites.editarAtributos.pegaDados(); */ captura: function(){ if(!YAHOO.i3GEO.janela.manager.find("editaAtributos")){ i3GEOF.editorlimites.mudaicone(botao); return; } i3GEOF.editorlimites.editarAtributos.x = objposicaocursor.ddx; i3GEOF.editorlimites.editarAtributos.y = objposicaocursor.ddy; i3GEOF.editorlimites.editarAtributos.pegaDados(); }, /** * Obtem os dados de um elemento de uma regiao * Monta o formulario para edicao * Executa admin/php/metaestat.php?funcao=listaAtributosMedidaVariavelXY */ pegaDados: function(){ var p = i3GEO.configura.locaplic+"/admin/php/metaestat.php?funcao=listaAtributosMedidaVariavelXY", codigo_tipo_regiao = $i("i3geoCartoRegioesEditaveis").value, id_medida_variavel = $i("editarAtributosComboMedidas").value, temp = function(retorno){ var atr = retorno.atributos, i = 0, n = atr.dados.length, j = 0, idunico = "", nj = atr.aliascolunas.length, ins = "" + '

Limite geográfico escolhido:

' + '

Nome: ' + retorno.regiao.nomeregiao + '

' + '

Código: ' + retorno.regiao.identificador_regiao + '

' + '' + '

Atributos:

' + '' + ' '; $i("editarAtributosRegiao").innerHTML = ins; ins = ""; //registros for(i=0;iexcluir

"; //colunas for(j=0;j' + '

'; } } } $i("editarAtributosForm").innerHTML = ins; new YAHOO.widget.Button( "editarAtributosAdicionar", {onclick:{fn: function(){ var novoel = document.createElement("div"), ins = "

"; for(j=0;j' + '

'; } } ins + "
"; novoel.innerHTML = ins; $i("editarAtributosForm").appendChild(novoel); }}} ); new YAHOO.widget.Button( "editarAtributosSalvar", {onclick:{fn: function(){ i3GEOF.editorlimites.editarAtributos.salva(); }}} ); }; cpJSON.call(p,"foo",temp,"&codigo_tipo_regiao="+codigo_tipo_regiao+"&id_medida_variavel="+id_medida_variavel+"&x="+i3GEOF.editorlimites.editarAtributos.x+"&y="+i3GEOF.editorlimites.editarAtributos.y); }, //TODO redesenhar as camadas que sofrerem altera��es em fun��o do salvar ou excluir /** * Exclui o valor de uma medida de variavel para o componente de uma regiao */ excluir: function(id){ if(i3GEO.login.verificaCookieLogin() === false){ i3GEO.janela.tempoMsg("Você precisa fazer login para usar essa opção"); return; } var p = i3GEO.configura.locaplic+"/admin/php/metaestat.php?funcao=excluiAtributosMedidaVariavel", codigo_tipo_regiao = $i("i3geoCartoRegioesEditaveis").value, id_medida_variavel = $i("editarAtributosComboMedidas").value, identificador_regiao = $i("editarAtributosidentificador_regiao").value, temp = function(retorno){ i3GEOF.editorlimites.editarAtributos.pegaDados(); i3GEO.janela.fechaAguarde("aguardeSalvaAtributos"); }; i3GEO.janela.AGUARDEMODAL = true; i3GEO.janela.abreAguarde("aguardeSalvaAtributos","Salvando..."); i3GEO.janela.AGUARDEMODAL = false; cpJSON.call(p,"foo",temp,"&codigo_tipo_regiao="+codigo_tipo_regiao+"&identificador_regiao="+identificador_regiao+"&id_medida_variavel="+id_medida_variavel+"&id="+id); }, /** * Salva os valores digitados */ salva: function(){ if(i3GEO.login.verificaCookieLogin() === false){ i3GEO.janela.tempoMsg("Você precisa fazer login para usar essa opção"); return; } var container = $i("editarAtributosForm"), divsT = container.getElementsByTagName("div"), n = divsT.length, i = 0, dv = "", inputs = "", codigo_tipo_regiao = $i("i3geoCartoRegioesEditaveis").value, id_medida_variavel = $i("editarAtributosComboMedidas").value, identificador_regiao = $i("editarAtributosidentificador_regiao").value, nj, j, colunas = [], colunasT = [], valores = [], valoresT = [], idsunicosT = [], p = i3GEO.configura.locaplic+"/admin/php/metaestat.php?funcao=salvaAtributosMedidaVariavel", re = new RegExp("idunico_", "g"),//prefixo usado para marcar o id dos elementos input que contem os valores que se quer obter temp = function(retorno){ i3GEOF.editorlimites.editarAtributos.pegaDados(); i3GEOF.editorlimites.atualizaCamadasMetaestat(); i3GEO.janela.fechaAguarde("aguardeSalvaAtributos"); }; if(codigo_tipo_regiao == ""){ i3GEO.janela.tempoMsg("Problemas com o codigo da regiao"); return; } if(id_medida_variavel == ""){ i3GEO.janela.tempoMsg("Escolha uma medida"); return; } if(identificador_regiao == ""){ i3GEO.janela.tempoMsg("Problemas com o identificador da regiao"); return; } for(i=0;i" + "Clique no mapa para traçar um polígono novo. Cada clique corresponde a um vértice do polígono. Para encerrar o traçado utilize um duplo clique. Após traçar um novo polígono pode-se selecioná-lo novamente e editar os vértices, se for necessário, ou mesmo apagar o polígono por completo. O novo polígono só será salvo por meio da opção específica para isso." + "" + "Utilize essa opção para capturar os vértices de um polígono existente. O resultado da captura é uma figura que pode ser editada, ou seja, os vértices podem ser modificados de posição ou mesmo removidos. Após editar, salve o novo polígono." + "" + "Após ativar essa opção clique no mapa sobre uma figura existente (que tenha sido capturada ou digtalizada). A figura passará então para o estado de 'selecionada' podendo ser utilizada por outras ferramentas de edição." + "" + "Remove da tela a figura que estiver selecionada. Essa operação não apaga o polígono do banco de dados, apenas remove do modo de edição." + "" + "Salva no banco de dados a figura que estiver selecionada. Essa opção altera apenas os atributos do limite geográfico, não afetando os valores armazenados em cada medida de variável." + "" + "Abre um formulário que permite alterar os valores de uma medida de variável relacionada a uma determinada região. Após abrir o formulário, clique no mapa sobre a região desejada, mas escolha a medida da variável primeiro. Os valores já existentes poderão então ser alterados ou podem ser adicionados novos." + ""; $i("editaAtributosAjuda_corpo").innerHTML = html; } };