Клуб API Карт

Определение меток попадающих в видимую область карты и получение их ID

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

Решаю задачу с определением меток попадающих в видимую область карты. При изменении масштаба карты, мне надо обновлять список на список состоящий только из объектов которые видны на карте. Для создания меток использую ObjectManager (с кластеризацией)

Получить объекты я могу 2-мя способами, но у обоих пока есть недостатки, которые не позволяют верно решить задачу.

Вариант 1.

// Определение объектов попадающих в видимую область карты
    myMap.events.add(['boundschange','datachange','objecttypeschange'], function(e){
        ymaps.geoQuery(objectManager.objects).searchInside(myMap).each(function (object) {
            console.log(object);
        });
    });

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

Вариант 2.

// Определение объектов попадающих в видимую область карты
    myMap.events.add(['boundschange','datachange','objecttypeschange'], function(e){
        objectManager.objects.each(function (object) {
          var objectState = objectManager.getObjectState(object.id);
          if (objectState.isShown) {
            console.log(object.id);
          }
        });
    });

Во этом варианте я могу получить список ID видимой области, но есть другая проблема. В видимую область попадают также объекты, которые на самом деле в видимой области не видны, но находятся где-то рядом, что неправильно. Приложил скриншот.

Подскажите пожалуйста, как правильно получить назначенные при создании массива объектов ID? Либо как правильно заставить работать isShown? Или может есть другой более правильый вариант?

Спасибо.

7 комментариев
mari-na-bzzz
Сотрудник Яндекса20 октября 2017, 11:02
Первый способ не очень удачный, потому что geoQuery для каждого объекта создает инстанцию GeoObject, что не очень хорошо скажется на производительности.


Во втором случае вы можете дополнительно проверять попадание точки внутрь прямоугольника map.getBounds()
mari-na-bzzz,
Здравствуйте. А как сделать проверку на попадание в область видимости с помощью getBounds? У objectManager есть что-то вроде searchInside?
И можно ли как-то все проверять на сервере. Чтобы клиент отсылал getBounds на сервер и из базы выводились только те маркеры, которые попали в область видимости. А то сейчас у меня выводит сразу все 70000, как-то не очень. 
Спасибо. Получилось. 
vikktor.com,
 Как именно сделали ?
map.events.add(['boundschange','datachange','objecttypeschange'], function () {
let objects = ymaps.geoQuery(objectManager.objects).searchInside(map);


console.log(objects);
});

в получаемом объекте есть данные  о метках, которые находятся в видимой части
BigDyuha,
Благодарю!
BigDyuha,
Ничего не понятно, но очень интересно!