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

Подскажите пожалуйста есть ли возможность добавить собственное изображение в классификатор в формате png, jpg, jpeg, bmp?

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 След.
RSS
Подскажите пожалуйста есть ли возможность добавить собственное изображение в классификатор в формате png, jpg, jpeg, bmp?
 
Доброе утро!
Спасибо, пример собирается и новые объекты действительно добавились в классификатор. Единственное, помогите пожалуйста еще доразобраться, как добавить свое изображение в классификатор вместо стандартных примитивов.Также уточните пожалуйста у какого типа объектов я могу задать отображение в виде собственного изображения (линейный, площадные, точечные)?

Код
    HRSC rscHandle = mapGetRscIdent(hmap, hsite);

    long int totalObjectCount = mapGetRscObjectCount(rscHandle);
    printf("All object in class: %d\n", totalObjectCount);

    RSCOBJECT newObject;
    memset( &newObject, 0, sizeof(newObject) );

    // Создать точечный объект
    newObject.Code = 10016;
    newObject.Segment = 7;
    newObject.Length = sizeof(RSCOBJECT);
    newObject.Local = LOCAL_POINT;
    strcpy(newObject.Name, "NewPoint2");

    int incode = mapAppendRscObject(rscHandle, &newObject);

    IMGGRAPHICMARKEX parm;
    memset((char*)&parm, 0, sizeof(parm));
    strcpy(parm.Name, "test.bmp");
    parm.Type = 1;
    parm.Height = 32;
    parm.Width = 32;
    parm.Length = sizeof(parm);
    parm.PosV   = 16;
    parm.PosH   = 16;
    parm.TransparentFlag = 1;

    int isImageSet = mapSetRscPrintObjectImage(rscHandle, incode, sizeof(IMGGRAPHICMARKEX), IMG_GRAPHICMARK, (char *)&parm);
    std::cout<<"isImageSet "<<isImageSet<<std::endl;

    if (incode && isImageSet)
        printf("Add point object: %d\n", incode);
    else
        printf("Not add point object\n");

    totalObjectCount = mapGetRscObjectCount(rscHandle);
    printf("All object in class: %d\n\n", totalObjectCount);

    mapCloseRsc(rscHandle);




Выполнение выше приведенного кода добавляет в классификатор новый точечный объект, но внешний вид его крестик розовый. Подскажите, почему не добавилось изображение? (Изображение находится в папке с проектом и в папке, где собирается проект).
 
Ошибка вкралась в пример.
Все размеры задаются в микронах (для экранного вида - условные микроны = пиксел * 250).
Код
// Операции пересчета пикселов в микроны и обратно
#define MKMINPIX     250  //  1000 * 25.4 / 96 = 264.583333
#define PIX2MKM(pixel)  (((int)(pixel))  * MKMINPIX)
#define MKM2PIX(metric) (((int)(metric)) / MKMINPIX)
 
Соответственно
Код
parm.Height = PIX2MKM(32);     
parm.Width = PIX2MKM(32);    
parm.PosV   = PIX2MKM(16);     
parm.PosH   = PIX2MKM(16);
 
К сожалению это не решило проблемы. По-прежнему вместо изображения собственного вижу розовый крестик.


Также, Вы не ответили на вопрос какой должна быть локализация добавляемого объекта, когда я хочу его отображать в виде изображения bmp? Сейчас в примере я создаю LOCAL_POINT, а затем задаю новый вид объекту.
Изменено: Анастаия - 28.06.2018 16:19:45
 
Здравствуйте!

Исходя из исходного текста, новому объекту назначается только принтерный вид.
Вероятно, Вы видите вид по умолчанию (розовый крестик) в образце отображения в экранном виде (вкладка "Вид" диалога "Редактор классификатора"). Образец принтерного вида объекта можно посмотреть на вкладке "На печать".

Вид отображения "Графический файл" можно назначить векторным и точечным объектам.
 
Здравствуйте!
Код
В образце отображения в экранном виде (вкладка "Вид" диалога "Редактор  классификатора"). Образец принтерного вида объекта можно посмотреть на  вкладке "На печать".
К сожалению на этой вкладке я также не вижу свое изображение, только розовый крестик! Код свой я привела. Вы по нему не можете сказать,  

Тогда ПО-ПРЕЖНЕМУ НЕ ЯСНО , как мне добавить объект с собственным изображением в классификатор. Вы можете мне ПРИВЕСТИ пример или сказать, какой для этого использовать метод?

Пример, что ВЫ дали, он рабочий, но в нем нет добавления именно собственного изображения. Я же ранее уже писала, что у нас задача добавления изображения в формате bmp, png, jpg.



