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

Открытие карты в консольном приложении с кириллицей

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Открытие карты в консольном приложении с кириллицей, открытие карты в консольном приложении с кириллицей средствами mapapi
 
Добрый день. Есть задача получить данные с матрицы высот из открытой карты. При открыти  карты средствами mapapi все работает ровно до того момента, когда испольлзуются латинские символы. Хотелось бы решить эту задачу при подачи в консольное приложение кирилических символов  в пути. Кирилица рабоотает при загрузки карты через  компонент QDMapView. Хотелось бы открыть карту в консольном приложении с кириллицей в путях не используюя QDMapView тк это визуальный компонент, а использовать средства mapapi. Разаработка ведется на QT5 C++ AstraLinux 1.6 Smolensk  
 
Добрый день!

Для передачи пути к карте из командной строки необходимо выполнить перекодировку из типа char (кодировка UTF-8) в тип WCHAR (кодировка UTF-16). Это можно сделать с помощью функции Unicode8ToUnicode() или FSEncodingToUnicode() (mapsyst.h):
Код
// Преобразовать строку UTF-8 в UTF-16
// src      - адрес входной строки ANSI
// srcsize  - размер входной строки в БАЙТАХ
// dest     - адрес буфера для размещения выходной строки UTF-16
// destsize - размер выходной строки в БАЙТАХ
// В случае успеха возвращает количество СИМВОЛОВ, записанных в выходной буфер,
// иначе - 0
INLINEFUNC int Unicode8ToUnicode(const char* src, int srcsize, WCHAR* dest, int destsize)
{
  ...
}

INLINEFUNC int FSEncodingToUnicode(const char* src, WCHAR* dest, int destsize)
{
  ...
}
 
pathMap это принимаемый путь к карте типа QString
WCHAR path2[pathMap.length()];
FSEncodingToUnicode(pathMap.toUtf8().constData(), path2, pathMap.length());
HMAP mapHandle = mapOpenData( (char *)path2 );
mapHandle при этом возвращает ноль

Возможно mapOpenData не подходит для открытия файла с расширением map в данном случае?
 
При хранении строки с помощью типа QString можно выполнить преобразование в тип WCHAR (кодировка UTF-16) с помощью функции QString::utf16(). При этом необходимо использовать API-функции с интерфейсом WCHAR. Например, функцию mapOpenDataUn() для открытия данных (mapapi.h):
Код
  // Открыть данные с автоматическим определением их типа
  // (векторные,растровые,матричные...)
  // name - имя открываемого файла (MAP, SIT, MTW, RSW, MPT) в кодировке UNICODE
  // mode - режим чтения/записи (GENERIC_READ, GENERIC_WRITE или 0)
  // GENERIC_READ - все данные только на чтение, при этом не открываются
  // файлы \Log\name.log и \Log\name.tac - протокол работы и журнал транзакций
  // error - после выполнения функции переменная содержит код ошибки
  //        (когда HMAP равен 0) или 0; коды ошибок приведены в maperr.rh
  // password - пароль доступа к данным из которого формируется 256-битный код
  //            для шифрования данных (при утрате пароля данные не восстанавливаются)
  // size     - длина пароля в байтах !!!
  // Передача пароля необходима, если при создании карты он был указан.
  // Если пароль не передан, а он был указан при создании,
  // то автоматически вызывается диалог scnGetMapPassword из mapscena.dll (gisdlgs.dll)
  // Если выдача сообщений запрещена (mapIsMessageEnable()), то диалог
  // не вызывается, а при отсутствии пароля происходит отказ открытия данных
  // После завершения использования карты необходимо освободить ресурсы функцией mapCloseData
  // При ошибке возвращает ноль

_MAPIMP HMAP _MAPAPI mapOpenAnyData(const WCHAR *name, long int mode = 0, long int *error = 0);
_MAPIMP HMAP _MAPAPI mapOpenDataUn(const WCHAR * name, long int mode = 0);
Пример вызова:
Код
HMAP hMap = mapOpenDataUn(string.utf16());
 
QString pathMap("/home/user/MAP/БрО/Топографическая основа.map");
HMAP mapHandle = mapOpenDataUn( pathMap.utf16() );
qDebug()<<"------->2 mapHandle="<<mapHandle;
   if (mapHandle == 0){
       std::cout<<"Невозможно открыть карту  "<<qPrintable(pathMap)<<std::endl;
       return false;
   }else {
         qDebug() << "map open";
   }

Возвращает ноль mapHandle.
Возможно есть требования к пробелам в пути к файлу?
 
Спасибо за советы. В вопросе разобрался, все работает
Страницы: 1
Читают тему (гостей: 1)



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

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