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

Нарисовать сложные составной объект на карте

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

1) Подскажите пожалуйста имеется ли возможность с помощью гис панорама рисовать сложные составные объекты на карте? Если такая возможность имеется, то можете пожалуйста привести пример как это реализовать на примере составного объекта, например как по ссылке https://yadi.sk/i/MvBbAi3rNqmGgw (чтоб был один объект внутри другого).

Использую ГИС  Конструктор для Qt Designer x64 (версия 12.4.0, Qt 4, Qt 5, платформа  x64, ОС "Astra Linux Special Edition", релиз "Смоленск")


Пример изображения приведен по ссылке https://yadi.sk/i/MvBbAi3rNqmGgw
 
Приветствую!

Что такое составной объект?
Можно создать несколько объектов, объединить их в группу (есть семантики служебные для этого и АПИ для работы с группами). Реализовать работу с такими объектами как с одним объектом, используя ГИС Конструктор.

С уважением,
Матвеев П.В.
 
Я как раз сейчас тоже разбираюсь с наборами (группами) объектов.

Цитата
Реализовать работу с такими объектами как с одним объектом, используя ГИС Конструктор.
Вот примеры такого поведения где можно посмотреть ?

функции описаны в seekapi.h (после этого комментария идёт набор функций):



Код
  /*******************************************************************
  *                                                                  *
  *     ФУНКЦИИ ДЛЯ НАБОРА ОБЪЕКТОВ, ОБЪЕДИНЕННЫХ ПО СЕМАНТИЧЕСКОЙ   *
  *                      ХАРАКТЕРИСТИКЕ                              *
  *                                                                  *
  *  Коды семантик:                                                  *
  *                                                                  *
  *  32801 - признак объекта, имеющего ссылку на подчиненный объект; *
  *  32802 - признак объекта, на который имеется ссылка от главного  *
  *          объекта;                                                *
  *  32803 - признак объекта, входящего в группу равноправных        *
  *          объектов.                                               *
  *                                                                  *
  *    Значением семантики является уникальный номер группы, который *
  * формируется автоматически по номеру главного объекта или первого *
  * объекта в группе равноправных объектов.                          *
  *                                                                  *
  ********************************************************************/



Из того что я сейчас разобрал:

Для создания группы из уже созданных объектов нужно сначала создать группу

Код
 // Создание класса набора объектов, объединенных по семантической
 // характеристике
 // При ошибке возвращает 0

_MAPIMP HOBJSET _MAPAPI mapCreateObjectSet();

потом накидать в неё главный и подчинённые объекты:

Код
 // Добавить главный объект группу (с приписыванием семантики 32801)
 // hobjset - указатель на набор объектов
 // save - сохранение в файл : = 0 - не сохранять, 1 - сохранять
 // Если hobj - вновь созданный объект (Key = 0) и save = 1
 //             вначале info будет сохранен, а потом добавлен в группу
 // Если объект hobj содержит групповую семантику и является главным
 // - добавляет в набор, не изменяя групповую семантику
 // Если объект hobj содержит групповую семантику и является подчиненным
 // - добавляет групповую семантику (создает новую группу не разрушая старую)
 // Возвращает порядковый номер объекта или 0

_MAPIMP long int _MAPAPI mapObjectSetAppendGeneral(HOBJSET hobjset, HOBJ hobj,
                                                   long int save);

 // Добавить подчиненный объект группу (с приписыванием семантики 32802)
 // hobjset - указатель на набор объектов
 // save - сохранение в файл : = 0 - не сохранять, 1 - сохранять
 // Если hobj - вновь созданный объект (Key = 0) и save = 1
 //             вначале info будет сохранен, а потом добавлен в группу
 // Если объект hobj содержит групповую семантику и является главным
 // - добавляет групповую семантику (создает новую группу не разрушая старую)
 // Если объект hobj содержит групповую семантику и является подчиненным
 // - добавляет в набор, изменяя групповую семантику
 // Возвращает порядковый номер объекта или 0

_MAPIMP long int _MAPAPI mapObjectSetAppendSubordinate(HOBJSET hobjset, HOBJ hobj,
                                                       long int save); 
Причём, если создать объекты и не вызывать для них mapCommitObject, то при параметре save = 1 коммит произойдёт автоматически, правда номер у группы будет странный.


Если у вас уже есть набор(группа) объектов (на вновь открытой карте), то чтобы получить эту группу (имея один объект из группы), нужно -

Создать пустую группу (mapCreateObjectSet()),
Вызвать метод построения группы:

