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

Пересчёт координат курсора из одной СК в другую и обратно

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

Стоит задача отображения координат курсора в 2х системах координат:
1) Исходная СК карты (Nord Sahara 1959)
2) Пересчет в WGS 84

Если карта в СК WGS 84 то должно выполняться и обратный пересчет координат курсора в Nord Sahara 1959.
При этом объекты на карте пересчитываться не должны.

Координаты курсора получаю с MapScreen.

Пробовал использовать mapSetDocProjection с датумом перехода из Nord Sahara в WGS 84. Для обратного перехода пробовал использовать тот же датум с обратными знаками
Как в первом, так и во втором случи получаю не корректный пересчёт координат.
Привожу пример кода (NS->WGS):
Код
        TMAPREGISTEREX ParentMapReg;
   TELLIPSOIDPARAM Ellipsoid;
   TDATUMPARAM Datum;
        TLISTREGISTER List;

   ZeroMemory(&Datum, sizeof(Datum));
   ZeroMemory(&ParentMapReg, sizeof(ParentMapReg));
   ZeroMemory(&Ellipsoid, sizeof(Ellipsoid));
        ZeroMemory(&List, sizeof(List));
        // Получаю MAPREGISTEREX открытой карты
   mapGetMapInfoEx(MapScreen1->MapHandle, 1, ParentMapReg, List);

   TMAPREGISTEREX NewMapReg; 
   ZeroMemory(&NewMapReg, sizeof(NewMapReg));

   NewMapReg.Length = sizeof(NewMapReg) ;
   mapRegisterFromMapType(MT_TOPOLOCAL, NewMapReg); 
   mapGetEllipsoidParameters(EK_CLARKE_80, &Ellipsoid);

        NewMapReg.Scale = ParentMapReg.Scale;
   NewMapReg.EllipsoideKind = EK_CLARKE_80;
   NewMapReg.AxisMeridian = ParentMapReg.AxisMeridian;

   NewMapReg.MaterialProjection = MP_UTM;//ParentMapReg.MaterialProjection;
   NewMapReg.FalseEasting = ParentMapReg.FalseEasting;
   NewMapReg.ScaleFactor = ParentMapReg.ScaleFactor;

   // Заполняем датум
   Datum.DX = -209.362198;
   Datum.DY = -87.816200;
   Datum.DZ = 404.619830;
   Datum.RX = -0.00461215;
   Datum.RY = -3.47842207;
   Datum.RZ = -0.58048472;
   Datum.M = -0.0000014547220; // -1.4547220 * 1E-6
   Datum.Count = 7;
        // Применяю параметры проекции
        mapSetDocProjection(MapScreen1->MapHandle, &NewMapReg, &Datum, &Ellipsoid);

Подскажите пожалуйста правильный алгоритм пересчёта координат.
Заранее спасибо.
 
В целом подход правильный - использовать mapSetDocProjection.

Хотя в Вашем случае можно поступить проще.

Поскольку Вам требуется выдавать координаты курсора одновременно и в системе карты Nord Sahara 1959, и в WGS84, достаточно иметь открытую карту в Nord Sahara 1959, а координаты курсора пересчитывать к СК самой карты и к WGS84.

1. координаты курсора преобразуются к метрам в СК карты (mapPictureToPlane
2. полученные метры пересчитываются к геодезическим координатам:
2а. для Nord Sahara 1959 это СК самой карты, так как в ней открыт основной документ (mapPlaneToGeo)
2б. для WGS84 используется штатная функция преобразования к WGS84 (mapPlaneToGeoWGS84)

Чтобы функции mapPictureToPlane, mapPlaneToGeo и другие, работающие с СК карты, выдавали результаты именно в Nord Sahara 1959, необходимо, чтобы документ карты был открыт в этой СК.
Это достигается двумя способами.
1. Основная (первая) карта, которая открывается у Вас в MapScreen, должна быть в Nord Sahara 1959. Остальные карты, добавляемые к ней, автоматически будут к ней трансформироваться "на лету". То есть для Вашей задачи можно всегда иметь карту в Nord Sahara 1959 (пусть даже пустую), которую всегда открывать первой, а остальные карты добавлять к ней.
2. Установить рабочую СК и проекцию с помощью как раз таки mapSetDocProjection. Для упрощения процесса заполнения параметров СК, датума и проекции можно воспользоваться функцией mapGetParametersForEPSG, но для этого надо знать правильный код EPSG. Для Nord Sahara 1959 это, скорее всего, будет 4307, хотя это следует уточнить исходя из Ваших задач, так как кодов EPSG для Nord Sahara 1959 несколько и какой следует использовать, Вам должно быть виднее.
 
Благодарю за Ваш ответ, использование функция преобразования из системы кары (NS) к WGS84 действительно более простое решение. Проблемы начинаются при обратной ситуации.
Цитата
Денис Вицко написал:

Основная (первая) карта, которая открывается у Вас в MapScreen, должна быть в Nord Sahara 1959. Остальные карты, добавляемые к ней, автоматически будут к ней трансформироваться "на лету".
В нашей задачи пересчёт метрик объектов карты совершенно недопустим, поэтому изначально был выбран метод mapSetDocProjection с использование датума преобразования из NS в WGS84 и с "обратным" датумом для преобразования WGS84 в NS.

Цитата
Денис Вицко написал:
Установить рабочую СК и проекцию с помощью как раз таки mapSetDocProjection. Для упрощения процесса заполнения параметров СК, датума и проекции можно воспользоваться функцией mapGetParametersForEPSG, но для этого надо знать правильный код EPSG. Для Nord Sahara 1959 это, скорее всего, будет 4307, хотя это следует уточнить исходя из Ваших задач, так как кодов EPSG для Nord Sahara 1959 несколько и какой следует использовать, Вам должно быть виднее.
Для NordSahara 1959 существует несколько EPSG кодов в зависимости от зоны карты (30729 - 30732), которую довольно проблематично определить если открытая карта в СК WGS84.

В представленном нами выше коде мы попытались реализовать переход от NS к WGS84, в результате получили координаты с ошибкой в несколько секунд.
Не могли бы Вы подсказать нам где наша ошибка в заданных параметрах для mapSetDocProjection и по возможности подсказать вариант пересчёта координат курсора из исходной карты в СК WGS84 в СК NS не трансформируя эту карту.

Заранее спасибо.
Изменено: Сергей Алексеев - 12.04.2018 16:16:18
 
Возможно, проблема в том, что функция mapGetParametersForEPSG возвращает в параметрах датума для
Datum.M значение -1.4547220 * 1E-7 вместо -1.4547220 * 1E-6.
Мы поправим эту функцию. Пока можно переустановить полученное значение в программе.

Для пересчета координат точки не нужно менять параметры документа.
Есть группа функций: mapCreateUserSystemParametersPro - mapDeleteUserSystemParameters для параллельных пересчетов в разные системы.
См. документацию по разработке новых модулей,
4.2.5 Управление системой координат карты -
http://gistoolkit.ru/download/doc/mapapi.pdf
 
Благодарю за Ваш ответ, использование пользовательской системы помогло полностью решить задачу.
Страницы: 1
Читают тему (гостей: 1)



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

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