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

Работа со слоями. При скрытии слоя пропадают все добавленные на карту объекты и перестает работать добавление их

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Работа со слоями. При скрытии слоя пропадают все добавленные на карту объекты и перестает работать добавление их, Работа со слоями. При скрытии слоя пропадают все добавленные на карту объекты и перестает работать их последующее добавление
 
Добрый день!


1. Загрузка карты и создание временной карты
Код
   ui->viewMap->SetMapFileName("/home/arm/gisdesigner/Podolsk/podolsk.map");
   ui->viewMap->SetMapActive(true);
   ui->viewMap->SetMapVisible(true);                
   hmap = ui->viewMap->GetMapHandle();
   hsite = mapCreateAndAppendTempSite(hmap, "/home/arm/gisdesigner/Podolsk/Topo100t.rsc");

2. Добавляю объект на пользовательскую карту.
 
Код
          HOBJ hObj = mapCreateSiteObject(hmap, hsite, IDDOUBLE2);  
          mapRegisterDrawObject(hObj, 5, IMG_LINE); 

          IMGLINE parm1;
          parm1.Color = RGB(255,0,0);
          parm1.Thick = PIX2MKM(10);

          mapAppendDraw(hObj, IMG_LINE, (const char *) &parm1);
          mapAppendPointPlane(hObj, 6169347, 7408652);
          mapAppendPointPlane(hObj, 6169657, 7410182);
          mapCommitObject(hObj);            
          mapFreeObject(hObj);
          ui->viewMap->Repaint();     
3. Далее работа с отображением слоев. Скрываю слой  "РАСТИТЕЛЬНОСТЬ (ЗАЛИВКА),ТАКЫР"
Код
    QString fileName = "/home/arm/gisdesigner/Podolsk/Topo100t.rsc";
    QDMapSites *mapSites = ui->viewMap->VarMapSites;     // доступ к пользовательским картам
    QDMapSite *currentMapSite;
    currentMapSite = mapSites->GetSitesForFileName(const_cast<char*>(fileName.toStdString().c_str()) );

    QDMapSelect *qselect = new QDMapSelect(ui->viewMap->GetMapViewAcces());
     qselect->SetSiteNumber(currentMapSite->GetNumber());  // номер пользовательской карты (для базовой 0)
     qselect->SetLayers(3, false); // отключить слой номер 3
     ui->viewMap->SetViewSelect(qselect);
     ui->viewMap->SetSelecting(true);
     ui->viewMap->Repaint();
В результате пункта 3 у меня перестает отображаться слой номер 3, НО также у меня перестает отображаться добавленный ранее объект. И при повторной попытке добавить объект (описано в пункте 2) он не добавляется на карту.

Помогите пожалуйста решить эту проблему. Также подскажите пожалуйста, как реализовать добавление объектов на определенный пользовательский слой, чтобы потом программно я могла бы скрывать и свои созданные слои.

4. Также подскажите пожалуйста есть ли какие спец. методы, которые позволяют отображать всплывающие подсказки при наведении курсора мыши на объекты добавленные на карту (собственные и из классификатора).


Использую ОС Astra Linux, карта Подольска.
Использую ГИС   Конструктор для Qt Designer x64 (версия 12.3.1, Qt 4, Qt 5, платформа   x64, ОС "Astra Linux Special Edition", релиз "Смоленск") от 10.05.2018
 
С пропаданием созданного объекта разберемся.
Для управления пользовательским слоем надо его сначала добавить в классификатор. Также в этот слой добавьте возможные виды объектов этого слоя.
Далее создавайте объекты именно в этом слое и управляйте его отображением.

Специальных методов для отображения всплывающих подсказок в инструментарии нет, так как в каждом приложении может быть своя логика их поведения.
Надо на перемещение мыши выполнять поиск объекта карты в точке и выводить нужную подсказку.
 
Спасибо, тогда напишите пожалуйста, когда разберетесь с пропаданием объектов.

А можете пожалуйста уточнить, какой метод использовать для добавления слоя в классификатор?

