Клуб API Карт

Задание координат для собственной карты по разрешению исходного изображения

Dimoks
9 мая, 01:49

Создал из исходного изображения разрешением 15000×10000 тайлы для масштабов с 3 до 6, и из них сделал собственную карту по примеру.

Моей целью было разместить начало координат в центре исходного изображения, правому верхнему углу его задать координаты (y, x): (5000, 7500), нижнему левому координаты (-5000, -7500). Протяжённость координат равна сторонам исходного изображения.

С помощью подсказки поддержки про использование размера мира на максимальном масштабе получилось задуманное через декартову систему координат:

/* до функции создания карты поместил вычисление размера мира для максимального масштаба*/

var MAX_ZOOM = 6;

var worldSize = Math.pow(2, MAX_ZOOM) * 256;

/* в функции же создания карты разместил проекцию так:*/

projection: new ymaps.projection.Cartesian([[5000-worldSize, -7500], [5000, worldSize-7500]], [false, false]))

Т. е. для координаты (y) нижнего левого угла исходного изображения из отрицательной желаемой координаты вычел размер мира, а для координаты (x) верхнего правого угла из размера мира вычел желаемую для него.

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

projection: new ymaps.projection.Cartesian([[worldSize, 0], [0, worldSize]], [false, false])

А если есть желание сделать отрицательное значение (y) для нижнего края, то так:

projection: new ymaps.projection.Cartesian([[-worldSize, 0], [0, worldSize]], [false, false])

Собственно для совпадения мировых координат с размерами исходного изображения требуется лишь указание размера мира для максимального масштаба в качестве одной из координат: для нижней левой — y, для верхней правой — x. Оказывается довольно просто.

3 комментария
Насколько я понимаю – координаты проекции расчитываются для 0-го масштаба
Размер холста на 0 масштабе = Math.pow(2 * 2, 0) * 256 === 256
Размер холста на 6 масштабе = Math.pow(2 * 2, 6) * 256 === 1048576


размер вашей картинки  на 0-м масштабе = [15000, 10000].map(n => n / Math.pow(2 * 2, 6)) ===
[3.662109375, 2.44140625]



Теперь делим на 2 чтобы получить углы проекции
projection: new ymaps.projection.Cartesian([[-1.8310546875, -1.220703125], [1.8310546875, 1.220703125]], [false, false])




dimik,
Не настолько далеко уходит точка с координатами 7500,-5000 от угла исходного изображения, чтобы применять перерасчёт на нулевой уровень. Просто эти координаты почему-то ложатся на самый дальний угол тайлов, а он на всех масштабах разный... Мне же нужно, чтобы эти координаты таки легли на угол исходного изображения.
Нашёл таки решение. Спасибо поддержке за намёк.