/* 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; $i = function(id){ return window.parent.document.getElementById(id); }; box = window.parent.$i("boxpingoogle"); if(i3GEO){ i3GEO.util.criaBox("boxg"); $i("boxg").style.display = "none"; }; function inicializa(){ counterClick = 0; var m = document.getElementById("mapa"), nz = 8, coordenadas = false, pol,ret,pt1,pt2,centro; if(i3GEO){ i3GEO.util.criaPin("boxpingoogle",i3GEO.configura.locaplic+'/imagens/dot1red.gif',"5px","5px"); box = $i("boxpingoogle"); m.style.width = (i3GEO.parametros.w / 2.5) - 20 + "px"; m.style.height = (i3GEO.parametros.h / 2.5) -20 + "px"; i3geoOverlay = false; if($i("boxg")){ $i("boxg").style.zIndex = 0; } 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; try{ coordenadas = i3GEO.navega.dialogo.google.coordenadas; } catch(e){} } 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){ ondegoogle(); } }); google.maps.event.addListener(map, "mousemove", function(ponto) { var teladms,temp, mapexten = i3GEO.util.extOSM2Geo(i3GEO.parametros.mapexten); teladms = i3GEO.calculo.dd2dms(ponto.x,ponto.y); window.parent.objposicaocursor = { ddx: ponto.x, ddy: ponto.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(ponto.x < temp[2] && ponto.y < temp[3]){ xy = i3GEO.calculo.dd2tela(ponto.x,ponto.y,$i(i3GEO.Interface.IDMAPA),mapexten,i3GEO.parametros.pixelsize); box.style.display = "block"; box.style.width = "5px"; box.style.height = "5px"; box.style.top = (parseInt(xy[1],10) + 2.5) +"px"; box.style.left = (parseInt(xy[0],10) - 2.5) +"px"; } }); /* function botaoI3geo() {}; botaoI3geo.prototype = new GControl(); botaoI3geo.prototype.initialize = function(map) { var container = document.createElement("div"); var i3geo = document.createElement("div"); this.setButtonStyle_(i3geo); container.appendChild(i3geo); i3geo.appendChild(document.createTextNode("i3Geo")); google.maps.event.addDomListener(i3geo, "click", function() { try {map.removeOverlay(wmsmap);wmsmap = null;} catch(x){ wmsmap = new google.maps.GroundOverlay(criaWMS(), map.getBounds()); map.addOverlay(wmsmap); if(typeof(console) !== 'undefined'){console.error(x);} } }); var rota = document.createElement("div"); this.setButtonStyle_(rota); container.appendChild(rota); rota.appendChild(document.createTextNode("Rota")); GEvent.addDomListener(rota, "click", function() { ativaI3geoRota(); }); map.getContainer().appendChild(container); return container; }; botaoI3geo.prototype.getDefaultPosition = function() { return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(50, 50)); }; botaoI3geo.prototype.setButtonStyle_ = function(button) { button.style.textDecoration = "none"; button.style.color = "black"; button.style.backgroundColor = "white"; button.style.font = "small Arial"; button.style.border = "1px solid black"; button.style.padding = "1px"; button.style.marginBottom = "3px"; button.style.textAlign = "center"; button.style.width = "3em"; button.style.cursor = "pointer"; }; */ if(i3GEO){ if(i3GEO.parametros.mapfile){ botaoI3geo(); } 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 retāngulo indicando a extensão geográfica do mapa mostrado na janela do GM */ function ondegoogle(){ if(!i3GEO || !map.getBounds()){return;} var ext = i3GEO.util.extOSM2Geo(i3GEO.parametros.mapexten), bd = map.getBounds(), so = bd.getSouthWest(), ne = bd.getNorthEast(), xyMin = i3GEO.calculo.dd2tela(so.lng(),so.lat(),$i(i3GEO.Interface.IDMAPA),ext,i3GEO.parametros.pixelsize), xyMax = i3GEO.calculo.dd2tela(ne.lng(),ne.lat(),$i(i3GEO.Interface.IDMAPA),ext,i3GEO.parametros.pixelsize), box = $i("boxg"), w = xyMax[0]-xyMin[0], h = xyMin[1]-xyMax[1]; if(box){ box.style.display = "none"; if(w < i3GEO.parametros.w || h < i3GEO.parametros.h){ box.style.width = w + "px"; box.style.height = h+3 + "px"; box.style.top = xyMax[1]+"px"; box.style.left = xyMin[0]+"px"; box.style.display="block"; } } } 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 principal conforme a extensão geográfica do mapa do GM */ function panTogoogle(){ if(!i3GEO){return;} var b = $i("boxg"); b.style.display="block"; 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 parāmetros 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( "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( "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