Клуб API Карт

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

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

Необходимо расширить возможности масштабирования для собственного слоя карты.

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

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

Заменила событие getTileUrl, с ним все понятно, но как правильно переписать событие getTileSize? Я не понимаю связи между номером масштаба и размером тайла. У меня они на карте вообще всем 256х256. Поэтому я попыталась решить задачу угадыванием.

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

layer.getTileSize = function (zoom)
{
  if (zoom > 12) m = 512;
  else m = 256;

  return [m, m]
}

Но мне нужно больше.

Подскажите, чем надо руководствоваться заменяя событие getTileSize?

6 комментариев
Sergey Konstantinov
27 января 2016, 23:00
m = z > 12 ? Math.pow(2, z - 4) : 256

Спасибо! Все заработало :)

 

Не сочтите за наглость: это "рыба", а мне бы очень хотелось "удочку".

Подскажите, где про эти подробности почитать.

Спасибо. Но под "подробностями" я имела ввиду соотношение между масштабом карты и размером тайла.

В стандартых слоях размер тайла всегда 256 px. Метод getTileSize специально сделан публичным в интерфейсе слоя чтобы этот размер пользователь мог менять как ему нужно. У вас может быть даже один тайл для всех масштабов.

Если вы объясните подробнее что именно непонятно, мы можем подробнее объяснить

Я постараюсь! :)

 

Итак, в стандартных слоях размер тайла всегда 256 px.

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

Мне понятно зачем и как переопределять метод, возвращающий адрес, по которому нужно искать тайл. Здесь вопросов нет.

И вроде бы как достаточно определить только один этот метод: getTileUrl. Но оказывается, что это не так. И чтобы карта на любых масштабах показывалась корректно, обязательно нужно переопределить метод getTileSiz.

Но раз существует необходимость переопределить метод, возвращающий РАЗМЕР тайла, значит этот размер не всегда должен быть равен 256?

Физически у меня на диске тайлы лежат размером в 256 точек. Но я должна отдавать в getTileSize какие-то другие размеры. Догадываюсь, что это связано с тем, что движок должен эти самые тайлы как-то растянуть.

Так вот вопрос именно в этом — какие размеры я должна отдавать в этом методе? Чем эти размеры определяются?

Вот мне подсказали формулу: два в степени (номер масштаба минус четыре).  Подозреваю, что это для частного случая, мною указанного.  Потому что для других моих карт эта формула не подходит. Например, у меня есть карта с тайлами максимального масштаба 16, но для неё я не смогла растянуть ее до масштаба 17 вышеприведенной формулой.

 

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