Клуб API Карт

Как определить кол-во точек в remoteObjectManager?

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

Здравствуйте,

подскажите, пожалуйста, как отслеживать изменение количества точек в remoteObjectManager и как узнать начальное кол-во точек сразу после загрузки?

Пока мне удалось только добавить фунцию для определения и вывода кол-ва точек в объекте remoteObjectManager:

function onMapEvent () {
  var objectsNumber = remoteObjectManager.objects.getLength();
  alert(objectsNumber);
}

и включить ее выполнение при окончании исполнения шага плавного движения карты:

map.events.add("actiontickcomplete", onMapEvent);

Но остался нерешенным вопрос определения кол-ва точек сразу после загрузки, и, вообще-то, хотелось бы повесить эту функцию на событие изменения объекта remoteObjectManager или использовать как-то конструкцию result.then...

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

Добрый день, можно следить за событиями add и remove на коллекции объектов

Александр Мартынов
27 января 2016, 23:07

И Вам добрый день, спасибо за ответ! Изменил код на следующий

function onMapEvent () {
  var objectsNumber = remoteObjectManager.objects.getLength();
  alert(objectsNumber);
}
remoteObjectManager.objects.events.add(["add", "remove"], onMapEvent);

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

можно повесить таймаут на событие карты boundschange, если в течение, скажем, 500 мс, ничего не пришло, значит объектов на карте нет

Александр Мартынов
27 января 2016, 23:07

Так и сделал, но, с учетом того, что событие boundschange не происходит при начальном загрузке карты, пришлось еще добавить запуск функции через секунду после загрузки страницы. В любом случае, все это решение в случае задержки с загрузкой тайлов выдаст неверный результат - 0, а затем выведет точки на карту. Неужели нет другого способа определить начальное кол-во точек в remoteObjectManager сразу после его загрузки?

1. менеджер добавляется на карту

2. посылается запрос на сервер за данными

3. менеджер некоторое время ожидает данне

4. если сервер за это время не ответил, то считается, что данные уже никогда не придут

 

Я правильно понимаю, что вам нужно событие, извещающее о том, что менеджер не дождался загрузки данных?

Александр Мартынов
27 января 2016, 23:07

В итоге использую предложенное Вами решение из 4-х пунктов, но оно мне кажется не оптимальным из-за возможных задержек при загрузке тайлов.

 

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

 

Кстати, возник еще один вопрос. А как определить, что точка из объекта remoteObjectManager попадает в видимую область карты? Я пытался использовать конструкцию remoteObjectManager.objects.searchInside(map) но она для таких объектов не работает.

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

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

 

По поводу второго вопроса - вам нужно понять, отрисована ли точка или именно попадание в окошко карты?

Александр Мартынов
27 января 2016, 23:07

Здравствуйте! Спасибо за предложение! Пока я не очень понимаю, как можно сделать такую глобальную функцию, но попробую разобраться.

 

А что касается второго вопроса, то мне нужно понять именно попадание в окошко карты.

Можно взять границы карты через map.getBounds и просто проверить через max/min, попадают ли точки в полученные границы

Александр Мартынов
27 января 2016, 23:07

Так и сделал. Спасибо!

Александр Мартынов
27 января 2016, 23:07

Кстати, обнаружил баг. Если зайти на карту с точками от ObjectManager, скажем на страницу - https://tech.yandex.ru/maps/jsbox/2.1/object_manager, отдалить карту на максимум, провернуть земной шар на 360 градусов вправо или влево, то точки исчезают.

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