【问题标题】:How to remove Google Map Markers without blinking?如何在不闪烁的情况下删除谷歌地图标记?
【发布时间】:2019-11-12 18:54:43
【问题描述】:

我正在尝试每隔 5 秒通过 ajax 请求填充多个标记。一切正常,但标记会在每次间隔调用时闪烁。

我正在清除所有标记并在每次间隔调用时重新生成。我只想在不闪烁的情况下重新生成标记。

此外,ajax 请求可能会在每次间隔调用时返回不同的结果集。

以下是代码:

  var map;
  var places;
  var markers = [];
  var iw_map;
  var markers_map = new Array();

  function initialize() {
      geocoder = new google.maps.Geocoder();

      var latlngCenter = new google.maps.LatLng(25.1999721, 66.8354386);
      iw_map = new google.maps.InfoWindow();
      var mapOptions = {
          center: latlngCenter,
          zoom: 7,
          mapTypeId: google.maps.MapTypeId.ROADMAP
      };

      map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
      fetchPlaces();
      fitMapToBounds_map();
  }

  function fetchPlaces(cityId = null, hubId = null, riderId = null) {
    clearMarkers(); 
    $.ajax({
      url: '{{ route('get-markers') }}',
      method:'POST',
      data: {'city_id': cityId, hub_id: hubId, rider_id: riderId},
      dataType: 'json',
      cache: false,
      success: function(data) {

          // console.log(markers);

          var markerz = data.markers;

          // clearMarkers();

          $.each(markerz, function (i, dt) {

            var marker_icon = {url: dt.icon};
            var position = new google.maps.LatLng(dt.lat,dt.lng);
            var marker = new google.maps.Marker({
              map: map,
              position: position,
              icon: marker_icon
            });

            // newcoordinate = new google.maps.LatLng(dt.lat,dt.lng);

            google.maps.event.addListener(marker, "click", function(event) { 
              $.ajax({  
                  url: '{{ route('get-marker-info') }}',
                  method:'POST',
                  data: JSON.parse(dt.params),
                  success: function(data) {  
                      iw_map.setContent(data.infoBox);  
                      iw_map.open(map, marker);  
                  }  
              });
            });
            markers.push(marker.getPosition());
            markers_map.push(marker);
          });

          // fitMapToBounds_map();
      }  
    });

  }

  function fitMapToBounds_map() {
      var bounds = new google.maps.LatLngBounds();
      if (markers.length>0) {
          for (var i=0; i<markers.length; i++) {
              console.log(markers[i]);
              bounds.extend(markers[i]);
          }
          map.fitBounds(bounds);
      }
  } 

  function clearMarkers() {

    for (var i = 0; i < markers_map.length; i++) {
      markers_map[i].setMap(null);
    }

    markers_map = [];
  }

  function loadScript_map() {
      var script = document.createElement("script");
      script.type = "text/javascript";
      script.src = "http://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=false&v=3&libraries=places&callback=initialize";
      document.body.appendChild(script);
  }
  window.onload = loadScript_map;

  setInterval(fetchPlaces, 5000);

【问题讨论】:

  • 先设置新标记然后删除旧标记?这实际上取决于客户端机器的性能和您正在加载的标记数量。可能是您甚至没有看到变化,或者“眨眼”可能比眨眼更长......
  • 同时可以有数千个标记。如果我删除这部分clearMarkers 函数for (var i = 0; i &lt; markers_map.length; i++) { markers_map[i].setMap(null); }。 ajax 调用创建新标记,但不会删除未在 ajax 响应中收到的旧标记
  • 显然是的。那条评论的意义何在?
  • 只是想让你知道,我可以在不闪烁的情况下添加新标记,但不能删除旧标记。比方说,最初我有 5 个标记(A、B、C、D、E),在区间调用中我得到 6 个标记(A、B、C、F、G、H)。在这种情况下,添加了 F,G,H,但不会删除 D,E
  • 这就是我在第一条评论中所说的...为避免“闪烁”,您可以尝试首先添加新标记然后删除旧的......这当然意味着你的代码有一些变化。

标签: javascript google-maps google-maps-api-3 google-maps-markers


【解决方案1】:

这是未经测试的代码,因此可能需要进行一些调整。

我用有意义的名称重命名了您的变量,并将逻辑更改为首先添加新标记,然后删除旧标记。

当您使用 AJAX 获取标记时,首先清空 new_markers 数组,然后在地图上绘制标记,并将它们添加到 new_markers 数组中。然后从地图中清除旧标记(markers 数组)。第一次,这个数组是空的,所以什么都不会发生。将new_markers 数组复制到markers 数组。重复。

代码如下:

var map;
var places;
var markers_positions = [];
var markers = [];
var new_markers = [];
var iw_map;


function initialize() {
  geocoder = new google.maps.Geocoder();

  var latlngCenter = new google.maps.LatLng(25.1999721, 66.8354386);
  iw_map = new google.maps.InfoWindow();
  var mapOptions = {
    center: latlngCenter,
    zoom: 7,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };

  map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
  fetchPlaces();
  fitMapToBounds_map();
}

function fetchPlaces(cityId = null, hubId = null, riderId = null) {

  new_markers = [];

  $.ajax({
    url: '{{ route('get-markers') }}',
    method: 'POST',
    data: {
      city_id: cityId,
      hub_id: hubId,
      rider_id: riderId
    },
    dataType: 'json',
    cache: false,
    success: function(data) {

      $.each(data.markers, function(i, dt) {

        var marker_icon = {
          url: dt.icon
        };
        var position = new google.maps.LatLng(dt.lat, dt.lng);
        var marker = new google.maps.Marker({
          map: map,
          position: position,
          icon: marker_icon
        });

        google.maps.event.addListener(marker, "click", function(event) {
          $.ajax({
            url: '{{ route('get-marker-info') }}',
            method: 'POST',
            data: JSON.parse(dt.params),
            success: function(data) {
              iw_map.setContent(data.infoBox);
              iw_map.open(map, marker);
            }
          });
        });
        markers_positions.push(marker.getPosition());
        new_markers.push(marker);
        clearMarkers();
      });
    }
  });

}

function fitMapToBounds_map() {
  var bounds = new google.maps.LatLngBounds();

  for (var i = 0; i < markers_positions.length; i++) {
    console.log(markers_positions[i]);
    bounds.extend(markers_positions[i]);
  }
  map.fitBounds(bounds);
}

function clearMarkers() {

  for (var i = 0; i < markers.length; i++) {
    markers[i].setMap(null);
  }

  markers = new_markers;
}

function loadScript_map() {
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "http://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=false&v=3&libraries=places&callback=initialize";
  document.body.appendChild(script);
}
window.onload = loadScript_map;

setInterval(fetchPlaces, 5000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2021-05-28
    • 1970-01-01
    • 2012-10-17
    • 2012-09-15
    相关资源
    最近更新 更多