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

[MAPAPI] Добавление подписи к объекту

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
[MAPAPI] Добавление подписи к объекту, [MAPAPI] Добавление подписи к объекту
 
Здравствуйте.

А есть ли возможность добавить к объекту подпись (на пользовательских слоях)?
В виде отдельного объекта или семантики.

Я сейчас умею создавать объекты типа подпись на пользовательской карте,
но чтоб использовать данные объекты как подпись к другим объектам,
понадобится вычислять координаты точки, куда эту подпись помещать,
и при изменении масштаба подпись будет уезжать (наверное, я не пробовал ещё).
А хотелось бы иметь возможность добавить подпись (над или под объектом, с смещением, скажем, в 5 пикселей) с привязкой к объекту,
и чтобы подпись при изменении масштаба была привязана к объекту (к рамке объекта, например).
То как я сейчас рисую текст с помощью подписей на пользовательских картах:

Код
    HMAP hmap = panorama::mapOpenWMS(MAP_PATH);
    if (hmap == 0){
        std::cerr << "can not open map" << MAP_PATH;
        return 1;
    }
    HSITE site = panorama::mapCreateAndAppendTempSite(hmap, RSC_PATH);
    if (site == 0){
        std::cerr << "can not create temp sit" << std::endl;
        return 1;
    }

    DFRAME mapFrame;
    rc = panorama::mapGetTotalBorder(hmap, &mapFrame, panorama::PP_GEO);
    if (rc == 0){
     std::cerr << "can not get frame of map" << std::endl;
     return 1;
    }else{
        std::cerr << "total border in geo: X1:" << ::gis::coord::common::radian2degree(mapFrame.X1)
                  << " X2:" << ::gis::coord::common::radian2degree(mapFrame.X2)
                  << " Y1:" << ::gis::coord::common::radian2degree(mapFrame.Y1)
                  << " Y2:" << ::gis::coord::common::radian2degree(mapFrame.Y2)
                  << std::endl;
    }
    double centerB = (mapFrame.X1 + mapFrame.X2)/2.0;
    double centerL = (mapFrame.Y1 + mapFrame.Y2)/2.0;

    HOBJ textObj = mapCreateSiteObject(hmap, site);
    if (textObj == 0){
     std::cerr << "can not create object text on temp site" << std::endl;
     return 1;
    }
    rc = panorama::mapRegisterObjectByKey(textObj, TEXT_SIGN_KEY);
    if (rc == 0){
     std::cerr << "can not register text object by key" << std::endl;
     return 1;
    }
    rc =mapAppendPointGeo(textObj, centerB, centerL);
    if (rc == 0){
     std::cerr << "can not append point to object Text" << std::endl;
     return 1;
    }
    QString text = " Hello world мир";
    QByteArray koi8r = ::gis::common::convertStringToKOI8_R(text);
    rc = panorama::mapPutText(textObj, koi8r.constData(), 0);
    if (rc == 0){
     std::cerr << "can not put text to text object" << std::endl;
     return 1;
    }
    mapCommitObject(textObj);
    mapFreeObject(textObj);
    drawToFile(hmap, "map.png", 600, 200);
    mapCloseData(hmap);



P.S. я пытался найти на форуме, но попадались только темы про настольные приложения ГИС Карта и задачи автоматического построения объектов по семантике или типа того.

P.P.S. нашёл несколько тем(одна из них), но как-то понятнее не стало =( Видимо, только вручную поддерживать объект подпись рядом с объектом к которому он относится, либо использовать редактор классификатора (нам не подходит, у нас нет операторов, работающих с картой)
Изменено: Владимир Егоров - 06.11.2018 16:45:37
 
Можно выравнивание использовать (для точечных объектов). В качестве точки метрики подписи отдавать точку метрики объекта, а выравнивание выставлять горизонтальное по центру, а вертикальное - по верхней линии:

Код
    rc = panorama::mapPutTextVerticalAlign(textObj, FA_TOP, 0);
    if (rc != FA_TOP){
        std::cerr << "can not put vertical align to text object" << std::endl;
        return 1;
    }
    rc = panorama::mapPutTextHorizontalAlign(textObj, FA_CENTER, 0);
    if (rc != FA_RIGHT){
        std::cerr << "can not put horizontal align to text object" << std::endl;
    }

Что-то типа такого получается: пример

Но это подойдёт только если знак рисуется вверх от первой точки метрики.
Знак может быть векторным, например, и рисоваться вокруг первой точки метрики (какой-нибудь круглый знак).
Изменено: Владимир Егоров - 06.11.2018 17:28:17
Страницы: 1
Читают тему (гостей: 1)



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

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