Управлять отображаем пользовательского слоя аналогично тому, что я описала в пункте 3?
Изменено: Анастаия - 18.05.2018 08:47:16
 
Для управления отображением ГРАФИЧЕСКИХ объектов есть отдельные методы в MAPAPI:
Код
 // Запросить признак отбора графических объектов по обобщенным условиям поиска
 // hselect - условия поиска/отображения
 // если результат = 0 - отбор по "общему" фильтру,
 //                  1 - отобрать только графические объекты,
 //                  2 - не отбирать графические объекты

_MAPIMP long int _MAPAPI mapGetDrawObjectsFlag(HSELECT hselect);


 // Установить признак отбора графических объектов по обобщенным условиям поиска
 // hselect - условия поиска/отображения
 // flag = 0 - отбор по "общему" фильтру,
 //        1 - отобрать только графические объекты,
 //        2 - не отбирать графические объекты.

_MAPIMP void _MAPAPI mapSetDrawObjectsFlag(HSELECT hselect, long int flag);

Нужно ВКЛЮЧИТЬ отображение (выбор) графических объектов в условиях поиска\отображения.
 
Если Вам необходимо создавать некие группы пользовательских объектов, а затем управлять их отображением (вкл/выкл), то сделать это можно несколькими способами:
1. использовать в качестве "слоев" несколько пользовательских карт (в т.ч. временных), создавать на них нужные объекты и управлять их отображением на уровне включения/выключения отдельных карт;
2. использовать систему управления отображением на основе классификационных признаков с помощью HSELECT (как Вы уже пытались);
3. использовать систему управления отображением HSELECT в том числе для включения или выключения графических объектов;
4. комбинация указанных выше методов.


Способ 1 позволяет использовать графические объекты. Пользовательская карта включается и выключается целиком.
Недостаток графических объектов в том, что они не имеют четких классификационных признаков. То есть их нельзя отнести к какому либо слою классификатора и, соответственно,  включить или выключить их как часть этого слоя.

Способ 2 основан на том, что объекты имеют классификационный код, то есть принадлежат определенному слою в классификаторе карты. Это позволяет включить или выключить эти объекты путем управления отображением этого слоя.

Способ 3 также использует контекст поиска/отображения HSELECT для установки состава отображения карты, но при использовании объектов, не имеющих классификационных кодов (графических объектов) использовать его немного сложнее.
Придется более детально настраивать HSELECT, в том числе для графических объектов - как Вам подсказали выше.

Цитата
Анастаия написал:
А можете пожалуйста уточнить, какой метод использовать для добавления слоя в классификатор?
Как правило, классификатор карты готовиться заранее и определяет некую утвержденную структуру картографической информации.
Поэтому в качестве методов компонентов ГИС Конструктора средства редактирования классификатора не вынесены.
При необходимости можно воспользоваться функциями интерфейса MAPAPI.


Цитата
Анастаия написал:
И при повторной попытке добавить объект (описано в пункте 2) он не добавляется на карту

Скорее всего он добавляется, но поскольку Вы установили свой состав отображения по HSELECT, в котором не включено отображение графических объектов, Вы его не видите.
Рекомендую проверять коды возврата от функций MAPAPI и методов компонент ГИС Конструктора. Если объект не создан, mapCommitObject вернет ноль.


Документация ГИС Конструктор для Qt Designer SE
 
Добрый день!
Спасибо за ответ.
1) Можете пожалуйста привести пример реализации работы первого способа.
2)
Цитата
Денис Вицко написал:
Скорее всего он добавляется, но поскольку Вы установили свой состав отображения по HSELECT, в котором не включено отображение графических объектов, Вы его не видите.Рекомендую проверять коды возврата от функций MAPAPI и методов компонент ГИС Конструктора. Если объект не создан, mapCommitObject вернет ноль.
Проверила. Объект действительно добавляется (методы mapRegisterDrawObject, mapAppendDraw, mapAppendPointPlane возращают 1, а метод mapCommitObject возвращает 2), но объект не виден на карте.


