Клуб API Карт

YMaps + 2134 маркера

deespater
27 октября 2015, 23:29

Добрый день!

 

Прошу у клуба помощи со следующей задачей:

 

В наличии имеем 2134 объекта {lat, lng, title} которые нужно нанести на карту. Кластеризовать не хочется, поэтому было принято решение показывать маркеры только при зуме >= 14. 


Пробовал следующие методы:

1) Создавал массив GeoObject с options.visible = false, добавлял в mapInstanse а событие 'boundschange'  карты проходился по geoObjects и выставлял опцию видимости, сравнивая текущий zoom  c желаемым. Итог — страшно тормозит, поскольку рендерятся все маркеры даже вне текущей области видимости.

2) Пытался добавлять маркеры через ObjectManager, однако он оперирует не GeoObject а просто JSON описанием сущности, поэтому итерируя objectManager.objects я не могу выставлять options.visible. Итог — прятать маркеры по зуму не получилось.

3) Использование setFilter у objectManager с условием map.getZoom() >=14 ни к чему не привело


Подскажите пожалуйста, каким образом я могу попросить ЯндексКарты рисовать маркеры на карте только при указанном зуме с достаточной производительностью (желательно вообще рисовать маркеры только в текущей области видимости)? Вариант с запросами на сервер я стараюсь не рассматривать, потому что расходы на Ajax запрос-ответ непозволительны с точки зрения delay.

 

Спасибо

2 комментария

1. Коллекции понятное дело столько объектов не потянут.

 

2. Если что setFilter принимает и функцию-фильтр, можно в ней фильтровать, но не суть. Не нужен тут фильтр и переборы с выставлением visible. Нужно слушать boundschange и при зум < 14 просто удалять менеджер с карты

Хотя и это костыли – оптимальный вариант см. пункт 4

 

3. С менеджером заморачиваться показом объектов только в области видимости не нужно (он итак это делает)

 

4. Пассаж про расходы на AJAX и delay я не понял. Вы сейчас 2000 объектов прямо в тело страницы в js распечатали? )))

Это хуже, оно же не кешируется и каждый раз заного скачивается. Оптимальный вариант тут ROM с потайловой загрузкой. Я делал пример со 100тыс объектов без каких либо тормозов и задержек.

Ну и вариант с ограничением по масштабу тут гораздо проще решается – вы просто отдаете с сервера пустой массив без каких-либо обработчиков boundschange и удалений/добавлений менеджера – на клиенте будет только создание менеджера и все – пара строчек

Большое спасибо за ответ.

 

По поводу AJAX — да, сейчас идет единоразовая загрузка json файла с объектами (~200kb), который потом сохраняется в localStorage и это (на данный момент) единственный вариант обеспечивающий, помимо показа маркеров, еще и почти мгновенный поиск по объектам и панирование к ним на карте.

Однако вариант с ROM я тщательно изучу на будущее, спасибо вам