2009-03-20 89 views
16

Tôi đã viết một ứng dụng nhỏ cho thiết bị cầm tay sử dụng JavaScript và API Google Maps, bây giờ II cần di chuyển biểu tượng điểm đánh dấu của tôi ở bất kỳ đâu trên bản đồ dọc theo tuyến đường bằng chức năng hẹn giờ. Tôi có một biểu tượng người đàn ông và tôi cần phải di chuyển nó tự động trên bản đồ. Tôi có thể làm cái này như thế nào?Làm cách nào để tạo hiệu ứng đánh dấu Google Maps tùy chỉnh dọc theo tuyến đường?

+0

Tôi chỉnh sửa các tiêu đề để phản ánh các nội dung của câu hỏi. @ jyothi: khi đăng câu hỏi, hãy dành thời gian của bạn để xem lại nội dung của nó. Chỉ với 2 phút đánh giá bổ sung, bạn có thể nâng cao chất lượng lên 100%, với kỳ vọng có nhiều câu trả lời tốt hơn và tốt hơn. –

+0

k sir thank u, u có thể trả lời câu hỏi của tôi –

+0

@ jyothi bạn đã nhận được một giải pháp này tôi cần phải làm điều này cùng một chính xác trên một ứng dụng bản đồ. Bạn có thể làm sáng tỏ nếu bạn đạt được nó như thế nào nó đã đạt được. – devdar

Trả lời

0

Nó không di chuyển một cái gì đó tự động, nhưng bạn nên kiểm tra các thí nghiệm Google Drive bằng phatfusion. Nhìn vào mã có thể giúp bạn.

8

Thật không may, không có chức năng chuyển động tự động đánh dấu trong bộ sưu tập chính thức của GMaps.

Tuy nhiên, nếu bạn có GRoute, điều đó có nghĩa là bạn có một tập hợp các điểm. Để lặp qua các bước lộ trình, bạn có thể sử dụng một cái gì đó như thế này:

for (var c = 0; c < yourroute.getNumSteps(); c++) { 
    yourmarker.setLatLng(yourroute.getStep(c).getLatLng()); 
} 

Tất nhiên, có thể bạn sẽ muốn làm điều này không đồng bộ bằng cách sử dụng tính giờ:

function moveToStep(yourmarker,yourroute,c) { 
    if {yourroute.getNumSteps() > c) { 
     yourmarker.setLatLng(yourroute.getStep(c).getLatLng()); 
     window.setTimeout(function(){ 
      moveToStep(yourmarker,yourroute,c+1); 
     },500); 
    } 
} 

moveToStep(marker,route,0); 

Đối với phong trào thậm chí mượt mà, bạn có thể nội suy các điểm từ những điểm bạn đã có.

+0

Chức năng này có sẵn trong Google Maps V3 không?Mảng "bước" được trả về bởi DirectionsService chỉ dường như bao gồm các bước của chỉ đường (tức là rẽ trái tại như vậy) thay vì các điểm riêng lẻ tạo nên đường kết xuất. – Kevin

+0

@Puskvor có thể tiếp tục tăng một tọa độ dài để mô phỏng tuyến đường, tuyến đường không phải chỉ trên đường phố. – devdar

+1

@dev_darin: Có. Không phải tất cả các tuyến đường đều là đường thẳng; ở giữa các điểm tuyến khác nhau, cách tiếp cận của bạn tất nhiên là khả thi. – Piskvor

16

Một ví dụ khá thú vị là ở đây:

http://www.kmcgraphics.com/google/

+0

Trang đó sử dụng phiên bản cũ hơn của thư viện tại http://econym.org.uk/gmap/epoly.htm chứa một số chức năng tiện ích hữu ích mà bạn có thể sử dụng để tìm vị trí dài của một vị trí dọc theo một con đường. Nên làm cho nó dễ dàng hơn nhiều để xây dựng một dấu hiệu hoạt hình. –

+0

Tôi đã sử dụng một kỹ thuật tương tự trên trang web mà tôi đã sửa vào năm ngoái. các phương thức có thể hơi lỗi thời với các API mới nhất nhưng nó hoạt động tốt. http://www.flushtracker.com/ – Matt