Код
 // Построение группы из объектов карты
 // по существующей в объекте групповой семантике
 // hobjset - указатель на набора объектов
 // info    - идентификатор объекта карты
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapBuildObjectSet(HOBJSET hobjset, HOBJ info);
И здесь, внимание, после вызова mapBuildObjectSet владение над объектом передаётся внутрь группы, то есть если после этого вызывать mapFreeObj(info), а потом mapFreeObjectSet(ваша группа объектов), то получим удаление невалидного (уже удалённог указателя).

При чём владение перехватывается только над тем объектом, для которого был вызван mapBuildObjectSet, не важно, главный он или подчинённый.

При использовании AppendGeneral и AppendSubordinate такой проблемы не будет.

Ещё из нюансов.
Код
 // Запрос признака группового объекта (по семантике)
 // groupnumber - переменная, куда помещается номер группы
 // (если он нужен) или 0
 // hobjset - указатель на набора объектов
 // hobj    - идентификатор объекта
 // Возвращает код групповой семантики (GROUPLEADER,GROUPSLAVE,GROUPPARTNER) или 0

_MAPIMP long int _MAPAPI mapObjectSetIsGroup(HOBJSET hobjset, HOBJ hobj,
                                             long int *groupnumber);
Вот в этой функции неважно какую группу объектов вы передаёте первым параметром, даже если объект hobj находится в другой группе объектов вы всё равно получите и номер группы и роль объекта в группе (главный/подчинённый/равноправный)
 
И ещё мне не совсем понятны некоторые описания функций, например:

Код
 // Найти главный объект в группе
 // hobjset - указатель на набор объектов
 // group - номер группы
 //         при group = 0 - номер группы устанавливается из набора hobjset
 // Объект HOBJ не нужно создавать !!!

_MAPIMP HOBJ _MAPAPI mapObjectSetFindGeneral(HOBJSET hobjset, long int group);

В комментарии сказано  - "Объект HOBJ не нужно создавать !!!"

А как бы мы могли его создать если HOBJ нам возвращается ?
Мы же не передаём его внутрь.

И нужно ли удалять объект, который нам вернёт mapObjectSetFindGeneral(...) ???

То же самое в другой функции:

Код
 // Запросить объект из набора по номеру (начиная с 1)
 // Объект HOBJ не нужно создавать !!!
 // hobjset - указатель на набора объектов
 // number  - номер объекта из набора
 // При ошибке возвращает 0

_MAPIMP HOBJ _MAPAPI mapObjectSetObject(HOBJSET hobjset, long int number);
 
Вообще, как я понял, группы объектов (HOBJSET) позволяют (с помощью использования служебных семантик) сохранять в карте (на пользовательских слоях, к примеру)   информацию о том, что объекты связаны.
Как вы их обрабатывать будете - уже ваши проблемы.

Ну то есть например - я хочу связать некоторый точечный объект и подпись (объект). Я могу создать группу и записать её в пользовательский слой (точечный объект - главный, подпись объект - подчинённый).

Затем, при очередном открытии пользовательского слоя я найду эту группу (в процессе загрузки объектов слоя) и где-то помечу для точечного объекта - что он главный. И при изменении метрики главного объекта я заодно изменю метрику подчинённого - подписи.
Причём для пользователя (который пользуется моим сервисом работы со слоями) будет виден только главный (точечный) объект, а подпись будет просто задаваться текстом при создании объекта. И редактировать (двигать) пользователь будет только точечный объект (главный). О реализации подписи в виде объекта с локализацией "подпись", входящего в состав группы, пользователь ничего знать не будет.


Поправьте меня если я не прав.
 
Цитата
И нужно ли удалять объект, который нам вернёт mapObjectSetFindGeneral(...) ???
Не нужно, я так понял что возвращается один из созданных внутри HOBJSET объектов, и при вызове mapFreeObjectSet все данные внутренние объекты будут удалены.

И судя по всему вызов mapBuildObjectSet добавляет в внутренний список тот объект который передаётся параметром, а для оставшихся объектов группы создаёт новые HOBJ, считывает в них объекты с карты и возвращает при вызове mapObjectSetObject
 
Приветствую!

HOBJSET не использовал, кажется что это не более чем АПИ для работы с группами, чтобы напрямую с семантиками не работать, ряд функций типа включить\исключить и т.п.
Для работы с группами использую те же семантики что используются при работе с HOBJSET.
Использование примерно как Вы и указали:
Выбрали объекты

Создали группу (записали семантику с информацией о группе)
Кликнули в карту - нашли объект, если объект из какой-то группы, то нашли все остальные, и выделили на карте. Для пользователя выглядит как работа с одним объектом)


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



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

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