From 3a506a79ebff29096c9ab0c4d730c3e5102c5623 Mon Sep 17 00:00:00 2001 From: Edmar Moretti Date: Tue, 22 Nov 2011 10:36:18 +0000 Subject: [PATCH] Correção das opções que utilizam seleção para funcionarem corretamente no Postgis na versão 6 do Mapserver --- classesphp/classe_analise.php | 318 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- classesphp/classe_atributos.php | 60 +++++++++++++++--------------------------------------------- classesphp/classe_shp.php | 14 ++------------ classesphp/classe_temas.php | 85 ++++++++++++++++++++++++++----------------------------------------------------------- classesphp/funcoes_gerais.php | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------- 5 files changed, 221 insertions(+), 369 deletions(-) diff --git a/classesphp/classe_analise.php b/classesphp/classe_analise.php index 65b3caa..c1851bb 100644 --- a/classesphp/classe_analise.php +++ b/classesphp/classe_analise.php @@ -1021,29 +1021,13 @@ $locaplic - Localização do I3geo. //define o nome do novo shapefile que será criado $nomefinal = nomeRandomico(); $nomeshp = $this->diretorio."/".$nomefinal; - //pega os shapes selecionados - $itemspt = pegaItens($layerPt); - $existesel = carregaquery2($this->arquivo,$this->layer,$this->mapa); - if ($existesel == "nao") - {$layerPt->queryByrect($this->mapa->extent);} - $res_count = $layerPt->getNumresults(); - $pontos = array(); - //pega um shape especifico - $sopen = $layerPt->open(); - if($sopen == MS_FAILURE){return "erro";} - $spts = array(); - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6) - {$shape = $layerPt->getShape($layerPt->getResult($i));} - else{ - $result = $layerPt->getResult($i); - $shp_index = $result->shapeindex; - $shape = $layerPt->getfeature($shp_index,-1); - } - $spts[] = $shape; + // + $spts = retornaShapesSelecionados($layerPt,$this->arquivo,$this->mapa); + if(count($spts) == 0){ + $spts = retornaShapesMapext($layerPt,$this->mapa); } - $layerPt->close(); + // + $itemspt = pegaItens($layerPt); //gera o novo arquivo shape file // cria o dbf $def = $this->criaDefDb($itemspt); @@ -1098,7 +1082,7 @@ $locaplic - Localização do I3geo. $lineo = $spt->line(0); $pt = $lineo->point(0); //faz a pesquisa - //error_reporting(E_ALL); + error_reporting(E_ALL); foreach ($layers as $layer) { $layer->set("template","none.htm"); @@ -1109,7 +1093,7 @@ $locaplic - Localização do I3geo. $itens = $listaItens[$layer->name]; $sopen = $layer->open(); if($sopen == MS_FAILURE){return "erro";} - if ($res_count > 0 && $layer->getResult(0) !== FALSE) + if ($layer->getResult(0) !== FALSE) { if($this->v == 6) {$shape = $layer->getShape($layer->getResult(0));} @@ -1139,8 +1123,7 @@ $locaplic - Localização do I3geo. if($this->dbaseExiste == false) xbase_close($db); else - dbase_close($db); - + dbase_close($db); $novolayer = ms_newLayerObj($this->mapa, $layerPt); $novolayer->set("data",$nomeshp.".shp"); $novolayer->set("name",$nomefinal); @@ -1149,9 +1132,6 @@ $locaplic - Localização do I3geo. $novolayer->setmetadata("DOWNLOAD","SIM"); $novolayer->setmetadata("ITENS",""); $novolayer->setmetadata("ITENSDESC",""); - //$novolayer->removeMetaData("ITENS"); - //$novolayer->removeMetaData("ITENSDESC"); - if(ms_GetVersionInt() > 50201) {$novolayer->setconnectiontype(MS_SHAPEFILE);} else @@ -1171,7 +1151,7 @@ parameters: temaorigem - nome do layer com o ponto de origem -temadestino - nome od tema com os pontos de destino +temadestino - nome do tema com os pontos de destino temaoverlay - tema que será utilizado para selecionar o tema de destino @@ -1182,8 +1162,9 @@ itemorigem - nome do item na tabela de atributos do tema de origem que será acre itemdestino - nome do item na tabela de atributos do tema de origem que será acrescentado ao tema que será criado */ -function distanciaptpt($temaorigem,$temadestino,$temaoverlay,$locaplic,$itemorigem,$itemdestino) +function distanciaptpt($temaorigem,$temadestino,$temaoverlay,$locaplic,$itemorigem="",$itemdestino="") { + error_reporting(E_ALL); set_time_limit(180); //para manipular dbf if($this->dbaseExiste == false){ @@ -1195,34 +1176,21 @@ function distanciaptpt($temaorigem,$temadestino,$temaoverlay,$locaplic,$itemorig //define o nome do novo shapefile que será criado $nomefinal = nomeRandomico(); $nomeshp = $this->diretorio."/".$nomefinal; + $existesel = carregaquery2($this->arquivo,$this->layer,$this->mapa); if ($existesel == "nao") {return "errox";} + $layerorigem = $this->mapa->getlayerbyname($temaorigem); $layerdestino = $this->mapa->getlayerbyname($temadestino); $layeroverlay = $this->mapa->getlayerbyname($temaoverlay); - $sopen = $layerorigem->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $layerorigem->getNumresults(); - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6) - {$shapesorigem[] = $layerorigem->getShape($layerorigem->getResult($i));} - else{ - $result = $layerorigem->getResult($i); - $shp_index = $result->shapeindex; - $shapesorigem[] = $layerorigem->getshape(-1, $shp_index); - } + + $shapesorigem = retornaShapesSelecionados($layerorigem,$this->arquivo,$this->mapa); + if(count($shapesorigem) == 0){ + return "erro"; } - $layerorigem->close(); $layeroverlay->set("tolerance",0); $layerdestino->set("tolerance",0); - - //if($layeroverlay->getProjection() == "" ) - //{$layeroverlay->setProjection("init=epsg:4291");} - //if($layerdestino->getProjection() == "" ) - //{$layerdestino->setProjection("init=epsg:4291");} - $layeroverlay->queryByrect($this->mapa->extent); $layerdestino->queryByFeatures($layeroverlay->index); @@ -1266,13 +1234,19 @@ function distanciaptpt($temaorigem,$temadestino,$temaoverlay,$locaplic,$itemorig $db=dbase_open($dbname,2); foreach ($shapesorigem as $sorigem) { - $valororigem = $sorigem->values[$itemorigem]; + if($itemorigem != "") + {$valororigem = $sorigem->values[$itemorigem];} + else + {$valororigem = "";} foreach ($shapesdestino as $sdestino) { $linha = ms_newLineObj(); $linha->add($sorigem->getCentroid()); $linha->add($sdestino->getCentroid()); - $valordestino = $sdestino->values[$itemdestino]; + if($itemdestino != "") + {$valordestino = $sdestino->values[$itemdestino];} + else + {$valordestino = "";} $ShapeObj = ms_newShapeObj(MS_SHAPE_LINE); $ShapeObj->add($linha); $novoshpf->addShape($ShapeObj); @@ -1283,8 +1257,6 @@ function distanciaptpt($temaorigem,$temadestino,$temaoverlay,$locaplic,$itemorig xbase_add_record($db,$registro); else dbase_add_record($db,$registro); - $linha->free(); - $ShapeObj->free(); } } $novoshpf->free(); @@ -1344,28 +1316,10 @@ nome do layer criado com o buffer. } $nomebuffer = nomeRandomico(); $nomeshp = $this->diretorio."/".$nomebuffer; + $listaShapes = array(); if($this->nome != ""){ - //pega os shapes selecionados - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - - $this->layer->open(); - $res_count = $this->layer->getNumresults(); - $buffers = array(); - //pega um shape especifico - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6) - {$listaShapes[] = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $listaShapes[] = $this->layer->getfeature($shp_index,-1); - } - } - $fechou = $this->layer->close(); + $listaShapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); } else{ $s = ms_shapeObjFromWkt($wkt); @@ -1436,7 +1390,7 @@ nome do layer criado com o buffer. else dbase_close($db); //adiciona no mapa atual o novo tema - $novolayer = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,("Buffer (".$nomebuffer.")"),$metaClasse="SIM"); + $novolayer = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,("Buffer (".$nomebuffer.")"),$metaClasse="SIM",false); $novolayer->set("data",$nomeshp.".shp"); $novolayer->setmetadata("DOWNLOAD","SIM"); $novolayer->set("template","none.htm"); @@ -1476,33 +1430,21 @@ $item {string} - (opcional) Item q será utilizado para ponderar os valores. $nomeCentro = nomeRandomico(); $nomeshp = $this->diretorio."/".$nomeCentro; //pega os shapes selecionados - carregaquery2($this->arquivo,$this->layer,$this->mapa); - if($this->layer->getNumresults() == 0) - {$this->layer->querybyrect($this->mapa->extent);} - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $this->layer->open(); - $res_count = $this->layer->getNumresults(); - $shapes = array(); + $lshapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); + if(count($lshapes) == 0){ + $lshapes = retornaShapesMapext($this->layer,$this->mapa); + } $pondera = 1; $xs = 0; $ys = 0; - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } + foreach($lshapes as $shape){ if($item != "") {$pondera = $shape->values[$item];} $pt = $shape->line(0)->point(0); $xs += ($pt->x * $pondera); $ys += ($pt->y * $pondera); + } - $fechou = $this->layer->close(); //gera o novo arquivo shape file // cria o shapefile $novoshpf = ms_newShapefileObj($nomeshp, MS_SHP_POINT); @@ -1573,32 +1515,14 @@ $locaplic - Localização do I3geo. } $nomeCentroides = nomeRandomico(); $nomeshp = $this->diretorio."/".$nomeCentroides; - //pega os shapes selecionados - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $this->layer->open(); - $res_count = $this->layer->getNumresults(); - $centroides = array(); - $shapes = array(); - //pega um shape especifico - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } + $shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); + foreach($shapes as $shape){ $LineObj = ms_newLineObj(); $LineObj->add($shape->getCentroid()); $ShapeObj = ms_newShapeObj(MS_SHAPE_POINT); $ShapeObj->add($LineObj); - $centroides[] = $ShapeObj; - $shapes[] = $shape; + $centroides[] = $ShapeObj; } - $fechou = $this->layer->close(); //gera o novo arquivo shape file // cria o shapefile $novoshpf = ms_newShapefileObj($nomeshp, MS_SHP_POINT); @@ -2110,6 +2034,7 @@ $locaplic - Localização do I3geo */ function nptPol($temaPt,$temaPo,$locaplic) { + //error_reporting(E_ALL); set_time_limit(180); //para manipular dbf if($this->dbaseExiste == false){ @@ -2137,38 +2062,19 @@ $locaplic - Localização do I3geo {$db = xbase_create($nomeshp.".dbf", $def);xbase_close($db);} else {$db = dbase_create($nomeshp.".dbf", $def);dbase_close($db);} - - //if($layerPo->getProjection() == "" ) - //{$layerPo->setProjection("init=epsg:4291");} - //if($layerPt->getProjection() == "" ) - //{$layerPt->setProjection("init=epsg:4291");} - //acrescenta os pontos no novo shapefile $dbname = $nomeshp.".dbf"; if($this->dbaseExiste == false) $db=xbase_open($dbname,2); else - $db=dbase_open($dbname,2); - $sopen = $layerPo->open(); - if($sopen == MS_FAILURE){return "erro";} - - $layerPo->querybyrect($this->mapa->extent); - $sopen = $layerPo->open(); - $res_count = $layerPo->getNumresults(); - for ($i = 0; $i < $res_count; ++$i) + $db=dbase_open($dbname,2); + $shapes = retornaShapesMapext($layerPo,$this->mapa); + foreach($shapes as $shape) { - if($this->v == 6) - {$shape = $layerPo->getShape($layerPo->getResult($i));} - else{ - $result = $layerPo->getResult($i); - $shp_index = $result->shapeindex; - $shape = $layerPo->getfeature($shp_index,-1); - } $novoreg = array(); foreach($itenspo as $ipo) {$novoreg[] = $shape->values[$ipo];} $layerPt->querybyshape($shape); - //echo $layerPt->getNumresults(); $novoreg[] = $layerPt->getNumresults(); $novoshpf->addShape($shape); if($this->dbaseExiste == false) @@ -2176,14 +2082,13 @@ $locaplic - Localização do I3geo else dbase_add_record($db,$novoreg); } - $fechou = $layerPo->close(); $novoshpf->free(); if($this->dbaseExiste == false) xbase_close($db); else dbase_close($db); //adiciona o novo tema no mapa - $novolayer = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,"N pontos",$metaClasse="SIM"); + $novolayer = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,"N pontos",$metaClasse="SIM",false); $novolayer->set("data",$nomeshp.".shp"); $novolayer->setmetadata("DOWNLOAD","SIM"); $novolayer->setmetadata("TEMALOCAL","SIM"); @@ -2211,47 +2116,23 @@ Salva o mapa acrescentando um novo layer com o resultado. else include_once "../pacotes/phpxbase/api_conversion.php"; } - //define o nome do novo shapefile que será criado - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $this->layer->getNumresults(); - // - //pega os indices dos poligonos por classe de atributo - // + $shapes =retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); $indices = array(); - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6){ - $shape = $this->layer->getShape($this->layer->getResult($i)); - $shp_index = $shape->index; - } - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } + foreach($shapes as $shape){ if($item != "") - $valor = $shape->values[$item]; + {$valor = $shape->values[$item];} else - $valor = "nenhum"; - if(!isset($indices[$valor])) - { - $indices[$valor] = array($shp_index); + {$valor = "nenhum";} + if(!isset($indices[$valor])){ + $indices[$valor] = array($shape); } else - $indices[$valor] = array_merge($indices[$valor],array($shp_index)); + $indices[$valor] = array_merge($indices[$valor],array($shape)); } - $dissolve=array(); - foreach($indices as $i) + foreach($indices as $shapes) { - foreach ($i as $indice) - { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($indice));} - else - {$shape = $this->layer->getfeature($indice,-1);} + foreach($shapes as $shape){ if($item != "") $valor = $shape->values[$item]; else @@ -2260,7 +2141,7 @@ Salva o mapa acrescentando um novo layer com o resultado. {$dissolve[$valor] = $shape;} else { - $tipo = $shape1->type; + $tipo = $shape->type; if($tipo==2) { for($l=0;$l<($shape->numlines);$l++) @@ -2278,7 +2159,6 @@ Salva o mapa acrescentando um novo layer com o resultado. } } } - $this->layer->close(); // //cria o novo shapefile // @@ -2317,13 +2197,10 @@ Salva o mapa acrescentando um novo layer com o resultado. //adiciona o novo layer no mapa // $n = pegaNome($this->layer); - $novolayer = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,("Agrupamento de ".$n),$metaClasse="SIM"); + $novolayer = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,("Agrupamento de ".$n),$metaClasse="SIM",false); $novolayer->set("data",$nomeshp.".shp"); $novolayer->setmetadata("DOWNLOAD","SIM"); $novolayer->setmetadata("TEMALOCAL","SIM"); - if (file_exists($this->qyfile)) - {unlink ($this->qyfile);} - return("ok"); } @@ -2350,48 +2227,23 @@ $locaplic - Localização do I3geo else include_once "../pacotes/phpxbase/api_conversion.php"; } - //define o nome do novo shapefile que será criado - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $this->layer->getNumresults(); - // - //pega os indices dos poligonos por classe de atributo - // + $shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); $indices = array(); - for ($i = 0; $i < $res_count; ++$i) - { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } + foreach($shapes as $shape){ if($item != "") - $valor = $shape->values[$item]; + {$valor = $shape->values[$item];} else - $valor = "nenhum"; - if(!isset($indices[$valor])) - { - $indices[$valor] = array($i); + {$valor = "nenhum";} + if(!isset($indices[$valor])){ + $indices[$valor] = array($shape); } else - $indices[$valor] = array_merge($indices[$valor],array($i)); + $indices[$valor] = array_merge($indices[$valor],array($shape)); } - //var_dump($indices); - // - //faz o dissolve dos poligonos - // $dissolve=array(); - foreach($indices as $i) + foreach($indices as $shapes) { - foreach ($i as $indice) - { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($indice));} - else - {$shape = $this->layer->getfeature($indice,-1);} + foreach($shapes as $shape){ if($item != "") $valor = $shape->values[$item]; else @@ -2400,11 +2252,23 @@ $locaplic - Localização do I3geo {$dissolve[$valor] = $shape;} else { - $dissolve[$valor] = $shape->union($dissolve[$valor]); + if($shape->type != MS_SHAPE_POLYGON) + { + for($l=0;$l<($shape->numlines);$l++) + { + $shape1 = $dissolve[$valor]; + $linha = $shape->line($l); + $shape1->add($linha); + } + $dissolve[$valor] = $shape1; + } + else + { + $dissolve[$valor] = $shape->union($dissolve[$valor]); + } } } } - $this->layer->close(); // //cria o novo shapefile // @@ -2476,7 +2340,6 @@ $locaplic - Localização do I3geo $this->incmapageometrias($dir_tmp,$imgdir,$geometrias,$tipoLista="arraywkt"); return "ok"; } - $geos = array(); foreach ($geometrias as $geo){ $geos[] = ms_shapeObjFromWkt($geo); @@ -2775,35 +2638,18 @@ function gravaCoordenadasPt($tema,$limitepontos="TRUE",$extendelimite) $nomefinal = nomeRandomico(); $nomearq = $this->diretorio."/".$nomefinal; $itemspt = pegaItens($layerPt); - $existesel = carregaquery2($this->arquivo,$this->layer,$this->mapa); - if ($existesel == "nao") - { - //if($layerPt->getProjection() == "" ) - //{$layerPt->setProjection("init=epsg:4291");} - $layerPt->queryByrect($this->mapa->extent); + $shapes = retornaShapesSelecionados($layerPt,$this->arquivo,$this->mapa); + if(count($shapes) == 0){ + $shapes = retornaShapesMapext($layerPt,$this->mapa); } - $res_count = $layerPt->getNumresults(); $pontos = array(); - //pega um shape especifico - $sopen = $layerPt->open(); - if($sopen == MS_FAILURE){return "erro";} - if (($prjTema != "") && ($prjMapa != $prjTema)) { $projInObj = ms_newprojectionobj($prjTema); $projOutObj = ms_newprojectionobj($prjMapa); } - for ($i = 0; $i < $res_count; ++$i) + foreach($shapes as $shape) { - if($this->v == 6) - {$shape = $layerPt->getShape($layerPt->getResult($i));} - else{ - $result = $layerPt->getResult($i); - $shp_index = $result->shapeindex; - $shape = $layerPt->getfeature($shp_index,-1); - } - //$lineo = $shape->line(0); - //$pt = $lineo->point(0); $pt = $shape->getCentroid(); if (($prjTema != "") && ($prjMapa != $prjTema)) { @@ -2853,7 +2699,7 @@ function gravaCoordenadasPt($tema,$limitepontos="TRUE",$extendelimite) $dimx = "c(".$xi.",".$xf.")"; $dimy = "c(".$yi.",".$yf.")"; return array("dimx"=>$dimx,"dimy"=>$dimy,"arqx"=>($nomearq."x"),"arqy"=>($nomearq."y"),"prefixoarquivo"=>$nomearq); -} +} /* function unserializeGeo diff --git a/classesphp/classe_atributos.php b/classesphp/classe_atributos.php index 2f81d4d..c1ae73f 100644 --- a/classesphp/classe_atributos.php +++ b/classesphp/classe_atributos.php @@ -269,23 +269,15 @@ $tipo - Tipo de busca brasil|null $this->layer->setfilter(""); //le o arquivo de query se existir e checa se existe seleção para o tema $items = pegaItens($this->layer); - $existesel = carregaquery2($this->arquivo,$this->layer,$this->mapa); - if ($existesel == "nao") - {$this->layer->querybyrect($this->mapa->extent);} - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} + + $shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); + if(count($shapes) == 0){ + $shapes = retornaShapesMapext($this->layer,$this->mapa); + } $registros[] = array(); - $res_count = $this->layer->getNumresults(); - for ($i = 0; $i < $res_count; ++$i) + foreach($shapes as $shape) { $valitem = array(); - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } foreach ($items as $item) { $v = trim($shape->values[$item]); @@ -338,11 +330,8 @@ $tipolista - Indica se serão mostrados todos os registros ou apenas os seleciona else {$items[] = $itemtema;} $resultadoFinal[] = array("itens"=>$items); - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $indxlayer = $this->layer->index; - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $this->layer->getNumresults(); + $shapes = retornaShapesSelecionados($layerPt,$this->arquivo,$this->mapa); + $res_count = count($shapes); $registros = array(); //lista apenas os selecionados if ($tipolista == "selecionados") @@ -356,15 +345,7 @@ $tipolista - Indica se serão mostrados todos os registros ou apenas os seleciona for ($i = $inicio; $i < $res_count; ++$i) { $valitem = array(); - if($this->v == 6){ - $shape = $this->layer->getShape($this->layer->getResult($i)); - $indx = $shape->index; - } - else{ - $result = $this->layer->getResult($i); - $indx = $result->shapeindex; - $shape = $this->layer->getfeature($indx,-1); - } + $shape = $shapes[$i]; foreach ($items as $item) { $valori = trim($shape->values[$item]); @@ -381,10 +362,8 @@ $tipolista - Indica se serão mostrados todos os registros ou apenas os seleciona $shp_atual = array(); for ($i = 0; $i < $res_count;++$i) { - $rc = $this->layer->getResult($i); - $shp_atual[$rc->shapeindex] = $rc->shapeindex; + $shp_atual[$i] = $shapes[$i];; } - $this->layer->close(); $chk = ""; if (@$this->layer->queryByrect($this->mapa->extent) == MS_SUCCESS) { @@ -551,22 +530,13 @@ Include: $filtro = $this->layer->getfilterstring(); if ($filtro != ""){$this->layer->setfilter("");} //le o arquivo de query se existir e checa se existe seleção para o tema - $existesel = carregaquery2($this->arquivo,$this->layer,$this->mapa); - if ($existesel == "nao") - {$this->layer->queryByrect($this->mapa->extent);} - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $this->layer->getNumresults(); + $shapes = retornaShapesSelecionados($layerPt,$this->arquivo,$this->mapa); + if(count($shapes) == 0){ + $shapes = retornaShapesMapext($layerPt,$this->mapa); + } //pega os valores - for ($i = 0; $i < $res_count; ++$i) + foreach($shapes as $shape) { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } $v = $shape->values[$item]; $valores[] = $v; } diff --git a/classesphp/classe_shp.php b/classesphp/classe_shp.php index 46fa0fc..a366ce9 100644 --- a/classesphp/classe_shp.php +++ b/classesphp/classe_shp.php @@ -388,20 +388,10 @@ array - xy if(!$this->layer){return "erro";} $this->layer->set("template","none.htm"); $this->layer->setfilter(""); - $existesel = carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $this->layer->getNumresults(); + $shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); $xy = array(); - for ($i = 0; $i < $res_count; ++$i) + foreach($shapes as $shape) { - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } $nlinhas = $shape->numlines; for($j = 0;$j < $nlinhas; ++$j){ $lin = $shape->line($j); diff --git a/classesphp/classe_temas.php b/classesphp/classe_temas.php index ec811b0..68b6245 100644 --- a/classesphp/classe_temas.php +++ b/classesphp/classe_temas.php @@ -796,26 +796,14 @@ $nome - nome que será dado a geometria $this->mapa->setsize(30,30); $ext = $this->mapa->extent; $sb = $this->mapa->scalebar; - $sb->set("status",MS_OFF); - + $sb->set("status",MS_OFF); $items = pegaItens($this->layer); - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - - $res_count = $this->layer->getNumresults(); $final["layer"] = pegaNome($this->layer); + $shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); $registros = array(); - for ($i = 0; $i < $res_count; ++$i) + foreach($shapes as $shape) { $valitem = array(); - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } foreach ($items as $item) { $v = trim($shape->values[$item]); @@ -1030,52 +1018,31 @@ Calcula a extensão geográfica dos elementos selecionados de um tema e ajusta o m $extatual = $this->mapa->extent; $prjMapa = $this->mapa->getProjection(); $prjTema = $this->layer->getProjection(); - carregaquery2($this->arquivo,$this->layer,$this->mapa); - $sopen = $this->layer->open(); - if($sopen == MS_FAILURE){return "erro";} - $res_count = $this->layer->getNumresults(); - if($res_count > 0) + $shapes = retornaShapesSelecionados($this->layer,$this->arquivo,$this->mapa); + $xmin = array(); + $xmax = array(); + $ymin = array(); + $ymax = array(); + foreach($shapes as $shape) { - $versao = versao(); - if($versao["principal"] == 6){ - $ret = $this->layer->getResultsBounds(); - } - else{ - $xmin = array(); - $xmax = array(); - $ymin = array(); - $ymax = array(); - for ($i = 0; $i < $res_count; ++$i) - { - $valitem = array(); - if($this->v == 6) - {$shape = $this->layer->getShape($this->layer->getResult($i));} - else{ - $result = $this->layer->getResult($i); - $shp_index = $result->shapeindex; - $shape = $this->layer->getfeature($shp_index,-1); - } - $bound = $shape->bounds; - $xmin[] = $bound->minx; - $xmax[] = $bound->maxx; - $ymin[] = $bound->miny; - $ymax[] = $bound->maxy; - } - $ret = ms_newRectObj(); - $ret->set("minx",min($xmin)); - $ret->set("miny",min($ymin)); - $ret->set("maxx",max($xmax)); - $ret->set("maxy",max($ymax)); - } - $this->layer->close(); - if (($prjTema != "") && ($prjMapa != $prjTema)) - { - $projInObj = ms_newprojectionobj($prjTema); - $projOutObj = ms_newprojectionobj($prjMapa); - $ret->project($projInObj, $projOutObj); - } - $extatual->setextent($ret->minx,$ret->miny,$ret->maxx,$ret->maxy); + $bound = $shape->bounds; + $xmin[] = $bound->minx; + $xmax[] = $bound->maxx; + $ymin[] = $bound->miny; + $ymax[] = $bound->maxy; + } + $ret = ms_newRectObj(); + $ret->set("minx",min($xmin)); + $ret->set("miny",min($ymin)); + $ret->set("maxx",max($xmax)); + $ret->set("maxy",max($ymax)); + if (($prjTema != "") && ($prjMapa != $prjTema)) + { + $projInObj = ms_newprojectionobj($prjTema); + $projOutObj = ms_newprojectionobj($prjMapa); + $ret->project($projInObj, $projOutObj); } + $extatual->setextent($ret->minx,$ret->miny,$ret->maxx,$ret->maxy); if($this->mapa->getmetadata("interface") == "googlemaps") {$this->mapa->setProjection($projO);} return("ok"); diff --git a/classesphp/funcoes_gerais.php b/classesphp/funcoes_gerais.php index b8d17d0..0cf7ce2 100644 --- a/classesphp/funcoes_gerais.php +++ b/classesphp/funcoes_gerais.php @@ -1747,11 +1747,13 @@ $metaTema {string} - nome do tema que será incluído no metadata TEMA $metaClasse {string} - SIM|NAO indica se a classe é visível ou não na legenda +$reposiciona {boolean} - reordena ou não o novo layer + Retorno: {layer} */ -function criaLayer($oMapa,$ms_tipo,$ms_status,$metaTema,$metaClasse="SIM") +function criaLayer($oMapa,$ms_tipo,$ms_status,$metaTema,$metaClasse="SIM",$reposiciona=true) { $l = ms_newLayerObj($oMapa); $l->set("type",$ms_tipo); @@ -1773,23 +1775,25 @@ function criaLayer($oMapa,$ms_tipo,$ms_status,$metaTema,$metaClasse="SIM") $estilo->set("symbolname","ponto"); } //reposiciona o layer na pilha - $ltipo = $l->type; - if (($ltipo == 2) || ($ltipo == 3)) - { - $indicel = $l->index; - $numlayers = $oMapa->numlayers; - $nummove = 0; - for ($i = $numlayers-1;$i > 0;$i--) + if($reposiciona == true){ + $ltipo = $l->type; + if (($ltipo == 2) || ($ltipo == 3)) { - $layerAbaixo = $oMapa->getlayer($i); - $tipo = $layerAbaixo->type; - if (($tipo != 2) && ($tipo != 3)) - {$nummove++;} - } - if ($nummove > 2) - { - for ($i=0;$i<=($nummove - 3);++$i) - {$oMapa->movelayerup($indicel);} + $indicel = $l->index; + $numlayers = $oMapa->numlayers; + $nummove = 0; + for ($i = $numlayers-1;$i > 0;$i--) + { + $layerAbaixo = $oMapa->getlayer($i); + $tipo = $layerAbaixo->type; + if (($tipo != 2) && ($tipo != 3)) + {$nummove++;} + } + if ($nummove > 2) + { + for ($i=0;$i<=($nummove - 3);++$i) + {$oMapa->movelayerup($indicel);} + } } } return $l; @@ -2776,6 +2780,21 @@ function carregaquery($mapfile,$objlayer,$objmapa) } return "nao"; } +/* +Function: carregaquery2 + +Le um arquivo PHP, serializado com a lista de índices de objetos SHAPE selecionados em um LAYER, e aplica ao LAYER a seleção desses SHAPES usando querybyindex + +Atenção: na versão 6 do Mapserver, não funciona com layers do tipo Postgis + +Parametros: + +$mapfile + +$objlayer + +$objmapa +*/ function carregaquery2($mapfile,&$objlayer,&$objmapa) { $qyfile = dirname($mapfile)."/".$objlayer->name.".php"; @@ -2823,4 +2842,64 @@ function verificaEditores($editores) } return $editor; } +function retornaShapesMapext($objLayer,$objMapa){ + $shapes = array(); + $status = $objLayer->open(); + $status = $objLayer->whichShapes($objMapa->extent); + while ($shape = $objLayer->nextShape()) + {$shapes[] = $shape;} + $objLayer->close(); + return $shapes; +} +function retornaShapesSelecionados($objLayer,$map_file,$objMapa){ + $shapes = array(); + $qyfile = dirname($map_file)."/".$objLayer->name.".php"; + $handle = fopen ($qyfile, "r"); + $conteudo = fread ($handle, filesize ($qyfile)); + fclose ($handle); + $listaDeIndices = unserialize($conteudo); + if(count($listaDeIndices) == 0) + {return $shapes;} + if ($objLayer->connectiontype != MS_POSTGIS){ + //pega os shapes selecionados + carregaquery2($map_file,$objLayer,$objMapa); + $sopen = $objLayer->open(); + if($sopen == MS_FAILURE){return "erro";} + $objLayer->open(); + $res_count = $objLayer->getNumresults(); + $centroides = array(); + $shapes = array(); + //pega um shape especifico + for ($i = 0; $i < $res_count; ++$i) + { + if($this->v == 6) + {$shape = $objLayer->getShape($objLayer->getResult($i));} + else{ + $result = $objLayer->getResult($i); + $shp_index = $result->shapeindex; + $shape = $objLayer->getfeature($shp_index,-1); + } + $shapes[] = $shape; + } + $fechou = $objLayer->close(); + } + else{ + $rect = ms_newRectObj(); + $rect->set("minx",-180); + $rect->set("miny",-90); + $rect->set("maxx",180); + $rect->set("maxy",90); + $status = $objLayer->open(); + $status = $objLayer->whichShapes($rect); + while ($shape = $objLayer->nextShape()) + { + if(in_array($shape->index,$listaDeIndices)){ + $shapes[] = $shape; + } + } + $objLayer->close(); + } + return $shapes; +} + ?> \ No newline at end of file -- libgit2 0.21.2