Shoorick
Автор

Столкнулся со следующей проблемой при автоматической генерации map файла (привязки карты для OziExplorer). В конце файла есть параметр MM1B, методика расчета которого не совсем очевидна. В интернете толковых ответов нет. Привожу свое решение - может еще кому пригодится.

По справке Ozi, MM1B - это соотношение метры/точки, измеренное в горизонтальном направлении карты. Или число метров, которое помещается в одном пикселе изображения.

Точная методика расчета, которой пользуется Ozi, не документирована. В других сгенеренных привязках (maps.poehali.org, спутниковые снимки с geoengine DOI-10M-*) MM1B немного отличается от значения, который проставляет сам Ozi.

Методы решения:
1. Проставить любое значение (например, 10.0), потом загрузить карту, выполнить "Check Calibration of Map" и "Save". Ozi сам поправит параметр.
(Мне не подошло из-за большого количества карт).

2. Определяем длину параллели на нужной широте, потом находим длину сегмента между левым и правым краями карты.
mm1b = ( 2 pi R cos(широта) / 360 * (долгота_вост - долгота_зап) ) / ширина_в_пикселях
R Земли = 6372795.
Широта здесь и ниже берется по середине карты.
Отличие от значения, которое считает Ozi сам - 0.35%.

3. Пользуемся формулой для вычисления great circle distance
( http://en.wikipedia.org/wiki/Great_circle_distance )
Для нашего случая она сворачивается в:
mm1b = (R 2 asin(cos(широта) * sin((долгота_вост-долгота_зап)/2))) / ширина_в_пикселях
Результат такой же, видимо это аналогичная формула.

4. Расчитываем по проекции WGS84 (основную для Ozi)
( http://ne-grusti.narod.ru/Glossary/coordinates.html
http://ne-grusti.narod.ru/Glossary/ellipsoid-geoid.html )

Параметры эллипсоида GRS80, который используется в WGS84:
A = 6378137
B = 6356752.31425
E2=(A^2-B^2)/A^2
V = A / sqrt(1-E2*sin^2(широта))

Координаты левого края карты:
x_зап = V cos(широта) cos(долгота_зап)
y_зап = V cos(широта) sin(долгота_зап)
Координату z не считаем, так как для обоих краев она будет одинаковая.
x_вост и y_вост считаем аналогично.
Расстояние между краями hd = sqrt((x_вост-x_зап)^2 + (y_вост-y_зап)^2)
mm1b = hd / ширина_в_пикселях

Это самый точный метод, получается значение, которое отличается от Ozi на 0.05% (третий знак после запятой).
/Поправка 29.10.2007:/ Точнее получать, видимо, смысла нет, так как сам Ozi при конвертации из Geotiff и MrSid считает не так, как при Calibration Map, и делает даже большУю ошибку.