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

Проецирование

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Проецирование
 
Здравствуйте уважаемые разработчики "КБ Панорама".  Использую "GIS ToolKit Free" v.12.5.2.
Мне нужно провести проецирование всех объектов существующего SIT'а в СК Nord Sahara 1959 на новый (создаваемый) SIT в СК WGS-84.

Для начала создаю SIT отдельной функцией. Параметры:
inEPGS - код EPGS (передаю 7030)
inPaths - пути к создаваемой карте и используемому классификатору
inParentMapReg - структура MAPREGISTEREX полученная из исходной карты с использованием mapGetMapInfoEx
inParentList - формуляр полученный из исходной карты с использованием mapGetMapInfoEx
Код
HMAP __fastcall TForm2::CreateSit(int inEPGS, std::pair<UnicodeString,UnicodeString> inPaths, MAPREGISTEREX &inParentMapReg, LISTREGISTER &inParentList) // Функция, создающая сит
{

   MAPREGISTEREX mapReg;
   LISTREGISTER listReg;
   DATUMPARAM datum;
   CREATESITEUN createSite;
   ELLIPSOIDPARAM ellipsoid;
   SHEETNAMES  sheetnames;

   try
   {
      // Формируем структуры для создания карты (предварительно забив их нулями)
         for (int i = 0; i < sizeof (mapReg); i++) {
         char *xxx = (char *) &mapReg ;
         xxx [i] = 0 ;
         }
         for (int i = 0; i < sizeof (listReg); i++) {
         char *xxx = (char *) &listReg ;
         xxx [i] = 0 ;
         }
         for (int i = 0; i < sizeof (createSite); i++) {
         char *xxx = (char *) &createSite ;
         xxx [i] = 0 ;
         }

      mapReg.Length = sizeof(mapReg) ;

      // заполняем данные по коду EPGS 
      mapGetParametersForEPSG(inEPGS, &mapReg, &datum, &ellipsoid) ;
      // заполняем данные по типу карты
      mapRegisterFromMapType(UTMWGS84, &mapReg) ;

      mapReg.DeviceCapability = -1 ;
      mapReg.Scale = inParentMapReg.Scale ;

      strcpy(mapReg.Name, inParentMapReg.Name);

      mapReg.FlagRealPlace = 1 ;                      // задаём SIT

      listReg.Length = sizeof(listReg) ;
      listReg.MaterialKind = -1 ;                     // задаем параметры получения карты "Не установлено"
      listReg.MaterialType = -1 ;
      strcpy(listReg.ListName, inParentList.ListName);
      strcpy(listReg.Nomenclature, inParentList.Nomenclature) ;
      strcpy(listReg.FileName, inParentList.FileName) ;
      listReg.ReliefHeight = inParentList.ReliefHeight;
      strcpy(listReg.DateAngle, inParentList.DateAngle);
      strcpy(listReg.Date, inParentList.DateAngle);


      mbstowcs(sheetnames.Nomenclature, inParentList.Nomenclature, sizeof(inParentList.Nomenclature));
      mbstowcs(sheetnames.ListName, inParentList.ListName, sizeof(inParentList.ListName));
      mbstowcs(sheetnames.FileName, inParentList.FileName, sizeof(inParentList.FileName));

      mapCheckAndUpdate(&mapReg, &listReg, 0) ;
      HMAP hMap = mapCreateMapPro(inPaths.first.w_str(), inPaths.second.w_str(), &mapReg, &listReg, &sheetnames, L"", L"", 0) ;
      return hMap;
   }
   catch (...)
   {
      return 0;
   }

}

Данная функция создаёт новый SIT (WGS-84) и возвращает его HMAP для последующего использования.

Создав новый SIT, я перебрасываю на него объекты из исходного SIT'а (Nord Sahara 1959), их семантики и метрику, предварительно преобразовав координаты с помощью mapPlaneToGeoWGS84(hWritingMap, &Point.x, &Point.y)

В результате получаю не совсем верные координаты в метрике получившихся объектов:

Исходная точка (Nord Sahara 1959)  x = 3598583.340; y = 734897.006
Получаемая точка (WGS-84) x = 3598283.100; y = 734979.600

Подскажите пожалуйста что я делаю не верно. Заранее спасибо.

Изменено: Сергей Алексеев - 19.12.2017 11:10:05
 
