Рано или поздно SAS планете это произойдет, поэтому тему открою и наработки буду подкидывать.
Экспорт в формат навигаторов Magellan (.rmp)
Хотелка
В Хотелке вопрос :
> 1. Чем вас не устраивает текущий вариант экспорта?
Прямой экспорт всегда предпочтительный по самому определению "прямой экспорт".
Ну и кто сказал что для Magellana нужны карты только в географической проекции LatLong (далее LL)?
Да это просто более продвинутые пользователи по удобному алгоритму из растра в проекции LL научились собирать RMP.
А на самом то деле сам девайс (навигатор) этот растр обратно его коверкает, чтоб изобразить на своем экране картинку в равенстве по высоте и ширине в пересчете метров на пиксель. Этот факт сегодня уже признают что ни на есть магеллан-гуру.
С другой стороны даже самые отъявленные магеллано-центристы не оспаривают первенство изобретения навигатора Магелан перед появлением самих карт. И для удобства с некоторых пор эти растровые карты навигаторы Магеллан (как впрочем GPS других производителей) их поддерживает, а масштаб там (как на картах так и на экране Магеллана) указан отнюдь не в градусном представлении. Поэтому мне лично видится что в общем случае по растру Магеллан заточен отнюдь не исключительно под карты в проекции LL.
Но вернемся к второму пункту из Хотелки.
Моя задача реализуемая и имеет не единственное решение и к тому же разными способами. Проверено на широтах 50° , 7,5° и 69°
Самый удобный - прямое вычисление. Более замороченный - итерация.
Простой и понятный вариант следующий:
Допустим выделенная область 5тайлов в высоту 4 в ширину уровня z15. На данный момент имеем следующее.
область выделения:
30 тайлов (при выделенных 5х4=20), из которых верхний левый выкроен так :
и соответственно
Number of tiles in first block: 30
Width of tile in degree: 0,0219727
Height of tiles in degree: 0,0141654
И по "
2. Для произвольно взятой точки с координатами ALon, ALat и для "мира", разрешение тайлов которого равно ATileWidthDegree и ATileHeightDegree координаты тайлов считаются вот так:
AX := (ALon + 180) / ATileWidthDegree;
AY := (-ALat + 90) / ATileHeightDegree;"
то , скажем если привязываться к середине области выделения, для координаты ALat оригинальных тайлов меркатор из середины области выделения в данной выделенки получается что AY := 2823,843873 (при Height of tiles in degree:0,0141654).
Округляем результат до ближайшего целого (тут 2824) и обратным вычислением находим ATileHeightDegree_New, при котором нарезка совпадет с существующим меркатором. ATileHeightDegree_New := (-ALat + 90) / 2824 => ATileHeightDegree_New :=0,014164617
На этом можна было б и остановится.
Но у нас в выделенной области 5 тайлов в высоту, и лучший результат будет если для каждого ряда тайлов определится своя ATileHeightDegree_New, а конечный результат как среднее арифметическое этих ATileHeightDegree_New.
Сам результат довольно таки хорош и для сравнения с результатом, полученным итерациею с условиями допуска расхождения 1 пиксель на 16 тайлов, представлен на картинке.