/* Title: Google Maps Abre um mapa, baseado na API do Google Maps, que permite navegar de forma integrada com o mapa principal do i3Geo. O código da API do Google Maps é armazenada em i3geo/ms_configura.php Veja: Arquivo: i3geo/ferramentas/googlemaps/index.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@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 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. */ /* Function: inicializa Cria o mapa do Google Maps e adiciona os botões especiais do i3Geo. Define os eventos que disparam modificações no mapa principal do i3Geo quando é feita a navegação. */ navm = false; // IE navn = false; // netscape var app = navigator.appName.substring(0,1); if (app=='N') navn=true; else navm=true; i3GEO = window.parent.i3GEO; MARCA = false; BOX = false; ATUALIZABOX = true; $i = function(id){ return window.parent.document.getElementById(id); }; function inicializa(){ counterClick = 0; var m = document.getElementById("mapa"), nz = 8, coordenadas = false, pol,ret,pt1,pt2,centro; if(i3GEO){ m.style.width = (i3GEO.parametros.w / 2.5) - 20 + "px"; m.style.height = (i3GEO.parametros.h / 2.5) -20 + "px"; i3geoOverlay = false; try{ coordenadas = i3GEO.navega.dialogo.google.coordenadas; } catch(e){} pol = i3GEO.util.extOSM2Geo(i3GEO.parametros.mapexten); ret = pol.split(" "); pt1 = (( (ret[0] * -1) - (ret[2] * -1) ) / 2) + ret[0] *1; pt2 = (((ret[1] - ret[3]) / 2)* -1) + ret[1] *1; } else{ pt1 = -54; pt2 = -12; } centro = new google.maps.LatLng(pt2,pt1); if(i3GEO && i3GEO.Interface.ATUAL === "openlayers"){ nz = window.parent.i3geoOL.getZoom() + 2; } map = new google.maps.Map(m,{zoom:nz,center:centro,scaleControl:true,mapTypeControl:true,streetViewControl:true,zoomControl:true,mapTypeId:google.maps.MapTypeId.SATELLITE}); if(coordenadas != false){ adicionaMarcasMapa(coordenadas); } google.maps.event.addListener(map, "moveend", function() { ondegoogle(map); }); google.maps.event.addListener(map, "bounds_changed", function() { if(i3GEO){ //evita loop entre os eventos do i3geo e do googlemaps if(ATUALIZABOX === true){ var bd = map.getBounds(); var centro = bd.getCenter(); i3GEO.Interface[i3GEO.Interface.ATUAL].pan2ponto(centro.lng(),centro.lat()); } ATUALIZABOX = true; ondegoogle(); } }); google.maps.event.addListener(map, "mousemove", function(ponto) { var teladms,temp, mapexten = i3GEO.util.extOSM2Geo(i3GEO.parametros.mapexten), x = ponto.latLng.lng(), y = ponto.latLng.lat(); teladms = i3GEO.calculo.dd2dms(x,y); window.parent.objposicaocursor = { ddx: x, ddy: y, dmsx: teladms[0], dmsy: teladms[1], imgx:0, imgy:0, telax: 0, telay: 0 }; i3GEO.eventos.mousemoveMapa(); if(i3GEO.Interface.ATUAL === "googleearth") {return;} temp = mapexten.split(" "); if(x < temp[2] && y < temp[3]){ if(MARCA === false){ MARCA = i3GEO.desenho.addPin(x,y,"","",i3GEO.configura.locaplic+'/imagens/google/confluence.png',"googlemaps"); } else{ i3GEO.desenho.movePin(MARCA,x,y); } } }); if(i3GEO){ ondegoogle(map); } botaoRota(); if(coordenadas) {adicionaMarcasMapa(coordenadas);} } function botaoI3geo(){ var controlDiv = document.createElement('div'); controlDiv.index = 1; controlDiv.style.padding = '5px'; // Set CSS for the control border var controlUI = document.createElement('div'); controlUI.style.backgroundColor = 'white'; controlUI.style.borderStyle = 'solid'; controlUI.style.borderWidth = '2px'; controlUI.style.cursor = 'pointer'; controlUI.style.textAlign = 'center'; controlUI.title = 'Adiciona o mapa ao Google'; controlDiv.appendChild(controlUI); var controlText = document.createElement('div'); controlText.style.fontFamily = 'Arial,sans-serif'; controlText.style.fontSize = '12px'; controlText.style.paddingLeft = '4px'; controlText.style.paddingRight = '4px'; controlText.innerHTML = 'i3Geo'; controlUI.appendChild(controlText); google.maps.event.addDomListener(controlUI, 'click', function() { wmsmap = new google.maps.GroundOverlay(criaWMS(), map.getBounds(),{map: map}); }); map.controls[google.maps.ControlPosition.TOP_RIGHT].push(controlDiv); } function botaoRota(){ var controlDiv = document.createElement('div'); controlDiv.index = 1; controlDiv.style.padding = '5px'; // Set CSS for the control border var controlUI = document.createElement('div'); controlUI.style.backgroundColor = 'white'; controlUI.style.borderStyle = 'solid'; controlUI.style.borderWidth = '2px'; controlUI.style.cursor = 'pointer'; controlUI.style.textAlign = 'center'; controlUI.title = ''; controlDiv.appendChild(controlUI); var controlText = document.createElement('div'); controlText.style.fontFamily = 'Arial,sans-serif'; controlText.style.fontSize = '12px'; controlText.style.paddingLeft = '4px'; controlText.style.paddingRight = '4px'; controlText.innerHTML = 'Rota'; controlUI.appendChild(controlText); google.maps.event.addDomListener(controlUI, 'click', function() { ativaI3geoRota(); }); map.controls[google.maps.ControlPosition.TOP_RIGHT].push(controlDiv); } /* Function: ondegoogle Mostra, no mapa principal, um retangulo indicando a extensão geográfica do mapa mostrado na janela do GM */ function ondegoogle(){ if(!i3GEO || !map.getBounds()){return;} var b = bbox(); b = b.split(" "); if(BOX === false){ BOX = i3GEO.desenho.addBox(b[0], b[1], b[2], b[3], "boxOndeGoogle"); } else{ BOX = i3GEO.desenho.moveBox(BOX,b[0], b[1], b[2], b[3]); } } function moveMapa(bd){ if(!i3GEO){return;} nex = bd.minX+" "+bd.minY+" "+bd.maxX+" "+bd.maxY; var p = i3GEO.locaplic+"/classesphp/mapa_controle.php?funcao=mudaext&ext="+nex; var cp = new cpaint(); //cp.set_debug(2) cp.set_response_type("JSON"); cp.call(p,"mudaExtensao",i3GEO.atualiza); } /* Function: panTogoogle Desloca o mapa do google quando o mapa principal e deslocado */ function panTogoogle(){ if(!i3GEO){return;} ATUALIZABOX = false; var pol = i3GEO.util.extOSM2Geo(i3GEO.parametros.mapexten); var ret = pol.split(" "); var pt1 = (( (ret[0] * -1) - (ret[2] * -1) ) / 2) + ret[0] *1; var pt2 = (((ret[1] - ret[3]) / 2)* -1) + ret[1] *1; map.panTo(new google.maps.LatLng(pt2,pt1)); } /* Function: bbox Obtém os valores de extensão geográfica do GM e converte para uma string no formato aceito pelo i3Geo Return: {String} - xmin ymin xmax ymax */ function bbox(){ var bd = map.getBounds(); var so = bd.getSouthWest(); var ne = bd.getNorthEast(); var bbox = so.lng()+" "+so.lat()+" "+ne.lng()+" "+ne.lat(); return (bbox); } /* Function: criaWMS Formata uma URL que transforma o mapa atual do i3Geo em um WMS, possibilitando sua inclusão como uma camada na janela GM. Return: [String} - URL WMS */ function criaWMS(){ var cgi = i3GEO.configura.locaplic+"/classesphp/parse_cgi.php?g_sid="+i3GEO.configura.sid; var parametros = "&map_size="+parseInt(document.getElementById("mapa").style.width); parametros += ","+parseInt(document.getElementById("mapa").style.height); parametros += "&mapext="+bbox(); parametros += "&map_imagecolor=0 0 0&map_transparent=on"; return(cgi+parametros); } function criaTile(){ var cgi = window.parent.i3GEO.util.protocolo()+"://"+window.location.host+window.parent.i3GEO.parametros.cgi+"?"; var parametros = "map="+window.parent.i3GEO.parametros.mapfile; parametros += "&map.scalebar=status+off&map_imagecolor=-1 -1 -1&map_transparent=on"; parametros += '&mode=tile'; parametros += '&tilemode=gmap'; parametros += '&tile={X}+{Y}+{Z}'; return(cgi+parametros); } function ativaI3geo() { var i3GEOTile = new GTileLayer(null,0,18,{ tileUrlTemplate:criaTile(), isPng:true, opacity:1 }); i3GEOTileO = new GTileLayerOverlay(i3GEOTile); map.addOverlay(i3GEOTileO); } /* Function: ativaI3geoRota Inicia a função de criação de rotas, solicitando a indicação do primeiro ponto */ function ativaI3geoRota(){ rotaEvento = google.maps.event.addListener(map, "click", parametrosRota); i3GEO.janela.tempoMsg("Clique o ponto de origem da rota"); counterClick++; } /* Function: parametrosRota Obtém os parametros para criação da rota, inclusive o ponto de destino */ function parametrosRota(overlay){ if(counterClick == 1){ counterClick++; i3GEO.janela.tempoMsg("Clique o ponto de destino da rota"); pontoRota1 = overlay.latLng; return; } if(counterClick == 2){ pontoRota2 = overlay.latLng; counterClick = 0; google.maps.event.removeListener(rotaEvento); constroiRota(); //montaRota(); } } /* Function: constroiRota Cria a rota do ponto de origem ao ponto de destino */ function constroiRota(){ var pt2 = function(response,status){ if (status == google.maps.GeocoderStatus.OK) { var place = response[0]; endereco2 = place.formatted_address; endereco2 = i3GEO.janela.prompt( "Confirme o endereco do final", function(){ montaRota(); }, endereco2 ); } else{ i3GEO.janela.tempoMsg("Ocorreu um erro"); } }; var pt1 = function(response,status){ //map.clearOverlays(); if (status == google.maps.GeocoderStatus.OK) { var place = response[0]; endereco1 = place.formatted_address; endereco1 = i3GEO.janela.prompt( "Confirme o endereco do inicio", function(){ geocoder.geocode( {'location':pontoRota2}, pt2 ); }, endereco1 ); } else{ i3GEO.janela.tempoMsg("Ocorreu um erro"); } }; var geocoder = new google.maps.Geocoder(); geocoder.geocode( {'location':pontoRota1}, pt1 ); } /* Function: montaRota Inclui o traçado da rota como uma nova camada no mapa principal */ function montaRota(){ if(!document.getElementById("descrota")){ var descrota = document.createElement("div"); descrota.id = "descrota"; document.body.appendChild(descrota); } else{ descrota = document.getElementById("descrota"); descrota.innerHTML = ""; } var directions = new google.maps.DirectionsService(); directions.route( {origin: pontoRota1,destination: pontoRota2,'travelMode':google.maps.TravelMode.DRIVING}, function(retorno, status) { if (status == google.maps.GeocoderStatus.OK){ var i,p,nvertices,vertice, directionsDisplay = new google.maps.DirectionsRenderer(); directionsDisplay.setPanel(descrota); directionsDisplay.setMap(map); directionsDisplay.setDirections(retorno); p = retorno.routes[0].overview_path; nvertices = p.length; pontos = []; for(i=0;i