Commit e31a03a6635baeebea38fb480fa8d1435c401983

Authored by Edmar Moretti
1 parent 9d255116

V 6 - inclusão da rotina de corte de imagens no gerador de serviços OGC

admin/admin.db
No preview for this file type
classesphp/mapa_openlayers.php
... ... @@ -203,11 +203,11 @@ if(isset($_GET["map_size"])){
203 203 $map_size = explode(" ",$_GET["map_size"]);
204 204 $mapa->setsize($map_size[0],$map_size[1]);
205 205 }
  206 +
206 207 if(isset($_GET["mapext"])){
207 208 $mapext = explode(" ",$_GET["mapext"]);
208 209 $mapa->setExtent($mapext[0],$mapext[1],$mapext[2],$mapext[3]);
209 210 }
210   -
211 211 //
212 212 //qd a cahamda e para um WMS, redireciona para ogc.php
213 213 //
... ... @@ -251,7 +251,8 @@ if($_GET["tipolayer"] != "fundo")
251 251 //antes de gerar a imagem
252 252 //
253 253 if($cortePixels > 0){
254   - //$imagemBranco = $mapa->prepareImage();
  254 + $mapa->prepareImage();
  255 + echo $mapa->scaledenom;exit;
255 256 $escalaInicial = $mapa->scaledenom;
256 257 $extensaoInicial = $mapa->extent;
257 258 $wh = 256+($cortePixels*2);
... ... @@ -261,7 +262,6 @@ if($cortePixels > 0){
261 262 $mapa->zoomScale($escalaInicial, $ponto, $wh, $wh, $extensaoInicial);
262 263 }
263 264  
264   -
265 265 //se nao houver selecao
266 266 if($qy != true){
267 267 $img = $mapa->draw();
... ... @@ -389,7 +389,7 @@ else{
389 389 }
390 390 }
391 391 function salvaCacheImagem($cachedir,$map,$tms){
392   - global $img,$cortePixels,$cortePixels;
  392 + global $img,$cortePixels;
393 393 if($cachedir == ""){
394 394 $nome = dirname(dirname($map))."/cache".$tms;
395 395 }
... ... @@ -406,6 +406,11 @@ function salvaCacheImagem($cachedir,$map,$tms){
406 406 if($cortePixels > 0){
407 407 $img = imagecreatefrompng($nome);
408 408 $imgc = imagecreate(256,256);
  409 + //@FIXME necessario, sem isso algumas imagens sao geradas de forma errada
  410 + imagesavealpha($imgc, true);
  411 + $color = imagecolorallocatealpha($imgc,0x00,0x00,0x00,127);
  412 + imagefill($imgc, 0, 0, $color);
  413 +
409 414 imagecopy( $imgc, $img, 0 , 0 , $cortePixels , $cortePixels , 256, 256 );
410 415 imagepng($imgc,$nome);
411 416 }
... ...
mashups/openlayers.php
... ... @@ -461,7 +461,7 @@ i3GEO.editorOL.mapa = new OpenLayers.Map(
461 461 {
462 462 autoUpdateSize: false,
463 463 controls:[],
464   - resolutions: [0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.001373291015625,0.0006866455078125,0.00034332275390625,0.000171661376953125,0.0000858306884765625,0.00004291534423828125,0.000021457672119140625,0.000010728836059570312,0.000005364418029785156,0.000002682209014892578]
  464 + resolutions: [0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 0.0006866455078125, 0.00034332275390625, 0.000171661376953125, 0.0000858306884765625, 0.00004291534423828125, 0.000021457672119140625, 0.000010728836059570312, 0.000005364418029785156, 0.000002682209014892578]
465 465 }
466 466 );
467 467 i3GEO.editorOL.inicia();
... ...
ogc.php
... ... @@ -22,7 +22,7 @@ Este programa é distribuído na expectativa de que seja útil
22 22 porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita
23 23 de COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA.
24 24 Consulte a Licença Pública Geral do GNU para mais detalhes.
25   -Você deve ter recebido uma cópia da Licença Pública Geral do
  25 +Você deve ter recebido uma copia da Licença Pública Geral do
26 26 GNU junto com este programa; se não, escreva para a
27 27 Free Software Foundation, Inc., no endereço
28 28 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
... ... @@ -230,6 +230,8 @@ if(isset($_GET["DESLIGACACHE"]) && $_GET["DESLIGACACHE"] == "sim"){
230 230 $nomeMapfileTmp = $dir_tmp."/ogc_".md5($tema)."_".$agora.".map";
231 231 $nomeMapfileTmp = str_replace(",","",$nomeMapfileTmp);
232 232 $nomeMapfileTmp = str_replace(" ","",$nomeMapfileTmp);
  233 +//essa variavel e usada para definir se a imagem final gerada devera ser cortada ou nao
  234 +$cortePixels = 0;
233 235 if(file_exists($nomeMapfileTmp) && $tipo == ""){
234 236 $oMap = ms_newMapobj($nomeMapfileTmp);
235 237 }
... ... @@ -269,7 +271,7 @@ else{
269 271 //para o caso do tema ser um arquivo mapfile existente em uma pasta qualquer
270 272 //$temai3geo = true indica que o layer será buscado na pasta i3geo/temas
271 273 $temai3geo = true;
272   - //FIXME não aceita gvp quando o caminho é completo
  274 + //FIXME nao aceita gvp quando o caminho e completo
273 275 if(file_exists($_GET["tema"]) && !isset($id_medida_variavel)){
274 276 $nmap = ms_newMapobj($_GET["tema"]);
275 277 $temai3geo = false;
... ... @@ -293,7 +295,6 @@ else{
293 295 if($teste != "" && $l->data == ""){
294 296 $id_medida_variavel = $teste;
295 297 }
296   -
297 298 }
298 299 if(isset($id_medida_variavel)){
299 300 $temai3geo = false;
... ... @@ -351,8 +352,7 @@ else{
351 352 }
352 353 if($l->type == MS_LAYER_RASTER && $l->numclasses > 0){
353 354 $c = $l->getclass(0);
354   - if($c->name == "")
355   - {
  355 + if($c->name == ""){
356 356 $c->name = " ";
357 357 }
358 358 }
... ... @@ -424,8 +424,7 @@ else{
424 424 }
425 425 if($l->type == MS_LAYER_RASTER && $l->numclasses > 0){
426 426 $c = $l->getclass(0);
427   - if($c->name == "")
428   - {
  427 + if($c->name == ""){
429 428 $c->name = " ";
430 429 }
431 430 }
... ... @@ -434,7 +433,13 @@ else{
434 433 if($extensao == ""){
435 434 $extensao = $extensaoMap;
436 435 }
437   - $l->setmetadata("wms_extent",$extensao);
  436 + $l->setmetadata("wms_extent",$extensao);
  437 + //
  438 + //numero de pixels que serao considerados para corte da imagem no caso de cache ativo e tema de pontos
  439 + //
  440 + if ($l->getmetadata("cortepixels") != ""){
  441 + $cortePixels = $l->getmetadata("cortepixels");
  442 + }
438 443 }
439 444 $req->setParameter("LAYERS", implode(",",$layers));
440 445 $req->setParameter("STYLES", "");
... ... @@ -486,8 +491,7 @@ else{
486 491 if (($conta >= $int[0]) && ($conta <= $int[1])){
487 492 $l = $nmap->getlayerbyname($t);
488 493 $extensao = $l->getmetadata("EXTENSAO");
489   - if($extensao == "")
490   - {
  494 + if($extensao == ""){
491 495 $extensao = $extensaoMap;
492 496 }
493 497 $l->setmetadata("wms_extent",$extensao);
... ... @@ -512,8 +516,15 @@ else{
512 516 $l->setmetadata("wms_attribution_logourl_width","50");
513 517 $l->setmetadata("wms_attribution_logourl_href",$mini);
514 518 }
  519 + //
  520 + //numero de pixels que serao considerados para corte da imagem no caso de cache ativo e tema de pontos
  521 + //
  522 + if ($l->getmetadata("cortepixels") != ""){
  523 + $cortePixels = $l->getmetadata("cortepixels");
  524 + }
515 525 cloneInlineSymbol($l,$nmap,$oMap);
516   - ms_newLayerObj($oMap, $l);
  526 + ms_newLayerObj($oMap, $l);
  527 +
517 528 }
518 529 }
519 530 }
... ... @@ -537,12 +548,12 @@ else{
537 548 }
538 549 if(ob_get_contents ()){
539 550 ob_end_clean();
540   -}
  551 +}
541 552 //
542 553 //verifica se a requisicao e do tipo TMS.
543 554 //
544 555 //
545   -//calcula a extensao geografica com base no x,y,z em requisições TMS
  556 +//calcula a extensao geografica com base no x,y,z em requisisoes TMS
546 557 //quando for do tipo tms $_GET["tms"] contem os parametros do tile
547 558 //essa rotina faz um exit ao final
548 559 //o cache tms so fucniona se houver apenas uma camada no mapa
... ... @@ -563,11 +574,33 @@ if(isset($_GET[&quot;tms&quot;])){
563 574 if($cache == true){
564 575 carregaCacheImagem($cachedir,$nomeMapfileTmp,$_GET["tms"]);
565 576 }
  577 + $layer0 = $oMap->getlayer(0);
  578 + //
  579 + //numero de pixels que serao considerados para corte da imagem no caso de cache ativo e tema de pontos
  580 + //
  581 + if ($layer0->getmetadata("cortepixels") != ""){
  582 + $cortePixels = $layer0->getmetadata("cortepixels");
  583 + }
566 584 //se nao existir, salva a imagem
567 585 //echo $lon1." ".$lat1." ".$lon2." ".$lat2;exit;
568   - $oMap->setExtent($lon1,$lat1,$lon2,$lat2);
569 586 $oMap->setsize(256,256);
570   - $oMap->getlayer(0)->set("status",MS_DEFAULT);
  587 + $oMap->setExtent($lon1,$lat1,$lon2,$lat2);
  588 +
  589 + $layer0->set("status",MS_DEFAULT);
  590 + //
  591 + //se o layer foi marcado para corte altera os parametros para ampliar o mapa
  592 + //antes de gerar a imagem
  593 + //
  594 + if($cortePixels > 0){
  595 + //$oMap->prepareImage();
  596 + $escalaInicial = $oMap->scaledenom;
  597 + $extensaoInicial = $oMap->extent;
  598 + $wh = 256+($cortePixels*2);
  599 + $oMap->setsize($wh,$wh);
  600 + $ponto = new pointObj();
  601 + $ponto->setxy(($wh/2),($wh/2));
  602 + $oMap->zoomScale($escalaInicial, $ponto, $wh, $wh, $extensaoInicial);
  603 + }
571 604 $img = $oMap->draw();
572 605 if($img->imagepath == ""){
573 606 exit;
... ... @@ -585,6 +618,12 @@ if(isset($_GET[&quot;Z&quot;]) &amp;&amp; isset($_GET[&quot;X&quot;])){
585 618 $y = $_GET["Y"];
586 619 $z = $_GET["Z"];
587 620 $layer0 = $oMap->getlayer(0);
  621 + //
  622 + //numero de pixels que serao considerados para corte da imagem no caso de cache ativo e tema de pontos
  623 + //
  624 + if ($layer0->getmetadata("cortepixels") != ""){
  625 + $cortePixels = $layer0->getmetadata("cortepixels");
  626 + }
588 627 if($cache == true){
589 628 carregaCacheImagem($cachedir,$nomeMapfileTmp,"/googlemaps/$layer0->name/$z/$x/$y");
590 629 }
... ... @@ -607,20 +646,30 @@ if(isset($_GET[&quot;Z&quot;]) &amp;&amp; isset($_GET[&quot;X&quot;])){
607 646 $poPoint2 = ms_newpointobj();
608 647 $poPoint2->setXY($lon2, $lat2);
609 648 $poPoint2->project($projInObj, $projOutObj);
  649 + $oMap->setsize(256,256);
610 650 $oMap->setExtent($poPoint1->x,$poPoint1->y,$poPoint2->x,$poPoint2->y);
611   - $oMap->setsize(256,256);
  651 +
612 652 $oMap->getlayer(0)->set("status",MS_DEFAULT);
613 653 $oMap->setProjection("proj=merc,a=6378137,b=6378137,lat_ts=0.0,lon_0=0.0,x_0=0.0,y_0=0,k=1.0,units=m");
614 654 $layer0->setProjection("proj=latlong,a=6378137,b=6378137");
615   - //$oMap->save();
  655 + //
  656 + //se o layer foi marcado para corte altera os parametros para ampliar o mapa
  657 + //antes de gerar a imagem
  658 + //
  659 + if($cortePixels > 0){
  660 + //$oMap->prepareImage();
  661 + $escalaInicial = $oMap->scaledenom;
  662 + $extensaoInicial = $oMap->extent;
  663 + $wh = 256+($cortePixels*2);
  664 + $oMap->setsize($wh,$wh);
  665 + $ponto = new pointObj();
  666 + $ponto->setxy(($wh/2),($wh/2));
  667 + $oMap->zoomScale($escalaInicial, $ponto, $wh, $wh, $extensaoInicial);
  668 + }
616 669 $img = $oMap->draw();
617 670 if($img->imagepath == ""){
618 671 exit;
619 672 }
620   - /**
621   - * @TODO ativar cache
622   - */
623   -
624 673 if($cache == true){
625 674 salvaCacheImagem($cachedir,$nomeMapfileTmp,"/googlemaps/$layer0->name/$z/$x/$y");
626 675 }
... ... @@ -701,8 +750,8 @@ function ogc_imprimeAjuda(){
701 750 echo "Para escolher um tema, utilize:<br>";
702 751 echo "ogc.php?lista=temas - para listar os temas dispon&iacute;veis<br>";
703 752 echo "Para usar esse web service, al&eacute;m dos par&acirc;metros normais, vc dever&aacute; incluir o par&acirc;metro &tema=,<br>";
704   - echo "ou seja,http://[host]/i3geo/ogc.php?tema=[código do tema]<br>";
705   - echo "no lugar do código pode ser especificado tamb&eacute;m um arquivo mapfile qualquer. Nesse caso, deve ser digitado o caminho completo no servidor<br><br>";
  753 + echo "ou seja,http://[host]/i3geo/ogc.php?tema=[c&oacute;digo do tema]<br>";
  754 + echo "no lugar do c&ocaute;digo pode ser especificado tamb&eacute;m um arquivo mapfile qualquer. Nesse caso, deve ser digitado o caminho completo no servidor<br><br>";
706 755 echo "Utilize o sistema de administra&ccedil;&atilde;o do i3Geo para configurar quais os temas da pasta i3geo/temas podem ser utilizados.";
707 756 echo "Utilize o parametro &intervalo=0,20 para definir o n&uacute;mero de temas desejado na fun&ccedil;&atilde;o getcapabilities.";
708 757 echo "Utilize o parametro restauramapa para indicar o ID de um mapa salvo no banco de dados de administra&ccedil;&atilde;o para utiliz&aacute;-lo como um WMS";
... ... @@ -800,7 +849,7 @@ function carregaCacheImagem($cachedir,$map,$tms){
800 849 }
801 850 }
802 851 function salvaCacheImagem($cachedir,$map,$tms){
803   - global $img,$dir_tmp;
  852 + global $img,$dir_tmp,$cortePixels;
804 853 if($cachedir == ""){
805 854 $nome = $dir_tmp."/cache".$tms;
806 855 }
... ... @@ -810,8 +859,22 @@ function salvaCacheImagem($cachedir,$map,$tms){
810 859 @mkdir(dirname($nome),0777,true);
811 860 chmod(dirname($nome),0777);
812 861 $img->saveImage($nome);
813   - chmod($nome,0777);
814   -
  862 + //
  863 + //corta a imagem gerada para voltar ao tamanho normal
  864 + //
  865 + if($cortePixels > 0){
  866 + $img = imagecreatefrompng($nome);
  867 + $imgc = imagecreate(256,256);
  868 +
  869 + imagesavealpha($imgc, true);
  870 + // Fill the image with transparent color
  871 + $color = imagecolorallocatealpha($imgc,0x00,0x00,0x00,127);
  872 + imagefill($imgc, 0, 0, $color);
  873 +
  874 + imagecopy($imgc, $img, 0 , 0 , $cortePixels , $cortePixels , 256, 256);
  875 + imagepng($imgc,$nome);
  876 + }
  877 + chmod($nome,0777);
815 878 header('Content-Length: '.filesize($nome));
816 879 header('Content-Type: image/png');
817 880 header('Cache-Control: max-age=3600, must-revalidate');
... ... @@ -838,10 +901,29 @@ function nomeRand($n=10)
838 901 return $nomes;
839 902 }
840 903 function renderNocacheTms(){
841   - global $img,$i3georendermode,$dir_tmp;
842   - if($i3georendermode == 0 || !isset($i3georendermode)){
843   - $nomer = $dir_tmp."/temp".nomeRand().".png";
844   - $img->saveImage($nomer);
  904 + global $img,$i3georendermode,$dir_tmp,$cortePixels;
  905 + if($i3georendermode == 1 && $cortePixels == 0){
  906 + ob_clean();
  907 + header('Content-Type: image/png');
  908 + $img->saveImage();
  909 + exit;
  910 + }
  911 + if($i3georendermode == 1 && $cortePixels > 0){
  912 + $i3georendermode = 0;
  913 + }
  914 + $nomer = $dir_tmp."/temp".nomeRand().".png";
  915 + $img->saveImage($nomer);
  916 + //
  917 + //corta a imagem gerada para voltar ao tamanho normal
  918 + //
  919 + if($cortePixels > 0){
  920 + $img = imagecreatefrompng($nomer);
  921 + $imgc = imagecreate(256,256);
  922 + imagecopy( $imgc, $img, 0 , 0 , $cortePixels , $cortePixels , 256, 256 );
  923 + imagepng($imgc,$nomer);
  924 + }
  925 + if($i3georendermode == 0 || !isset($i3georendermode)){
  926 +
845 927 header('Content-Length: '.filesize($nomer));
846 928 header('Content-Type: image/png');
847 929 header('Cache-Control: max-age=3600, must-revalidate');
... ... @@ -849,14 +931,7 @@ function renderNocacheTms(){
849 931 header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($nomer)).' GMT', true, 200);
850 932 fpassthru(fopen($nomer, 'rb'));
851 933 }
852   - if($i3georendermode == 1){
853   - ob_clean();
854   - header('Content-Type: image/png');
855   - $img->saveImage();
856   - }
857 934 if($i3georendermode == 2){
858   - $nomer = $dir_tmp."/temp".nomeRand().".png";
859   - $img->saveImage($nomer);
860 935 ob_clean();
861 936 header('Cache-Control: public, max-age=22222222');
862 937 header('Expires: ' . gmdate('D, d M Y H:i:s', time()+48*60*60) . ' GMT');
... ...
temas/_lbiomashp.map
... ... @@ -6,7 +6,7 @@ MAP
6 6 DATA "/var/www/i3geo/aplicmap/dados/biomas.shp"
7 7 METADATA
8 8 "METAESTAT_ID_MEDIDA_VARIAVEL" ""
9   - "cache" ""
  9 + "cache" "SIM"
10 10 "CLASSE" "SIM"
11 11 "permitekmz" "nao"
12 12 "METAESTAT_CODIGO_TIPO_REGIAO" ""
... ...