На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

mapPlaneUTMToGeoWGS84ByZone описание gisdesigner11

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
mapPlaneUTMToGeoWGS84ByZone описание gisdesigner11, mapPlaneUTMToGeoWGS84ByZone описание gisdesigner11
 
Здравствуйте.

Разбирался сейчас с функцией 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 сможет вычислить для нас координаты.
Пример:

Код
    int zone = 35;
    double FalseEast = 500000.0;
    double X = 6690060.0;
    double Y = 609109.0;
    double Bx = X;
    double Ly = zone*1000000.0 + (Y - FalseEast);
    long rc = mapPlaneUTMToGeoWGS84ByZone(zone, &Bx, &Ly);
    if (rc != 0){
        qDebug() << "Utm B:" << Bx/M_PI*180.0 << " L: " << Ly/M_PI*180.0;
        qDebug() << "Utm B:" << Bx << " L: " << Ly;
    }
Код
Utm B: 60.3323  L:  28.9762 
Utm B: 1.053  L:  0.50573 


Upd. А для точек в южном полушарии, вероятно, из X надо будет вычитать FalseNorth (поле в паспорте rsw) равное 10000000 (10 миллионов) метров. Чтобы, к примеру, из значения 3309940.0 получить -6690060.0 и уже вот это отрицательное значение отдавать в функцию mapPlaneUTMToGeoWGS84ByZone
Изменено: Владимир Егоров - 29.05.2019 16:39:45
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности