Commit 9c81c6853808662f957d1213b70ac0609e8f97a6
1 parent
e1144583
Exists in
master
and in
7 other branches
Inclusão das funções de geração de grade Delaunay e diagrama de Voronoi na opção…
… de análise de distribuição de pontos. Além dos métodos criados em classe_analise.php, foi acrescentado um novo botão na ferramenta de análise de distribuição de pontos
Showing
2 changed files
with
324 additions
and
4 deletions
Show diff stats
classesphp/classe_analise.php
... | ... | @@ -148,8 +148,11 @@ Include: |
148 | 148 | $pontos = array(); |
149 | 149 | //pega um shape especifico |
150 | 150 | $layerPt->open(); |
151 | - $projInObj = ms_newprojectionobj($prjTema); | |
152 | - $projOutObj = ms_newprojectionobj($prjMapa); | |
151 | + if (($prjTema != "") && ($prjMapa != $prjTema)) | |
152 | + { | |
153 | + $projInObj = ms_newprojectionobj($prjTema); | |
154 | + $projOutObj = ms_newprojectionobj($prjMapa); | |
155 | + } | |
153 | 156 | for ($i = 0; $i < $res_count; $i++) |
154 | 157 | { |
155 | 158 | $result = $layerPt->getResult($i); |
... | ... | @@ -167,12 +170,12 @@ Include: |
167 | 170 | } |
168 | 171 | $layerPt->close(); |
169 | 172 | //grava o arquivo com os pontos em x |
170 | - $f = fopen($nomearq."x",w); | |
173 | + $f = fopen($nomearq."x","w"); | |
171 | 174 | foreach ($pontosx as $pt) |
172 | 175 | {fwrite($f,$pt."\n");} |
173 | 176 | fclose($f); |
174 | 177 | //grava o arquivo com os pontos em y |
175 | - $f = fopen($nomearq."y",w); | |
178 | + $f = fopen($nomearq."y","w"); | |
176 | 179 | foreach ($pontosy as $pt) |
177 | 180 | {fwrite($f,$pt."\n");} |
178 | 181 | fclose($f); |
... | ... | @@ -195,6 +198,13 @@ Include: |
195 | 198 | $dimy = "c(".$yi.",".$yf.")"; |
196 | 199 | switch ($tipo) |
197 | 200 | { |
201 | + //delaunay e voronoi | |
202 | + case "deldir": | |
203 | + $this->mapaDeldir($nomearq,$dir_tmp,$R_path,$locaplic); | |
204 | + $this->deldirDir2shp($nomearq."dirsgs",$dir_tmp,$locaplic); | |
205 | + $this->deldirDel2shp($nomearq."delsgs",$dir_tmp,$locaplic); | |
206 | + return "ok"; | |
207 | + break; | |
198 | 208 | case "kernel": |
199 | 209 | $this->mapaKernel($nomearq,$dimx,$dimy,$dir_tmp,$R_path,$locaplic,$sigma); |
200 | 210 | break; |
... | ... | @@ -543,6 +553,295 @@ $locaplic - Onde fica o I3Geo. |
543 | 553 | return "ok"; |
544 | 554 | } |
545 | 555 | /* |
556 | +function: mapaDeldir | |
557 | + | |
558 | +Calcula a triangulação de Delaunay e diagrama de Voronoi. | |
559 | + | |
560 | +Para funcionar, é necessário a instalação da biblioteca deldir do R. | |
561 | + | |
562 | +http://cran.r-project.org/web/packages/deldir | |
563 | + | |
564 | +parameters: | |
565 | + | |
566 | +$arqpt - Prefixo dos arquivos em disco com os pontos. | |
567 | + | |
568 | +$dir_tmp - Diretório temporário do mapserver. | |
569 | + | |
570 | +$R_path - Onde fica o R. | |
571 | + | |
572 | +$locaplic - Onde fica o I3Geo. | |
573 | +*/ | |
574 | + function mapaDeldir($arqpt,$dir_tmp,$R_path,$locaplic) | |
575 | + { | |
576 | + $gfile_name = nomeRandomico(20); | |
577 | + $rcode[] = 'dadosx<-scan("'.$arqpt.'x")'; | |
578 | + $rcode[] = 'dadosy<-scan("'.$arqpt.'y")'; | |
579 | + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) | |
580 | + { | |
581 | + $lib = '.libPaths("'.$locaplic.'/pacotes/rlib/win")'; | |
582 | + if(file_exists($locaplic.'/pacotes/rlib/win')) | |
583 | + $rcode[] = $lib; | |
584 | + } | |
585 | + else | |
586 | + { | |
587 | + if(file_exists($locaplic."/pacotes/rlib/linux")) | |
588 | + { | |
589 | + $lib = '.libPaths("'.$locaplic.'/pacotes/rlib/linux")'; | |
590 | + $rcode[] = $lib; | |
591 | + } | |
592 | + } | |
593 | + $rcode[] = 'library(deldir)'; | |
594 | + $rcode[] = 'pt <- deldir(dadosx, dadosy)'; | |
595 | + $rcode[] = 'write.csv(pt$delsgs,file="'.$arqpt.'delsgs")'; | |
596 | + $rcode[] = 'write.csv(pt$dirsgs,file="'.$arqpt.'dirsgs")'; | |
597 | + $r = executaR($rcode,$dir_tmp,$R_path,$gfile_name); | |
598 | + return "ok"; | |
599 | + } | |
600 | +/* | |
601 | +function deldirDel2shp | |
602 | + | |
603 | +Lê um arquivo CSV gerado pelo software R com os dados referentes à triangulação de Delaunay. | |
604 | + | |
605 | +O arquivo CSV é lido e convertido em um shape file que é então adicionado ao mapa. | |
606 | + | |
607 | +Parameters: | |
608 | + | |
609 | +$nomearq - nome do arquivo CSV | |
610 | + | |
611 | +$dir_tmp - diretório temporário do Mapserver | |
612 | + | |
613 | +$locaplic - diretório da aplicação i3geo | |
614 | +*/ | |
615 | + function deldirDel2shp($nomearq,$dir_tmp,$locaplic) | |
616 | + { | |
617 | + if (file_exists($nomearq)) | |
618 | + { | |
619 | + require_once "../pacotes/phpxbase/api_conversion.php"; | |
620 | + //define o nome do novo shapefile que será criado | |
621 | + $nomefinal = nomeRandomico(); | |
622 | + $nomeshp = $this->diretorio."/".$nomefinal; | |
623 | + //cria o shape file | |
624 | + $novoshpf = ms_newShapefileObj($nomeshp, MS_SHP_ARC); | |
625 | + // cria o dbf | |
626 | + $def[] = array("x1","N","12","5"); | |
627 | + $def[] = array("y1","N","12","5"); | |
628 | + $def[] = array("x2","N","12","5"); | |
629 | + $def[] = array("y2","N","12","5"); | |
630 | + $def[] = array("ind1","N","5","0"); | |
631 | + $def[] = array("ind2","N","5","0"); | |
632 | + $db = xbase_create($nomeshp.".dbf", $def); | |
633 | + $dbname = $nomeshp.".dbf"; | |
634 | + //le o arquivo linha a linha, pulando a primeira | |
635 | + //acrescenta os pontos no shape file formando as linhas | |
636 | + $abre = fopen($nomearq, "r"); | |
637 | + $buffer = fgets($abre); | |
638 | + $poligonos = array(); | |
639 | + while (!feof($abre)) | |
640 | + { | |
641 | + $buffer = fgets($abre); | |
642 | + $i = explode(",",$buffer); | |
643 | + if(is_array($i)) | |
644 | + { | |
645 | + $i1 = floatval($i[1]); | |
646 | + $i2 = floatval($i[2]); | |
647 | + $i3 = floatval($i[3]); | |
648 | + $i4 = floatval($i[4]); | |
649 | + $i5 = floatval($i[5]); | |
650 | + $i6 = floatval($i[6]); | |
651 | + $poPoint1 = ms_newpointobj(); | |
652 | + $poPoint1->setXY($i1,$i2); | |
653 | + $poPoint2 = ms_newpointobj(); | |
654 | + $poPoint2->setXY($i3, $i4); | |
655 | + $linha = ms_newLineObj(); | |
656 | + $linha->add($poPoint1); | |
657 | + $linha->add($poPoint2); | |
658 | + $ShapeObj = ms_newShapeObj(MS_SHAPE_LINE); | |
659 | + $ShapeObj->add($linha); | |
660 | + | |
661 | + $novoshpf->addShape($ShapeObj); | |
662 | + $registro = array($i1,$i2,$i3,$i4,$i5,$i6); | |
663 | + xbase_add_record($db,$registro); | |
664 | + $linha->free(); | |
665 | + $ShapeObj->free(); | |
666 | + } | |
667 | + } | |
668 | + $novoshpf->free(); | |
669 | + xbase_close($db); | |
670 | + fclose($abre); | |
671 | + //adiciona no mapa atual o novo tema | |
672 | + $novolayer = criaLayer($this->mapa,MS_LAYER_LINE,MS_DEFAULT,("Delaunay (".$nomefinal.")"),$metaClasse="SIM"); | |
673 | + $novolayer->set("data",$nomeshp.".shp"); | |
674 | + $novolayer->setmetadata("DOWNLOAD","SIM"); | |
675 | + $novolayer->set("template","none.htm"); | |
676 | + $classe = $novolayer->getclass(0); | |
677 | + $estilo = $classe->getstyle(0); | |
678 | + $estilo->set("symbolname","linha"); | |
679 | + $estilo->set("size",2); | |
680 | + $cor = $estilo->color; | |
681 | + $cor->setrgb(255,50,0); | |
682 | + } | |
683 | + } | |
684 | +/* | |
685 | +function deldirDir2shp | |
686 | + | |
687 | +Lê um arquivo CSV gerado pelo software R com os dados referentes ao diagrama de Voronoi. | |
688 | + | |
689 | +O arquivo CSV é lido e convertido em um shape file que é então adicionado ao mapa. | |
690 | + | |
691 | +Parameters: | |
692 | + | |
693 | +$nomearq - nome do arquivo CSV | |
694 | + | |
695 | +$dir_tmp - diretório temporário do Mapserver | |
696 | + | |
697 | +$locaplic - diretório da aplicação i3geo | |
698 | +*/ | |
699 | + function deldirDir2shp($nomearq,$dir_tmp,$locaplic) | |
700 | + { | |
701 | + if (file_exists($nomearq)) | |
702 | + { | |
703 | + require_once "../pacotes/phpxbase/api_conversion.php"; | |
704 | + // | |
705 | + //define os nomes dos novos shapefiles que serão criados | |
706 | + // | |
707 | + $nomeLinhas = nomeRandomico(); | |
708 | + $nomePoligonos = nomeRandomico(); | |
709 | + $nomeshpLinhas = $this->diretorio."/".$nomeLinhas; | |
710 | + $nomeshpPoligonos = $this->diretorio."/".$nomePoligonos; | |
711 | + //cria o shape file | |
712 | + $novoshpLinhas = ms_newShapefileObj($nomeshpLinhas, MS_SHP_ARC); | |
713 | + $novoshpPoligonos = ms_newShapefileObj($nomeshpPoligonos, MS_SHP_POLYGON); | |
714 | + // | |
715 | + // cria o dbf para o shapefile linear | |
716 | + // | |
717 | + $def[] = array("x1","N","12","5"); | |
718 | + $def[] = array("y1","N","12","5"); | |
719 | + $def[] = array("x2","N","12","5"); | |
720 | + $def[] = array("y2","N","12","5"); | |
721 | + $def[] = array("ind1","N","5","0"); | |
722 | + $def[] = array("ind2","N","5","0"); | |
723 | + $def[] = array("b1","C","6"); | |
724 | + $def[] = array("b2","C","6"); | |
725 | + $dbLinhas = xbase_create($nomeshpLinhas.".dbf", $def); | |
726 | + $dbnameLinhas = $nomeshpLinhas.".dbf"; | |
727 | + // | |
728 | + // cria o dbf para o shapefile poligonal | |
729 | + // | |
730 | + $def = array(); | |
731 | + $def[] = array("area","N","12","5"); | |
732 | + $dbPoligonos = xbase_create($nomeshpPoligonos.".dbf", $def); | |
733 | + $dbnamePoligonos = $nomeshpPoligonos.".dbf"; | |
734 | + // | |
735 | + //constrói as linhas do diagrama | |
736 | + // | |
737 | + //le o arquivo linha a linha, pulando a primeira | |
738 | + //acrescenta os pontos no shape file formando as linhas | |
739 | + //cria o array para criar os polígonos | |
740 | + // | |
741 | + $abre = fopen($nomearq, "r"); | |
742 | + $buffer = fgets($abre); | |
743 | + $borda = array();//guarda os pontos que ficam na borda | |
744 | + $poligonos = array(); | |
745 | + while (!feof($abre)) | |
746 | + { | |
747 | + $buffer = fgets($abre); | |
748 | + $i = explode(",",$buffer); | |
749 | + if(is_array($i)) | |
750 | + { | |
751 | + $i1 = floatval($i[1]); | |
752 | + $i2 = floatval($i[2]); | |
753 | + $i3 = floatval($i[3]); | |
754 | + $i4 = floatval($i[4]); | |
755 | + $i5 = floatval($i[5]); | |
756 | + $i6 = floatval($i[6]); | |
757 | + $poPoint1 = ms_newpointobj(); | |
758 | + $poPoint1->setXY($i1,$i2); | |
759 | + $poPoint2 = ms_newpointobj(); | |
760 | + $poPoint2->setXY($i3, $i4); | |
761 | + if(trim($i[7]) == "TRUE") | |
762 | + {$borda[] = $poPoint1;} | |
763 | + if(trim($i[8]) == "TRUE") | |
764 | + {$borda[] = $poPoint2;} | |
765 | + $linha = ms_newLineObj(); | |
766 | + $linha->add($poPoint1); | |
767 | + $linha->add($poPoint2); | |
768 | + if($poligonos[$i[5]]) | |
769 | + $poligonos[$i[5]] = array_merge(array($linha),$poligonos[$i[5]]); | |
770 | + else | |
771 | + $poligonos[$i[5]] = array($linha); | |
772 | + if($poligonos[$i[6]]) | |
773 | + $poligonos[$i[6]] = array_merge(array($linha),$poligonos[$i[6]]); | |
774 | + else | |
775 | + $poligonos[$i[6]] = array($linha); | |
776 | + $ShapeObj = ms_newShapeObj(MS_SHAPE_LINE); | |
777 | + $ShapeObj->add($linha); | |
778 | + $novoshpLinhas->addShape($ShapeObj); | |
779 | + $registro = array($i1,$i2,$i3,$i4,$i5,$i6,$i[7],$i[8]); | |
780 | + xbase_add_record($dbLinhas,$registro); | |
781 | + $ShapeObj->free(); | |
782 | + } | |
783 | + } | |
784 | + // | |
785 | + //adiciona os poligonos | |
786 | + // | |
787 | + foreach ($poligonos as $p) | |
788 | + { | |
789 | + $ShapeObjp = ms_newShapeObj(MS_SHAPE_LINE); | |
790 | + foreach ($p as $o) | |
791 | + {$ShapeObjp->add($o);} | |
792 | + $ns = $ShapeObjp->convexhull(); | |
793 | + $novoshpPoligonos->addShape($ns); | |
794 | + $registro = array($ns->getArea()); | |
795 | + xbase_add_record($dbPoligonos,$registro); | |
796 | + $ShapeObjp->free(); | |
797 | + } | |
798 | + $novoshpPoligonos->free(); | |
799 | + xbase_close($dbPoligonos); | |
800 | + // | |
801 | + //adiciona o layer com os polígonos no mapa | |
802 | + // | |
803 | + $novolayerp = criaLayer($this->mapa,MS_LAYER_POLYGON,MS_DEFAULT,("Voronoi - poligonos (".$nomePoligonos.")"),$metaClasse="SIM"); | |
804 | + $novolayerp->set("data",$nomeshpPoligonos.".shp"); | |
805 | + $novolayerp->setmetadata("DOWNLOAD","SIM"); | |
806 | + $novolayerp->set("template","none.htm"); | |
807 | + $classe = $novolayerp->getclass(0); | |
808 | + $estilo = $classe->getstyle(0); | |
809 | + $cor = $estilo->color; | |
810 | + $cor->setrgb(240,240,240); | |
811 | + // | |
812 | + //adiciona no mapa atual o novo tema com as linhas do diagrama | |
813 | + // | |
814 | + if (count($borda > 2)) | |
815 | + { | |
816 | + $linha = ms_newLineObj(); | |
817 | + foreach ($borda as $ponto) | |
818 | + { | |
819 | + $linha->add($ponto); | |
820 | + } | |
821 | + $ShapeObj = ms_newShapeObj(MS_SHAPE_LINE); | |
822 | + $ShapeObj->add($linha); | |
823 | + $novoshpLinhas->addShape($ShapeObj->convexhull()); | |
824 | + $registro = array(0,0,0,0,0,0,0,0); | |
825 | + xbase_add_record($dbLinhas,$registro); | |
826 | + $linha->free(); | |
827 | + $ShapeObj->free(); | |
828 | + } | |
829 | + $novoshpLinhas->free(); | |
830 | + xbase_close($dbLinhas); | |
831 | + fclose($abre); | |
832 | + $novolayer = criaLayer($this->mapa,MS_LAYER_LINE,MS_DEFAULT,("Voronoi (".$nomeLinhas.")"),$metaClasse="SIM"); | |
833 | + $novolayer->set("data",$nomeshpLinhas.".shp"); | |
834 | + $novolayer->setmetadata("DOWNLOAD","SIM"); | |
835 | + $novolayer->set("template","none.htm"); | |
836 | + $classe = $novolayer->getclass(0); | |
837 | + $estilo = $classe->getstyle(0); | |
838 | + $estilo->set("symbolname","linha"); | |
839 | + $estilo->set("size",4); | |
840 | + $cor = $estilo->color; | |
841 | + $cor->setrgb(255,210,0); | |
842 | + } | |
843 | + } | |
844 | +/* | |
546 | 845 | function: pontoEmPoligono |
547 | 846 | |
548 | 847 | Cruza um tema pontual com temas poligonais ou raster. | ... | ... |
ferramentas/pontosdistri/index.js
... | ... | @@ -41,7 +41,10 @@ comboTemasPt("temasPt",function(retorno) |
41 | 41 | ins += "<br><br><div style=top:0px;left:0px;text-align:left; onclick='analiseDensidade()' ><input id=botao1 size=35 type=button value='densidade de pontos' /></div><br>" |
42 | 42 | ins += "<div style=top:0px;left:0px;text-align:left; onclick='analiseDistancia()' ><input id=botao2 size=35 type=button value='distância entre pontos' /></div><br>" |
43 | 43 | ins += "<div style='padding:1px;left:0px;border: 1px solid gray;'><div style=top:0px;left:0px;text-align:left; onclick='analiseKernel()' ><input id=botaokernel size=35 type=button value='Kernel' /></div><div>Desvio padrão (sigma):<input class='digitar' type=text size=3 value='' id=sigma /></div></div><br>" |
44 | + ins += "<div style=top:0px;left:0px;text-align:left; onclick='analiseDeldir()' ><input id=botaodeldir size=35 type=button value='Delaunay/Voronoi' /></div><br>" | |
45 | + | |
44 | 46 | ins += "<div style=top:0px;left:0px;text-align:left; onclick='analiseRelatorio()' ><input id=botao3 size=35 type=button value='relatório' /></div><br>" |
47 | + | |
45 | 48 | $i("guia1obj").innerHTML = ins; |
46 | 49 | YAHOO.example.init = function () |
47 | 50 | { |
... | ... | @@ -52,6 +55,7 @@ comboTemasPt("temasPt",function(retorno) |
52 | 55 | new YAHOO.widget.Button("botao3"); |
53 | 56 | new YAHOO.widget.Button("botao4"); |
54 | 57 | new YAHOO.widget.Button("botaokernel"); |
58 | + new YAHOO.widget.Button("botaodeldir"); | |
55 | 59 | } |
56 | 60 | YAHOO.util.Event.onContentReady("botao1", onPushButtonsMarkupReady); |
57 | 61 | }() |
... | ... | @@ -88,6 +92,23 @@ function mostracores(retorno) |
88 | 92 | function corj(obj) |
89 | 93 | {window.parent.abreCor("wdocai",obj)} |
90 | 94 | |
95 | +function analiseDeldir() | |
96 | +{ | |
97 | + aguarde("block") | |
98 | + var temp = function() | |
99 | + { | |
100 | + aguarde("none"); | |
101 | + window.parent.ajaxredesenha("") | |
102 | + } | |
103 | + var tema = $i("temasPt").value | |
104 | + if(tema == ""){alert("Escolha um tema");aguarde("none");return} | |
105 | + var cp = new cpaint(); | |
106 | + var p = g_locaplic+"/classesphp/mapa_controle.php?g_sid="+g_sid+"&funcao=analiseDistriPt&tema="+tema+"&tipo=deldir&numclasses=&cori=&corf=&sigma=&limitepontos=" | |
107 | + //cp.set_debug(2) | |
108 | + cp.set_response_type("JSON"); | |
109 | + cp.call(p,"analiseDeldir",temp); | |
110 | +} | |
111 | + | |
91 | 112 | function analiseKernel() |
92 | 113 | { |
93 | 114 | var n = $i("numclasses").value | ... | ... |