/** * Title: PluginI3Geo * * i3GEO.pluginI3geo * * Implementa os plugins do i3Geo que adicionam camadas especiais ao mapa, * normalmente dados vetoriais processados no navegador Web. * * Arquivo: * * i3geo/classesjs/classe_plugini3geo.js * * Licença: * * 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 * * 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 ADEQUACÃ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 (i3GEO) === 'undefined') { var i3GEO = {}; } i3GEO.pluginI3geo = { OBJETOS : {}, /** * Lista de plugins * * Utilizado no editor de mapfiles do sistema de administracao */ PLUGINS : [ { "classe" : "heatmap", "nome" : "Mapa de calor", "editor" : true }, { "classe" : "markercluster", "nome" : "Agrupamento de pontos (cluster)", "editor" : true } ], /** * Inicia a execucao de um plugin * * Camada e um objeto gerado pelo i3Geo quando uma camada e adicionada ao * mapa O objeto i3GEO.arvoreDeCamadas.CAMADAS guarda todas as camadas * adicionadas ao mapa Ao adicionar uma camada pelo catalogo, o i3Geo * verifica se a camada possui plugin e direciona para ca Os plugins sao * definidos como metadados em cada mapfile de cada tema * * Veja em i3geo/classesphp/classe_mapa.php funcao parametrostemas */ inicia : function(camada) { if (i3GEO.janela) { i3GEO.janela.AGUARDEMODAL = true; i3GEO.janela.abreAguarde( "aguardePlugin", "Plugin..."); i3GEO.janela.AGUARDEMODAL = false; } // chama a funcao conforme o tipo de plugin e a interface atual // para cada plugin deve haver um objeto com as funcoes especificas // para // cada interface i3GEO.pluginI3geo[camada.plugini3geo.plugin][i3GEO.Interface.ATUAL].inicia(camada); }, /** * Retorna o HTML com o formulario para editar os parametros do plugin */ formAdmin : function(plugin, configString) { return i3GEO.pluginI3geo[plugin].formAdmin(configString); }, linkAjuda : function(plugin) { return i3GEO.pluginI3geo[plugin].linkAjuda(); }, ligaCamada : function(nomecamada) { if (i3GEO.pluginI3geo.OBJETOS[nomecamada] && i3GEO.pluginI3geo.OBJETOS[nomecamada].ligaCamada) { i3GEO.pluginI3geo.OBJETOS[nomecamada].ligaCamada(); return true; } return false; }, desligaCamada : function(nomecamada) { if (i3GEO.pluginI3geo.OBJETOS[nomecamada] && i3GEO.pluginI3geo.OBJETOS[nomecamada].desLigaCamada) { i3GEO.pluginI3geo.OBJETOS[nomecamada].desLigaCamada(); return true; } return false; }, removeCamada : function(nomecamada) { if (i3GEO.pluginI3geo.OBJETOS[nomecamada] && i3GEO.pluginI3geo.OBJETOS[nomecamada].removeCamada) { i3GEO.pluginI3geo.OBJETOS[nomecamada].removeCamada(); delete (i3GEO.pluginI3geo.OBJETOS[nomecamada]); return true; } return false; }, atualizaCamada : function(nomecamada) { if (i3GEO.pluginI3geo.OBJETOS[nomecamada] && i3GEO.pluginI3geo.OBJETOS[nomecamada].atualizaCamada) { i3GEO.pluginI3geo.OBJETOS[nomecamada].atualizaCamada(); return true; } return false; }, existeObjeto : function(nomecamada) { if (i3GEO.pluginI3geo.OBJETOS[nomecamada] && i3GEO.pluginI3geo.OBJETOS[nomecamada].atualizaCamada) { return true; } return false; }, /** * Aplica as propriedades em um objeto do tipo tema * * tema e fornecido por i3GEO.arvoreDeCamadas o ajuste das propriedades e * necessario para que as propriedades aparecam de forma correta na arvore * de camadas */ aplicaPropriedades : function(camada) { if (camada.plugini3geo && camada.plugini3geo != "") { camada = i3GEO.pluginI3geo[camada.plugini3geo.plugin][i3GEO.Interface.ATUAL].aplicaPropriedades(camada); } return camada; }, /** * Function: heatmap * * Mapa de calor * * Gera um layer do tipo mapa de calor e adiciona ao mapa * * As dependências em javascript sao carregadas via script tag por * meio de ferramentas/heatmap * * Esse programa também obtém os dados necessários ao * plugin * * O layer existente no mapfile deve conter um metadata chamado PLUGINI3GEO * * Esse matadado deve conter uma string que será transformada em um * objeto javascript para uso no plugin * * Exemplo: * * "PLUGINI3GEO" '{"plugin":"heatmap","parametros":{"tipoGradiente": * "default","coluna":"teste","max":"10","radius":"15"}}' * * Coluna é a que contém os dados numéricos que definem * a quantidade de uma medida em cada ponto e é usada para gerar a * representação. Se for vazia, considera-se o valor como 1 * * As cores das classes existentes no LAYER serão utilizadas para * calcular as cores do mapa de calor. Se tipoGradiente for igual a * "default" será utilizado o gradiente padrĂ£o. * */ heatmap : { linkAjuda : function() { return i3GEO.configura.locaplic + "/ajuda_usuario.php?idcategoria=3&idajuda=121"; }, formAdmin : function(config) { // {"plugin":"heatmap","parametros":{"coluna":"","radius":15,"max":10}} var parametros, ins = "", configDefault = '{"plugin":"heatmap","parametros":{"tipoGradiente": "default","valorPonto":1,"coluna":"","radius":15}}'; if (config === "") { config = configDefault; } config = YAHOO.lang.JSON.parse(config); if (config.plugin != "heatmap") { config = YAHOO.lang.JSON.parse(configDefault); } parametros = config.parametros; ins += "" + "
Coluna que contém os dados:"
+ "
Ou valor numérico para cada ponto:"
+ "
Raio de cada ponto em pixels:"
+ "
Valor máximo em cada ponto:"
// + "
Tipo de gradiente (deixe vazio para utilizar as classes definidas no Layer ou escreva 'default' para usar o normal):"
+ "
Para definir os cortes no gradiente de cores utilize valores entre 0 e 1." + " As cores são definidas nas classes do LAYER, sendo que o nome define o valor superior do gradiente e COLOR define a cor." + " Veja o exemplo utilizado no tema _lmapadecalor.map
"; return ins; }, googlemaps : { aplicaPropriedades : function(camada) { camada.sel = "nao"; camada.download = "nao"; camada.AGUARDALEGENDA = false; camada.temporizador = ""; camada.copia = false; camada.procurar = false; camada.toponimia = false; camada.etiquetas = false; camada.tabela = false; camada.grafico = false; camada.destacar = false; camada.wms = false; camada.classe = "NAO"; return camada; }, inicia : function(camada) { var nomeScript = "heatmap_script", p = i3GEO.configura.locaplic + "/ferramentas/heatmap/googlemaps_js.php", carregaJs = "nao", criaLayer; criaLayer = function() { var heatmap, pontos; heatmap = new HeatmapOverlay(i3GeoMap, camada.name, { "radius" : camada.plugini3geo.parametros.radius, "visible" : true, "opacity" : camada.transparency, "gradient" : heatmap_config.gradient, "legend" : { "title" : camada.tema, "position" : "bl", "offset" : [ 5, 50 ] } }); // i3GeoMap.overlayMapTypes.insertAt(0, heatmap); pontos = { max : camada.plugini3geo.parametros.max, data : heatmap_dados }; i3GEO.janela.fechaAguarde("aguardePlugin"); heatmap.setDataSet(pontos); heatmap.ligaCamada = function() { this.liga(); }; heatmap.desLigaCamada = function() { this.desliga(); }; heatmap.removeCamada = function() { this.destroy(); }; heatmap.atualizaCamada = function() { this.draw(); }; i3GEO.pluginI3geo.OBJETOS[camada.name] = heatmap; heatmap_dados = null; }; // se o script nao existir carrega o codigo e os dados // caso contrario, carrega apenas os dados no script if (!$i(nomeScript)) { carregaJs = "sim"; } else { nomeScript = ""; } p += "?carregajs=" + carregaJs + "&layer=" + camada.name + "&coluna=" + camada.plugini3geo.parametros.coluna + "&tipoGradiente=" + camada.plugini3geo.parametros.tipoGradiente + "&g_sid=" + i3GEO.configura.sid + "&nomevariavel=heatmap_dados&nomevariavelConfig=heatmap_config"; i3GEO.util.scriptTag( p, criaLayer, nomeScript); } }, // // O script que adiciona a camada // define os eventos visibilitychanged, moveend e removed // A camada e adicionada como um objeto layer, permitindo que as funcoes // do i3Geo operem normalmente, sem muitas modificacoes // openlayers : { aplicaPropriedades : function(camada) { camada.sel = "nao"; camada.download = "nao"; camada.AGUARDALEGENDA = false; camada.temporizador = ""; camada.copia = false; camada.procurar = false; camada.toponimia = false; camada.etiquetas = false; camada.tabela = false; camada.grafico = false; camada.destacar = false; camada.wms = false; camada.classe = "NAO"; return camada; }, inicia : function(camada, objMapa) { var nomeScript = "heatmap_script", p = i3GEO.configura.locaplic + "/ferramentas/heatmap/openlayers_js.php", carregaJs = "nao", criaLayer; criaLayer = function() { var temp, heatmap, transformedTestData = { max : 1, data : [] }, data = heatmap_dados, datalen = heatmap_dados.length, nudata = [], max = 0; // para uso com o mashup if (!objMapa) { objMapa = i3geoOL; } // in order to use the OpenLayers Heatmap Layer we have // to // transform our data into // { max:Distância máxima entre ponto em pixels:"
+ "
Tipo de estilos (deixe vazio para utilizar as classes definidas no Layer ou escreva 'default' para usar o normal):"
+ "
Os símbolos utilizados podem ser customizados alterando-se as classes do Mapfile
" + "Veja o exemplo utilizado no tema _lmapadecluster.map
"; return ins; }, googlemaps : { aplicaPropriedades : function(camada) { camada.sel = "nao"; camada.download = "nao"; camada.AGUARDALEGENDA = false; camada.temporizador = ""; camada.copia = false; camada.procurar = false; camada.toponimia = false; camada.etiquetas = false; camada.tabela = false; camada.grafico = false; camada.destacar = false; camada.wms = false; camada.classe = "NAO"; return camada; }, inicia : function(camada) { var nomeScript = "markercluster_script", p = i3GEO.configura.locaplic + "/ferramentas/markercluster/googlemaps_js.php", carregaJs = "nao", criaLayer; criaLayer = function() { var markercluster, marcas, latLng, marker, n, i; n = markercluster_dados.length; marcas = []; for (i = 0; i < n; i++) { latLng = new google.maps.LatLng(markercluster_dados[i].lat, markercluster_dados[i].lng); marker = new google.maps.Marker({ 'position' : latLng, icon : { url : markercluster_config.ponto.url, scaledSize : new google.maps.Size(markercluster_config.ponto.width, markercluster_config.ponto.height) } }); marcas.push(marker); } markercluster = new MarkerClusterer(i3GeoMap, marcas, { "gridSize" : parseInt( camada.plugini3geo.parametros.gridSize, 10), "visible" : true, "opacity" : camada.transparency, "name" : camada.name, "styles" : markercluster_config.estilos }); i3GEO.janela.fechaAguarde("aguardePlugin"); i3GEO.eventos.cliquePerm.ativo = false; markercluster.ligaCamada = function() { i3GEO.pluginI3geo.OBJETOS[camada.name].ready_ = true; i3GEO.pluginI3geo.OBJETOS[camada.name].redraw(); i3GEO.eventos.cliquePerm.ativo = false; }; markercluster.desLigaCamada = function() { i3GEO.pluginI3geo.OBJETOS[camada.name].resetViewport(true); i3GEO.pluginI3geo.OBJETOS[camada.name].ready_ = false; i3GEO.eventos.cliquePerm.ativo = true; }; markercluster.removeCamada = function() { i3GEO.pluginI3geo.OBJETOS[camada.name].clearMarkers(); i3GEO.eventos.cliquePerm.ativo = true; }; markercluster.atualizaCamada = function() { i3GEO.pluginI3geo.OBJETOS[camada.name].ready_ = true; i3GEO.pluginI3geo.OBJETOS[camada.name].redraw(); i3GEO.eventos.cliquePerm.ativo = false; }; i3GEO.pluginI3geo.OBJETOS[camada.name] = markercluster; markercluster_dados = null; }; // se o script nao existir carrega o codigo e os dados // caso contrario, carrega apenas os dados no script if (!$i(nomeScript)) { carregaJs = "sim"; } else { nomeScript = ""; } p += "?carregajs=" + carregaJs + "&layer=" + camada.name + "&g_sid=" + i3GEO.configura.sid + "&tipoEstilos=" + camada.plugini3geo.parametros.tipoEstilos + "&nomevariavel=markercluster_dados&nomevariavelConfig=markercluster_config"; i3GEO.util.scriptTag( p, criaLayer, nomeScript); } }, openlayers : { aplicaPropriedades : function(camada) { camada.sel = "nao"; camada.download = "nao"; camada.AGUARDALEGENDA = false; camada.temporizador = ""; camada.copia = false; camada.procurar = false; camada.toponimia = false; camada.etiquetas = false; camada.tabela = false; camada.grafico = false; camada.destacar = false; camada.wms = false; camada.classe = "NAO"; return camada; }, inicia : function(camada, objMapa) { var nomeScript = "markercluster_script", p = i3GEO.configura.locaplic + "/ferramentas/markercluster/openlayers_js.php", carregaJs = "nao", criaLayer; criaLayer = function() { var layerListeners, logMax, logMin, classes, min, max, markercluster, marcas, lonlat, n, i, style, nestilos, intervalo, regra, regras = []; nestilos = markercluster_config.estilos.length; n = markercluster_dados.length; classes = Array(); logMax = Math.log(n) / Math.LN10; // max decimal logarithm (or base // 10) logMin = Math.log(1) / Math.LN10; intervalo = (logMax - logMin) / nestilos; // we compute log bounds for (i = 0; i < nestilos; i++) { if (i == 0) { classes[i] = logMin; } else { classes[i] = classes[i - 1] + intervalo; } } // we compute antilog classes = classes.map(function(x) { return Math.pow( 10, x); }); // and we finally add max value classes.push(n); // ponto sozinho regra = new OpenLayers.Rule({ filter : new OpenLayers.Filter.Comparison({ type : OpenLayers.Filter.Comparison.LESS_THAN, property : "count", value : 2 }), symbolizer : { externalGraphic : markercluster_config.ponto.url, graphicWidth : markercluster_config.ponto.width, graphicHeight : markercluster_config.ponto.height, graphicYOffset : (markercluster_config.ponto.height / 2) * -1 } }); regras.push(regra); min = 2; for (i = 0; i < nestilos; i++) { max = classes[i + 1]; regra = new OpenLayers.Rule({ filter : new OpenLayers.Filter.Comparison({ type : OpenLayers.Filter.Comparison.BETWEEN, property : "count", lowerBoundary : min, upperBoundary : max }), symbolizer : { externalGraphic : markercluster_config.estilos[i].url, graphicWidth : markercluster_config.estilos[i].width, graphicHeight : markercluster_config.estilos[i].height, label : "${count}", labelOutlineWidth : 1, fontColor : "#000000", fontOpacity : 1, fontSize : "12px" } }); regras.push(regra); min = max; } // Create a Style that uses the three previous rules style = new OpenLayers.Style(null, { rules : regras }); // para uso com o mashup if (!objMapa) { objMapa = i3geoOL; } layerListeners = { featureclick : function(e) { if (e.feature.cluster.length > 1) { objMapa.setCenter([e.feature.geometry.x,e.feature.geometry.y],objMapa.getZoom() + 1,false,false); //objMapa.zoomIn(); } return false; } }; markercluster = new OpenLayers.Layer.Vector(camada.name, { renderers : [ 'Canvas', 'SVG' ], strategies : [ new OpenLayers.Strategy.AnimatedCluster({ distance : parseInt( camada.plugini3geo.parametros.gridSize, 10) }) ], styleMap : new OpenLayers.StyleMap(style), eventListeners : layerListeners }); objMapa.addLayer(markercluster); marcas = []; for (i = 0; i < n; i++) { lonlat = new OpenLayers.LonLat(markercluster_dados[i].lng, markercluster_dados[i].lat); if (i3GEO.Interface.openlayers.googleLike === true) { lonlat.transform( new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")); } marcas.push(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat))); } markercluster.addFeatures(marcas); i3GEO.janela.fechaAguarde("aguardePlugin"); i3GEO.eventos.cliquePerm.ativo = false; markercluster.ligaCamada = function() { i3GEO.eventos.cliquePerm.ativo = false; }; markercluster.desLigaCamada = function() { i3GEO.eventos.cliquePerm.ativo = true; }; markercluster.removeCamada = function() { i3GEO.eventos.cliquePerm.ativo = true; }; markercluster.atualizaCamada = function() { i3GEO.eventos.cliquePerm.ativo = false; }; i3GEO.pluginI3geo.OBJETOS[camada.name] = markercluster; markercluster_dados = null; }; // se o script nao existir carrega o codigo e os dados // caso contrario, carrega apenas os dados no script if (!$i(nomeScript)) { carregaJs = "sim"; } else { nomeScript = ""; } p += "?carregajs=" + carregaJs + "&layer=" + camada.name + "&g_sid=" + i3GEO.configura.sid + "&tipoEstilos=" + camada.plugini3geo.parametros.tipoEstilos + "&nomevariavel=markercluster_dados&nomevariavelConfig=markercluster_config"; i3GEO.util.scriptTag( p, criaLayer, nomeScript); } } } };