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

Как получить у открытой карты Вид преобразования

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Как получить у открытой карты Вид преобразования, Получить у открытой карты Вид преобразования Delphi 10.4
 
Доброе утро.

Подскажите, как у открытой карты средствами Git ToolKit получить Вид преобразования.

Пробовал процедуру:
// Запросить общие параметры проекции документа для отображения,
// печати и расчета координат
// hmap  - идентификатор открытых данных (документа)
// Структуры MAPREGISTER, DATUMPARAM и ELLIPSOIDPARAM описаны в mapcreat.h
// type  - тип локального преобразования координат (см. TRANSFORMTYPE в mapcreat.h) или 0
// parm - параметры локального преобразования координат (см. mapcreat.h)
// Если параметры не устанавливались функцией mapSetMapInfoEx,
// то они соответсвуют параметрам карты, открытой в документе первой
// При ошибке возвращает ноль

 code := mapGetDocProjectionPro(hMapIn,
                                mapregisterex,
                                datum,
                                param,
                                @ttype,
                                tparm);

ttype - на всех картах выдаёт 0
Screenshot_2.bmp (1.5 МБ)
 
Добрый день!

В параметрах датума (DATUMPARAM) вид преобразования от заданного эллипсоида к эллипсоиду WGS-84 (то, что Вы выделили на скриншоте) определяется следующим образом.
Если задано 3 параметра, то применяется преобразование Молоденского (Standard Molodensky Transformations),
если 7 - преобразование по ГОСТ 32453-2017, то это обратное преобразование Гельмерта или Coordinate Frame Rotation
(EPSG dataset coordinate operation method code 1032).

см. параметр Count структуры DATUMPARAM:
Код
int    Count;        // 3 или 7  (14 - признак пересчета через ПЗ-90.02 для СК42\95)
 
Как отличить такие Виды Преобразований ?
Count  у них одинаковый 7
Изменено: Александр - 09.04.2025 17:07:25
 
Всё же это разные значения. В красных квадратах разница.

Имеем один файл SXF преобразуем его в версии 11 получаем данные вида преобразования как на правой картинке.
Делаем Импорт из SXF в SITX в версии 15 имеем вид преобразования, как на левой картинке.
Рамка листа в 11 версии программами контроля выдаёт ошибку. И из-за этих расхождений показанных на картинке построенная рамка в 15 версии не сидит на объектах сделанных в 11 версии.
Возникает несколько вопросов:
1. Как узнать Вид преобразования у текущей карты.
2. Как установить необходимый вид преобразования.
3. Как корректно преобразовать топографическую карту из формата SXF в SITX с "правильной рамкой"(с сохранением правильных параметров Вида преобразования.

Спасибо за ответы.
Screenshot_6.jpg (344.76 КБ)
 
Математически - это одинаковые преобразования.
В версии 15 записаны общепринятые прямые параметры пересчета через WGS-84.
На результаты расчета координат это не влияет.

Расхождения начинаются, как уже сообщали ранее в соседней теме, при сохранении данных в файл.
Версия 15 сохраняет координаты в метрах в поле размером 8 байт без искажений.
Версия 11 сохраняет координаты, пересчитывая их в дискреты (1 / 20 000 от масштаба карты) и записывает в поле размером 4 байта с искажениями.

Когда-то памяти на дисках и на системной плате было мало. Для экономии писали в 4 байта. Точность в сантиметрах была не принципиальной.
В версии 15 искажения координат не производятся.
 
Слева в параметрах DATUMPARAM поле Count равно 7.
Значения параметров перехода заданы относительно эллипсоида WGS-84.

Справа в параметрах DATUMPARAM поле Count равно 14.
Значения параметров перехода заданы относительно эллипсоида ПЗ-90.02.
 
Вы это имеете ввиду ?
TDATUMPARAM = packed record
 DX     : double;      // Сдвиги по осям в метрах
 DY     : double;
 DZ     : double;
 RX     : double;      // Угловые поправки в секундах
 RY     : double;
 RZ     : double;
 M      : double;      // Поправка масштаба
 Count  : integer;         // 3 или 7  (14 - признак пересчета через ПЗ-90.02 для СК42\95)
 Reserve: integer;         // Равно 0
end;

На приложенных мной скринах паспорта карты (Датум) отличия есть только в DX, DY, DZ
 
Левый Дату паспорта листа
// СК-42  -> WGS-84  (Count = 7)
DX_S42_WGS84      =  '23.57';
DY_S42_WGS84      ='-140.95';
DZ_S42_WGS84      = '-79.8';
RX_S42_WGS84      =   '0.0';
RY_S42_WGS84      =  '-0.35';
RZ_S42_WGS84      =  '-0.79';
 M_S42_WGS84      =  '-0.00000022L';

Правая картинка Датум паспорта листа
// СК-42  ->  ПЗ-90.02  (Count = 14)
DX_S42_SGS85 = '23.93L';
DY_S42_SGS85 = '-141.03L';
DZ_S42_SGS85 = '-79.98L';
RX_S42_SGS85 = '0.0L';
RY_S42_SGS85 = '-0.35L';
RZ_S42_SGS85 = '-0.79L';
M_S42_SGS85 = '-0.00000022L';

Но при этом процедура
mapGetDocProjectionPro(hMapIn,
                                mapregisterex,
                                datum,
                                param,
                                @ttype,
                                tparm);

Выдаёт для обоих листов значение ttype = 0

Это ошибка или так и было задумано ?
 
Код
 // Запросить общие параметры проекции документа для отображения, печати и расчета координат
 // hmap  - идентификатор открытых данных (документа)
 // Структуры MAPREGISTER, DATUMPARAM и ELLIPSOIDPARAM описаны в mapcreat.h
 // ttype  - тип локального преобразования координат (см. TRANSFORMTYPE в mapcreat.h) или 0
 // tparm - параметры локального преобразования координат (см. mapcreat.h)
 // Если параметры не устанавливались функцией mapSetMapInfoEx,
 // то они соответсвуют параметрам карты, открытой в документе первой
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetDocProjectionPro(HMAP hMap, MAPREGISTEREX * map, DATUMPARAM * datum,
                                                ELLIPSOIDPARAM * ellparm, long int * ttype, LOCALTRANSFORM * tparm);
ttype  - тип локального преобразования координат (см. TRANSFORMTYPE в mapcreat.h):
Код
// Типы деформации системы координат на плоскости
typedef enum TRANSFORMTYPE
{
  ROTATESCALEOFFSET =  1, // поворот, масштаб, сдвиг
  AFFINETRANSFORM   =  2, // аффинное преобразование
}
TRANSFORMTYPE;
ttype = 0; // Параметры деформации не заданы
 
Спасибо за ответ. Буду разбираться.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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