2013-10-15 6 views
0

지도 상에 경로를 설정하는 함수가 있습니다.이 함수는 시작부터 끝까지 폴리 라인을 만듭니다. 일단 ploylines 그려진 다음 나는 이러한 경로를 따라 마커를 움직입니다.Google지도 모든 마커 및 폴리선 지우기

마커가 폴리선을 따라 움직이고 대상에 도달했을 때지도에서 모든 오버레이를 지우고 싶습니다.

여기 내가 지금까지 가지고있는 것의 LINK입니다.

어떻게 수행 할 수 있습니까?

CODE

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Google Maps JavaScript API v3 Example: Directions Complex</title> 


<style> 
html{height:100%;} 
body{height:100%;margin:0px;font-family: Helvetica,Arial;} 
</style> 

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type ="text/javascript" src="http://www.geocodezip.com/scripts/v3_epoly.js"></script> 
<script type="text/javascript"> 

    var map; 
    var directionDisplay; 
    var directionsService; 
    var stepDisplay; 

    var position; 
    var marker = []; 
    var polyline = []; 
    var poly2 = []; 
    var poly = null; 
    var startLocation = []; 
    var endLocation = []; 
    var timerHandle = []; 


    var speed = 0.000005, wait = 1; 
    var infowindow = null; 

    var myPano; 
    var panoClient; 
    var nextPanoId; 

    var startLoc = new Array(); 
    startLoc[0] = 'rio claro, trinidad'; 
    startLoc[1] = 'preysal, trinidad'; 
    startLoc[2] = 'san fernando, trinidad'; 
    startLoc[3] = 'couva, trinidad'; 

    var endLoc = new Array(); 
    endLoc[0] = 'princes town, trinidad'; 
    endLoc[1] = 'tabaquite, trinidad'; 
    endLoc[2] = 'mayaro, trinidad'; 
    endLoc[3] = 'arima, trinidad'; 


    var Colors = ["#FF0000", "#00FF00", "#0000FF"]; 


function initialize() { 

    infowindow = new google.maps.InfoWindow(
    { 
     size: new google.maps.Size(150,50) 
    }); 

    var myOptions = { 
     zoom: 10, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    address = 'Trinidad and Tobago' 
    geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 'address': address}, function(results, status) { 
    map.fitBounds(results[0].geometry.viewport); 

    }); 
    // setRoutes(); 
    } 


function createMarker(latlng, label, html) { 
// alert("createMarker("+latlng+","+label+","+html+","+color+")"); 
    var contentString = '<b>'+label+'</b><br>'+html; 
    var marker = new google.maps.Marker({ 
     position: latlng, 
     map: map, 
     title: label, 
     zIndex: Math.round(latlng.lat()*-100000)<<5 
     }); 
     marker.myname = label; 


    google.maps.event.addListener(marker, 'click', function() { 
     infowindow.setContent(contentString); 
     infowindow.open(map,marker); 
     }); 
    return marker; 
} 

function setRoutes(){ 

    var directionsDisplay = new Array(); 

    for (var i=0; i< startLoc.length; i++){ 

    var rendererOptions = { 
     map: map, 
     suppressMarkers : true, 
     preserveViewport: true 
    } 
    directionsService = new google.maps.DirectionsService(); 

    var travelMode = google.maps.DirectionsTravelMode.DRIVING; 

    var request = { 
     origin: startLoc[i], 
     destination: endLoc[i], 
     travelMode: travelMode 
    }; 

     directionsService.route(request,makeRouteCallback(i,directionsDisplay[i])); 

    } 


    function makeRouteCallback(routeNum,disp){ 
     if (polyline[routeNum] && (polyline[routeNum].getMap() != null)) { 
     startAnimation(routeNum); 
     return; 
     } 
     return function(response, status){ 

      if (status == google.maps.DirectionsStatus.OK){ 

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


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

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


      // For each route, display summary information. 
      var path = response.routes[0].overview_path; 
      var legs = response.routes[0].legs; 


      disp = new google.maps.DirectionsRenderer(rendererOptions);  
      disp.setMap(map); 
      disp.setDirections(response); 


      //Markers    
      for (i=0;i<legs.length;i++) { 
       if (i == 0) { 
       startLocation[routeNum].latlng = legs[i].start_location; 
       startLocation[routeNum].address = legs[i].start_address; 
       // marker = google.maps.Marker({map:map,position: startLocation.latlng}); 
       marker[routeNum] = createMarker(legs[i].start_location,"start",legs[i].start_address,"green"); 
       } 
       endLocation[routeNum].latlng = legs[i].end_location; 
       endLocation[routeNum].address = legs[i].end_address; 
       var steps = legs[i].steps; 

       for (j=0;j<steps.length;j++) { 
       var nextSegment = steps[j].path;     
       var nextSegment = steps[j].path; 

       for (k=0;k<nextSegment.length;k++) { 
        polyline[routeNum].getPath().push(nextSegment[k]); 
        //bounds.extend(nextSegment[k]); 
       } 

       } 
      } 

     }  

     polyline[routeNum].setMap(map); 
     //map.fitBounds(bounds); 
     startAnimation(routeNum); 

    } // else alert("Directions request failed: "+status); 

    } 

} 

    var lastVertex = 1; 
    var stepnum=0; 
    var step = 50; // 5; // metres 
    var tick = 100; // milliseconds 
    var eol= []; 
