在地图上显示移动标记

当车辆在路上行驶时,我试图在地图上移动标记( 不会消失并再次出现 )。

我有两个latLng值,我想在两者之间移动标记,直到车辆发送下一个点。 然后再次重复该过程。

我尝试了什么:[这不是一种非常有效的方式,我知道]

我的想法是使用下面的技术实现上述方法:

1)在两者之间划一条线。

2)在折线的1/10分数上获取每个点的latLng。

3)在地图上标记10个点以及折线。

这是我的代码:

var isOpen = false; var deviceID; var accountID; var displayNameOfVehicle; var maps = {}; var lt_markers = {}; var lt_polyLine = {}; function drawMap(jsonData, mapObj, device, deleteMarker) { var oldposition = null; var oldimage = null; var arrayOflatLng = []; var lat = jsonData[0].latitude; var lng = jsonData[0].longitude; //alert(jsonData[0].imagePath); var myLatLng = new google.maps.LatLng(lat, lng); if (deleteMarker == true) { if (lt_markers["marker" + device] != null) { oldimage = lt_markers["marker" + device].getIcon().url; oldposition = lt_markers["marker" + device].getPosition(); lt_markers["marker" + device].setMap(null); lt_markers["marker" + device] = null; } else { console.log('marker is null'); oldimage = new google.maps.MarkerImage(jsonData[0].imagePath, null, null, new google.maps.Point(5, 17), //(15,27), new google.maps.Size(30, 30)); oldposition = myLatLng; } } var image = new google.maps.MarkerImage(jsonData[0].imagePath, null, null, new google.maps.Point(5, 17), //(15,27), new google.maps.Size(30, 30)); lt_markers["marker" + device] = new google.maps.Marker({ position: myLatLng, icon: image, title: jsonData[0].address }); if (oldposition == myLatLng) { alert('it is same'); lt_markers["marker" + device].setMap(mapObj); mapObj.panTo(myLatLng); } else { alert('it is not same'); var markMarker = null; var i = 10; for (i = 10; i  128) { if (pointTo.x > pointFrom.x) pointTo.x -= 256; else pointTo.x += 256; } // Calculate point between var x = pointFrom.x + (pointTo.x - pointFrom.x) * fraction; var y = pointFrom.y + (pointTo.y - pointFrom.y) * fraction; var pointBetween = new google.maps.Point(x, y); // Project back to lat/lng var latLngBetween = projection.fromPointToLatLng(pointBetween); return latLngBetween; } 

面临的问题:

1)标记没有显示在地图上,因为绘图和删除标记的过程非常快,以至于标记在屏幕上不可见。 我尝试过setTimeOut,它根本没用。

2)如果我让浏览器运行此代码超过5分钟,浏览器崩溃。

注意:使用setInterval每10秒调用Above函数。

什么是更好的解决方案? 请帮忙..

要使标记移动相对平稳,您需要

  • 更新多于折线的1/10分数(至少每几个像素)
  • 更频繁地调用更新方法
  • 不要删除并重新添加标记

例如,类似于:

 var counter = 0; interval = window.setInterval(function() { counter++; // just pretend you were doing a real calculation of // new position along the complex path var pos = new google.maps.LatLng(35, -110 + counter / 100); marker.setPosition(pos); if (counter >= 1000) { window.clearInterval(interval); } }, 10); 

我在http://jsfiddle.net/bmSbU/2/做了一个简单的例子,它显示了一条沿直线路径移动的标记。 如果这是您想要的,那么您上面的大部分代码都可以重复使用(或查看http://broady.github.io/maps-examples/points-along-line/along-directions。 HTML )

您可以使用marker-animate-unobtrusive库使标记从一个位置平滑过渡到另一个位置(而不是重新出现)。

您可以像这样初始化您的标记:

 var marker = new SlidingMarker({ //your original marker options }); 

每次新车辆的坐标到达时,只需调用marker.setPosition()。

PS我是图书馆的作者。

为什么不保留现有的Marker / MarkerImage并调用setPosition()来移动它,无论是在计时器上还是在位置发生变化时?

删除它并重新创建它是导致它闪烁/闪烁并最终崩溃的原因。 如果你保持相同的实例但只是移动它,你应该做得更好。

请参阅:Marker.setPosition()

https://developers.google.com/maps/documentation/javascript/reference#Marker

使用javascript在Google地图上制作动画移动标记,可在Youtube.com上查看

尝试使用此链接..首先在您拥有的2个位置添加两个标记。 然后,您可以使用链接中的代码在2个点之间创建动画