谷歌地图道路 api 循环 - 如何停止

Posted

技术标签:

【中文标题】谷歌地图道路 api 循环 - 如何停止【英文标题】:google maps roads api looping - how to stop 【发布时间】:2018-12-26 21:13:24 【问题描述】:

我已经实现了在以下位置看到的代码:

https://developers.google.com/maps/documentation/roads/inspector。

在本页的每个示例中,标记动画都会循环播放。

您应该如何停止循环,以便图标保持在终点,直到向其提供更多坐标,此时我将从最后一个 gps 坐标动画到我刚刚收到的最新 gps 坐标?

我只是不想看到课程一遍又一遍。

【问题讨论】:

【参考方案1】:

要停止动画,请在图标到达折线末端时取消 setInterval。

function animateCircle(polyline) 
  var count = 0;
  // fallback icon if the poly has no icon to animate
  var defaultIcon = [
    
      icon: lineSymbol,
      offset: '100%'
    
  ];
  handle = window.setInterval(function() 
    if ((count+1) == 200)
       window.clearInterval(handle);
    count = (count + 1) % 200;
    var icons = polyline.get('icons') || defaultIcon;
    icons[0].offset = (count / 2) + '%';
    polyline.set('icons', icons);
  , 20);

proof of concept fiddle

代码 sn-p:

/**
 * Animate an icon along a polyline
 * @param Object polyline The line to animate the icon along
 */
function animateCircle(polyline) 
  var count = 0;
  // fallback icon if the poly has no icon to animate
  var defaultIcon = [
    icon: lineSymbol,
    offset: '100%'
  ];
  handle = window.setInterval(function() 
    // when reaches end of polyline
    if ((count + 1) == 200) 
      // cancel the interval timer
      window.clearInterval(handle);
      // hide the circle
      var icons = polyline.get('icons') || defaultIcon;
      icons[0].icon.strokeOpacity = 0;
      polyline.set('icons', icons);
    

    count = (count + 1) % 200;
    var icons = polyline.get('icons') || defaultIcon;
    icons[0].offset = (count / 2) + '%';
    polyline.set('icons', icons);
  , 20);



// Icons for markers
var RED_MARKER = 'https://maps.google.com/mapfiles/ms/icons/red-dot.png';
var GREEN_MARKER = 'https://maps.google.com/mapfiles/ms/icons/green-dot.png';
var BLUE_MARKER = 'https://maps.google.com/mapfiles/ms/icons/blue-dot.png';
var YELLOW_MARKER = 'https://maps.google.com/mapfiles/ms/icons/yellow-dot.png';

// URL for places requests
var PLACES_URL = 'https://maps.googleapis.com/maps/api/place/details/json?placeid=';

// URL for Speed limits
var SPEED_LIMIT_URL = 'https://roads.googleapis.com/v1/speedLimits';

var coords;

/**
 * Current Roads API threshold (subject to change without notice)
 * @const number
 */
var DISTANCE_THRESHOLD_HIGH = 300;
var DISTANCE_THRESHOLD_LOW = 200;

/**
 * @type Array<ExtendedLatLng>
 */
var originals = []; // the original input points, a list of ExtendedLatLng

var interpolate = true;
var map;
var placesService;
var originalCoordsLength;

// Settingup Arrays
var infoWindows = [];
var markers = [];
var placeIds = [];
var polylines = [];
var snappedCoordinates = [];
var distPolylines = [];

// Symbol that gets animated along the polyline
var lineSymbol = 
  path: google.maps.SymbolPath.CIRCLE,
  scale: 8,
  strokeColor: '#005db5',
  strokeWidth: '#005db5'
;

