From 94e29cf24a608e174d899cb2c7e8e1225cf6a9be Mon Sep 17 00:00:00 2001 From: Edmar Moretti Date: Tue, 28 Jun 2011 19:03:59 +0000 Subject: [PATCH] - Opção para criar um buffer no ponto clicado na ferramenta de identificação --- admin/admin.db | Bin 71680 -> 0 bytes classesjs/dicionario_ajuda.js | 2 +- classesphp/classe_analise.php | 49 +++++++++++++++++++++++++++++++------------------ classesphp/mapa_controle.php | 2 +- ferramentas/bufferpt/index.js.php | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ferramentas/identifica/index.js.php | 12 ++++++++++-- 6 files changed, 227 insertions(+), 22 deletions(-) create mode 100644 ferramentas/bufferpt/index.js.php diff --git a/admin/admin.db b/admin/admin.db index a4fc612..794bcae 100644 Binary files a/admin/admin.db and b/admin/admin.db differ diff --git a/classesjs/dicionario_ajuda.js b/classesjs/dicionario_ajuda.js index 9f9693b..4f01939 100644 --- a/classesjs/dicionario_ajuda.js +++ b/classesjs/dicionario_ajuda.js @@ -210,7 +210,7 @@ g_traducao_ajuda = { diretorio:"i3geo/ferramentas/buffer", categoria:"3", pt:"O entorno, ou buffer, é um polígono que circunda um elemento geográfico em uma distância fixa. Para o cálculo de distância o i3Geo utiliza a projeção policônica. Os atributos do tema alvo são copiados para os polígonos resultantes e uma nova camada é adicionada ao mapa. Opcionalmente, os polígonos resultantes podem ser unidos como um único.", - complemento:"Para gerar o entorno, você precisa selecionar alguns elementos de um tema. Utilize para isso a opção de seleção ou a tabela de atributos do tema desejado.", + complemento:"Para gerar o entorno, você precisa selecionar alguns elementos de um tema. Utilize para isso a opção de seleção ou a tabela de atributos do tema desejado. O buffer pode ser gerado também por meio da ferramenta de identificação.", tela:"ferramentas/buffer/exemplo.htm", apijs:"i3GEO.analise.dialogo.buffer()" }, diff --git a/classesphp/classe_analise.php b/classesphp/classe_analise.php index f2a613b..ef01de6 100644 --- a/classesphp/classe_analise.php +++ b/classesphp/classe_analise.php @@ -1226,14 +1226,17 @@ $locaplic - Localização do I3geo. $unir - sim|nao indica se os elementos selecionados deverão ser unidos em um só antes do buffer ser criado +$wkt - (opcional) elemento no formato wkt para o qual o buffer será gerado. Só de ve ser definido se $this->nome for vazio, ou seja +se o parâmetro "tema" não tiver sido fornecido ao construtor da classe + return: nome do layer criado com o buffer. */ - function criaBuffer($distancia,$locaplic,$unir="nao") + function criaBuffer($distancia,$locaplic,$unir="nao",$wkt="") { - if(!$this->layer){return "erro";} set_time_limit(180); + //error_reporting(E_ALL); //para manipular dbf if(file_exists($this->locaplic."/pacotes/phpxbase/api_conversion.php")) include_once($this->locaplic."/pacotes/phpxbase/api_conversion.php"); @@ -1241,20 +1244,32 @@ nome do layer criado com o buffer. include_once "../pacotes/phpxbase/api_conversion.php"; $nomebuffer = nomeRandomico(); $nomeshp = $this->diretorio."/".$nomebuffer; - //pega os shapes selecionados - carregaquery($this->arquivo,&$this->layer,&$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $items = pegaItens($this->layer); - $this->layer->open(); - $res_count = $this->layer->getNumresults(); - $buffers = array(); - //pega um shape especifico - for ($i = 0; $i < $res_count; ++$i) - { - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); + $listaShapes = array(); + if($this->nome != ""){ + //pega os shapes selecionados + carregaquery($this->arquivo,&$this->layer,&$this->mapa); + $sopen = $this->layer->open(); + if($sopen == MS_FAILURE){return "erro";} + $items = pegaItens($this->layer); + $this->layer->open(); + $res_count = $this->layer->getNumresults(); + $buffers = array(); + //pega um shape especifico + for ($i = 0; $i < $res_count; ++$i) + { + $result = $this->layer->getResult($i); + $shp_index = $result->shapeindex; + $listaShapes[] = $this->layer->getfeature($shp_index,-1); + } + $fechou = $this->layer->close(); + } + else{ + $s = ms_shapeObjFromWkt($wkt); + $s->values["ID"] = 0; + $items[] = "ID"; + $listaShapes[] = $s; + } + foreach($listaShapes as $shape){ //calcula a extensão geografica $rect = $shape->bounds; $projInObj = ms_newprojectionobj("proj=latlong"); @@ -1283,11 +1298,9 @@ nome do layer criado com o buffer. $buffers = array($ns); $shapes = array($shapes[0]); } - $fechou = $this->layer->close(); //gera o novo arquivo shape file // cria o shapefile $novoshpf = ms_newShapefileObj($nomeshp, MS_SHP_POLYGON); - $items = pegaItens($this->layer); // cria o dbf $def = array(); $def[] = array("i3geo","C","254"); diff --git a/classesphp/mapa_controle.php b/classesphp/mapa_controle.php index e18f81f..d166856 100644 --- a/classesphp/mapa_controle.php +++ b/classesphp/mapa_controle.php @@ -464,7 +464,7 @@ Salva o mapa acrescentando um novo layer com o buffer. include_once("classe_analise.php"); copiaSeguranca($map_file); $m = new Analise($map_file,$tema,$locaplic,$ext); - $retorno = $m->criaBuffer($distancia,$locaplic,$unir); + $retorno = $m->criaBuffer($distancia,$locaplic,$unir,$wkt); $m->salva(); $_SESSION["contadorsalva"]++; //limpa selecao diff --git a/ferramentas/bufferpt/index.js.php b/ferramentas/bufferpt/index.js.php new file mode 100644 index 0000000..ae9ca7c --- /dev/null +++ b/ferramentas/bufferpt/index.js.php @@ -0,0 +1,184 @@ + +/*jslint plusplus:false,white:false,undef: false, rhino: true, onevar: true, evil: true */ +/* +Title: Buffer (entorno) em um ponto + +Arquivo: + +i3geo/ferramentas/bufferpt/index.js.php + +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@mma.gov.br + +Este programa é software livre; você pode redistribuí-lo +e/ou modificá-lo sob os termos da Licença Pública Geral +GNU conforme publicada pela Free Software Foundation; + +Este programa é distribuído na expectativa de que seja útil, +porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita +de COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. +Consulte a Licença Pública Geral do GNU para mais detalhes. +Você deve ter recebido uma cópia da Licença Pública Geral do +GNU junto com este programa; se não, escreva para a +Free Software Foundation, Inc., no endereço +59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. +*/ +if(typeof(i3GEOF) === 'undefined'){ + i3GEOF = []; +} +/* +Classe: i3GEOF.bufferpt + +Cria um novo tema com um polígono de entorno para uma determinada coordenada enviada como parâmetro + +*/ +i3GEOF.bufferpt = { + /* + Propriedade: x + + Coordenada x (longitude) do ponto + */ + x: 0, + /* + Propriedade: y + + Coordenada y (latitude) do ponto + */ + y: 0, + /* + Variavel: aguarde + + Estilo do objeto DOM com a imagem de aguarde existente no cabeçalho da janela. + */ + aguarde: "", + /* + Function: inicia + + Inicia a ferramenta. É chamado por criaJanelaFlutuante + + Parametro: + + iddiv {String} - id do div que receberá o conteudo HTML da ferramenta + */ + inicia: function(iddiv){ + var box; + try{ + $i(iddiv).innerHTML += i3GEOF.bufferpt.html(); + new YAHOO.widget.Button( + "i3GEObufferptbotao2", + {onclick:{fn: i3GEOF.bufferpt.atualizaBox}} + ); + new YAHOO.widget.Button( + "i3GEObufferptbotao1", + {onclick:{fn: i3GEOF.bufferpt.executa}} + ); + } + catch(erro){alert(erro);} + }, + /* + Function: html + + Gera o código html para apresentação das opções da ferramenta + + Retorno: + + String com o código html + */ + html:function(){ + var ins = '' + + '

Distância em metros ao redor do ponto

' + + $inputText("","","i3GEOFbufferptDistancia","",10,0) + + '

'; + return ins; + }, + /* + Function: criaJanelaFlutuante + + Cria a janela flutuante para controle da ferramenta. + + Os parâmetros x e y são utilizados para a definição das propriedades i3GEOF.bufferpt.x e i3GEOF.bufferpt.y. Se não forem fornecidos, + seus valores permanecerão como 0. Essas propriedades podem também ser definidas pela função que ativou a ferramenta. + + Parametros: + + x {dd} - coordenada x (longitude) + + y {dd} - coordenada y (latitude) + */ + criaJanelaFlutuante: function(x,y){ + var janela,divid,temp,titulo,cabecalho,minimiza; + if(x) + {i3GEOF.bufferpt.x = x;} + if(y) + {i3GEOF.bufferpt.y = y;} + cabecalho = function(){}; + minimiza = function(){ + i3GEO.janela.minimiza("i3GEOF.bufferpt"); + }; + //cria a janela flutuante + titulo = "Entorno de um ponto    "; + janela = i3GEO.janela.cria( + "210px", + "110px", + "", + "", + "", + titulo, + "i3GEOF.bufferpt", + false, + "hd", + cabecalho, + "" + ); + divid = janela[2].id; + i3GEOF.bufferpt.aguarde = $i("i3GEOF.bufferpt_imagemCabecalho").style; + i3GEOF.bufferpt.inicia(divid); + }, + /* + Function: executa + + Altera o tamanho do mapa + + Veja: + + + */ + executa: function(){ + try{ + if(i3GEOF.bufferpt.aguarde.visibility === "visible") + {return;} + var distancia = $i("i3GEOFbufferptDistancia").value, + p, + fim, + cp; + if (distancia*1 !== 0) + { + i3GEOF.bufferpt.aguarde.visibility = "visible"; + fim = function(retorno){ + i3GEOF.bufferpt.aguarde.visibility = "hidden"; + if (retorno.data === undefined ) + {alert("Erro. A operação demorou muito.");} + else + {i3GEO.atualiza();} + }; + p = i3GEO.configura.locaplic+"/classesphp/mapa_controle.php?g_sid="+i3GEO.configura.sid+"&funcao=criabuffer&tema=&distancia="+distancia+"&unir=nao&wkt=POINT("+i3GEOF.bufferpt.x+" "+i3GEOF.bufferpt.y+")"; + cp = new cpaint(); + cp.set_response_type("JSON"); + cp.call(p,"criaBuffer",fim); + } + else + {alert("Distancia invalida");} + } + catch(e){$i("i3GEObufferfim").innerHTML = "

Erro. "+e;i3GEO.janela.fechaAguarde();i3GEOF.bufferpt.aguarde.visibility = "hidden";} + + + + } +}; + \ No newline at end of file diff --git a/ferramentas/identifica/index.js.php b/ferramentas/identifica/index.js.php index b212d4b..ef71c16 100644 --- a/ferramentas/identifica/index.js.php +++ b/ferramentas/identifica/index.js.php @@ -163,6 +163,14 @@ i3GEOF.identifica = { }; $i("i3GEOidentificaguia5").onclick = function(){ i3GEO.guias.mostraGuiaFerramenta("i3GEOidentificaguia5","i3GEOidentificaguia"); + new YAHOO.widget.Button("i3GEOidentificabotao2",{ + onclick:{ + fn: function(){ + var js = i3GEO.configura.locaplic+"/ferramentas/bufferpt/index.js.php"; + i3GEO.util.scriptTag(js,"i3GEOF.bufferpt.criaJanelaFlutuante("+i3GEOF.identifica.x+","+i3GEOF.identifica.y+")","i3GEOF.bufferpt_script"); + } + } + }); var ins = "",retorna; i3GEO.coordenadas.formato = "lista"; i3GEO.coordenadas.mostraCoordenadas(false,"i3GEOidentificacoordtexto",i3GEOF.identifica.x,i3GEOF.identifica.y); @@ -303,7 +311,7 @@ i3GEOF.identifica = { ins += '

  • Temas visíveis
  • '; ins += '
  • Todos
  • '; ins += '
  • Etiquetas
  • '; - ins += '
  • XY
  • '; + ins += '
  • XY/buffer
  • '; ins += '
  • Propriedades
  • '; ins += ' '; ins += ''; @@ -328,7 +336,7 @@ i3GEOF.identifica = { ins += ' Valores para o ponto indicado no mapa
    '; ins += '

    '; ins += '
    '; - + ins += '

    '; ins += ' '; //ins += ' '; return ins; -- libgit2 0.21.2