如何在 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。我目前无法测试地理定位,所以我随手写了这个。应该没问题,希望 ;)
我正在尝试在查看地图上标记的工具提示或弹出窗口的功能之间切换,具体取决于与标记的距离。有一种简单的方法可以启用弹出窗口,但是有什么方法类似于
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。我目前无法测试地理定位,所以我随手写了这个。应该没问题,希望 ;)