Всем известно, что напечать ядрекс-карту API 2.х с метками и кластерами просто так не получится. До сих пор карта строится не на канвасе, а на дивах с подложкой (background-image). Да и канвас любимому браузеру не поможет.
Была поставлена задача — быстро сделать версию для печати карты. Количество меток — более 600 + кластеры «из коробки».
Работающий вариант под катом
инициализируем карту как обычно — зум и центр берем из ссылки

делаем принтер-френдли лейаут для метки
тут надо сказать, что принтер-френдли — это значит, что не используем background-image, а делаем кучу дивов с имиджами.
у меня иконка метки состоит из 2 частей — картинки и подложки. и то и другое — в спрайте. поэтому такой бешеный style. его я привожу inline для наглядности

то же самое — с иконкой кластера. заморачиваться с разными размерами иконок кластера под разное количество точек внутри я не стал — быстро надо было)

здесь получаем контейнер лейера самОй подложки карты

так как типы карты у статики другие, делаем соответствия и получаем центр карты

size — это засада. статик отдает максимум 650 на 450. тоже заморачиваться не стал — пускай будет максимум
div с картой тоже надо делать не больше этих размеров.
по-хорошему, если делать див с картой большого размера, нужен другой подход — через layer.

формируем линку для статики

тут начинается магия
делаем див с абсолютным позиционированием и располагаем его посередине, так как привязка pane будет к центру вьюпорта. на самом деле, надо было вызывать map.panes.get(‘layers’).getViewport() и считать центр. но при загрузке pane лежит посередине, а карту мы двигать не дадим

вставляем внутрь img со статикой

и вставляем в контейнер лейера над остальными элементами

хорошая функция — отключает все события карты. теперь ни сдвинуть, ни позумить

тут я добавляю на карту свои маркеры. они у меня лежат в переменной window.data

теперь кластерер. что такое margin — я не помню, но было на нормальной карте

для иконок кластеров устанавливаем макет

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

добавляем маркеры в кластерер

на всякий случай кластерер тоже заглушим

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

тада!!! все работает и печатается (если браузер выдержит такое количества dom-объектов)
один лишь баг — два копирайта. при удалении с карты или даже скрытия сыпятся ошибки. для и ладно.

посмотреть можно тут

Комментарии