Клуб API Карт

Собственная карта как оверлейный слой

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

Всем привет.

Тут возник интересный вопрос про собственные карты.

Итак, имеем свой карточный слой, который хочется отобразить поверх яндексовской карты.

Создаем слой, добавляем его, все ОК.

Вот только тайлов яндекса нет


tileTransparent указывал в true.
notFoundTile не определен

Отрисовываются собственные тайлы и дефолтный текст о том, что здесь тайлов нет


Если ответ - укажите notFoundTile, то не прокатит, так как у слоя проекция, например, другая.


Т.е. хочется, в конечном итоге получить полную карту, но где есть мои тайлы - там они выводятся, а где нет - там дефолтные тайлы я.карт.


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

Приведите код или ссылку на карту

Без проблем.

Вот, на на своем сайте разработки создал только что

http://development.zhuk.cc/index.php/user-maptype

 

Там 2 типа

* Locia

* Locia 2

Отличаются только установкой свойства прозрачности

 

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

Вам нужно, чтобы ваш тип карты показывал сразу два слоя - и слой яндекс карт, и ваш кастомный слой.

ymaps.mapType.storage.add('customMapType4', new ymaps.MapType('Locia',// Возьмем список слоев для типа карты Яндекс и добавим к нему свой слойymaps.mapType.storage.get('yandex#map').getLayers().concat(['customMapType4']));

Ага, вот где собака порылась :)

Т.е. если я хочу просто новый слой для карты, я делаю

 

ymaps.layer.storage.add('customMapType4', customMapType4);

 

Если хочется оверлей, то

ymaps.mapType.storage.get('yandex#map').getLayers().concat(['customMapType4']);

 

Ну, типа того. Поэкспериментирую. Спасибо,

Этим действием вы зарегистрируете ключ для определенного слоя в хранилище.

Добавление слоя на карту происходит через map.layers.add(...);

ymaps.layer.storage.add('customMapType4', customMapType4);

 

Теперь про эту строчку

ymaps.mapType.storage.get('yandex#map').getLayers().concat(['customMapType4']);

Тут мы берем тип карты "yandex#map", достаем его из хранилища ymaps.mapType.storage.get('yandex#map')

Далее получаем массив из ключей слоев, которые показываются для этого типа карты. ymaps.mapType.storage.get('yandex#map').getLayers()

И к этому массиву добавляем еще один наш слой. Теперь наш слой будет показывать вместе с картой от яндекса

Отлично, получилось.

Т.е.

Если хочу оверлеем, я добавляю свой новый слой

ymaps.mapType.storage.add('customMapType5', new ymaps.MapType(
    'Locia 2',
    ymaps.mapType.storage.get('yandex#map').getLayers().concat(['customMapType5'])
));

Если же отдельным слоем
ymaps.mapType.storage.add('customMapType5', new ymaps.MapType(
    'Locia 2',
    ['customMapType5']
));

Тогда еще один вопрос: правильно ли я понял, что если я хочу добавить свой слой оверлеем на все "предопределенные" яндексовские типы карт,
то мне просто надо насоздавать свои типы с таким же названием, добавить в сторадж и в список доступных  карт.
Или можно создать слой, а потом просто пройтись и добавить его
ymaps.mapType.storage.get('yandex#map').getLayers().concat(['customMapType5']);
ymaps.mapType.storage.get('yandex#satellite').getLayers().concat(['customMapType5']);
ymaps.mapType.storage.get('yandex#hybrid').getLayers().concat(['customMapType5']);

Я не уверена, корректно ли отработает добавление слоя "на лету", лучше пересоздать типы карты с теми же названиями.

Попробовал - не прокатило :(

Правда, оно и к лучшему - придумал отличный вариант реализации (и проще в реализации, и проще в понимании концепции), так что на днях реализую в расширениях.

Спасибо