Google Maps-动画多线 - 停止 /删除动画



我正在从GPX文件上绘制Google Maps API V3上的polyline。

在鼠标上,我有一个动画点,沿着多线线移动,使用function animateroute((;

目前,我没有一种方法可以删除鼠标out上的动画点,因此,如果您的鼠标,鼠标out,鼠标或鼠标等,您最终会沿着同一条线移动多个动画点。p>代码片段:(也请参见下面的完整工作URL(

var gmarkers = [];
function loadGPXFileIntoGoogleMap(map, filename,recordNum, name, hex_code) {
$.ajax({
    type: "GET",
    url: filename,
    dataType: "xml",
    success: function(xml) {
    var points = [];
    var bounds = new google.maps.LatLngBounds ();
    $(xml).find("trkpt").each(function() {
        var lat = $(this).attr("lat");
        var lon = $(this).attr("lon");
    if((lat != 0) && (lon != 0))
    {
        var p = new google.maps.LatLng(lat, lon);
        points.push(p);
        bounds.extend(p);
    }

    });
    var strokeColor =  "#ff0000";
    var poly = new google.maps.Polyline({
        path: points,
        strokeColor: strokeColor,
        strokeOpacity: 1,
        strokeWeight: 4,
        recordNum: recordNum,
    });
    poly.setMap(map);
    google.maps.event.addListener(poly, 'mouseover', function() {
        var start = {
            path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0",
            fillColor: '#00ff00',
            fillOpacity: 1,
            strokeColor:'#000000',
            strokeWeight: 4,
            scale: 0.5
        }
        var end = {
            path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0",
            fillColor: '#FF0000',
            fillOpacity: 1,
            strokeColor:'#000000',
            strokeWeight: 4,
            scale: 0.5
        }
        var markerStart = new google.maps.Marker({
            position: poly.getPath().getAt(0),
            icon: start,
            map: map,
            zIndex: 200,
            scale: 1
        });
        gmarkers.push(markerStart);
        var markerEnd = new google.maps.Marker({
            position: poly.getPath().getAt(poly.getPath().getLength() - 1),
            icon: end,
            map: map,
            zIndex: 200,
            scale: 1
        });
        gmarkers.push(markerEnd);
        var icons =  this.setOptions({
        icons: [{
            icon: {
                path: google.maps.SymbolPath.CIRCLE,
                strokeOpacity: 1,
                strokeColor: "#000000",
                strokeWeight: 2,
                scale: 4
            },
        }]});
        animateRoute(poly);

    });
    function animateRoute(line) {
    var count = 0;
        window.setInterval(function() {
            count = (count + 1) % 200;
            var icons = poly.get('icons');
            icons[0].offset = (count / 2) + '%';
            poly.set('icons', icons);
        }, 60);
    }


    google.maps.event.addListener(poly, 'mouseout', function() {
        removeMarkers();
    });
    // fit bounds to track
    map.fitBounds(bounds);
    }
});
}
function removeMarkers(){
for(i=0; i<gmarkers.length; i++){
    gmarkers[i].setMap(null);
}
}
$(document).ready(function() {
var mapOptions = {
        zoom: 17,
        mapTypeId: google.maps.MapTypeId.TERRAIN
    };
    var map = new google.maps.Map(document.getElementById("map"),
            mapOptions);
    loadGPXFileIntoGoogleMap(map, "cmsAdmin/uploads/blue_and_green_not_comfortable_.gpx","724","Example A","FFFF00");
    loadGPXFileIntoGoogleMap(map, "cmsAdmin/uploads/taraweratrailrouterecce.gpx","431","Example B","4F4CBE");
});

完整的工作示例:https://www.wildthings.club/mapstack.php

悬停在蓝线上,您会看到动画点。鼠标关闭,然后又悬停了几秒钟后 - 将出现第二个点,并且第一个点仍在进行。重复,您很快就会有一堆抖动的点。

理想情况下,我想删除Mouseout上的所有动画点。

第二个选项是,如果该多线线上已经有一个,请不要添加随后的动画点图标(请注意,地图上有多个polyline(。

第三个选项失败的是将动画dot停止并在达到末端(位置标记(后删除,因此至少它不会循环。

我尝试将图标放入数组中,然后从那里删除(就像我对Gmarkers Array和emoveMarkers((一样,但没有运气。

我还玩过动画的Google Maps polyline播放,但这仅适用于直线点,而不是从GPX文件中遵循一系列点。

任何帮助,最感谢欢呼

您应该使用window.clearInterval()函数来删除您使用的间隔来对多线线上的图标进行动画。在animateRoute()中调用window.setInterval()时,应保存id。这是简单的JSBIN概念证明,该证明是根据该网站上的代码改编的。在我的代码中,我只是简单地使用全局id变量,然后在animateRoute()中更新该变量:

<!DOCTYPE html>
<html>
  <head>
    <title>Polyline path</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <style>
    html, body, #map {
      height: 100%;
      width: 100%;
    }
</style>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY" type="text/javascript"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
    var map;
    var id;
    var gmarkers = [];
    var gmarkersicons = [];
    function initMap() {
      var mapOptions = {
            zoom: 3,
            mapTypeId: google.maps.MapTypeId.TERRAIN,
            center: {lat: 9.291, lng: -157.821}
        };
      map = new google.maps.Map(document.getElementById("map"),
                mapOptions);
       var points = [
         {lat: 37.772, lng: -122.214},
         {lat: 21.291, lng: -157.821},
         {lat: -18.142, lng: 178.431},
         {lat: -27.467, lng: 153.027}
       ];
     var poly = new google.maps.Polyline({
            path: points,
            strokeColor: "red",
            strokeOpacity: 1,
            strokeWeight: 4,
            recordNum: "test"
        });
        poly.setMap(map);
        google.maps.event.addListener(poly, 'mouseover', function() {
            var start = {
                path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0",
                fillColor: '#00ff00',
                fillOpacity: 1,
                strokeColor:'#000000',
                strokeWeight: 4,
                scale: 0.5
            }
            var end = {
                path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0",
                fillColor: '#FF0000',
                fillOpacity: 1,
                strokeColor:'#000000',
                strokeWeight: 4,
                scale: 0.5
            }
            var go = {
                path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0",
                fillColor: '#000000',
                fillOpacity: 1,
                strokeColor:'#fff',
                strokeWeight: 4,
                scale: 0.5
            }
            var markerStart = new google.maps.Marker({
                position: poly.getPath().getAt(0),
                icon: start,
                map: map,
                zIndex: 200,
                scale: 1
            });
            gmarkers.push(markerStart);
            var markerEnd = new google.maps.Marker({
                position: poly.getPath().getAt(poly.getPath().getLength() - 1),
                icon: end,
                map: map,
                zIndex: 200,
                scale: 1
            });
            gmarkers.push(markerEnd);
            var icons =  this.setOptions({
            icons: [{
                icon: {
                    path: google.maps.SymbolPath.CIRCLE,
                    strokeOpacity: 1,
                    strokeColor: "#000000",
                    strokeWeight: 2,
                    scale: 4
                },
            }]});
            this.setOptions({
                strokeColor: "red",
                scale: 1,
                strokeWeight:15,
                strokeOpacity:.6
                });
            var contentString = "Testing";
            var infowindow = new google.maps.InfoWindow({
                    content: contentString
                });
            infowindow.open(map, markerStart);
            id = animateRoute(poly);
        });
        function animateRoute(line) {
          var count = 0;
          var id = window.setInterval(function() {
            count = (count + 1) % 200;
            var icons = poly.get('icons');
            icons[0].offset = (count / 2) + '%';
            poly.set('icons', icons);
          }, 60);
          return id;
        }
        google.maps.event.addListener(poly, 'mouseout', function() {
            removeMarkers();
            this.setOptions({strokeColor:"red",strokeWeight:4,strokeOpacity:1});
            this.setOptions( { suppressMarkers: true } );
            this.setOptions({
            icons: [{}]});
            window.clearInterval(id);
        });

     function removeMarkers(){
       for(i=0; i<gmarkers.length; i++){
         gmarkers[i].setMap(null);
       }
     }
 }
$(document).ready(function() {
initMap();
});
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
</html>

最新更新