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

Работа с несколькими листами карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Работа с несколькими листами карты
 
Как установить прозрачность нескольких листов карты?
Я делаю так:
Код
    QDMapView *mapView = new QDMapView(this);
    mapView->setGeometry(0, 0, 1200, 800);

    QString nameSxf1 = "/usr/share/maps/Kazan/N-38-2.sxf";
    QString nameSxf2 = "/usr/share/maps/Kazan/N-39-1.sxf";
    QString nameRsc = "/usr/share/maps/Kazan/500t05g.rsc";
    QString nameMap1 = "/usr/share/maps/map1.map";
    QString nameMap2 = "/usr/share/maps/map2.map";
    qDebug() << ImportFromAnySxfPro(0, reinterpret_cast<const WCHAR *>(nameSxf1.constData()),
                                    reinterpret_cast<const WCHAR *>(nameRsc.data()),
                                    reinterpret_cast<WCHAR *>(nameMap1.data()), 0, 0, 0, 0, 1, 0, 0);
    qDebug() << ImportFromAnySxfPro(0, reinterpret_cast<const WCHAR *>(nameSxf2.constData()),
                                    reinterpret_cast<const WCHAR *>(nameRsc.data()),
                                    reinterpret_cast<WCHAR *>(nameMap2.data()), 0, 0, 0, 0, 1, 0, 0);

    qDebug() << mapView->MapOpen(nameMap1, true);
    qDebug() << mapAppendAnyDataPro(mapView->GetMapHandle(), reinterpret_cast<const WCHAR *>(nameMap2.constData()), 0, 0);

    qDebug() << mapSetSiteTransparent(mapView->GetMapHandle(), mapView->GetMapHandle(), 20);
- устанавливается прозрачность только первого открытого листа.
 
Код
  // Установить степень прозрачности карты (от 0 до 100)
  // hMap  - идентификатор открытой карты
  // hSite - идентификатор открытой пользовательской карты
  // transparent - степень прозрачности карты от 0 (карта не видна)
  // до 100 (карта не прозрачная)
  // Возвращает новое значение флага 
  
  _MAPIMP long int _MAPAPI mapSetSiteTransparent(HMAP hMap, HSITE hSite, long int transparent); 
Вторым параметром передается идентификатор листа(HSITE), который можно запросить по порядковому номеру в
Код
// Определить идентификатор открытой пользовательской карты  
// по ее номеру в цепочке  
// hMap   - идентификатор открытой карты  
// number - номер пользовательской карты в цепочке  
// Если number == 0, возвращается идентификатор фоновой  
// (базовой) карты, равный hMap (он может применяться вместо HSITE)!  
// При ошибке возвращает ноль   

_MAPIMP HSITE _MAPAPI mapGetSiteIdent(HMAP hMap,long int number);

При указании в параметре HSITE идентификатора HMAP, выполняется действие для базовой карты только.
 
Спасибо.
Появился еще вопрос.
Хочу на временной пользовательской карте нарисовать объект, координаты которого находятся сразу на двух листах.
Если использовать код из первого поста плюс этот для рисования прямоугольника:
Код
    HMAP hMap = mapView->GetMapHandle();
    HSITE hSite = mapCreateAndAppendTempSiteUn(hMap, 0);

    HOBJ hObj = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
    mapRegisterDrawObject(hObj, 0, LOCAL_LINE);

    IMGLINE lineParm;
    memset(&lineParm, 0, sizeof(IMGLINE));
    lineParm.Thick = PIX2MKM(30);
    mapAppendDraw(hObj, IMG_LINE, reinterpret_cast<const char *>(&lineParm));

    const int LENGTH = 300000;
    mapAppendPointPlane(hObj, 6180000, 8550000);
    mapAppendPointPlane(hObj, 6180000, 8550000 + LENGTH);
    mapAppendPointPlane(hObj, 6180000 - 10000, 8550000 + LENGTH);
    mapAppendPointPlane(hObj, 6180000 - 10000, 8550000);
    mapAppendPointPlane(hObj, 6180000, 8550000);

    mapCommitObject(hObj);
    mapView->repaint();
отрисовывается только часть прямоугольника на первом листе.
Думал куда-нибудь присобачить mapGetSiteIdent(), да вроде некуда.
Помогите нарисовать такой объект.
 
Непонятен вопрос немного.
Если Вы создаете объект на SIT (временном или постоянном), то он будет создан полностью. В нем нет понятия рамка листа.
Если Вы создаете объект на MAP(однолистовом) - метрика обрежется по рамке листа, потому что за ней ничего не может быть.
Если Вы создаете объект на MAP(многолистовом) и используете функцию mapCommitObjectWithPlace, то объект порежется на несколько (на какие листы он попадает) и будет сохранен как разные объекты.
 
В примере выше я открыл два листа, создал временный SIT и создал прямоугольник на нем. Вы пишете он должен быть создан полностью, и наверное так и есть. Проблема в том, что у меня он отображается только на первом открытом листе, там где первый лист заканчивается он перестает отрисовываться. Почему так?
 
Мне кажется Дмитрий называет листами пользовательские (sit) карты, а не листы многолистовых векторных карты (которые Sheet)
Изменено: Владимир Егоров - 15.10.2018 17:24:06
 
В первом сообщении этой темы:
Код
QString nameSxf1 = "/usr/share/maps/Kazan/N-38-2.sxf";     
QString nameSxf2 = "/usr/share/maps/Kazan/N-39-1.sxf";
это я называю листами и хочу нарисовать большой объект, который будет находиться на обоих.
Поправьте меня если это не листы.
 
Приветствую!

По коду вроде все нормально.
Вероятно, прямоугольник обрезается габаритами основной карты (/usr/share/maps/map1.map),
Находиться объект будет в любом случае на той карте, на которой создается (временная пользовательская)
Попробуйте в качестве основной карты использовать пользовательскую (sit или sitx), на нее добавьте сконвертированные из sxf и временную для рисования прямоугольника. в этом случае, вероятно все будет нормально.
Если не получится, то можно на пользовательскую основную добавить какой-нидь объект-рамку (для увеличения габаритов) покрывающий, к примеру, весь Татарстан


С уважением,
Матвеев П.В.
 
Спасибо за подсказки.
Проблема была, видимо, во временной пользовательской карте.
После открытия сконвертированных sxf вместо mapCreateAndAppendTempSiteUn() использовал mapCreateAndAppendSiteUn(), и все нарисовалось.
Страницы: 1
Читают тему (гостей: 1)



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

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