Получить список маркеров/слоев в пределах текущих границ карты в Листовке

Это несколько похоже на вопрос, заданный здесь -

Я пишу окно поиска для приложения карты, которое сразу извлекает весь набор результатов поиска (имена людей и информацию) с сервера, а затем страницы через список результатов. Таким образом, в любой точке на карте есть два типа маркеров - фоновой маркер для точек, которые находятся в результатах поиска, но не на текущей странице, и маркер переднего плана для точек, находящихся на текущей странице результатов поиска.

Все это прекрасно работает.. то, что я хотел бы сделать сейчас, настроено так, чтобы, если пользователь увеличивает или панорамирует карту, список результатов поиска обновляется, чтобы показывать только маркеры в пределах текущей границы карты.

Очевидно, есть способы для работы на стороне сервера, или я мог бы просто запустить весь список маркеров, чтобы увидеть, какие из них соответствуют текущим границам; но знает ли кто-нибудь встроенный способ сделать это в листовке? Что-то, что будет выглядеть 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;
}