! Уточните пожалуйста какие методы необходимо применить для установления экранного и принтерного вида точечного объекта в классификаторе?
Изменено: Анастаия - 02.07.2018 09:29:11
 
Здравствуйте!

Привожу полный пример исходного кода добавления в классификатор точечного объекта с видом "Графический знак".
Примечания по данному исходному коду:
- за основу взят пример из предыдущих постов;
- добавлено использование описанного ранее макроса PIX2MKM;
- добавлено назначение экранного вида с помощью функции mapSetRscObjectImage;
- для тестирования необходимо, чтобы bmp-файл находился рядом с измененным классификатором;
- отображение образца объекта в редакторе классификатора проверено в продуктах ГИС Панорама Мини для Windows и ГИС Оператор SE для Astra Linux.
Код
#include <iostream>
#include "rscapi.h"


int main(int argc, char *argv[])
{
  HRSC rscHandle = mapOpenRsc("topo200t.print.rsc");


  long int totalObjectCount = mapGetRscObjectCount(rscHandle);
  printf("All object in class: %d\n", totalObjectCount);


  RSCOBJECT newObject;
  memset( &newObject, 0, sizeof(newObject) );


  // Создать точечный объект
  newObject.Code = 10016;
  newObject.Segment = 7;
  newObject.Length = sizeof(RSCOBJECT);
  newObject.Local = LOCAL_POINT;
  strcpy(newObject.Name, "NewPoint2");


  int incode = mapAppendRscObject(rscHandle, &newObject);


  IMGGRAPHICMARKEX parm;
  memset((char*)&parm, 0, sizeof(parm));
  strcpy(parm.Name, "test.bmp");
  parm.Type = 1;
  parm.Height = PIX2MKM(32);
  parm.Width = PIX2MKM(32);
  parm.Length = sizeof(parm);
  parm.PosV   = PIX2MKM(16);
  parm.PosH   = PIX2MKM(16);


  int isImagePrinterSet = mapSetRscPrintObjectImage(rscHandle, incode, sizeof(IMGGRAPHICMARKEX), IMG_GRAPHICMARK, (char *)&parm);
  std::cout << "isImageSet (printer view) " << isImagePrinterSet << std::endl;


  int isImageScreenSet = mapSetRscObjectImage(rscHandle, incode, sizeof(IMGGRAPHICMARKEX), IMG_GRAPHICMARK, (char *)&parm);
  std::cout << "isImageSet (screen view) " << isImageScreenSet << std::endl;


  if (incode && isImagePrinterSet && isImageScreenSet)
    printf("Add point object: %d\n", incode);
  else
    printf("Not add point object\n");


  totalObjectCount = mapGetRscObjectCount(rscHandle);
  printf("All object in class: %d\n\n", totalObjectCount);


  mapCloseRsc(rscHandle);
}
 
Спасибо Вам за оказанную помощь! Теперь все работает именно так как необходимо!
Единственное Вы не уточните, есть ли возможность добавить изображение с прозрачным фоном?
 
Формат bmp не поддерживает прозрачность.
Есть возможность сделать прозрачным фон исходя из цвета первого пиксела используемого bmp. Для этого нужно выставить флаг TransparentFlag структуры
IMGGRAPHICMARKEX (mapgdi.h):
 
Код
char     TransparentFlag;        // Флаг прозрачности фонового цвета   
                                 // (первый пиксел картинки - левый нижний угол BMP)
Код
parm.TransparentFlag = 1;
 
Спасибо за помощь! Все работает, так как это было необходимо!
Изменено: Анастаия - 03.07.2018 10:46:20
 
Добрый день!

Подскажите пожалуйста. Можно ли добавить картинку на карту, но без добавления ее в классификатор?

Я попытался сделать все, аналогично приведенному выше коду, используя следующие код:
Код
HOBJ hObj = mapCreateSiteObject(m_baseMapHandler, m_userMapHandler, IDDOUBLE2, 0);

IMGGRAPHICMARKEX parm;
memset(&parm, 0, sizeof(parm));
parm.Length = sizeof(parm);
parm.Type = 1; // 1- BMP
parm.Height = PIX2MKM(640);
parm.Width = PIX2MKM(800);
parm.PosH = 0;
parm.PosV = 0;

const char * picturename = "image.bmp";
strcpy(parm.Name, picturename);

mapRegisterDrawObject(hObj, 1, LOCAL_POINT);                            //28/02/18
mapAppendDraw(hObj, IMG_GRAPHICMARK, (char *)&parm);

mapAppendPointPlane(hObj, x, y);
auto resCommit = mapCommitObject(hObj); 

На карте добавляется рамка, а картинка не отображается.

Файл image.bmp лежит в  одном каталоге с пользовательской картой и файлом классификатора.

Что я делаю не так?

Заранее спасибо.
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)



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

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