// Initialize
function initialize() 
  // Centre the map on Sydney
  var mapOptions = 
    center: 
      'lat': -33.870315,
      'lng': 151.196532
    ,
    zoom: 16
  ;

  // Map object
  map = new google.maps.Map(document.getElementById('map'), mapOptions);

  // Places object
  placesService = new google.maps.places.PlacesService(map);

  drawSnappedPolyline();

  // Draw the polyline for the snapToRoads API response
  // Call functions to add markers and infowindows for each snapped
  // point along the polyline.
  function drawSnappedPolyline(snappedCoords) 
    var snappedCoords = [
        lat: -33.87031296432842,
        lng: 151.19649532278828,
        originalIndex: 0,
        interpolated: false
      ,
      
        lat: -33.8702971,
        lng: 151.1964966,
        interpolated: true
      ,
      
        lat: -33.8702971,
        lng: 151.1964966,
        interpolated: true
      ,
      
        lat: -33.8700888,
        lng: 151.19690029999998,
        interpolated: true
      ,
      
        lat: -33.8700888,
        lng: 151.19690029999998,
        interpolated: true
      ,
      
        lat: -33.869997,
        lng: 151.197091,
        interpolated: true
      ,
      
        lat: -33.8699822,
        lng: 151.1971317,
        interpolated: true
      ,
      
        lat: -33.8699669,
        lng: 151.1971912,
        interpolated: true
      ,
      
        lat: -33.8699669,
        lng: 151.1971912,
        interpolated: true
      ,
      
        lat: -33.869954,
        lng: 151.1972377,
        interpolated: true
      ,
      
        lat: -33.8699449,
        lng: 151.1972855,
        interpolated: true
      ,
      
        lat: -33.86994270100937,
        lng: 151.197353292079,
        originalIndex: 1,
        interpolated: false
      ,
      
        lat: -33.8699414,
        lng: 151.19739339999998,
        interpolated: true
      ,
      
        lat: -33.8699441,
        lng: 151.1974702,
        interpolated: true
      ,
      
        lat: -33.8699507,
        lng: 151.19755139999998,
        interpolated: true
      ,
      
        lat: -33.8699602,
        lng: 151.1976302,
        interpolated: true
      ,
      
        lat: -33.86997848255702,
        lng: 151.19772949764274,
        originalIndex: 2,
        interpolated: false
      ,
      
        lat: -33.869981300000006,
        lng: 151.19774479999998,
        interpolated: true
      ,
      
        lat: -33.8700129,
        lng: 151.1978469,
        interpolated: true
      ,
      
        lat: -33.8700129,
        lng: 151.1978469,
        interpolated: true
      ,
      
        lat: -33.8700458,
        lng: 151.1979242,
        interpolated: true
      ,
      
        lat: -33.8700834,
        lng: 151.1979993,
        interpolated: true
      ,
      
        lat: -33.8701059,
        lng: 151.1980374,
        interpolated: true
      ,
      
        lat: -33.870184300000005,
        lng: 151.1981381,
        interpolated: true
      ,
      
        lat: -33.8702143,
        lng: 151.1981743,
        interpolated: true
      ,
      
        lat: -33.8702143,
        lng: 151.1981743,
        interpolated: true
      ,
      
        lat: -33.8702902,
        lng: 151.19825269999998,
        interpolated: true
      ,
      
        lat: -33.87031617902999,
        lng: 151.19827540632983,
        originalIndex: 3,
        interpolated: false
      ,
      
        lat: -33.8703672,
        lng: 151.19832,
        interpolated: true
      ,
      
        lat: -33.870480199999996,
        lng: 151.19839969999998,
        interpolated: true
      ,
      
        lat: -33.870480199999996,
        lng: 151.19839969999998,
        interpolated: true
      ,
      
        lat: -33.8705388,
        lng: 151.1984269,
        interpolated: true
      ,
      
        lat: -33.87057888561142,
        lng: 151.19844125817298,
        originalIndex: 4,
        interpolated: false
      ,
      
        lat: -33.870625219935086,
        lng: 151.19845785457534,
        originalIndex: 5,
        interpolated: false
      ,
      
        lat: -33.8706823,
        lng: 151.1984783,
        interpolated: true
      ,
      
        lat: -33.8706823,
        lng: 151.1984783,
        interpolated: true
      ,
      
        lat: -33.870718800000006,
        lng: 151.1984865,
        interpolated: true
      ,
      
        lat: -33.8708181,
        lng: 151.19850399999999,
        interpolated: true
      ,
      
        lat: -33.8708644,
        lng: 151.1985081,
        interpolated: true
      ,
      
        lat: -33.870908899999996,
        lng: 151.1985078,
        interpolated: true
      ,
      
        lat: -33.87095031058638,
        lng: 151.19850565885983,
        originalIndex: 7,
        interpolated: false
      ,
      
        lat: -33.8709998,
        lng: 151.19850309999998,
        interpolated: true
      ,
      
        lat: -33.87103822739919,
        lng: 151.1984996185936,
        originalIndex: 8,
        interpolated: false
      ,
      
        lat: -33.8713497,
        lng: 151.1984714,
        interpolated: true
      ,
      
        lat: -33.8713497,
        lng: 151.1984714,
        interpolated: true
      ,
      
        lat: -33.8718054,
        lng: 151.1984326,
        interpolated: true
      ,
      
        lat: -33.8719381,
        lng: 151.1984352,
        interpolated: true
      ,
      
        lat: -33.87203169684805,
        lng: 151.198429447748,
        originalIndex: 9,
        interpolated: false
      
    ];
    var snappedPolyline = new google.maps.Polyline(
      path: snappedCoords,
      strokeColor: '#005db5',
      strokeWeight: 6,
      icons: [
        icon: lineSymbol,
        offset: '100%'
      ]
    );

    snappedPolyline.setMap(map);
    animateCircle(snappedPolyline);

    polylines.push(snappedPolyline);

    var placeIds = [
      "ChIJS6cYMjeuEmsRVxRklOwdF8o",
      "ChIJS6cYMjeuEmsRVxRklOwdF8o",
      "ChIJ-dDXMDeuEmsRSUxWOfxOpYA",
      "ChIJ-dDXMDeuEmsRSUxWOfxOpYA",
      "ChIJKVpuODeuEmsRjffu1J1v888",
      "ChIJKVpuODeuEmsRjffu1J1v888",
      "ChIJKVpuODeuEmsRjffu1J1v888",
      "ChIJKVpuODeuEmsRjffu1J1v888",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJR6yfRDeuEmsRhllVwX6TMJ8",
      "ChIJrV1uWzeuEmsR2N5RA6d2SEE",
      "ChIJrV1uWzeuEmsR2N5RA6d2SEE",
      "ChIJrV1uWzeuEmsR2N5RA6d2SEE",
      "ChIJrV1uWzeuEmsR2N5RA6d2SEE",
      "ChIJrV1uWzeuEmsR2N5RA6d2SEE",
      "ChIJrV1uWzeuEmsR2N5RA6d2SEE",
      "ChIJeUaSWTeuEmsRGB2FlgUyPzE",
      "ChIJeUaSWTeuEmsRGB2FlgUyPzE",
      "ChIJeUaSWTeuEmsRGB2FlgUyPzE",
      "ChIJeUaSWTeuEmsRGB2FlgUyPzE",
      "ChIJeUaSWTeuEmsRGB2FlgUyPzE",
      "ChIJOU6hVzeuEmsRlJsTGD1vpqU",
      "ChIJOU6hVzeuEmsRlJsTGD1vpqU",
      "ChIJOU6hVzeuEmsRlJsTGD1vpqU",
      "ChIJOU6hVzeuEmsRlJsTGD1vpqU",
      "ChIJOU6hVzeuEmsRlJsTGD1vpqU",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJmRMQVTeuEmsRUH-faYDgJs0",
      "ChIJ9SmzqTCuEmsRbkJlaklnr2s",
      "ChIJ9SmzqTCuEmsRbkJlaklnr2s",
      "ChIJ9SmzqTCuEmsRbkJlaklnr2s",
      "ChIJ9SmzqTCuEmsRbkJlaklnr2s"
    ];
    for (var i = 0; i < snappedCoords.length; i++) 
      var marker = addMarker(snappedCoords[i]);
    
  

 // End init function

