2012-04-23 24 views
1

這是我的例子http://gidzior.net/map/v3_animate_marker_directions.html(我在輸入中使用佔位符),GM代碼的核心是來自geocodezip.com,我在Andrew的大力幫助下開發代碼Leach如何重置谷歌地圖步驟的價值v3動畫

在將動畫設置爲1500米之前將目標設置爲縮放可能會更好地到達此目標點,遺憾的是縮放後動畫不平滑,因此我將「step」值設置爲15,如何復位該值動畫停止

i之後設置步驟= 15 - if (d>eol-1500 && zoomed!=true) { map.setZoom(15); step = 15; zoomed=true; }

整個腳本

 var map; 
    var directionDisplay; 
    var directionsService; 
    var stepDisplay; 
    var markerArray = []; 
    var position; 
    var marker = null; 
    var polyline = null; 
    var poly2 = null; 
    var speed = 0.0000005, wait = 1; 
    var infowindow = null; 
    var zoomed; 
    var zoomedd; 
    var zoomeddd; 

    var myPano; 
    var panoClient; 
    var nextPanoId; 
    var timerHandle = null; 

    var size = new google.maps.Size(26,25); 
    var start_point = new google.maps.Point(0,0); 
    var foothold = new google.maps.Point(13,15); 

    var car_icon = new google.maps.MarkerImage("http://gidzior.net/map/car.png", size, start_point, foothold); 

function createMarker(latlng, label, html) { 
    var contentString = '<b>'+label+'</b><br>'+html; 
    var marker = new google.maps.Marker({ 
     position: latlng, 
     map: map, 
     icon: car_icon, 
     clickable: false, 
     zIndex: Math.round(latlng.lat()*-100000)<<5 
     }); 
    return marker; 
} 


function initialize() { 
    infowindow = new google.maps.InfoWindow(
    { 
     size: new google.maps.Size(150,50) 
    }); 
    // Instantiate a directions service. 
    directionsService = new google.maps.DirectionsService(); 

    // Create a map and center it on Warszawa. 
    var myOptions = { 
     zoom: 13, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    address = 'warszawa' 
    geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     map.setCenter(results[0].geometry.location); 
    }); 

    // Create a renderer for directions and bind it to the map. 
    var rendererOptions = { 
     map: map, 
    } 
    directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions); 

    // Instantiate an info window to hold step text. 
    stepDisplay = new google.maps.InfoWindow(); 

    polyline = new google.maps.Polyline({ 
    path: [], 
    strokeColor: '#FF0000', 
    strokeWeight: 3 
    }); 
    poly2 = new google.maps.Polyline({ 
    path: [], 
    strokeColor: '#FF0000', 
    strokeWeight: 3 
    }); 
    } 



    var steps = [] 

    function calcRoute(){ 

if (timerHandle) { clearTimeout(timerHandle); } 
if (marker) { marker.setMap(null);} 
polyline.setMap(null); 
poly2.setMap(null); 
directionsDisplay.setMap(null); 
    polyline = new google.maps.Polyline({ 
    path: [], 
    strokeColor: '#FF0000', 
    strokeWeight: 3 
    }); 
    poly2 = new google.maps.Polyline({ 
    path: [], 
    strokeColor: '#FF0000', 
    strokeWeight: 3 
    }); 
    // Create a renderer for directions and bind it to the map. 
    var rendererOptions = { 
     map: map, 
     suppressMarkers:true 
    } 
directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions); 

     var start = document.getElementById("start").value; 
     var end = document.getElementById("end").value; 
     var travelMode = google.maps.DirectionsTravelMode.DRIVING 

     var request = { 
      origin: start, 
      destination: end, 
      travelMode: travelMode, 
      waypoints: [{ 
       location:new google.maps.LatLng(52.185570, 20.997255), 
       stopover:false}], 
      optimizeWaypoints: false 
     }; 

     // Route the directions and pass the response to a 
     // function to create markers for each step. 
    directionsService.route(request, function(response, status) { 
    if (status == google.maps.DirectionsStatus.OK){ 
    directionsDisplay.setDirections(response); 

     var bounds = new google.maps.LatLngBounds(); 
     var route = response.routes[0]; 
     startLocation = new Object(); 
     endLocation = new Object(); 

     // For each route, display summary information. 
    var path = response.routes[0].overview_path; 
    var legs = response.routes[0].legs; 
     for (i=0;i<legs.length;i++) { 
      if (i == 0) { 
      startLocation.latlng = legs[i].start_location; 
      startLocation.address = legs[i].start_address; 
      // marker = google.maps.Marker({map:map,position: startLocation.latlng}); 
      marker = createMarker(legs[i].start_location,"start",legs[i].start_address,"green"); 
      } 
      endLocation.latlng = legs[i].end_location; 
      endLocation.address = legs[i].end_address; 
      var steps = legs[i].steps; 
      for (j=0;j<steps.length;j++) { 
      var nextSegment = steps[j].path; 
      for (k=0;k<nextSegment.length;k++) { 
       polyline.getPath().push(nextSegment[k]); 
       bounds.extend(nextSegment[k]); 



      } 
      } 
     } 

     polyline.setMap(map); 
     document.getElementById("distance").innerHTML = (polyline.Distance()/1000).toFixed(2)+" km"; 
     map.fitBounds(bounds); 
//  createMarker(endLocation.latlng,"end",endLocation.address,"red"); 
    map.setZoom(18); 
    startAnimation(); 
    zoomed=false; 
    zoomedd=false; 
    zoomeddd=false; 
    }              
}); 
} 



     var step = 50; // 5; // metres 
     var tick = 100; // milliseconds 
     var eol; 
     var k=0; 
     var stepnum=0; 
     var speed = ""; 
     var lastVertex = 1; 


