Разбирался сейчас с функцией mapPlaneUTMToGeoWGS84ByZone в старой версии gisdesigner (11-ая версия)
На форуме информации не нашёл, поэтому оставлю здесь пост, может кому-нибудь пригодится (для большинства эти вещи очевидны, вероятно).
Итак, функция:
Код
// Преобразование координат в метрах на местности из заданной зоны UTM
// в геодезические координаты в системе WGS-84. // 03/07/06
// zone - номер исходной зоны системы UTM
// x,y - преобразуемые координаты
// на входе метры в одной зоне UTM, на выходе - радианы WGS-84.
// При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapPlaneUTMToGeoWGS84ByZone(long int zone, double * x, double * y);
С помощью этой функции я хотел вычислить координаты левого нижнего угла растрового файла , у которого в паспорте написано что он в системе UTM на WGS84.
Код
// Типы флага "Тип карты"
typedef enum MAPTYPE
{
// UNDEFINED = -1, // Не установлено
TOPOGRAPHIC = 1, // Топографическая (СК42), требует осевой меридиан
CK_42 = 1, // Система координат 42 года, требует осевой меридиан
...
UTMWGS84 = 11, // UTM на WGS84, требует осевой меридиан
...
}
MAPTYPE;
Проекция, эллипсоид и система координат (поля в паспорте rsw) действительно соответствуют этому типу карты.
Координаты (по паспорту rsw) левого нижнего угла rsw:
Код
X: 6.69006e+06
Y: 609109
На выходе мы хотим получить WGS84 долготу/широту. Если использовать PHOTOMOD GeoCalculator, то результат будет:
Код
B:60.332346299
L:28.976193205
Тут главное не забыть, что в паспорте rsw ось X направлена вверх, ось Y направлена вправо (как в проекции Гаусса-Крюгера), а в универсальной поперечной проекции Меркатора ось Y вверх, а ось X вправо. Соответственно, X - это широта, а Y - это долгота (не смотря на то, что в проекции Меркатора Y это широта, а X долгота)
Зоны в Меркаторе нумеруются не так, как в Гауссе-Крюгере, они сдвинуты на 30 вправо относительно зон Гаусса-Крюгера:
Код
int MapIndexer::calcTransverseMercatorZone(double axisMeridianInRadian)
{
int x = (calcSK42Zone(axisMeridianInRadian) + 30) % 60;
return x?x:60;
}
В паспорте rsw осевой меридиан (AxisMeridian) указан как 27 градусов, это 5-ая зона в Гауссе-Крюгере и 35-ая зона в Меркаторе. Указываем данные (35-ая зона, E, N) в фотоплане и получаем координаты: Скриншот
А чтобы получить те же координаты с помощью mapPlaneUTMToGeoWGS84ByZone нам придётся отредактировать Y.
Сначала вычтем из него значение FalseEast из паспорта карты (смещение центра координат на восток) и получим расстояние от точки до осевого меридиана по оси Y
FalseEast в паспорте rsw указан как 500000 (метров), то есть Y получится 109109 вместо 609109.
Дальше к значению нужно прибавить номер зоны в меркаторе умноженный на 1000000 (миллион), то есть 35 * 10^6, получим 35109109.
И вот теперь функция mapPlaneUTMToGeoWGS84ByZone сможет вычислить для нас координаты. Пример:
Upd. А для точек в южном полушарии, вероятно, из X надо будет вычитать FalseNorth (поле в паспорте rsw) равное 10000000 (10 миллионов) метров. Чтобы, к примеру, из значения 3309940.0 получить -6690060.0 и уже вот это отрицательное значение отдавать в функцию mapPlaneUTMToGeoWGS84ByZone