Клуб API Карт

Неправильное число маркеров на карте при использовании кластеризации

Пост в архиве.

 При использовании карты с кластеризатором общее число меток в коллекции зависит от положения карты. В приведенном ниже примере, если сразу нажать на кнопку, то будет 5 точек, а если поставить центр подальше от этих маркеров, например в Ханты-Мансийск, то при нажатии на кнопку будет 0 точек.

<!DOCTYPE html>
<html>
<head>
    <title>Неправильное число маркеров</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="//api-maps.yandex.ru/2.0/?load=package.standard,package.clusters&lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
var markers;
ymaps.ready(init);
function init () {
    var myMap = new ymaps.Map("map", {
            center: [54.83, 37.11],
       behaviors: ['default', 'scrollZoom'],
            zoom: 5
        });
    myMap.controls.add('zoomControl', { left: 5, top: 10 });
    function generateMarkers(tlCorner, brCorner, count) {
        var deltaLat = tlCorner[0] - brCorner[0],
            deltaLon = brCorner[1] - tlCorner[1],
            markers = [];
        for(var i = 0; i < count; i++) {
            var lat = brCorner[0] + Math.random()*deltaLat,
                lon = tlCorner[1] + Math.random()*deltaLon;
            markers.push([lat, lon]);
        }
        return markers;
    }
    markers = new ymaps.Clusterer();
    //markers= new ymaps.GeoObjectCollection();
    [[54.51,35.90],[55.77,37.49],[55.00,37.76],[53.87,37.08],[55.11,37.18],[57.10,39.83],[56.88,37.11],[53.87,38.81],[56.63,39.02],[54.75,36.36]].forEach(function(coords) {
     var myPlacemark = new ymaps.Placemark(coords);
        markers.add(myPlacemark);
    });
    myMap.geoObjects.add(markers);
}
function log() {
    document.getElementById("logField").innerHTML = markers.getLength()
}
</script>
</head>
<body>
    <div id="map" style="width:400px; height:300px"></div>
    <button onclick="log();">Сколько точек на карте?</button>
    <span id="logField"></span><span> точек на карте</span>
</body>
</html>

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

5 комментариев

 clusterer.getLength возвращает количество объектов, которые в данный момент реально добавлены на карту. То есть значение будет зависеть от области видимости карты.

 

Поскольку вы сами добавляете маркеры в кластеризатор, вы можете сохранить ссылку на эти объекты и позже к ним обращаться через нее.

small_butterfly_long_long_as_long_as_i_can_do_it_here
28 января 2016, 01:33

получается, что мне нужно добавлять новый маркер сразу в две коллекции: одна для карты, другая для себя. Неужели нет доступа к маркерам в кластере? Они же там в любом случае хранятся

речь о том что Вы маркеры в кластеризатор добавляйте в массиве. Вот и работайте с этим массивом

small_butterfly_long_long_as_long_as_i_can_do_it_here
28 января 2016, 01:33

Получилось, спасибо. Но проблема оказалась в другом месте: нельзя открыть балун кластера, если его нет в зоне видимости. Вот пример кода: https://gist.github.com/just-boris/6362862. Для открытия балуна у кластера не получилось использовать массив маркеров. Этот код вызывает ошибку:

function openBalloon(index) {    marker[index-1].balloon.open()}

Uncaught Error: geoObject.Balloon.open: геообъект не добавлен на карту

Теперь вопрос в том, как открыть балун у кластера, которого нет в области просмотра? (При этом область просмотра должна сместиться, чтобы показать его, как это делают маркеры в обычной GeoObjectCollection)

 

Эта задача решена в этом примере