Последнее время работал с темой, которая меня изрядно напрягла, хотя я с детства любил и карты и тригонометрию со стереометрией; но профессиональных знаний по картографии всё же не хватило.
Свободно доступных SVG-карт не так-то много. Взял
вот эту. Встал вопрос: как пересчитывать реальные географические координаты в декартовы координаты этой картинки и обратно? Ясно, что это зависит от использованной на карте проекции. А какая она там, проекция? Неведомо.
Я исходил из оптимистического предположения, что равнопромежуточная коническая. Выбрал опорные точки и принялся подгонять (путь аналитического решения пришлось в конце концов отложить в пользу численного). Какие тут свободные параметры преобразования? Где-то есть полюс - это две координаты на плоскости, два параметра. Третий - масштаб, упрощённо говоря - расстояние между параллелями. Не сразу сообразил, что нулевой мередиан идёт не строго влево, а неизвестно куда, а конус же разворачивается на плоскости в угол не 360 °, а меньший (подгонка дала 293 °). Это ещё два параметра.
Дальше дело застопорилось. Javascript (как и PHP, кстати) и MSO Excel имеют разный порядок аргументов в функции atan2 и по-разному понимают оператор ^ (а это я, конечно, знал, но всё время из головы вылетает). Но и преодолев эти заминки, я продолжал получать искажения в сотни километров.
Уже совершенно интуитивно (что нехорошо, вообще говоря,- следует представлять, что творишь) я догадался добавить ещё один параметр: отступ 90-й параллели от гипотетической точки полюса. После этого всё вроде сошлось, с точностью, которую я посчитал адекватной карте и прицельности моего тыкания мышкой (искажения менее 8 ′ в самом худшем случае). В общем, полюс на этой карте отображается не в точку, а в дугу. Задачу я пока что решил, но понимание того, что это за проекция, совсем утратил. Надеюсь, не потребуется.