我已经使用JavaScript和Google Maps API为手持设备编写了一个小应用程序,现在我需要使用计时器功能将我的标记图标沿着路径移动到地图上的任何位置.我有一个男人图标,我需要在地图上自动移动它.我怎样才能做到这一点?
这里有一个非常酷的例子:
http://www.kmcgraphics.com/google/
不幸的是,官方GMaps系列中没有自动标记移动功能.
但是,如果你有一个GRoute,那就意味着你有一组积分.要遍历路径步骤,您可以使用以下内容:
for (var c = 0; c < yourroute.getNumSteps(); c++) { yourmarker.setLatLng(yourroute.getStep(c).getLatLng()); }
当然,您可能希望使用计时器异步执行此操作:
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);
为了更平滑的移动,您可以插入已有的点.
这是我的解决方案,适用于v3 API.这使得标记不是以固定速度动画,而是基于计算的路线持续时间.有一个速度因素,所以例如你可以比实际速度快10倍.
我试图尽可能简单地做到这一点.随意使用它.
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); }
用法:
setAnimatedRoute("source address or LatLng ...", "destination address or LatLng ...", map); // start simulation on button click... $("#simulateRouteButton").click(function() { startRouteAnimation(agentMarker); });