谷歌地图API 3 - 根据缩放级别显示/隐藏标记

30
我试图根据缩放级别显示/隐藏一些谷歌地图标记。我在这里寻找答案,虽然我更清楚应该做什么,但我无法将其实现到我的谷歌地图中。
var infowindow = new google.maps.InfoWindow();
var marker, i;
var locations = [
    ['<div style="width: 170px;">Title1</div>', 50.794785, -1.116947, image],
    ['<div style="width: 190px;">Title2</div>', 50.797, -1.109, image],
    ['<div style="width: 120px;">Title3', 50.796928, -1.107119, '../images/map-pointer.png'],
    ['<div style="width: 150px;">Title4</div>', 50.794703, -1.117880, '../images/map-pointer.png']
];
/* Get the markers from the array */
for (i = 0; i < locations.length; i++) {  
    marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]), 
        map: map,
        icon: locations[i][3],
        zIndex: 10
    }); 
    /* Open marker on mouseover */
    google.maps.event.addListener(marker, 'mouseover', (function(marker, i) {
    return function() {
        infowindow.setContent(locations[i][0]);
        infowindow.open(map, marker);
    }
    })(marker, i));
}
/* Change markers on zoom */
google.maps.event.addListener(map, 'zoom_changed', function() {
var zoom = map.getZoom();

    if (zoom <= 15) {
        marker.setMap(null);
    } else {                           
        marker.setMap(map);
    }
});

标记已经正常绘制,但我尝试的缩放功能似乎根本不起作用 - 我做错了吗?

1个回答

39
你需要将标记保存在一个数组中,并迭代它们以在缩放事件上显示/隐藏它们。你只在marker变量中保存了最后一个标记。你需要一个markers数组。此外,您可以使用标记的setVisible方法,而不是使用setMap
var infowindow = new google.maps.InfoWindow();
var marker, i;
var markers = [];
var locations = [
    ['<div style="width: 170px;">Title1</div>', 50.794785, -1.116947, image],
    ['<div style="width: 190px;">Title2</div>', 50.797, -1.109, image],
    ['<div style="width: 120px;">Title3', 50.796928, -1.107119, '../images/map-pointer.png'],
    ['<div style="width: 150px;">Title4</div>', 50.794703, -1.117880, '../images/map-pointer.png']
];
/* Get the markers from the array */
for (i = 0; i < locations.length; i++) {  
    marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]), 
        map: map,
        visible: true, // or false. Whatever you need.
        icon: locations[i][3],
        zIndex: 10
    }); 
    /* Open marker on mouseover */
    google.maps.event.addListener(marker, 'mouseover', (function(marker, i) {
    return function() {
        infowindow.setContent(locations[i][0]);
        infowindow.open(map, marker);
    }
    })(marker, i));
    markers.push(marker); // save all markers
}

/* Change markers on zoom */
google.maps.event.addListener(map, 'zoom_changed', function() {
    var zoom = map.getZoom();
    // iterate over markers and call setVisible
    for (i = 0; i < locations.length; i++) {
        markers[i].setVisible(zoom <= 15);
    }
});

非常感谢您!我已将其更改为当缩放比例>=15时显示 - 唯一的问题是,当地图加载时,图标会一直显示,直到您缩放。起初我想隐藏它们,然后当用户缩放时它们就会出现。是否还有一种方法可以在不同的缩放级别下显示特定的图标?或者我是否需要使用标记聚合器? - user1788364
您可以使用聚类器。或者,如果您想自己完成,您可以拥有多个标记数组,并根据缩放级别调整它们的可见性 :) 我不知道您正在处理多少标记(和标记组),因此很难说哪种方法最适合您。 - Taylan Aydinli
谢谢您的快速回复 :) 我只想显示4个标记。理想情况下,当地图缩小时,我希望能够显示其中两个,然后当地图放大时,它将显示所有标记。如果要有两个数组,我需要有两个变量位置(例如var locations1,var locations2)吗?此外,目前似乎加载了标记,只有当用户更改缩放比例时才会显示/隐藏。我是否需要使用if函数来确定从一开始就应该显示标记? - user1788364
visible: false 属性添加到标记选项中,标记将从一开始就不可见。请查看 MarkerOptions 文档。我更新了我发布的代码以添加 visible 选项。 - Taylan Aydinli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接