Имеется несколько MTW файлов. Читаю данные из этих файлов с помощью GDAL (https://www.gdal.org), используя язык программирования С++. Было обнаружено, что координаты каждого пикселя из матрицы MTW различаются с координатами из ГИС ПАНОРАМЫ 12 для СК WGS 84 в градусах. Более того, получаю разные результаты в ГИС ПАНОРАМЕ 12 и в QGIS.
Скажите, пожалуйста, как прочитать MTW файл с помощью GIS ToolKit? Скажите, пожалуйста, как получить все метаданные из файла (bounding box, СК, проекцию, координату каждого пикселя, высоту)? Скажите, пожалуйста, как затем перевести эти координаты в WGS 84, используя GIS ToolKit? Исходная система координат: Pulkovo 1942. Но для разных MTW СК отличается.
Из изученного API GIS Toolkit смог найти только _MAPIMP HMAP _MAPAPI mapOpenMtr(const char *mtrname, long int mode = 0);
Как прочитать MTW файл с помощью GIS ToolKit (mtrapi.h) -----------------------------------------------------------------------------------
Запросить описание файла матричных данных - mapGetMtrDescribeUn В структуре описания имеется габаритная рамка матрицы в метрах MTRDESCRIBEUN.FrameMeters Можно читать высоты по координатам в метрах
// Выбор значения абсолютной высоты в заданной точке. mapGetHeightValue(HMAP hMap,double x, double y);
// Выбор значения абсолютной высоты в заданной точке из // матрицы с наименьшим размером элемента (более точной) mapGetPrecisionHeightValue(HMAP hMap, double x, double y);
// Расчет абсолютной высоты методом треугольников в заданной точке mapGetPrecisionHeightTriangle(HMAP hMap, double x, double y);
// Возвращает интерполированную высоту в заданной точке // hMap - идентификатор открытой основной карты // number - номер матрицы высот в цепочке // interptype - тип интерполяции // 1 - ближайший сосед // 2 - интерполяция по ближайшим 3 элементам // 3 - билинейная интерполяция по 4 ближайшим элементам // 4 - бикубическая интерполяция по 16 ближайшим элементам // x, y - координаты точки в метрах // h - возвращаемое значение в метрах (при ошибке устанавливается ERRORHEIGHT) // При ошибке возвращает 0 mapGetHeightValueOfMtrEx(HMAP hMap, long int number,long int interptype, double x, double y, double *h);
// Расчет среднего значения абсолютной высоты по высотам квадратной области // Функция может использоваться для создания матрицы обобщенного рельефа // xcenter, ycenter - координаты центра области в метрах // size - размер стороны области в метрах (размер элемента матрицы обобщенного рельефа) // Возвращает среднее значение высоты в метрах // В случае ошибки при выборе высот и в случае необеспеченности // заданной области матричными данными возвращает ERRORHEIGHT mapGetGeneralHeight(HMAP hMap, double xcenter, double ycenter, double size);
// Выбор массива значений абсолютных высот, соответствующих // логическим элементам, лежащим на заданном отрезке. // hMap - идентификатор открытой основной векторной карты // Координаты точек, задающих начало и конец отрезка // (FirstPoint,SecondPoint) задаются в метрах в системе // координат векторной карты. // Размер массива высот, заданного адресом HeightArray, // должен соответствовать запрашиваемому количеству высот // (HeightCount), в противном случае возможны ошибки работы // с памятью. // В случае необеспеченности логического элемента матричными // данными его значение равно ERRORHEIGHT (-111111.0 м) // В случае ошибки при выборе высот возвращает ноль mapGetHeightArray(HMAP hMap, double *HeightArray, long int HeightCount, const DOUBLEPOINT *FirstPoint, const DOUBLEPOINT *SecondPoint);
Можно также читать высоты по индексам элементов матрицы ---------------------------------------------------------------------------------------
// Чтение элемента матрицы высот по абсолютным индексам // hMap - идентификатор открытой карты // number - номер файла в цепочке // value - полученное значение элемента в метрах // (при отсутствии высоты равно ERRORHEIGHT) // string - индекс строки матрицы (значение от 0 до height-1, где height - высота // матрицы элементах, запрашиваемая функцией mapGetMtrHeightInElement) // column - индекс колонки матрицы (значение от 0 до width-1, где width - ширина // матрицы элементах, запрашиваемая функцией mapGetMtrWidthInElement) // hPaint - контекст поддержки многопоточного вызова (см. mapCreatePaintControl) или 0 // При ошибке и при отсутствии высоты возвращает ноль
mapGetMtrPoint(HMAP hMap, long int number, double *value, long int string, long int column);
Для преобразования координат можно использовать функции ---------------------------------------------------------------------------------------
// Запрос - поддерживается ли пересчет к геодезическим // координатам из плоских прямоугольных и обратно // hMap - идентификатор открытой основной карты // number - номер файла в цепочке // Если нет - возвращает ноль _MAPIMP long int _MAPAPI mapIsMtrGeoSupported(HMAP hMap, long int number);
// Запросить данные о проекции матрицы // hMap - идентификатор открытой основной векторной карты // number - номер файла в цепочке // projectiondata - адрес структуры, в которой будут размещены // данные о проекции // Структурa MTRPROJECTIONDATA описанa в maptype.h // ttype - тип локального преобразования координат (см. TRANSFORMTYPE в mapcreat.h) или 0 // tparm - параметры локального преобразования координат (см. mapcreat.h) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetMtrProjectionDataPro(HMAP hMap, long int number, MAPREGISTEREX* mapregister, DATUMPARAM *datumparam, ELLIPSOIDPARAM *ellipsoidparam, long int * ttype, LOCALTRANSFORM * tparm);
Далее можно применить функции преобразования координат (mapapi.h) ------------------------------------------------------------------------------------------------------
получаем HANDLE:
// Установить текущие параметры пользовательской системы координат _MAPIMP HANDLE _MAPAPI mapCreateUserSystemParametersPro(MAPREGISTEREX * parm, DATUMPARAM * datum, ELLIPSOIDPARAM * ellipsoid, long int ttype, LOCALTRANSFORM * tparm); применяем HANDLE:
// Преобразование из геодезических координат (радианы) в пользовательской проекции // в геодезические координаты в радианах (общеземной эллипсоид WGS84) // huser - идентификатор пользовательской системы координат // Bx,Ly - преобразуемые координаты, на входе радианы, на выходе - радианы // H - геодезическая высота в метрах // При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapUserGeoToGeoWGS84(HANDLE huser, double *Bx, double *Ly);