Клуб API Карт

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

Мартынов Александр
13 февраля 2015, 15:51

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

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

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

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

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

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

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

12 комментариев
Подписаться на комментарии к посту

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

Мартынов Александр
13 февраля 2015, 18:12

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

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

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

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

Мартынов Александр
15 февраля 2015, 17:15

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

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

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

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

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

 

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

Мартынов Александр
15 февраля 2015, 20:33

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

 

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

 

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

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

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

 

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

Мартынов Александр
16 февраля 2015, 10:37

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

 

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

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

Мартынов Александр
16 февраля 2015, 15:45

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

Мартынов Александр
16 февраля 2015, 16:26

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

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