3) Уточните пожалуйста, какой метод использовать для создания пользовательского слоя?

4) Также не ясно какой номер слоя указывать при регистрации нового объекта?  Сейчас я задаю системный слой номер 5  (Рельеф суши)

mapRegisterDrawObject(hObj, 5, LOCAL_TITLE);                // локализация - площадной объект

5) Не могу разобраться, как именно корректно задать состав отображения HSELECT. Можете пожалуйста привести пример или ссылку на документацию, где это указано.
Цитата
Денис Вицко написал:
Скорее всего он добавляется, но поскольку Вы установили свой состав отображения по HSELECT, в котором не включено отображение графических объектов, Вы его не видите.
Изменено: Анастаия - 24.05.2018 14:39:25
 
Цитата
Анастаия написал:
1) Можете пожалуйста привести пример реализации работы первого способа.

Тут вряд ли нужен пример. Все должно быть понятно и так.
Просто опишу примерный порядок действий.
1. к основной (фоновой) карте создаете и добавляете временную пользовательскую карту
mapCreateAndAppendTempSiteUn
2. пункт 1 повторяете столько раз, сколько "слоев" вам необходимо, получаете для каждой такой карты описатель - HSITE;
3. создаете объекты на той или другой пользовательской карте, используя соответствующий HSITE - mapCreateSiteObject
4. далее эти объекты по своему усмотрению регистрируете либо видом из классификатора карты (mapRegisterObject), либо как графический (mapRegisterDrawObject) с добавлением им графики (mapAppendDraw и пр.), сохраняете их - mapCommitObject.    
5. по Вашему усмотрению включаете или выключаете ту или иную пользовательскую карту - mapSetSiteViewFlag, выполнить перерисовку по новым условиям.


Цитата
Анастаия написал:
3) Уточните пожалуйста, какой метод использовать для создания пользовательского слоя?
Это уже вопрос по классификатору?
см. Функции работы со слоями из классификатора объектов - mapAppendRscSegment
Но я бы не рекомендовал программно динамически изменять классификатор карты. Классификатор - это все-таки статическая вещь, определяющая структуру карты.


Цитата
Анастаия написал:
Также не ясно какой номер слоя указывать при регистрации нового объекта?
Тот, с которым Вы желаете соотнести Ваш объект, так как реально в классификаторе карты описания его условного знака не будет. Это для того, чтобы как раз ГИС-ядро и могло рассматривать такие объекты как часть того или иного слоя, определенного в классификаторе.
Это также используется и при установке условий отображения (HSELECT), когда Вы включаете или выключаете слой целиком.
Но для графических объектов при этом необходимо учитывать, что для них есть еще один уровень фильтрации - так, как Вам написал выше Oleg Belenkov.
 
Добрый день!
1) По первому вопросу разобралась. Спасибо за помощь!
2) По второму пункту вопрос остается открытым. После открытия окна "Состав объектов карты" графические объекты (линия, тексты и др не добавляются), но добавляются стандартные объекты из классификатора.

Цитата
Денис Вицко написал:
Но для графических объектов при этом необходимо учитывать, что для них есть еще один уровень фильтрации - так, как Вам  написал выше Oleg Belenkov .
Вот этот момент мне пока еще не совсем понятен
 
Цитата
Анастаия написал:
После открытия окна "Состав объектов карты" графические объекты (линия, тексты и др не добавляются), но добавляются стандартные объекты из классификатора.

Диалог "Состав объектов карты" устанавливает состав отображения. Это все такой же HSELECT, который Вы можете установить самостоятельно с помощью SetViewSelect.
Причин "недобавления" объектов может быть две.
а) Вы добавляете графические объекты в слой, который сейчас выключен из состава отображения;
б) в HSELECT-е, установленном для фильтрации состава отображения (в SetViewSelect), выключены графические объекты (см. mapGetDrawObjectsFlag/mapSetDrawObjectsFlag - флаг =2).
Любое из этих условий приведет к тому, что Вы просто не увидите создаваемые графические объекты.
Страницы: 1
Читают тему (гостей: 1)



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

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