//----------------------------------------------------------------------     
function updatePoly(i,d) { 
// Spawn a new polyline every 20 vertices, because updating a 100-vertex poly is too slow 
    if (poly2[i].getPath().getLength() > 20) { 
      poly2[i]=new google.maps.Polyline([polyline[i].getPath().getAt(lastVertex-1)]); 
      // map.addOverlay(poly2) 
     } 

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

function animate(index,d) { 
    if (d>eol[index]) { 

     marker[index].setPosition(endLocation[index].latlng); 
     return; 
    } 
    var p = polyline[index].GetPointAtDistance(d); 

    //map.panTo(p); 
    marker[index].setPosition(p); 
    updatePoly(index,d); 
    timerHandle[index] = setTimeout("animate("+index+","+(d+step)+")", tick); 
} 

//------------------------------------------------------------------------- 

function startAnimation(index) { 
     if (timerHandle[index]) clearTimeout(timerHandle[index]); 
     eol[index]=polyline[index].Distance(); 
     map.setCenter(polyline[index].getPath().getAt(0)); 

     poly2[index] = new google.maps.Polyline({path: [polyline[index].getPath().getAt(0)], strokeColor:"#FFFF00", strokeWeight:3}); 

     timerHandle[index] = setTimeout("animate("+index+",50)",2000); // Allow time for the initial map display 
} 

//----------------------------------------------------------------------------  



</script> 
</head> 
<body onload="initialize()"> 

<div id="tools"> 

    <button onclick="setRoutes();">Start</button> 

</div> 

<div id="map_canvas" style="width:100%;height:100%;"></div> 

</body> 
</html> 
+1

오류가 꽤 분명하다'makeRouteCallback은 defined'되지 않습니다. 당신이 그것이 사용 된 범위에 있음을 확신합니까? 게시물에서 코드를 깨뜨린 방식으로 말하기는 어렵습니다. 문제가있는 jsfiddle이 있습니까? – geocodezip

+0

ok makeRouteCallback은 SetRoutes() 내의 콜백 함수입니다. 내 코드를 수정하지만 마커가 폴리 라인의 끝에 도달하면 폴리 라인을 확장하는 데 관심이 있습니다. 그것에 대해 조언 해 주실 수 있습니까? 감사합니다 – devdar

+0

@geocodezip 나는 질문을 업데이 트하고 유사한 코드의 jsbin 데모를 포함 시켰습니다. 나는 또한 내가 테스트 코드에서 달성하고 싶은 것에 대한 설명을 포함시켰다. – devdar

답변

1

당신이하고 다음과 같은 것을 수행 할 수 있어야한다 :

첫째, setRoutes()에, 폴리 라인을 억제 길 렌더러 (이미 자신을 그리는) 전화 :

var rendererOptions = { 
      map: map, 
      suppressMarkers : true, 
      suppressPolylines : true, 
      preserveViewport: true 
     } 

animate()에서 모든 마커와 폴리선을 hid로 설정합니다.

if (d>eol[index]) { 
     marker[index].setVisible(false); 
     polyline[index].setVisible(false); 
     poly2[index].setVisible(false); 
     marker[index].setPosition(endLocation[index].latlng); 
     return; 
     } 

여기에 수정 된 예를 찾기 : 경로가 위에있을 때 덴 JSBIN

+0

대단한 답변 감사합니다. – devdar

+0

모든 마커가 나타날 때까지 기다려야 만 접근 할 수있는 방법을 보여줄 수 있습니까? 완전한 애니메이션. 'if (completed == startLoc.length) {}'는 모든 마커의 이동이 완료되었음을 나타냅니다. 나는 이것을 시도하고있다. 루프를 만들고 설정 마커와 polyline.setVisible (false)을 반복하고 루프 외부에 return 문을 배치했습니다. 그러나 마커 만 폴리 라인을 유지합니다. – devdar

+0

나는 내 실수를 보았다. 다시 한 번 오타 고마워했다. – devdar