Клуб API Карт

Какая проекция используется в Яндекс.картах ? -- ДОПОЛНЕНИЕ

mik-usachyov
25 апреля 2009, 14:22

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

В документации ( http://api.yandex.ru/maps/jsapi/doc/dg/concepts/coordinates_conversion.xml в пункте 'Географические координаты', под картинкой ) сказано "...В действительности, в Яндекс.Картах видимая область карты по широте ограничена несколько меньшими значениями, так как в околополюсных областях визуальные искажения становятся настолько сильны, что эти области просто нет смысла отображать на карте..."

Но точных цифр я не нашёл.

Помогите, пожалуйста, разобраться с этим.

Дополнение:


На самом деле мой вопрос заключается примерно в следующем:
Картами очевидно используется проекция Меркатора, точнее её часть, ограниченная по оси У значениями -0.5 и +0.5, которым соответствуют широты в градусах приблизительно -85.05112878 и +85.05112878.
Я в своём проекте накладываю карты на глобус исходя из этих предположений. Также на глобус я накладываю метки населённых пунктов, координаты которых (в градусах широты и долготы) взяты с сайта www.geonames.org. Так вот положение меток и визуальные центры городов на картах существенно расходятся (до нескольких десятков километров). Расхождения наблюдается только по широте, а по долготе расхождений нет.
Замечено следующее: в районе экватора расхождений практически нет. Поэтому я предположил, что карты имеют некоторый коэффициент сжатия, а центр сжатия -- экватор. И, как следствие, что охвачена картами территория, несколько большая, чем территория по оси У от -0.5 до +0.5 по проекции Меркатора, но помещена она в тот же квадрат, из которого нарезаются тайлы. При попытке измерять величину "коэффициента расхождения" на разных широтах, получились неоднозначные результаты (возможно, я где-то в расчёте напутал, но сам ошибки не нашёл).
Привожу сравнительные с гуглом примеры.
В каждом примере находится один объект на картах яндекса и гугла на одном уровне детальности и сверяются номера тайлов по координате У (т.е, приведённые числа есть номера тайлов).

Слева гугл, справа яндекс:
-1) Южная точка о. Тасмания: x=7437, z=13. y-values: google 5201, yandex 5195.
Число тайлов на данном уровне 8192. Абсолютное расхождение ~6.
Коэффициент расхождения: ( 5201 - 8192 / 2 ) / ( 5195 - 8192 / 2 ) = 1105 / 1099 = 1.00546
google yandex
0) Южная часть аэропорта города Entebbe в Африке (0.05 градусов северной широты): x=4834, z=13. y-values: google 4095, yandex 4095.
Число тайлов по вертикали на данном уровне 8192. Расхождение не видно.
google yandex
1) РГУПС-кольцо(Ростов-на-Дону): x=79989, z=17. y-values: google 45967.75, yandex 46070.375.
Число тайлов по вертикали на данном уровне 131072. Абсолютное расхождение ~103.
Коэффициент расхождения: ( 131072 / 2 - 45967.75 ) / ( 131072 / 2 - 46070.375 ) = 19568,25 / 19465.625 = 1.00527
google yandex
2) Петропавловская крепость, отдельная постройка в центре(центр её основания): x=76573, z=17. y-values: google 38099, yandex 38220.
Число тайлов 131072. Абсолютное расхождение ~121.
Коэффициент расхождения: ( 131072 / 2 - 38099.375 ) / ( 131072 / 2 - 38220.45 ) = 27436,625 / 27315,55 = 1.00443
google yandex
3) Южная точка острова Диксонский(Северный ледовитый океан): x=3181, z=12. y-values: google 583, yandex 587.
Число тайлов 4096. Абсолютное расхождение ~4.
Коэффициент расхождения: ( 4096 / 2 - 583.5 ) / ( 4096 / 2 - 587.75 ) = 1464.5 / 1460,25 = 1.00291
google yandex

Аналогичное сравнение с yahoo всё подтверждает; у yahoo, правда нумерация тайлов по У несколько отличается (что сути не меняет). У гугла нумерация тайлов точно такая же как у яндекса.
Расхождения везде, не считая "приэкваторных территорий". Хотелось бы разобраться в этой картине, поскольку хочется использовать наши карты, а пока не получается...
И, если есть какие-то точные цифры относительно проиллюстрированного -- хотелось бы их увидеть.

Или подскажите, плз, где-что я не догоняю..

