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

mapCreateSiteUn не работает

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
mapCreateSiteUn не работает
 
При внедрении интернационализации в наше приложение столкнулся с проблемой:
вызов метода mapCreateSiteUn с путём, не содержащим русские или английские символы, возвращает ноль.
При этом в программе каталог создаётся и классификатор копируется в созданный каталог нормально.

Каким образом можно создать слой в указанных условиях? И можно ли?
Спасибо!
 
Здравствуйте!

Приведите, пожалуйста, пример кода заполнения параметров и вызова функции mapCreateSiteUn.
 
Код
struct LayerInfo
{
    QString     m_name; // = "àâæôœ"
    int         m_scale;
    double      m_cLat,
                m_cLon;
    double      m_axisMeridian,
                m_mainParallel;
    LayerInfo() :m_scale(0), m_cLat( 0), m_cLon( 0), m_axisMeridian( 0), m_mainParallel( 0){}
};

#define DEFAULT_OBJECTS_CLASSIFIER      ":/rscData/operator.rsc"

HMAP createMap(const QString &path, const LayerInfo &info)
{
    CREATESITEUN crs;
    memset( &crs, 0, sizeof( crs));
    crs.Length = sizeof( crs);
    double lat = 384, lon = 512;
    screen2geo( lat, lon);
    lat *= M_PI / 180.;
    lon *= M_PI / 180.;
    crs.AxisMeridian = info.m_axisMeridian == 0 ? lat : info.m_axisMeridian;
    crs.MainPointParallel = info.m_mainParallel == 0 ? lon : info.m_mainParallel;
    crs.Scale = info.m_scale;
    crs.MapType = BLANK;//CK_42;
    crs.MaterialProjection = MERCATORMAP;//GAUSSCONFORMAL;
    int maxLen = info.m_name.length() > 128 ? 128 : info.m_name.length();
    memcpy( crs.MapName, (WCHAR*)info.m_name.data(), maxLen*sizeof(WCHAR));

    QDir dr( path);
    if( dr.exists())
    {
        removeDir( path);
    }
    dr.mkpath( path);

    QString layerName = path + "/" + info.m_name + ".sit";
    QFileInfo fli( DEFAULT_OBJECTS_CLASSIFIER);
    QString rscName = path + "/" + fli.fileName();
    QFile fl( DEFAULT_OBJECTS_CLASSIFIER);
    fl.copy( rscName);

   HMAP hMap = mapCreateSiteUn( (WCHAR*)layerName.data(),
                              (WCHAR*)rscName.data(),
                              &crs);
   mapSetSiteRangeScaleVisible( hMap, 0, 1, 40000000);
   system("sync");
   return hMap;
}
///окно отладчика
       
   Locals      
      crs      CREATESITEUN
         AxisMeridian   1,0485894245695171   double
         EllipsoideKind   0   long
         FirstMainParallel   0   double
         Length   352   long
         MainPointParallel   0,53059470017092769   double
         MapName   @0x7fffffffd028   WCHAR [128]
         MapType   9   long
         MaterialProjection   8   long
         PoleLatitude   0   double
         PoleLongitude   0   double
         Reserve   0   long
         Scale   5000   long
         SecondMainParallel   0   double
      dr   ""   QDir
      fl   ":/rscData/operator.rsc"   QFile
      fli   ":/rscData/operator.rsc"   QFileInfo
      hMap   0   HMAP
      info      LayerInfo &
         m_axisMeridian   0   double
         m_cLat   0   double
         m_cLon   0   double
         m_mainParallel   0   double
         m_name   "àâæôœ"   QString
            [0]   -32 'à'   QChar
            [1]   -30 'â'   QChar
            [2]   -26 'æ'   QChar
            [3]   -12 'ô'   QChar
            [4]   83 'œ'   QChar
         m_scale   5000   int
      lat   1,0485894245695171   double
      layerName   "somepath/àâæôœ/àâæôœ.sit"   QString
      lon   0,53059470017092769   double
      maxLen   5   int
      path   "somepath/àâæôœ"   QString &
      rscName   "somepath/àâæôœ/operator.rsc"   QString

Вроде ничего не забыл.
 
Здравствуйте!

В данном случае проблема связана с передачей имени файла из QString в функцию MAPAPI:
Код
HMAP hMap = mapCreateSiteUn( (WCHAR*)layerName.data(),
                             (WCHAR*)rscName.data(),
                             &crs);
Функция QString::data() преобразует символы из внутреннего формата QString (UTF-32) в однобайтовый формат (QChar).
Поскольку тип WCHAR хранит информацию в кодировке UTF16, то для преобразования из QString в WCHAR необходимо воспользоваться функцией QString::utf16().

В дополнение, поскольку время жизни возвращаемой функцией QString::utf16() памяти неизвестно, можно скопировать ее содержимое во временный массив типа WCHAR, который уже использовать потом в MAPAPI-функциях:
Код
WCHAR layerNameW[MAX_PATH_LONG];  layerNameW[0] = 0;
WcsCopy(layerNameW, (WCHAR*)(layerName.utf16()), sizeof(layerNameW));
 
Хорошо, сейчас попробую.
Меня смущает, что функции записи семантических значений при аналогичном использовании никаких проблем не создают.
 
Изменил:
Код
    WCHAR w_layerName[ MAX_PATH_LONG] = {0};
    memcpy( w_layerName, layerName.utf16(), layerName.length() * sizeof( WCHAR));
    WCHAR w_rscName[ MAX_PATH_LONG] = {0};
    memcpy( w_rscName, rscName.utf16(), rscName.length() * sizeof( WCHAR));
    HMAP hMap = mapCreateSiteUn( w_layerName,
                                 w_rscName,
                                 &crs);

