На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

Аналог LoadMapToBmp в Linux

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти  
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Аналог LoadMapToBmp в Linux
Есть ли аналог данной функции для вырезки фрагмента карты?
Попробуйте mapPaintToXImage(...)
Потом полученные байты сохранить в подходящий Вам графический формат
Можно пример как это правильно сделать?
Аналог функции для Linux:
extern "C"
{
//========================================================================
// Сохранить карту в формате BMP
// map - карта,содержащая векторные данные;
// handle - диалог визуального сопровождения процесса обработки.
// dframe - фрагмент сохраняемой карты(в метрах на местности)
// bitcount = 8 - кол-во бит на пиксел сохраняемого изображения
// scale - масштаб сохраняемого изображения
// resolution - разрешающая способность сохраняемого изображения(т/дюйм) // 20/04/08
// bmpname - имя файла сохраняемого изображения (*.bmp);
// При ошибке возвращает ноль
//
// Диалогу визуального сопровождения процесса обработки посылаются
// сообщения:
// - (0x591) Извещение об изменении состония процесса
// WPARAM - текущее состоние процесса в процентах (0% - 100%)
// Если функция-отклик возвращает 0x590, то процесс завершается.
//
// - (0x592) Извещение об ошибке
// LPARAM - указатель на структуру ERRORINFORMATION
// Структура ERRORINFORMATION описана в
//========================================================================
long int _PICEX LoadMapToPicture(HMAP Map,HMESSAGE Handle,
DFRAME * dframe, long BitCount,
long Scale, long Resolution,
char* BmpName,
HMESSAGE handleMainWin);

long int _PICEX LoadMapToPictureEx(HMAP Map,HMESSAGE Handle,
DFRAME * dframe, long BitCount,
long Scale, long Resolution,
char* BmpName, long FlagIntergraphTIFF,
long FlagCompressTIFF,
HMESSAGE handleMainWin);
}
Функция находится в библиотеке libqdmappicex.so
Сразу хочу оговориться - код на работоспособность не проверял, поэтому если сразу "не прокатит", не обессудьте smile;)
значит, что у нас есть - у нас есть cx, cy, cw, ch (cx, cy - координаты верхнего левого угла карты, cw, ch - габариты по ширине и высоте соответственно). ВАЖНО! cx, cy, cw, ch - координаты в пикселях (не в метрах на местности!), и есть имя файла fileName, в который нам нужно сохранить область карты.
Код примерно такой:
Код

void funSaveMapToFile(const char* fileName, int cx, int cy, int cw, int ch)
{
    RECT rectDraw;
    int bytes_per_line;
    XIMAGEDESC Ximagedesc;
    char* imageBits;

// выставляем необходимые значения
    bytes_per_line = cw * mapGetMapScreenDepth() / 8;
    long allignwidth = cw * mapDepth / 8;
    long size = allignwidth * ch;

// выделяем память под картинку
    imageBits = ::AllocateTheMemory(size);
    if (!imageBits) return;
    memset(imageBits, 0x0, size);

// заполняем структуру для отрисовки куска карты   
    Ximagedesc.Point = imageBits;
    Ximagedesc.Width = cw;
    Ximagedesc.Height = ch;
    Ximagedesc.Depth = mapGetMapScreenDepth();
    Ximagedesc.CellSize = mapGetMapScreenDepth() / 8;
    Ximagedesc.RowSize = cw * Ximagedesc.CellSize;

// область карты, которую необходимо отрисовать
    rectDraw.left = cx;
    rectDraw.top = cy;
    rectDraw.right = cx + cw;
    rectDraw.bottom = cy + ch;

// собственно сама отрисовка
    mapPaintToXImage(hMap, &Ximagedesc, 0, 0, &rectDraw);

// в зависимости от глубины цвета карты выставляем формат картинки
    QImage::Format format;
    switch (mapGetMapScreenDepth())
    {
        case  8: format = QImage::Format_Indexed8; break;
        case 16: format = QImage::Format_RGB16; break;
        case 32: format = QImage::Format_RGB32; break;
        default: format = QImage::Format_Invalid; break;
    }

// создаем картинку
    QImage image((uchar *)imageBits, cw, ch, bytes_per_line, format);

// само сохранение (причем не нужно заботиться о формате картинки, Qt все сделает само)
    image.save(fileName);
    FreeTheMemory(imageBits);
}

...
// вызовы функции
    funSaveMapToFile("/tmp/map_0_0_100x100.bmp", 0, 0, 100, 100);
    funSaveMapToFile("/tmp/map_0_0_100x100.jpg", 0, 0, 100, 100);
// после вызова получаем 2 фала, один в формате bmp, другой в jpg
...

Большое Вам спасибо, только файл получаеться с абсолютно темной картинкой. Подозреваю, что неправильно указываю hMap. Использую
Код
HMAP hMap = mapOpenData("/home/City.sit",0);

Сама карта добавляется так
Код
ui.DMapView1->SetMapFileName("/home/City.sit");
ui.DMapView1->SetMapActive(TRUE);
ui.DMapView1->SetMapVisible(TRUE);
Не знаю чей способ Вы выбрали, но я у себя попробовал сохранить в 3-х форматах (bmp, png, jpg) - везде картинка получается, как на экране
З.Ы. Я использую исключительно MAPAPI (функции, не классы), хотя это не должно ни коим образом влиять
Изменено: Александр Колдаев - 25.08.2010 16:37:13
Вы дважды открываете карту:
- сначало с помощью MAPAPI - HMAP hMap = mapOpenData("/home/City.sit",0);
- затем ГИС Конструктором.
Каким способом отрисовки в файл пользуетесь?
через mapPaintToXImage
Я открываю карту так:
Код
void MapView::openMap(const char* fileName)
{
    if (hMap)
   mapCloseMap(hMap);

// открываем карту
    hMap = mapOpenMap(fileName, 0);

    if (hMap)
    {
        QFileInfo fi(fileName);
        QString sitFileName = fi.path() + "/Sit/oto.sit";
        QString rscFileName = fi.path() + "/Sit/oto.rsc";
        
        MAPREGISTER map;
        LISTREGISTER sheet;

        memset(&map, 0, sizeof(MAPREGISTER));
        memset(&sheet, 0, sizeof(LISTREGISTER));

// создаем пользовательскую карту, на которой потом будем рисовать
        if (mapGetMapInfo(hMap, 1, &map, &sheet))
        {
            CREATESITE createsite;
            memset(&createsite, 0, sizeof(CREATESITE));

            char sitName[] = "TEST";
            memcpy(createsite.MapName, sitName, strlen(sitName));
            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;
            createsite.Length = sizeof(CREATESITE);

            hSite = mapCreateAndAppendSite(hMap, qPrintable(sitFileName), qPrintable(rscFileName), &createsite);
        }
    }
}
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)


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