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

получение изображения объекта из классификатора

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 След.
RSS
получение изображения объекта из классификатора
 
Здравствуйте!

Привожу пример отображения образцов объектов из классификатора перебором:
Код
#include <assert.h>
#include <iostream>

#include <QImage>

#include "mapapi.h"
#include "rscapi.h"

void PaintObject(HMAP mapHandle, HRSC rscHandle, long rscIncode)
{
  // Получить информацию по объекту из классификатора
  RSCOBJECT rscObject;
  mapGetRscObject(rscHandle, rscIncode, &rscObject);

  // Получить номер функции отображения и параметры из классификатора
  long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscIncode);
  assert(rscObjectFunctionNumber);

  const char *rscObjectParameters = mapGetRscObjectParameters(rscHandle, rscIncode);
  assert(rscObjectParameters);

  // Запросить параметры палитры карты (для отображения объекта)
  COLORREF palette[256];
  long colorCount = mapGetSiteColorsCount(mapHandle, mapHandle);
  mapGetSitePalette(mapHandle, mapHandle, palette, colorCount);

  // Выделить память для отрисовки объекта
  const int ICON_SIZE = 32;
  XIMAGEDESC ximageDesc;
  ximageDesc.Width = ICON_SIZE;
  ximageDesc.Height = ICON_SIZE;
  ximageDesc.Depth = 32;
  ximageDesc.CellSize = ximageDesc.Depth / 8;
  ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;

  char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
  ximageDesc.Point = paintMemory;
  assert(paintMemory);

  // Отрисовать образец объекта
  RECT rectDraw;
  rectDraw.left = 0;
  rectDraw.top = 0;
  rectDraw.right = ICON_SIZE;
  rectDraw.bottom = ICON_SIZE;

  char *objectText = NULL;
  long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber, (char *) rscObjectParameters, colorCount, palette, objectText, rscObject.Local);
  assert(isPainted);

  // Вывести картинку в файл
  QImage image((uchar *) (ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_ARGB32);
  image.save("/tmp/rsc-images/" + QString::number(rscIncode) + ".png");
}


int main()
{
  // Открыть карту
  WCHAR mapPath[MAX_PATH_LONG];
  mapPath[0] = 0;
  WcsCopy(mapPath, L"/usr/share/gisdesigner/examples/Data/Специальные\ карты/Оперативная\ обстановка/RedExample/battalion\ red/BattalionRed.sitx", sizeof(mapPath));

  HMAP mapHandle = mapOpenDataUn(mapPath);
  assert(mapHandle);

  // Открыть классификатор
  WCHAR rscPath[MAX_PATH_LONG];
  rscPath[0] = 0;
  WcsCopy(rscPath, L"/usr/share/gisdesigner/examples/Data/Специальные\ карты/Оперативная\ обстановка/RedExample/battalion\ red/operator.rsc", sizeof(rscPath));

  HRSC rscHandle = mapOpenRscUn(rscPath);
  assert(rscHandle);

  // Отрисовать образцы всех объектов в классификаторе
  for (int objectNumber = 1; objectNumber <= mapGetRscObjectCount(rscHandle); objectNumber++)
    PaintObject(mapHandle, rscHandle, objectNumber);

  mapCloseData(mapHandle);
  mapCloseMapAccess();

  return 0;
}
 
Взял функцию PaintObject и перебор целиком, поменял только идентификатор  карты и классификатора на свои. Результат тот же - прозрачные квадраты.
Я  немного деталей добавлю, чтобы было понятнее, что мне нужно: на карте  map с кучей разных данных надо открыть сит с конкретным классификатором и  отобразить объекты этого классификатора в виде картинок. При этом я не  могу закрывать какие-либо данные основной карты.

1) Основная карта .map открыта.
2) Пользовательский слой открыт так
Код
qdmapview->VarMapSites->Append((char*)(sitfile.toAscii().constData())) 
идентификатор получен так

Код
QDMapSite* dmSite = mapview_GD->dmap->VarMapSites->GetSitesForFileName( sitfile.toAscii().data() ); 
hSite = dmSite->GetSiteHandle();
3)  Классификатор не открывается (разве не "открыт" после загрузки сита?) с  помощью mapOpenRscUn(), а только получаю его идентификатор по открытому  ситу так

Код
hRsc = mapGetRscIdent( mapview_GD->h_gd, hSite );
4)  Выполняю перебор как указано у вас с такой же PaintObject(),  единственное что поменял - подставил свои идентификатор карты,  идентификатор классификатора.
5) В результате - прозрачные квадраты.

Пробовал  открывать файл классификатора с помощью mapOpenRsc() перед перебором и  рисовать картинки уже по этому идентификатору - идентификатор после  открытия отличается от того, что я получаю в п.3., почему? Ошибки нет,  создается также 56 пустых картинок.
 
Взял пример "mapview" из поставки Конструктора. Добавил в MainForm1 слот:

