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

Программное создание объекта из растра или вектора

Поиск  Пользователи  Правила  Войти
Форум » Архивные темы (доступны только для чтения) » ГИС "Панорама" 13
Страницы: 1
RSS
Программное создание объекта из растра или вектора
 
Здравствуйте, подскажите, пожалуйста, как можно в виде кода добавлять картинки типа SVG (если это возможно).
Так же очень интересует как к такому объекту добавить подпись на карте и управлять масштабированием (размер объекта должен уменьшаться при приближении карты).
То что я смог осилить для добавления своей картинки на карту, но это png, не масштабируется и нет подписи:
Код
    hObj = mapCreateSiteObject(hMap, hSite);

    // -- image begin

    mapRegisterDrawObject(hObj, 1, LOCAL_VECTOR);

    IMGGRAPHICMARKEX graphicMark;
    memset(&graphicMark, 0, sizeof(graphicMark));
    graphicMark.Length = sizeof(graphicMark);
    StrCopy(graphicMark.Name, "image.png", sizeof(graphicMark.Name));
    graphicMark.Type = 0;  // Тип файла (0 - PNG, 1 - BMP, 2 - JPG...
    graphicMark.Width = PIX2MKM(640);
    graphicMark.Height = PIX2MKM(210);
    graphicMark.PosV = PIX2MKM(0);
    graphicMark.PosH = PIX2MKM(0);
    graphicMark.Rotate = 1;  // Установка возможности поворота

    mapAppendDraw(hObj, IMG_GRAPHICMARK, (char *)&graphicMark);

    // -- image end

    // Задание семантики объекта
    mapAppendSemantic(hObj, 31104, dataObj.name.toStdString().c_str(), dataObj.name.length());
    mapAppendPointPlane(hObj, p.x, p.y);
    mapCommitObject(hObj);
    mapFreeObject(hObj);
 
Цитата
Глеб Недосекин написал:
Так же очень интересует как к такому объекту добавить подпись на карте и управлять масштабированием (размер объекта должен уменьшаться при приближении карты).
1. Создание подписи аналогично созданию знака типа IMGGRAPHICMARKEX:

mapRegisterDrawObject(hObj, 1, LOCAL_TITLE);
IMGTRUETEXT imgtext;
memset(&imgtext, 0, sizeof(imgtext));
imgtext.Height = 2000;  // 2 мм
...
// Установить новое содержание текстовой строки
mapPutTextUnicode(hObj, text, 0);
mapCommitObject(hObj);

2.
// Установить/Запросить масштабируемость объекта
// Применяется ТОЛЬКО для графических объектов, имеющих внутренний код равный нулю
// Для объектов из классификатора значение игнорируется
// scale = 1 для установки масштабируемости при увеличении карты
//         0 для сброса признака масштабируемости
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSetObjectScale(HOBJ info, long int scale);
_MAPIMP long int _MAPAPI mapGetObjectScale(HOBJ info);
Изменено: Александр Кружков - 24.06.2021 12:45:28
 
Здравствуйте, спасибо за ответ, добавить текст получилось, а вот масштабируемость не получилось задать, в чём может быть проблема или возможны ещё способы?

Для масштабирования пробовал добавлять строку "mapSetObjectScale(hObj, 1);" в свой код выше по очереди перед строками: "mapCommitObject(hObj);", "mapFreeObject(hObj);", "mapRegisterDrawObject(hObj, 1, LOCAL_VECTOR);".
Пробовал 0 и 1 передавать, результат одинаковый, объект фиксированного размера.
 
Добрый день!
1. Если Вы отображаете объект в ГИС Панорама, то в главном меню включите режим "Параметры-Масштабирование объектов-Картографическое", если в своем приложении - установите картографический способ масштабирования для карты (0):

 // Установить способ масштабирования объектов карты при отображении
 // method - способ масштабирования
 // (0 - картографический "с запаздыванием увеличения",
 //  1 - чертежный)
 // Возвращает ранее установленное значение

mapSetScaleMethod(method);

2. Для объекта отключить масштабирование (scale = 0):
mapSetObjectScale(info, scale);

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

3. Если масштаб отображения мельче базового масштаба карты, то на объект может уменьшаться (по умолчанию press = 0, рекомендуется) или не уменьшаться (press = 1):
mapSetObjectPress(info, press);

P.S. Если указанные способы не помогут - прошу прислать карту (в формате SITX или SXF) с одним графическим знаком (для проверки отображения знака).
Изменено: Александр Кружков - 29.06.2021 09:39:10
 