//=============== animation functions ====================== 
     function updatePoly(d) { 
     // Spawn a new polyline every 20 vertices, because updating a 100-vertex poly is too slow 
     if (poly2.getPath().getLength() > 20) { 
      poly2=new google.maps.Polyline([polyline.getPath().getAt(lastVertex-1)]); 
      // map.addOverlay(poly2) 
     } 

     if (polyline.GetIndexAtDistance(d) < lastVertex+2) { 
      if (poly2.getPath().getLength()>1) { 
      poly2.getPath().removeAt(poly2.getPath().getLength()-1) 
      } 
      poly2.getPath().insertAt(poly2.getPath().getLength(),polyline.GetPointAtDistance(d)); 
     } else { 
      poly2.getPath().insertAt(poly2.getPath().getLength(),endLocation.latlng); 
     } 
     } 


     function animate(d) { 
// alert("animate("+d+")"); 
     if (d>eol) {; 
      map.panTo(endLocation.latlng); 
      marker.setPosition(endLocation.latlng); 
      return; 
     } 
     if (d>eol-20000 && zoomeddd!=true) { 
      map.setZoom(12); // or whatever value 
      zoomeddd=true; 
     } 
     if (d>eol-10000 && zoomedd!=true) { 
      map.setZoom(13); // or whatever value 
      zoomedd=true; 
     } 
     if (d>eol-1500 && zoomed!=true) { 
      map.setZoom(15); // or whatever value 
      step = 15; 
      zoomed=true; 
     } 
     var p = polyline.GetPointAtDistance(d); 
     map.panTo(p); 
     marker.setPosition(p); 
     updatePoly(d); 
     timerHandle = setTimeout("animate("+(d+step)+")", tick); 
     } 


function startAnimation() { 
     eol=polyline.Distance(); 
     map.setCenter(polyline.getPath().getAt(0)); 
     // map.addOverlay(new google.maps.Marker(polyline.getAt(0),G_START_ICON)); 
     // map.addOverlay(new GMarker(polyline.getVertex(polyline.getVertexCount()-1),G_END_ICON)); 
     // map.addOverlay(marker); 
     poly2 = new google.maps.Polyline({path: [polyline.getPath().getAt(0)], strokeColor:"#0000FF", strokeWeight:10}); 
     // map.addOverlay(poly2); 
     setTimeout("animate(50)",2000); // Allow time for the initial map display 
} 

回答

1

我設法得到這一點,我還是謝謝你

我把VAR步= 50;到頂端

var map; 
    var directionDisplay; 
    var directionsService; 
    var stepDisplay; 
    var markerArray = []; 
    var position; 
    var marker = null; 
    var polyline = null; 
    var poly2 = null; 
    var speed = 0.0000005, wait = 1; 
    var infowindow = null; 
    var zoomed; 
    var zoomedd; 
    var zoomeddd; 

    var step = 50; // 5; // metres 

    var myPano; 
    var panoClient; 
    var nextPanoId; 
    var timerHandle = null; 

我設置step = 50;到calcRoute()函數結束,現在動畫工作正常