Клуб API Карт

Смещение тайлов относительно Google спутника

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

Здравствуйте снова! Очередная непонятка:

Я наложил свой слой через TileDataSource. Рассчитал нулевые номера тайлов и добавил соответствующие смещения в TileDataSource.getTileUrl() вот так:

/*
  urlTemplate - tile-%z-%x-%y.png
  opt.xntile - номер нулевого тайла, откуда я пристыковую свой слой.
  11 и 17 - масштабы на которых доступен мой слой.
  opt.kt - коэффициенты смещения для каждого масштаба.
*/
myData.getTileUrl = function (tile, zoom) {
  var exists = zoom >= 11 && zoom <= 17;
  var offset = {
    x: exists ? Math.floor(opt.xntile / Math.pow(2, 17-zoom)) + Number(opt.kt["kt"+zoom].x) : 0,
    y: exists ? Math.floor(opt.yntile / Math.pow(2, 17-zoom)) + Number(opt.kt["kt"+zoom].y) : 0
  };
  return this.getTileUrlTemplate().replace(/%x/i, tile.x - offset.x).replace(/%y/i, tile.y - offset.y).replace(/%z/i, zoom);
}

 

Происходит то что происходит - с удалением от нулевого тайла (к которому я привязываюсь) глобальной карты, смещается мой слой относительно гугл-спутника. Причём (что меня афигенно удивляет по незнанию наверное) - если сохранить выборочно тайлы (из удаленных друг от друга мест карты) и в графическом редакторе совместить их с моим слоем, то они идеально лягут и никаких смещений не будет!! Что это? поможите люди добрые!

Картинками ниже я постарался описать проблему, для упрощения понимания. Они показывают что происходит на моей странице в двух удаленных друг от друга местах карты.

 

 

 

Поможет ли мне это??

 Так как же всунуть в Яндекс карты тайлы приготовленые для Гугла, в том числе и карты самого гугла? (от thekashey)

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

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

рисовать тайлы ручками - это перерисовывать?

я прочитал пару статей что нашел на эту тему, но до меня не доходит несколько вещей:

- если сохранить выборочно тайлы и в графическом редакторе совместить их с моим слоем, то они идеально лягут и никаких смещений не будет!! где этот cдвиг на уровне html или js происходит?

- обязательно реализовывать ITile интерфейс как в статье?

Все дело в том что тайлы для яндекса и гугла физически имеют разные размеры.

В общем случае считайте что из "идеальной" фотки земли гугл получит тайл размером 256 пикселей, а яндекс 256.5

В пределах одного тайла они вроде как выглядят совершенно одинаково. А вот когда ошибка накапливается - получается большое смещение.

Самый простой и стабильный способ показать гугл тайлы на яндекс карте - показать их ручками.

Возмем "рыбу ручного контейнера" - и заменим интерфейс с гугл на яндекс.Оverlay. Останеться изменить момент получения bounds & zoom + конвертер и все готово.

Отображаться будет без глюков

мысли: "рыба ручного контейнера" это реализация GTileLayerOverlay.. значит нужно будет отображать мои тайлы через Гугл интерфейс? (сейчас яндекс слоями).

Если да, то того же самого я добиваюсь использованием кода из топика "Google тайлы на яндекс картах - SOLVED"?

(для себя и может для кого-то) насчёт моего вопроса, смещение происходит на уровне css:

element.style.top = py + 'px';

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

Меня вдруг осенило: если мои тайлы наложить поверх гугла обычным способом, то они совпадут?