google map api 如何通过单击多个标记之一放大然后缩小

亚当·弗莱彻

在地图上,我有各种标记。单击标记后,用户会放大并居中该标记以查看详细信息,并且 mapTypeId 也会从地形更改为卫星。

我希望用户能够再次单击标记以缩小、居中地图并将 mapTypeId 更改回地形。

地图初始化在这里:

var map = new google.maps.Map(document.getElementById('map-canvas'), {
    scrollwheel: false,
    navigationControl: false,
    mapTypeControl: false,
    zoom: 11,
    center: new google.maps.LatLng(-37.6756817,145.6690691),
    mapTypeId: 'terrain'
});
var mapzoom = map.getZoom(); 

我们像这样设置了一系列城镇:

var locations = [
    // Healesville
    ['Town: <a href="#">Healesville</a>', -37.6534206,145.5117927, 'uploaded-images/marker-red-32h.png',0],
    // Warburton
    ['Town: <a href="#">Warburton</a>', -37.7514003,145.6919378, 'uploaded-images/marker-red-32h.png',1],
    [...],
    [...],
    [...]
];

第一个放大操作的代码在这里:

var markerListener = google.maps.event.addListener(marker, 'click', (function(marker, i) {
    return function() {
        map.panTo(this.getPosition());
        map.setZoom(16);
        map.setMapTypeId('satellite'); 
    }
})(marker, i));

我开始第二部分缩小:

google.maps.event.addListener(map, 'zoom_changed', function() {
    var zoomLevel = map.getZoom();
    google.maps.event.addListener(marker, 'click', (function(marker, i) {
        if(zoomLevel > 11) {
            return function() {
                var center = new google.maps.LatLng(-37.6756817,145.6690691);
                map.setCenter(center);
                map.setZoom(11);
                map.setMapTypeId('terrain');
            }
        } else {
            return function() {
                map.panTo(this.getPosition());
                map.setZoom(16);
                map.setMapTypeId('satellite');
            }
        }
    })(marker, i));
}

不幸的是,缩小脚本仅适用于标记数组中的最后一个标记。需要弄清楚如何缩小地图上每个标记的原始设置。

地理编码

您只有对缩放处理代码中最后一个标记的引用(最后一次通过循环将其设置为最后一个值)。只需将代码添加到标记单击功能就更简单了。我想你想要的是这个:

var markerListener = google.maps.event.addListener(marker, 'click', (function(marker, i) {
  return function() {
    zoomLevel = map.getZoom();
    if (zoomLevel <= 11) {
      map.panTo(this.getPosition());
      map.setZoom(16);
      map.setMapTypeId('satellite');
    } else {
      var center = new google.maps.LatLng(-37.6756817, 145.6690691);
      map.setCenter(center);
      map.setZoom(11);
      map.setMapTypeId('terrain');      
    }
  }})(marker, i));
}

您可能希望通过计算显示标记的边界并使用该边界调用地图拟合边界(而不是当前在 else 中的代码)来动态计算中心/缩放。

概念证明小提琴

代码片段:

var zoomLevel;

function initialize() {
  var map = new google.maps.Map(document.getElementById('map-canvas'), {
    scrollwheel: false,
    navigationControl: false,
    mapTypeControl: false,
    zoom: 11,
    center: new google.maps.LatLng(-37.6756817, 145.6690691),
    mapTypeId: 'terrain'
  });
  var mapzoom = map.getZoom();
  for (var i = 0; i < locations.length; i++) {
    var marker = new google.maps.Marker({
      position: {
        lat: locations[i][1],
        lng: locations[i][2]
      },
      map: map
    })
    var markerListener = google.maps.event.addListener(marker, 'click', (function(marker, i) {
      return function() {
        zoomLevel = map.getZoom();
        if (zoomLevel <= 11) {
          map.panTo(this.getPosition());
          map.setZoom(16);
          map.setMapTypeId('satellite');
          clickedMarker = marker;
        } else {
          var center = new google.maps.LatLng(-37.6756817, 145.6690691);
          map.setCenter(center);
          map.setZoom(11);
          map.setMapTypeId('terrain');
        }

      }
    })(marker, i));
  }
}
google.maps.event.addDomListener(window, "load", initialize);
var locations = [
  // Healesville
  ['Town: <a href="#">Healesville</a>', -37.6534206, 145.5117927, 'uploaded-images/marker-red-32h.png', 0],
  // Warburton
  ['Town: <a href="#">Warburton</a>', -37.7514003, 145.6919378, 'uploaded-images/marker-red-32h.png', 1],
];
html,
body,
#map-canvas {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map-canvas"></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章