Получить список маркеров/слоев в пределах текущих границ карты в Листовке
Это несколько похоже на вопрос, заданный здесь -
Я пишу окно поиска для приложения карты, которое сразу извлекает весь набор результатов поиска (имена людей и информацию) с сервера, а затем страницы через список результатов. Таким образом, в любой точке на карте есть два типа маркеров - фоновой маркер для точек, которые находятся в результатах поиска, но не на текущей странице, и маркер переднего плана для точек, находящихся на текущей странице результатов поиска.
Все это прекрасно работает.. то, что я хотел бы сделать сейчас, настроено так, чтобы, если пользователь увеличивает или панорамирует карту, список результатов поиска обновляется, чтобы показывать только маркеры в пределах текущей границы карты.
Очевидно, есть способы для работы на стороне сервера, или я мог бы просто запустить весь список маркеров, чтобы увидеть, какие из них соответствуют текущим границам; но знает ли кто-нибудь встроенный способ сделать это в листовке? Что-то, что будет выглядеть map.getVisibleLayers()?
Ответы
Ответ 1
Я думаю, что это может помочь: https://github.com/stefanocudini/leaflet-list-markers
как видно из демонстрации, включая все маркеры в слое, этот плагин показывает список только тех, которые видны в текущем окне просмотра. Его использование простое, в ряд:
var markersLayer = new L.LayerGroup();
map.addControl( new L.Control.ListMarkers({layer: markersLayer}) );
Код для его получения выглядит так:
var layers = L.LayerGroup(), //layers contains all markers..
contained = []; //makers in map boundingbox
layers.eachLayer(function(l) {
if( l instanceof L.Marker && map.getBounds().contains(l.getLatLng()) )
contained.push(l);
});
Ответ 2
Вы должны проверить границы каждого слоя и границы карты. Поскольку eachLayer() возвращает все слои независимо от того, находятся ли они в видимой степени.
if(map.getBounds().contains(layer.getLatLng())) { ... }
В коде Стефано это показано в этой строке:
https://github.com/stefanocudini/leaflet-list-markers/blob/master/src/leaflet-list-markers.js#L95
Ответ 3
Что касается последней части вашего вопроса, если вы хотите перебрать видимые слои, вы можете использовать eachLayer, например:
map.eachLayer(function (layer) {
// do something with the layer
});
Справочник по API: http://leafletjs.com/reference.html#map-stuff-methods
Ответ 4
Здесь полностью рабочая функция, которая делает свою работу:
// var map is an instance of a Leaflet map
// this function assumes you have added markers as GeoJSON to the map
// it will return an array of all features currently shown in the
// active bounding region.
function getFeaturesInView() {
var features = [];
map.eachLayer( function(layer) {
if(layer instanceof L.Marker) {
if(map.getBounds().contains(layer.getLatLng())) {
features.push(layer.feature);
}
}
});
return features;
}