Добрый день, масштабирование не сработало, карта типа "map" только, могу выслать Вам её и картинку в png если нужно.
Если не сложно, подскажите ещё, пожалуйста, как просмотреть все значки сохранённые в ресурсном файле (если правильно понимаю rsc)?
 
Картинка не поможет. Файл map можно сохранить в формате SXF (при сохранении установить номер сохраняемого объекта в фильтре).
Еще лучше (и проще !!!) пользоваться знаками, описанными в классификаторе карты (RSC). При необходимости знак можно добавить в классификатор в ГИС Панорама и затем создавать нужные знаки, регистрируя объекты с помощью функций:

// Сформировать описание нового объекта по внешнему коду и локализации
// или изменить код существующего объекта на карте
// info - идентификатор объекта карты в памяти
// excode - внешний код объекта (числовой),
// local  - локализация (LOCAL_LINE, LOCAL_POINT...)
// Обычно вызывается после mapCreateObject(...) и добавления семантики
// (если она есть)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapRegisterObject(HOBJ info, long int excode,
                                          long int local);

// Сформировать описание нового объекта по короткому имени объекта
// (ключу) или изменить код существующего объекта на карте
// info - идентификатор объекта карты в памяти
// name - символьный код объекта в классификаторе (до 31 символа)
// Обычно вызывается после mapCreateObject(...)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapRegisterObjectByKey(HOBJ info, const char *name);

Пример знака типа "Графический знак" см. в примерах, которые поставляются в составе ГИС Панорама (объект 530, точечный, код 85, ключ в классификаторе P0000000085):
c:\Users\Public\Documents\Panorama\Panorama13\data\shape\shape­.sitx

Для регистрации такого объекта вместо mapRegisterDrawObject необходимо вызвать:
mapRegisterObject(info, 85, LOCAL_POINT);
или
mapRegisterObjectByKey(info, "P0000000085");

При необходимости отображения разных знаков в диалоге редактирования вида знака можно выбрать семантику, из которой будет выбираться имя файла с картинкой (png, jpg).
Изменено: Александр Кружков - 29.06.2021 16:19:22
 
Спасибо большое за ответы, я сделал масштабирование перерисовкой объектов при изменении приближении и отдалении на карте по итогу (не самый лучший вариант, особенно с приростом кол-ва объектов, но на данный момент достаточно).
Вот только столкнулся с другой проблемой.
Я добавляю картинки на карту и есть случаи когда я добавил картинку по адресу, например, "/home/user/img.png", затем изменяю саму картинку и добавляю новую с этого же адреса (на данный момент она уже выглядит по другому). Так вот почему-то все эти картинки с одного адреса добавляются как последняя отрисованная.

Код добавления картинки:
Код
    hObj = mapCreateSiteObject(hMap, hSiteObjects);

    mapRegisterDrawObject(hObj, 1, LOCAL_VECTOR);

    IMGGRAPHICMARKEX graphicMark;
    memset(&graphicMark, 0, sizeof(graphicMark));
    graphicMark.Length = sizeof(graphicMark);

    QString addrPNG = changeSVGColorAndSaveToPNG(dataObj.pathObj, dataObj.color, dataObj.course);

    QImageReader readerPNG(addrPNG);

    double width = readerPNG.size().width() * 10 / (scaleFactor + 1),
           height = readerPNG.size().height() * 10 / (scaleFactor + 1);

    StrCopy(graphicMark.Name, addrPNG.toStdString().c_str(), sizeof(graphicMark.Name));
    graphicMark.Type = 0;  // Тип файла (0 - PNG, 1 - BMP, 2 - JPG ...
    graphicMark.Width = PIX2MKM((int)width);
    graphicMark.Height = PIX2MKM((int)height);
    graphicMark.PosV = PIX2MKM((int)(height / 2));
    graphicMark.PosH = PIX2MKM((int)(width / 2));
    graphicMark.Rotate = 1;  // Установка возможности поворота

    mapAppendDraw(hObj, IMG_GRAPHICMARK, (char *)&graphicMark);
    mapAppendPointPlane(hObj, p.x, p.y);
    mapAppendPointPlane(hObj, p.x, p.y);

    mapCommitObject(hObj);
    mapFreeObject(hObj);
 
Данная функция загружает картинку в память. Идентификатором картинки является полное имя картинки (/home/user/img.png). Если несколько объектов ссылаются на одно имя, то и рисуются они одинаково. Для получения разных изображений необходимо в каждый объект записать уникальные имена картинок.
Страницы: 1
Читают тему (гостей: 1)



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

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