2011-05-05 72 views
18

使用Google Maps API v3,我可以通过AJAX调用更新标记的多个位置。但是,它没有任何转换。下面的代码:将Google地图标记扩展为更新流畅动画?

if (!latlong.equals(point.latlong)) { 
    point.latlong = latlong; 
    point.marker.setPosition(latlong); 
} 

的缺点是没有本土动画的方法。有没有人知道任何扩展的方法,以便标记可以流畅地“从旧”移动到新的位置?或者有什么方法可用?我一直无法找到任何文件。谢谢!

回答

39

我没有找到任何本地方式来创建此动画。您可以使用setPosition将位置从当前点移动到最终点来创建自己的动画。下面是一个代码片段,给你一个想法:

var map = undefined; 
var marker = undefined; 
var position = [43, -89]; 

function initialize() { 

    var latlng = new google.maps.LatLng(position[0], position[1]); 
    var myOptions = { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    marker = new google.maps.Marker({ 
     position: latlng, 
     map: map, 
     title: "Your current location!" 
    }); 

    google.maps.event.addListener(map, 'click', function(me) { 
     var result = [me.latLng.lat(), me.latLng.lng()]; 
     transition(result); 
    }); 
} 

var numDeltas = 100; 
var delay = 10; //milliseconds 
var i = 0; 
var deltaLat; 
var deltaLng; 
function transition(result){ 
    i = 0; 
    deltaLat = (result[0] - position[0])/numDeltas; 
    deltaLng = (result[1] - position[1])/numDeltas; 
    moveMarker(); 
} 

function moveMarker(){ 
    position[0] += deltaLat; 
    position[1] += deltaLng; 
    var latlng = new google.maps.LatLng(position[0], position[1]); 
    marker.setPosition(latlng); 
    if(i!=numDeltas){ 
     i++; 
     setTimeout(moveMarker, delay); 
    } 
} 

这或许可以被清理了一下,但会给你一个良好的开端。我正在使用JavaScript的setTimeout方法来创建动画。初始调用“过渡”会启动动画。 'transition'的参数是一个双元素数组[lat,lng]。 'transition'函数根据几个动画参数(numDeltas,delay)计算lat和lng的步长。然后它会调用'moveMarker'。函数'moveMarker'保持一个简单的计数器来指示标记何时到达最终目的地。如果不存在,它会再次自我调用。

下面是代码工作的的jsfiddle:http://jsfiddle.net/rcravens/RFHKd/13/

希望这有助于。

鲍勃

+2

很好的解决方案!我修改了你的代码,以便能够以公里/小时的速度添加特定的速度:http://jsfiddle.net/pmrotule/9tfq5sqc/8/ – pmrotule 2015-06-17 01:27:03

+0

@pmrotule伟大的。我试图修改以在标记上显示动态标签。但可能是因为它不断地改变标记,它没有显示。任何想法我可以继续? – 2018-01-23 11:26:48

+0

@ User-8017771不是,我将不得不看你的代码。我想它会在你改变位置时隐藏标签。要完全控制你的标记的外观,你可以使用类似这样的东西https://github.com/aaronmiler/beer-map/blob/master/app/assets/javascripts/custom_marker.js – pmrotule 2018-01-23 11:39:14