Код
void MainForm1::slotTestPaintObj()
{
    HMAP mapHandle = ui.DMapView1->GetMapHandle();

      // Открыть классификатор
    QString rscPath = "/home/tsn/build-mapview-Qt_4_8_7_qt4-Debug/mnk/mysits/service.rsc";
    HRSC rscHandle = mapOpenRsc( rscPath.toAscii().data() );

    for (int rscIncode = 1; rscIncode <= mapGetRscObjectCount(rscHandle); rscIncode++)
    {
      // Получить информацию по объекту из классификатора
      RSCOBJECT rscObject;
      mapGetRscObject(rscHandle, rscIncode, &rscObject);

      // Получить номер функции отображения и параметры из классификатора
      long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscIncode);
      assert(rscObjectFunctionNumber);

      const char *rscObjectParameters = mapGetRscObjectParameters(rscHandle, rscIncode);
      assert(rscObjectParameters);

      // Запросить параметры палитры карты (для отображения объекта)
      COLORREF palette[256];
      long colorCount = mapGetSiteColorsCount(mapHandle, /*hSite*/mapHandle);
      mapGetSitePalette(mapHandle, /*hSite*/mapHandle, palette, colorCount);

      // Выделить память для отрисовки объекта
      const int ICON_SIZE = 32;
      XIMAGEDESC ximageDesc;
      ximageDesc.Width = ICON_SIZE;
      ximageDesc.Height = ICON_SIZE;
      ximageDesc.Depth = 32;
      ximageDesc.CellSize = ximageDesc.Depth / 8;
      ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;

      char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
      ximageDesc.Point = paintMemory;
      assert(paintMemory);

      // Отрисовать образец объекта
      RECT rectDraw;
      rectDraw.left = 0;
      rectDraw.top = 0;
      rectDraw.right = ICON_SIZE;
      rectDraw.bottom = ICON_SIZE;

      char *objectText = NULL;
      long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber, (char *) rscObjectParameters, colorCount, palette, objectText, rscObject.Local);
      assert(isPainted);

      // Вывести картинку в файл
      bool success;
      QString path = "./rsc-images/" + QString::number(rscIncode) + ".png";

      QImage image((uchar *) (ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_ARGB32);
      success = image.save("./rsc-images/" + QString::number(rscIncode) + ".png");
      if( !success )
          qDebug() << QString("Paint obj #%1 to '%2' - FAIL").arg( rscIncode ).arg( path );
      else
          qDebug() << QString("Paint obj #%1 to '%2' - SUCCESS").arg( rscIncode ).arg( path );
    }
}

1) Открываю map через меню
2) Запускаю slotTestPaintObj() через меню
Получаю прозрачные квадратики.
Изменено: Илья Аникин - 11.12.2019 10:54:47 (опечатка)
 
Здравствуйте!

Уточните, пожалуйста, работает ли у Вас приведенный выше пример (одна функция в main()) с классификатором operator.rsc и картой battalion red (входят в состав инсталляции ГИС Конструктор) - чтобы можно было уточнить причину некорректного поведения.
 
Александр Савелов, уточняю: не работает - то же самое в итоге получается.

Функцию main() пришлось немного модифицировать, компилятор ругался на приведение типов в WcsCopy(), а также из-за того, что по указанным путям в системе ничего нет, пришлось самому искать где что лежит.

Код
int main()
{
    // Открыть карту
    QString mapPath = "/usr/share/qt4/examples/gisdesigner/Data/RedExample/battalion red/BattalionRed.sitx";
    HMAP mapHandle = mapOpenData(mapPath.toAscii().constData());
    assert(mapHandle);

    // Открыть классификатор
    QString rscPath = "/usr/share/qt4/examples/gisdesigner/Data/RedExample/battalion red/operator.rsc";
    HRSC rscHandle = mapOpenRsc(rscPath.toAscii().constData());
    assert(rscHandle);

    // Отрисовать образцы всех объектов в классификаторе
    for (int objectNumber = 1; objectNumber <= mapGetRscObjectCount(rscHandle); objectNumber++)
    PaintObject(mapHandle, rscHandle, objectNumber);

    mapCloseData(mapHandle);
    mapCloseMapAccess();

    return 0;
}

Идентификаторы карты и классификатора ненулевые.

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

Пример отрисовки образцов, приведенный в предыдущем сообщении, тестировался на текущей версии ГИС Конструктор (12.6.1). Есть ли у Вас возможность выполнить обновление до крайней версии?
 
Александр Савелов, попробовать можно, о результатах сообщу.
 
Александр Савелов,обновил Конструктор до 12.6.1 - картинки появляются, но палитра неправильная. Это классификатор operator.rsc из battalione red.
Изменено: Илья Аникин - 13.12.2019 08:51:19 (дополнил)
 
Здравствуйте!

Протестировали корректность создания образцов на исходном тексте примера, приведенного здесь, на Astra Linux 1.5. Уточните, пожалуйста, возможно, запускается модифицированный код.
Изменено: Александр Савелов - 17.12.2019 11:13:42
 
Александр Савелов, у вас по ссылке швейный мир, но я так понимаю, вы имели ввиду пример c main() и
PaintObject(). Запустил этот пример и все получилось как положено.

В своем предыдущем сообщении я запускал модифицированный пример mapview из состава Конструктора, как я его модифицировал, я уже описывал. Насколько я понимаю, проблема в том, что берется палитра из классификатора открытой map-карты.

Как мне получить картинки с правильной палитрой в ситуации, когда я на открытой map-карте открываю sit с нужным мне классификатором?
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)



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

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