kak*_*lon 13 javascript jquery google-maps google-maps-api-3
我有一张地图,我想更改标记图像,当缩放大于5.
我知道如何检测缩放更改,但我不知道如何更改图像.
Dan*_*llo 30
这应该很容易.我看了你的代码,看起来你没有保留对标记的引用.这是你应该做的第一件事.
因此创建一个markers数组:
var markers = [];
Run Code Online (Sandbox Code Playgroud)
在您的setMarkers()函数中,将每个新标记推入此数组:
markers.push(marker);
Run Code Online (Sandbox Code Playgroud)
现在,您将能够使用for循环迭代标记:for (i = 0; i < markers.length; i++).
理想情况下,我们还应将每个标记的两个图标存储在标记对象本身中.JavaScript对象可以非常容易地使用自定义属性进行扩充.为此,您可能需要更改setMarkers()功能,如下所示:
function setMarkers(map, map_bounds, locations, iconLevel1, iconLevel2) {
for (var i = 0; i < locations.length; i++) {
var loc = locations[i];
var myLatLng = new google.maps.LatLng(loc[1], loc[2]);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
icon: iconLevel1, // iconLevel1 by default
title: loc[0],
zIndex: loc[3]
});
// Add custom properties to the marker object
marker.iconLevel1 = iconLevel1;
marker.iconLevel2 = iconLevel2;
// Add the new marker to the markers array
markers.push(marker);
map_bounds.extend(myLatLng);
}
}
Run Code Online (Sandbox Code Playgroud)
最后,您似乎已经zoom_changed正确处理了事件.首先,我建议检查是否zoomLevel在1和之间发生了变化2,以便在markers没有需要的情况下不迭代数组.如果有更改,只需setIcon()为每个标记调用方法,然后传递自定义属性iconLevel1或iconLevel2取决于zoomLevel:
var zoomLevel = 1;
google.maps.event.addListener(map, 'zoom_changed', function() {
var i, prevZoomLevel;
prevZoomLevel = zoomLevel;
map.getZoom() < 5 ? zoomLevel = 1 : zoomLevel = 2;
if (prevZoomLevel !== zoomLevel) {
for (i = 0; i < markers.length; i++) {
if (zoomLevel === 2) {
markers[i].setIcon(markers[i].iconLevel2);
}
else {
markers[i].setIcon(markers[i].iconLevel1);
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
以上应该可以工作,但您可能需要按如下方式重构for循环,使用下标符号而不是点符号来访问标记的属性:
for (i = 0; i < markers.length; i++) {
markers[i].setIcon(markers[i]['iconLevel' + zoomLevel]);
}
Run Code Online (Sandbox Code Playgroud)