Клуб API Карт

Как разместить canvas на карте

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

Насколько я знаю, графическое ядро спрятали, и функций к доступу контейнеров нет.

куда копать? 

layer.tileContainer.DomContainer?

15 комментариев
Sergey Konstantinov
28 января 2016, 04:57

Поясните подробнее, что вы хотите сделать?

Я хочу выводить слой с отрисованными на канвасе метками.

этот слой отрисовывается потайлово на клиенте .

у DomContainer есть опция tileClass, его и можно перегрузить своим, так чтобы он реализовывал IDomTile

 слой подхватывается, тайл - нет

var MyDomTile = function(url) {this.tile = null;this.ready = false;this.events = null;this.destroy = function() {if (this.tile && this.tile.div){this.tile.div.remove() ;};};this.isReady = function() {return this.ready;};this.renderAt = function(context, clientBounds, animate){alert('render') ;};} ;this.layer = new ymaps.Layer('%c', {tileTransparent : true}) ;this.container = new ymaps.layer.tileContainer.DomContainer(this.layer, {class : MyDomTile}) ;this.map.layers.add(this.layer) ;

кстати, в документации:

Функция-шаблон получает на вход три параметра:
tileNumber - массив из двух чисел, номера тайла по x и y;
tileZoom - уровень масштабирования;
Возвращает строку-URL.

 таки 2?

таки два. Первый массив из двух чисел, второй - зум.

Больше вроде бы не и требуется.

опция называется tileClass

все равно не подхватывает.

пытается загрузить картинки.

даже конструктор не срабатывает 

Почитала сейчас документацию - там неоднозначное описание Layer.

На самом деле обстоит все так.

Layer сам инстанцирует layer.tileContainer.DomContainer внутри себя.

И выставляет свои опции родительскими для DomContainer.

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


В вашем примере создается отдельно контейнер и отдельно слой, которые между собой никак не связаны. Поэтому опции до слоя и не доходят.


Правильно так:

this.layer.options.set('tileClass', MyDomTile);

спасибо, почти все получилось!

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

осталась одна проблема:

вероятно из-за анимации мои тайлы не удаляются с карты. функцию destroy я почти полностью передрал с вашей.

this.destroy = function() {if (this.content && this.content.parentNode){this.content.parentNode.removeChild(this.content);}this.content = null;};
такое ощущение, что перед срабатыванием деструктора элементы вынимаются из dom (parentNode = null), но остаются в кэше (сам элемент существует). 

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

деструктор вызывается для предпоследнего зума. то есть после зума 10-11-12 удаляются только 10 зум. 11 и 12 видны.

а как убрать предыдущий? 

Sergey Konstantinov
28 января 2016, 04:57

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

Если хотите отключить этот механизм - поставьте слою опцию tileTransparent: true

да, действительно, transparent...

теперь смешно получается - http://maps.1cs.su/index.html?mapMode=1&tileMode=0

спасибо большое.

Очень интересная темка.

 

в вашей реализации не учтен один момент...

При выводе на экран ошибочного тайла (это те, которые за приделами карты).

функция MyDomTile - начинает разбирать на массив строку url, значение которой  - null.


пойду поиграюсь с notFoundTile и tileTransparent.

Но у вас - tileTransparent - необходимое условие - прозрачные. (для удаления тайлов после изменения зума).

Если, даже и выйдет подсунуть нужную строку в notFoundTile, то проверку в MyDomTile - все равно делать нужно...