如何在 Mapbox 中 "unbind" 弹出窗口?只允许特定范围内的标记弹出窗口(当用户移动时改变)

How to "unbind" Popups in Mapbox? Allowing only popups from markers within certain range(changing when user moves)

我正在尝试在查看地图上标记的工具提示或弹出窗口的功能之间切换,具体取决于与标记的距离。有一种简单的方法可以启用弹出窗口,但是有什么方法类似于

marker.bindPopup(entries[i].text_content);

删除再次查看弹出窗口的功能?

供参考,这里是完整的部分代码

$http.get(ApiEndpoint.entry).then(function(data) {
    entries = data.data;
    for (i=0; i<entries.length; i++){
            var lat = entries[i].lat;
            var long = entries[i].long;
    }
    var markers = new L.MarkerClusterGroup({maxClusterRadius: 40, removeOutsideVisibleBounds: true, singleMarkerMode: true});

    for (var i = 0; i < entries.length; i++) {
        var a = entries[i];
        var title = a[2];
        marker = L.marker(new L.LatLng(a.lat, a.long), {
            icon: L.mapbox.marker.icon({'marker-symbol': 'post', 'marker-color': '0044FF'}),
        });
        if(haversineDistance(current_lat, current_long, entries[i].lat, entries[i].long)<26){
            marker.bindPopup(entries[i].text_content);
        };

        markers.addLayer(marker);   
    }
    map.addLayer(markers);
});

其中haversineDistance函数用于计算从当前位置到标记的距离。

我想要的是一段可以在循环中 运行 的代码,它在一个时间间隔内删除所有弹出窗口,允许我再次使用 if 语句,允许弹出窗口随着用户移动,范围内的标记。

可以使用 L.Map 实例的 locate 方法使用 Leaflet 对客户端进行地理定位。启动后,您可以监听 locationfound 事件。该事件包含一个包含客户端坐标的 L.LatLng 实例。 L.Marker 个实例有一个 getLatLng 方法,其中 returns 个 L.LatLng 实例带有标记坐标。您可以使用 L.Latlng 个实例的 distanceTo 方法计算它们之间的距离。在带有注释的代码中进一步解释:

// Markers in a LayerGroup
var group = new L.LayerGroup([
  new L.Marker([0,0]),
  new L.Marker([0,0])
]).addTo(map);

// Start geolocation (assuming map holds a L.Map instance)
map.locate();

// Listen for the event
map.on('locationfound', function(event){
  // If succeeded get client coordinates
  var clientLatLng = event.latLng;
  // Loop over markers
  group.eachLayer(function(marker){
    // Get marker coordinates
    var markerLatLng = marker.getLatLng();
    // Calculate distance
    var distance = clientLatLng.distanceTo(markerLatLng);

    // When within 40 meters
    if (distance < 40) {
      marker.bindPopup('POP');
      marker.openPopup();
    } else {
      marker.unbindPopup();
    }
  });  
});

参考文献:

L.Map.locate(): http://leafletjs.com/reference.html#location-event

L.LatLng.distanceTo(): http://leafletjs.com/reference.html#latlng-distanceto

PS。我目前无法测试地理定位,所以我随手写了这个。应该没问题,希望 ;)