К сожалению на ПК выхлоп остался тот же (Linux Mint 18 Mate). После тестирования на конечной железяке напишу отдельно.
 
Проверили на конечном железе (напоминаю: ОС Астра 1.4, ГИС Панорама 11), карта не создаётся.
 
Здравствуйте!

Вы не могли уточнить несколько вопросов, чтобы мы могли воспроизвести у себя такое же поведение:
- какая локаль установлена на системе, где Вы выполняете тестирование примера?
- в качестве имени каталога Вы используете символы, не входящие в текущую локаль (например, ru_RU.UTF-8 )?
- модифицируйте, пожалуйста, следующий пример создания каталога с помощью Qt (пока без использования MAPAPI) Вашим именем каталога, который удается создать (чтобы мы имели общий исходный код, от которого можно в дальнейшем отталкиваться):
Код
#include <assert.h>

#include <QDir>
#include <QString>

int main()
{
  // Создать каталог
  QDir tmpDir("/tmp/");
  bool isCreated = tmpDir.mkdir(QString::fromUtf8("&#11956;"));
  assert(isCreated);

  return 0;
}
Спасибо!
 
Добрый день.
Локаль на всё LANG=ru_RU.UTF-8
Да, используются символы не из текущей локали, и я уже писал выше, что каталоги создаются успешно, равно как и успешно копируется в них файл классификатора.
Модифицировал свой код под указанные условия:
Код
HMAP PanoramaUtility::createMap(const QString &path, const LayerInfo &info)
{
    CREATESITEUN crs;
    memset( &crs, 0, sizeof( crs));
    crs.Length = sizeof( crs);
    double lat = 384, lon = 512;
    screen2geo( lat, lon);
    lat *= M_PI / 180.;
    lon *= M_PI / 180.;
    crs.AxisMeridian = info.m_axisMeridian == 0 ? lat : info.m_axisMeridian;
    crs.MainPointParallel = info.m_mainParallel == 0 ? lon : info.m_mainParallel;
    crs.Scale = info.m_scale;
    crs.MapType = BLANK;//CK_42;
    crs.MaterialProjection = MERCATORMAP;//GAUSSCONFORMAL;
    int maxLen = info.m_name.length() > 128 ? 128 : info.m_name.length();
    memcpy( crs.MapName, (WCHAR*)info.m_name.data(), maxLen * sizeof(WCHAR));

    QString tPath = path;
    tPath = QString( LAYERS_PATH) + QString( "/") + QString::fromUtf8("&#11956;");

    QDir dr( tPath);
    if( dr.exists())
    {
        removeDir( tPath);
    }
    dr.mkpath( tPath);

    QString tname = info.m_name;
    tname = QString::fromUtf8("&#11956;");
    QString layerName = tPath + "/" + tname + ".sit";
    QFileInfo fli( DEFAULT_OBJECTS_CLASSIFIER);
    QString rscName = tPath + "/" + fli.fileName();
    QFile fl( DEFAULT_OBJECTS_CLASSIFIER);
    fl.copy( rscName);

    WCHAR w_layerName[ MAX_PATH_LONG] = {0};
    memcpy( w_layerName, layerName.utf16(), layerName.length() * sizeof( WCHAR));
    WCHAR w_rscName[ MAX_PATH_LONG] = {0};
    memcpy( w_rscName, rscName.utf16(), rscName.length() * sizeof( WCHAR));
    HMAP hMap = mapCreateSiteUn( w_layerName,
                                 w_rscName,
                                 &crs);
//    HMAP hMap = mapCreateSiteUn( (WCHAR*)layerName.utf16(),
//                                 (WCHAR*)rscName.utf16(),
//                                 &crs);
    mapSetSiteRangeScaleVisible( hMap, 0, 1, 40000000);
    system("sync");
    return hMap;
}

 
Здравствуйте!

Прошу меня поправить, если я ошибаюсь: мне кажется, что такой способ задания кодов переменных (нотация &#11956;) применим только к HTML-разметке.
Если его использовать для формирования пути классу QDir, то просто создастся каталог с именем "&#11956;".
Вот модифицированный код тестового примера:

Код
#include <assert.h>
#include <dirent.h>

#include <QDebug>
#include <QDir>
#include <QString>

int main()
{
  // Создать каталог
  QDir tmpDir("/tmp/");
//  bool isCreated = tmpDir.mkdir(QString::fromUtf8("&#11956;"));
//  assert(isCreated);
  // Здесь я намеренно допустил ошибку и не написал ";" в конце, чтобы сохранить численное значения символа
  bool isCreated = tmpDir.mkdir(QString::fromUtf8("&#11956"));

  // Обойти каталог "/tmp"
  DIR *dirp = NULL;
  struct dirent *direntp = NULL;

  dirp = opendir("/tmp");
  assert(dirp);

  while ((direntp = readdir(dirp)) != NULL)
  {
    qDebug() << direntp->d_name;
  }

  return 0;
}
Здесь в конце я добавил низкоуровневое чтение содержимого каталога /tmp после создания в нем каталога.
В выводе получается имя каталога "&#11956;".

Если раскомментировать код создания каталога с именем, заданным как "⺴" (при этом кодировка исходников в utf8), то получим ошибку создания каталога (предполагаю из-за того, что такой символ не предусмотрен текущей локалью).

Просьба меня поправить, если я ошибаюсь - спасибо!
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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