// Call the initialize function once everything has loaded
google.maps.event.addDomListener(window, 'load', initialize);


/**
 * Add a marker to the map and check for special 'interpolated'
 * and 'unsnapped' properties to control which colour marker is used
 * @param ExtendedLatLng coords - Coords of where to add the marker
 * @return !Object marker - the marker object created
 */
function addMarker(coords) 
  var marker = new google.maps.Marker(
    position: coords,
    title: coords.lat + ',' + coords.lng,
    map: map,
    opacity: 0.5,
    icon: RED_MARKER
  );

  // Coord should NEVER be interpolated AND unsnapped
  if (coords.interpolated) 
    marker.setIcon(BLUE_MARKER);
   else if (!coords.related) 
    marker.setIcon(YELLOW_MARKER);
   else if (coords.originalIndex != undefined) 
    marker.setIcon(RED_MARKER);
    addCorrespondence(coords, marker);
   else 
    marker.setIcon(
      url: GREEN_MARKER,
      scaledSize: 
        width: 20,
        height: 20
      
    );
    addCorrespondence(coords, marker);
  

  // Make markers change opacity when the mouse scrubs across them
  marker.addListener('mouseover', function(mevt) 
    marker.setOpacity(1.0);
  );
  marker.addListener('mouseout', function(mevt) 
    marker.setOpacity(0.5);
  );

  coords.marker = marker; // Save a reference for easy access later
  markers.push(marker);

  return marker;



/**
 * Fit the map bounds to the current set of markers
 * @param Array<Object> markers Array of all map markers
 */
function fitBounds(markers) 
  var bounds = new google.maps.LatLngBounds;
  for (var i = 0; i < markers.length; i++) 
    bounds.extend(markers[i].getPosition());
  
  map.fitBounds(bounds);
html,
body 
  height: 100%;
  margin: 0;
  padding: 0;
  font-family: Roboto, Noto, sans-serif;


#map 
  height: 500px;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?libraries=places,geometry">
</script>
<div id="map">
</div>

【讨论】:

以上是关于谷歌地图道路 api 循环 - 如何停止的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌地图API中获取高速公路和道路的纬度和经度

谷歌地图 api 密钥有效,但道路 apikey 无效

如何使用谷歌地图 api 获得速度限制?

html html5地理位置api +谷歌地图方向api显示用户位置和最近的道路名称

谷歌地图 API 中令人不快的非正交特征类型

谷歌地图捕捉到不返回所有值的道路