1

Hy vọng điều này sẽ giúp bạn ở đây là một nút và khi bạn bấm vào chúng marker di chuyển từ nguồn đến đường đích. phương thức setRoutes được sử dụng để đặt tuyến đường đánh dấu.

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])); 

    } 

Tạo lộ trình sau khi đặt.

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); 

    } 

} 

Cuối cùng chúng ta gọi là bắt đầu chức năng hoạt hình

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 
} 

Bạn có thể tìm thấy mã đầy đủ trên GeekOnJava blog và sao chép mã đó và chạy chúng và đầu ra trên youtube.

+0

Tôi muốn tạo điểm đánh dấu tại điểm giữa trong hơn 2 giây và bắt đầu lại, tôi đã cố gắng làm cho giấc ngủ trong chức năng updatepoly nhưng nó không dừng lại? Bạn có thể giúp tôi ở đây không – Raghu

1

Đây là giải pháp của tôi hoạt động với API v3. Điều này làm động các điểm đánh dấu không với một vận tốc cố định, nhưng dựa trên thời gian tuyến tính được tính toán. Có một yếu tố tốc độ, vì vậy ví dụ bạn có thể lái xe thông qua các tuyến đường 10x nhanh hơn trong thực tế.

Tôi đã cố gắng làm điều đó đơn giản nhất có thể. Hãy sử dụng nó.

var autoDriveSteps = new Array(); 
var speedFactor = 10; // 10x faster animated drive 

function setAnimatedRoute(origin, destination, map) { 
    // init routing services 
    var directionsService = new google.maps.DirectionsService; 
    var directionsRenderer = new google.maps.DirectionsRenderer({ 
     map: map 
    }); 

    //calculate route 
    directionsService.route({ 
      origin: origin, 
      destination: destination, 
      travelMode: google.maps.TravelMode.DRIVING 
     }, 
     function(response, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       // display the route 
       directionsRenderer.setDirections(response); 

       // calculate positions for the animation steps 
       // the result is an array of LatLng, stored in autoDriveSteps 
       autoDriveSteps = new Array(); 
       var remainingSeconds = 0; 
       var leg = response.routes[0].legs[0]; // supporting single route, single legs currently 
       leg.steps.forEach(function(step) { 
        var stepSeconds = step.duration.value; 
        var nextStopSeconds = speedFactor - remainingSeconds; 
        while (nextStopSeconds <= stepSeconds) { 
         var nextStopLatLng = getPointBetween(step.start_location, step.end_location, nextStopSeconds/stepSeconds); 
         autoDriveSteps.push(nextStopLatLng); 
         nextStopSeconds += speedFactor; 
        } 
        remainingSeconds = stepSeconds + speedFactor - nextStopSeconds; 
       }); 
       if (remainingSeconds > 0) { 
        autoDriveSteps.push(leg.end_location); 
       } 
      } else { 
       window.alert('Directions request failed due to ' + status); 
      } 
     }); 
} 

// helper method to calculate a point between A and B at some ratio 
function getPointBetween(a, b, ratio) { 
    return new google.maps.LatLng(a.lat() + (b.lat() - a.lat()) * ratio, a.lng() + (b.lng() - a.lng()) * ratio); 
} 

// start the route simulation 
function startRouteAnimation(marker) { 
    var autoDriveTimer = setInterval(function() { 
      // stop the timer if the route is finished 
      if (autoDriveSteps.length === 0) { 
       clearInterval(autoDriveTimer); 
      } else { 
       // move marker to the next position (always the first in the array) 
       marker.setPosition(autoDriveSteps[0]); 
       // remove the processed position 
       autoDriveSteps.shift(); 
      } 
     }, 
     1000); 
} 

Cách sử dụng:

setAnimatedRoute("source address or LatLng ...", "destination address or LatLng ...", map); 
// start simulation on button click... 
$("#simulateRouteButton").click(function() { 
    startRouteAnimation(agentMarker); 
}); 
Các vấn đề liên quan