Клуб API Карт

Одновременный вывод большого количевства маркеров

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

Подскажите пожалуйста как лучше реализовать отображение большого количевства маркеров на карте и не вызывать торможение и зависание бразера.

Картина: в БД с периодичностью в одну минуту ложаться координаты. На сайте выбирается период времени за который требуется отбразить координаты на карте... и соответственно когда выбирается период хотя бы за сутки, выводятся 1,5тыс точек и браузер тормозит или виснет... не говоря уже о большем интервале времени.

Вопрос: как лучше реализовать вывод большого количевства маркеров?

Идеи: сразу появилась идея объединять маркеры в группы и показывать их в зависимости от выбранной высоты... тоесть

8 км. - отображается каждая восьмая координата из БД

4 км. - каждая 6

2 км. - каждая пятая

1 км. - каждая четвёртая

500 м. - каждая третья

300 м. - через одну

200 м. - все точки

тоесть при приближении происходит детализация и увеличение количевства маркеров.

и я так понимаю можно сделать активную область, тоесть если макссимальное приближение то будут загружены не все маркеры, а только в видимой области... может не правильно понял применение этой функции...

В общем так) я в API новичёк, так что не судите строго если что нетак. Подскажите пожалуйста как реализовать задумку правильно или есть ли альтернатива? Заранее спасибо.

13 комментариев
какая у вас задача.
если отобразить кучу мелких обьектов - активные области или их аналоги(на канвасе или рафаэле)
1.5к обьектов - это относительно мало.
Их сложно только показать(и иногда поменять зум).
В принципе что хром что опера(она даже лучше) влет и 3к обьектов переваривают.
ФФ - тороза от 600
ИЕ - промолчу.

и всеравно.. все зависит от задачи.
можно перед отдачей данных - на сервере( 1.5 на клиенте клеить уже не просто) сгрупировать и отдать "слоистые" данные.
Отображать точки по "порядку" можно будет только в том случае если они как-то четко отсортированы( или ровно по рандому) - иначе будут дырки
Sergey Konstantinov
28 января 2016, 06:53
Кажется, технология активных областей вас спасет: http://api.yandex.ru/maps/jsapi/doc/mod/concepts/api-modules-hotspots-layer.xml
Здравствуйте! У меня такая же задача вывести порядка 1000 маркеров на карту. Соответственно тоже проблема с производительностью, стал пробовать YMaps.ObjectManager, тоже подумываю делать выборку из базы в зависимости от рейтинга точки (рейтинг будут формировать пользователи). Соответственно уменьшаем зум - на карте остаются более "рейтинговые" метки, а при увеличении будут показываться все маркеры.



Но есть идея другая. Например для Google Maps есть такой замечательный плагин, как Clusterer. О его использовании хорошо написано здесь: http://vremenno.net/js/google-maps-and-too-many-markers/

Так вот, может есть идеи, как этот плагин заставить работать с Ymaps??? Тогда бы все наши проблемы были решены!
в данном случае - только активные области.
спасет сразу от всего
Да, буду пробовать, разбираться. Спасибо.
Но все же хотелось бы попробовать адаптировать указанный выше плагин к яндекс картам, т.к. я его уже применял на некоторых проектах и работает он просто отлично!
любой менеджер который управляет вашими маркерами, а не вашими данными по определению ушербен.
Группы якарт например управляют данными, в том смысле что маркеры они не трогают.
Sergey Konstantinov
28 января 2016, 06:53
На самом деле Clusterer, как и ObjectManager, не решает проблему с большим числом точек: информация о ВСЕХ точках все равно необходима при работе менеджера объектов. При количестве точек более нескольких тысяч начнутся очень серьезные лаги.

Слои активных областей - единственная известная мне технология, которая снимает ограничения на число точек на карте. Но кластеризацию, если она Вам нужна, Вам придется реализовать с серверной стороны самостоятельно.
twirl, Вы с thekashey уже несколько раз повторили про технологию активных областей, судя по вашей настойчивости это действительно единственный правильный метод ;)
Помогите пожалуйста разобраться с этой технологией, если не трудно.

Насколько я понял, суть этого метода в том, чтобы на сервере подготовить png изображение для каждого тайла, на котором размещены все маркеры, и файл js с описанием этого тайла.
Затем при загрузке карты, подгружается соответствующее изображение со всеми маркерами и накладывается на карту, правильно?
Просто для нашего проекта необходимо, чтобы у каждого маркера была своя картинка (вот здесь можно посмотреть, о чем речь: http://shirpotreba.net/mag.php). Конечно, можно было бы наверное разместить все маркеры с разными картинками в один png файл, но у нас каждый магазин продает свой тип продукции. Например, если пользователь выбирает "показать обувь", то должны отобразиться магазины, продающие обувь.
Хм, или нам тогда так и делать по типу продукции объединять в группы... Т.е. сколько видов продукции, столько и вариантов png файлов.
Или я вообще суть технологии не так понял?
Суть вы поняли правильно.

Если у вас много разнородных объектов, то лучше генерить тайлы в реальном времени, при каждом запросе и кэшировать по мере необходимости. Однако, это даст гораздо более серьезную нагрузку на сервер.
Sergey Konstantinov
28 января 2016, 06:53
Вы все правильно поняли :) Если хотите показывать-скрывать группы маркеров, придется на каждую группу завести свой слой. Посмотрите, например, на слои фотографий, развязок и видеокамер на Яндекс.Картах - они сделаны по такой технологии.
Так, я тут уже вовсю разбираюсь с активными областями...

Вроде все получается, только вот нужно придумать, как лучше организовать формирование этих тайлов, если на карте происходят изменения (добавление/удаление маркера). Не перерисовывать же все тайлы, правильно?
Но больше всего волнует другое, как организовать кластеризацию??? Чтобы при уменьшении зума, маркеры группировались? Где то вроде видел пример или упоминание, но так и не могу вспомнить, может дадите наводку, где искать?
и еще, а можно активные области прикрутить к каре google?