25 комментариев
Подписаться на комментарии к посту
По-видимому, проекция Lat/Lon
Кромки на 85-м градусе, с небольшим запасом.
(коммент, чтобы пост вверх поднялся)
Стандарт WGS84 учитывает эллипсоидность формы Земли.
О, большое спасибо всем ! А я что-то в упор не подумал, что могут использоваться формулы, учитывающие эллипсоидальность Земли, карты-то двухмерные... Интересно, а google earth учитывает эллипсоидальность?... Или у них два набора тайлов (учитывающих и не учитывающих), раз тайлы их плоских карт не учитывают... Ещё раз спасибо :-)
Не учитывает. У гугла используется проекция на сфероиде, а у Яндекса - на эллипсоид WGS-84
Хотя Яндекс.Карты и сделаны в проекции Меркатор, они не соответсуют проекции EPSG:900913, которую используют все основные картографические сервисы - Google, VirtualEarth, Yahoo, OSM. У Яндекса обрезка по верху и низу идет на других широтах, из-за чего если их не учесть, Яндекс.Карты будут чуть сдвинуты к югу.
По-моему, Вы что-то не то говорите. Если бы дело было в обрезке, расхождение было бы линейным. Т. е. коэффициент всегда был бы одинаковым. Тут дело как раз в проекции. Google, Yahoo!, VirtualEarth и OSM (короче, все буржуи) используют упрощённую проекцию на сфероид. Yandex и Kosmosnimki (в общем, все русские) исползуют более сложную проекцию на эллипсоид WGS-84 (т. е. учитывают приплюснутость Земли к полюсам). Поэтому, требуется сложный пересчёт. Простым умножением и сложением (как было бы в случае с другой обрезкой) не обойтись.
Собственно, ради чего спрашивал (хвастаюсь): http://fotki.yandex.ru/users/mik-usachyov/
А какая значит финальная функция дружбы гугла и яндекса?
у google детализация спутниковых снимков больше
Вопрос в том можно ли скрестить два разных набора тайлов - от Я и от Г
а что в чём должно быть? гугле карты на яндекс API.... или наоборот?
тайлы для гугла на яндекс карте. Мне получилось свести тайлы для москвы, но через тысячу километров по вертикали они опять расходятся, немного, но есть.. судя по всему, так как проекция яндекса чуть уже - в тайле опять же чуть меньше данных. на зумах больше 8ми это можно обойти выше - выше можно уже не делать наложение.. формула у меня получилась дубовая :) Реализуем ITile и меняем позицию картинки тайла для москвы смещение будет 1886740.1113891974/Math.pow(2,23-zoom); образно это 20037508.3427892(гугл)-18764656.2314(яндекс) + ручками вывереное смещение.. в радиусе пары сотен километров от москвы - идеально Далее... а далее формуле наплевать на реальные координаты тайла Хорошо хоть что вертикальные размеры тайла можно не трогать(на зумах >8) ибо там доли пикселя разница
а пример попытки реализации есть?
сводилось на http://www.esosedi.ru/onmap/transportnaya_razvyazka_simferopolskogo_shosse_i_dorogi_podolsk_domodedovo_/3924915/index.html#lat=55436755&lng=37615210&z=15&v=4&mt=2 наложение беты для гугла и яндекса совпадают, но у яндекса чуть смещен сам спутник по горизонтали, иногда бывает адрес тайла y=10294 теперь берем центр москвы http://www.esosedi.ru/onmap/krasnaya_ploschad/278/index.html#lat=55754304&lng=37621031&z=15&v=4&mt=2 адрес тайла 10243, разница 51 тайл или 13056 пикселей, или 35км дельта смещения 24,8 пиксе вниз.. или 0.48 пикс на тайл (как вариант - каждый тайл на 0.48 меньше, но проще позиционировать, стыки не смертельны)
504 Gateway Time-out
ага, красота :)
целый час чинили - вроде починили, пару часов еще поработает
потом опять положим
Подскажи пожалуйста, человеку почти не разбирающемуся в программинге:)

У меня есть:
var gMap = new YMaps.TileDataSource('http://khm1.google.ru/kh/v=40', false, false);
var gMapType = new YMaps.MapType(new YMaps.MapLayer(gMap), 'Google Maps', {minZoom: 1, maxZoom: 17});

gMap.getTileUrl = function(tile, zoom) {
    return this.getTileUrlTemplate() + '&x=' + tile.x + '&y=' + tile.y + '&z=' + zoom + '&s=G';
}

и

map.addControl(new YMaps.TypeControl([YMaps.MapType.MAP, YMaps.MapType.SATELLITE, YMaps.MapType.HYBRID, gMapType]));

Которые выводят кнопку, и сами карты гугл. Но аналогично - существует проблема смещения гугловских карт.

Каким образом (кусок кода) в это конструкции прописываются приведенные тобой схемы?
Это очень помогло бы. Заранее спасибо!
Космоснимки Yandex живут в универсальной проекции меркатора epsg:3395. Схемы вероятно тоже в ней.
В общем ясно что надо сделать свой вариант ITile чтобы сдвигать тайлы по вертикале при отображении для москвы, зум 10 это около 190 пикселей в низ.. но почему... не могу понять финальную формулу.. Итак - имеем на вход iTile.setPosition - почему тайлы должны опуститься
Наши, как обычно, сделали не как у всех нормальных людей. Даже если использована проекция маркатора не на сферу, а на эллипсоид, то это не делает карту точнее :-) Главное, чтобы карта была достоверна в своей проекции, а зачем тогда делать ее сложной? Горе от ума... :-D
По-моему всё правильно сделали.
Высоты в различных источниках данных в основном относительно эллипсоида WGS84 -- фактически стандарт.

Во как поговорили... а ответ был двумя страницами выше в руководстве :-D
Так всетаки какова формула пересчета координат или гыде ее взять??