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

RSC to BMP???

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1 2 3 След.
RSS
RSC to BMP???, Помогите сконвертировать объекты классификатора в BMP файлы
 
Здравствуйте!

На меня свалилась задача сохранения изображения объекта в файл формата BMP, пожалуйста помогите с решением.

PS: Использую MCBC + Интеграция
 
В комплекте разработчика "ГИС Карта 2005" под Linux есть следующие функции отрисовки объекта:
// Отобразить отдельный объект карты в пределах фрагмента
// Координаты объекта заданы в дискретах в листе
long int _MAPAPI mapPaintObject(HMAP hMap,HDC hDC,RECT * rect,HOBJ object);
// Отобразить отдельный объект карты в пределах фрагмента
// Координаты объекта заданы в дискретах в листе
// erase - признак стирания фона перед выводом,
// (0 - фон не стирать, !=0 - очистить фрагмент цветом фона),
// dontclip - признак отмены обрезки объектов по рамке при отображении
// (1 - не обрезать, 0 - выполнить обрезку)            // 19/03/01
long int _MAPAPI mapPaintObjectEx(HMAP hMap,HDC hdc,RECT * rect,HOBJ object,
                                  long int erase,long int dontclip);
В качестве переменной hdc используйте указатель на структуру XCONTECT, которую заполните следующим образом:
QPixmap pixmap;
XCONTEXT FxDC;

FxDC.xcDisplay = pixmap.x11AppDisplay();
FxDC.xcWindow = pixmap.handle();
FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow, 0, NULL);
FxDC.xcPoint.X = 0;
FxDC.xcPoint.Y = 0;

Отрисовка объекта происходит в QPixmap - далее используйте функцию этого класса save, которая позволяет сохранить рисунок в файл BMP.
 
gislinux, спасибо Вам большое! )

На первый взгляд все просто, сейчас попробую.

Может быть подскажите где можно посмотреть документацию более подробную чем в хедерах, или по крайней мере, более систематизированную.
 
Документация и примеры использования MAPAPI-интерфейса входят в комплект разработчика "ГИС Карта 2005" под Linux.
 
Мне как-то недосталась эта документация, только хедеры и библиотеки, причем я не совсем уверен, что они вообще одной версии. Вобщем чем богаты тому и радуемся... А в интернете икать бесполезно?
 
войдите в раздел "Скачать" и скачайте версию ГИС Панорама (версия 9.15.7, AltLinux 4.0). В каталоге ./SDK найдете искомое.
 
Не пойму в чем проблема, программа отрабатывает без ошибок, но изображение заполняется диагональным крестом на сером фоне, как при отсутствии значка с таким кодом??? Значек с таким кодом существует, в чем проблема?

Вот код:

Код
int 
main(int argc, char **argv)
{
    int  rc = 0;
    HRSC hrsc = 0;
    HMAP hmap = 0;
    HSITE hsite = 0;

    const char *mapname;

    RECT     rect = {0, };
    XCONTEXT FxDC = {0, };

    MAPREGISTER  map;
    LISTREGISTER sheet;
    CREATESITE   createsite;

    QApplication  app(argc, argv);
    QMainWindow  *mw;

    mw = new QMainWindow();
    QPixmap pixmap(mw->width(), mw->height());
    pixmap.fill("red");
    mw->setBackgroundPixmap(pixmap);
    mw->show();
    app.setMainWidget(mw);

    /* Open map data */
    if ((hmap = mapOpenData(MKCL_MAPFILENAME))
        == 0)
    {
        fprintf(stderr, "ERROR: Can't open map\n");
        rc = EINVAL;
        goto invalid_exit;
    }

    /* Create and append site */
    memset(&map, 0, sizeof(MAPREGISTER));
    memset(&sheet, 0, sizeof(LISTREGISTER));
    memset(&createsite, 0, sizeof(CREATESITE));

    if(mapGetMapInfo(hmap, 1, &map, &sheet) == 0)
    {
        fprintf(stderr, "ERROR: Can't get map description\n");
        rc = EINVAL;
        goto invalid_exit;
    }

    mapname = mapGetMapName(hmap);
    if (mapname == NULL)
    {
        fprintf(stderr, "ERROR: Can't get map name\n");
        rc = EINVAL;
        goto invalid_exit;
    }

    createsite.Length = sizeof(CREATESITE);
    memcpy(createsite.MapName, mapname, sizeof(createsite.MapName)-1);
    createsite.MapType = map.MapType;
    createsite.MaterialProjection = map.MaterialProjection;
    createsite.Scale = map.Scale;
    createsite.FirstMainParallel = map.FirstMainParallel;
    createsite.SecondMainParallel = map.SecondMainParallel;
    createsite.AxisMeridian = map.AxisMeridian;
    createsite.MainPointParallel = map.MainPointParallel;

    if ((hsite = mapCreateAndAppendSite(hmap, "./test.sit", argv[MKCL_RSCFILENAME], &createsite)) == 0)
    {
        fprintf(stderr, "ERROR: Can't create temporary site\n");
        rc = EINVAL;
        goto invalid_exit;
    }

    FxDC.xcDisplay = pixmap.x11AppDisplay();
    FxDC.xcWindow = pixmap.handle();
    FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow, 0, NULL);
    FxDC.xcPoint.X = 0;
    FxDC.xcPoint.Y = 0;

    rect.left   = 0;
    rect.top    = 0;
    rect.right  = 40;
    rect.bottom = 40;

    if (mapPaintExampleSiteObject(hmap, hsite, (unsigned int)&FxDC, &rect, 10101010) == 0)
    {
        fprintf(stderr, "ERROR: Can't paint object\n");
        rc = EINVAL;
        goto invalid_exit;
    }

    if (!pixmap.isNull())
        pixmap.save("./test.bmp", "BMP");
    else
        fprintf(stderr, "Image wasn't painted\n");

    rc = app.exec();

invalid_exit:
    if (FxDC.xcContext != NULL)
       XFreeGC(FxDC.xcDisplay, FxDC.xcContext);

    delete mw;
    if (hrsc != 0)
        mapCloseRsc(hrsc);

    if (hmap != 0)
        mapCloseData(hmap);

     return rc;
}


PS: Документацию скачал, изучаю, спасибо! )
 
PPS: Сорри за некоторый бардак в коде, это учебно-тренировочный код. )
 
10101010 - неверное значение.
Тут должен быть внутренний код объекта из классификатора (индекс), а не внешний.

Варианты получения внутреннего кода:

// Запросить индекс (внутренний код) объекта
// info - идентификатор объекта карты в памяти
// При ошибке возвращает 0 (ноль допустим для нового объекта)

_MAPIMP long int _MAPAPI mapObjectCode(HOBJ info);

 // Запросить внутренний код (порядковый номер) объекта
 // по внешнему коду , локализации  и порядковому номеру среди аналогичных
 // объектов(с 1)
 // hRsc - идентификатор классификатора карты
 // При ошибке возвращает ноль

_MAPIMP  long int  _MAPAPI mapGetRscObjectCodeByNumber(HRSC hRsc,
                                               long int excode,
                                               long int local,
                                               long int number = 1);
 
Вопрос тот же - как получить изображения объектов (для предпросмотра), но без использования qt?
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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