Забыл написать, есть эталонная карта, уже переведённая в  (WGS-84)
Эталонные координаты той же точки: x = 3598583.340; y = 734897.006
Полученные координаты не совпадают с эталонными (
 
Ваш текст пока не изучал, так как не понятно как объекты туда попадают.

В общем случае должно быть:

Открываете карту1 = hmap1
Создаете карту2 с нужным EPSG = hmap2.
Далее по карте один перебираете все объекты, получая hobj.
Для каждого объекта вызываете
mapChangeObjectMap(hobj, hmap2, hmap2);

 // Перенести объект на другую карту (пересчитать координаты и
 // заменить ссылку в объекте на карту)
 // При переносе объекта выполняется перекодировка объекта
 // для нового классификатора, если код не найден -
 // он устанавливается в ноль, прежнее значение
 // сохраняется в семантике (код 32800).
 // (для замены вызывается mapRegisterObject())
 // Метрика преобразуется в соответствии с типом карты
 // hSite - идентификатор открытой пользовательской карты
 // hObj  - идентификатор объекта пользовательской карты
 // hMap  - идентификатор открытой основной карты
 // Объект на исходной карте при этом не удаляется,
 // для записи объекта в новой карте необходимо вызвать mapCommitObject
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapChangeObjectMap(HOBJ hObj, HMAP hMap, HSITE hSite);
 
Попробовал использовать mapChangeObjectMap, в итоге мой созданный SIT, на который должны были проецироваться объекты был заменён на SIT в СК Nord Sahara 1959 из которого эти объекты и были взяты.
Код:
Код
   HMAP hReadingMap = mapOpenMapUn( "Путь к sitx" );

   MAPREGISTEREX PReg;
   LISTREGISTER PList;
   mapGetMapInfoEx(hReadingMap, 1, &PReg, &PList); // Параметры исходной карты

   HMAP hWritingMap = CreateSit(7024, "Пути к создаваемой карте и классификатору", PReg, PList); // Создаём карту для записи
   mapCloseMap(hWritingMap);

   mapOpenSiteForMapPro(hReadingMap, Paths.first.w_str(), 0, 1, NULL, NULL); // Добавляю созданную карту (т.к. mapGetSiteIdent требует HSITE 
   HSITE Site = mapGetSiteIdent(hReadingMap,1); // Ищим сит

   HOBJ FindObject = mapCreateObject(hReadingMap, hReadingMap, IDDOUBLE2, 0);
   long int ObjectsCount = mapGetObjectCount(hReadingMap, 1);

   for (int ObjectIndex = 1; ObjectIndex <= ObjectsCount; ObjectIndex++)
   {
      if (mapReadObjectByNumber(hReadingMap, hReadingMap, FindObject, 1, ObjectIndex)) // Нашли обект
      {
         mapChangeObjectMap(FindObject, hReadingMap, Site);
         mapCommitObject(FindObject);
      }
   }
   
   mapFreeObject(FindObject);
   mapCloseMap(hReadingMap);
И координаты опять же не верные.
Изменено: Сергей Алексеев - 19.12.2017 13:43:47
 
Для WGS-84 надо задавать код EPSG 4326. Проверьте, что исходная карта у вас не в WGS-84.
Не надо закрывать созданную карту и открывать ее с первой. Открывайте отдельно и пишите туда.
 
Тот же эффект наблюдается при проецировании из WGS-84 в CK-42.
 
Попробовал писать напрямую не закрывая созданного SIT'a, получил карту без объектов.
Исходная система Nord Sahara 1959, итоговая система WGS-84.
 
Давайте разберемся по порядку.

Во-первых,
Цитата
Сергей Алексеев написал:
В результате получаю не совсем верные координаты в метрике получившихся объектов:
Исходная точка (Nord Sahara 1959)  x = 3598583.340; y = 734897.006
Получаемая точка (WGS-84) x = 3598283.100; y = 734979.600
Вы хотели, чтобы прямоугольные координаты у Вас совпадали на картах разных проекций?


Во-вторых, после того, как Вы заполнили параметры создаваемой карты по коду EPSG (mapGetParametersForEPSG), Вы еще выполняете перезаполнение структуры MAPREGISTEREX вызовом mapRegisterFromMapTypeдля типа карты UTMWGS84.
Таким образом, карта никак не будет соответствовать Вашему коду EPSG.
Тип карты UTMWGS84 скорее соответствует кодам EPSG 32601-32760 (в зависимости от осевого меридиана).
В результате вообще трудно предположить, что за карта у Вас получится.


В-третьих, Вы пытаетесь задавать код EPSG 7030, которого в природе не существует.
Nord Sahara 1959 - это 4307.

И, в четвертых, очень зря Вы не проверяете коды возврата от функций.
В частности, mapGetParametersForEPSG вернет Вам 0 для несуществующего кода EPSG. Это, возможно, уже натолкнуло бы Вас на правильное решение.
 
Благодарю за ваши ответы. Действительно основная ошибка была с EPSG кодом. Так же убрал mapRegisterFromMapType.
При использовании функции mapChangeObjectMap ошибочно передал не тот параметр, поэтому объекты и не переносились.
Теперь всё работает, спасибо ещё раз)
Страницы: 1
Читают тему (гостей: 1)



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

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