Клуб API Карт

Как считать координаты тайлов?

Андрей
7 января, 18:52

Я пытаюсь сделать http-метод, выдающий данные для активных областей. Вот как тут https://tech.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/hotspots/hotspot-area-docpage/ . Всё моё приложение работает в координатах (широта/долгота), и мне нужно перевести их в номер тайла в соответствующем масштабе.

Я нигде не нашёл алгоритма перевода координат в номера тайлов и позицию на тайле. Вот тут написано только то, как карта режется на тайлы https://tech.yandex.ru/maps/doc/theory/concepts/coordinates-docpage/ , но не дано ничего более конкретного.

Я попробовал посчитать наиболее простым способом (например, для Москвы 55,546875 сш - это (90-55,546875)=34,453125 градусов от полюса, от верха карты. Если взять z=8, то есть 256 тайлов, и 34,453125÷180×256 = 49 - номер тайла по вертикали). Но оказалось, что реальный номер тайла - 80. Кажется, это связано с проекцией. Нужно проецировать точки на цилиндр и счиать тайлы уже на нём? Или как-то ещё?

4 комментария
Геокоординаты -> глобальные пиксели -> номер тайла 
В этом проекте есть все формулы для расчётов 
https://github.com/dimik/geohosting-server/tree/master/lib
dimik,
а это действительно стандартный способ задания активных областей в яндекс-картах? мне нужно нажимать на определённые точки нарисованной линии и привязывать к ним данные. я вообще в ту сторону думаю?
Обновлено 7 января, 22:22
dimik,
я почитал код. мне показалось сомнительным использование длины экватора для вычисления кол-ва пикселов на метр для широты. во-первых, у нас эллипсоид, а не шар. во-вторых, в проекции меркатора невозможно нарисовать полюса - они получаются бесконечно далеко, а длина меридиана будет бесконечной, а не полэкватора. то есть, если взять, например, 89 градусов сш, то там уже отрицательный тайл должен получиться.


https://github.com/dimik/geohosting-server/blob/d6c13367c8a39651becc7048d9b366acc4ce8190/lib/projection/geo-to-global-pixels.js#L37


сам код я запустить не смог, видимо, надо настраивать nodejs как-то правильно. позапускал определённые фрагменты, переведя их на go, так что мог допустить ошибки


хотя, вот тут описано точно так же
https://yandex.ru/blog/mapsapi/6654/56a9a310b15b79e31e0d7387


наверное, подойдёт, хотя лучше было бы знать географические координаты верхнего левого угла. поэкспериментирую ещё.
Андрей,
всё, разобрался, спасибо. Как-то сходу не понял, что карта квадратная, и общее кол-во пикселов по X и по Y одинаковое