На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

отображение подписи

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти  
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
отображение подписи
Возник следующий вопрос: создается точечный объект из классификатора и отображается на карте, необходимо рядом с ним вывести некоторую подпись, которая вводится пользователем через диалоговое окно и привязать ее к объекту, чтобы, например, при его передвижении двигалась и подпись. В документации по mapapi функциям я не нашла достаточно информации по подписям. Также, насколько я понимаю, для каждого объекта из классификатора имеется характеристика типа подпись, как можно вывести хотя бы ее, а не произвольную?
Объект создается следующим образом:

int MapLeft,MapTop,excode,local;
ui.DMapSelectObjectRsc1->ExecuteForMapObj(ui.DMapObj1,true);

excode = ui.DMapObj1->GetExCode();
local = LOCAL_POINT;

ui.DMapView1->GetMapLeftTop(&MapLeft,&MapTop);
int number = mapGetSiteNumber(ui.DMapView1->GetMapHandle(), TempHsite); //на пользовательской временной карте
ui.DMapObj1->CreateObject(number,IDFLOAT2,false,1,excode,local);
ui.DMapPoint1->SetPlaceIn(PP_GEO);
ui.DMapPoint1->SetPoint(x*M_PI/180,y*M_PI/180);
ui.DMapObj1->VarMetric->Append(0,ui.DMapPoint1->VarMapPoint);
mapCommitObjectAsNew(ui.DMapObj1->GetObjHandle());
ui.DMapObj1->Center();
Изменено: Екатерина - 15.03.2011 15:24:05
Здрвствуйте Катюша smile:)
Решить Вашу проблему можно двумя способами
СПОСОБ 1 (нужно писать код)
Возле Вашего точечного объекта нужно созадть объект типа подпись из классификатора.
Он такой же объект как и точка, линия, полигон только в отличии от предыдущих после его создания ui.DMapObj2->CreateObject(number,IDFLOAT2,false,1,excode,local);
нужно добавить значение текстовой подписи:
ui.DMapObj2->SetText(0,"ТЕКСТ ПОДПИСИ");
Записать ему 2 точки метрики и сохранить на карте
Метрика выбирается "возле точки"
-----------
СПОСОБ 2 (ничего писать не нужно)
Просто нужно настроить классификатор. Для этого в редакторе классификатора в Вашем точечном объекте
Нажмите кнопку "Добавить" появится второй примитив точечного объекта. Установите его тип в "Векторный знак"
и создайте "подпись по семантике 9"
При нанесении такой "точки" на карту и создании ей 9-й семантики, сразу же появляется возле неё подпись без созданию дополнительного объекта. smile:)
+ добавил
СКАЧАТЬ пример с таким объектом
Изменено: KFF - 16.03.2011 10:10:09 (+пример для скачивания)
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
Здравствуйте,Федор!smile:) Сделала первым способом, программным, все хорошо, то, что надо. Единственное, что, как привязать эту подпись к данному объекту...чтобы потом при передвижении они двигались вместе? Или необходимо подпись передвигать отдельно? т.е. при выделении объекта искать рядом ближайшую подпись и двигать ее? Просто боюсь,что если объекты будут близко друг к другу,может не та подпись найтись.
Спасибо большое!)
Изменено: Екатерина - 17.03.2011 10:06:08
Обьедините их в набор создавая служебную семантику 32801 для главного объекта у Вас точка, и для подписей 32802 подчинённый объект. В качестве значения добавьте уникальное число. Это число может быть например номер самого объека.
----------
перечитал свой пост, запутано.
Давайте так:
ЕСТЬ ТОЧКА допустим объект А
ЕСТЬ Подпись(подписи) объекта В, С, В и так далее
у объекта А (точка) есть ->GetKey(); уникальный номер на карте допустим 1000
Так вот:
1. берём этот номер используя метод ->GetKey() и запоминаем его в переменную Х (число 1000 см выше)
2. создаём для объекта А (точка) семантику с кодом 32801 и значением Х
3. берём объект-подпись В (или подписи если несколько) и каждому из них тоже создаём семантику но уже с кодом 32802, и устанавливаем значение Х
---------
ГОТОВО
Изменено: KFF - 17.03.2011 11:42:59
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
А как потом реализовать передвижение? вот я нашла мой объект - точку(DMapObj1):
if (ui.DMapFind1->First())
{
if (ui.DMapDlgObj1->SelectObjectInPoint(ui.DMapObj1,x,y,3))
ui.DMapObj1->SetStyle(QDMapObj::OS_SELECT);
}

далее хочу передвинуть и апдейчу метрику:
ui.DMapObj1->VarMetric->Update(0,1,ui.DMapPoint1->VarMapPoint);
и отрисовываю.
После этого должны передвинуться оба: и точка и подпись? Видимо, не так все просто, потому что у меня двигается только точка)
Смотрите Катюша, если Вы объедините в набор как я писал Выше точку и подписи через семантики 32801 и 32802 тогда операции над этой группой объектов в ГИС Карте, ГИС Редакторе и других промышленных продуктах КБ Панорама будут происходить как слитно (групповые операции) так и по раздельности (одиночные операции)
Это означает, что оператор который будет работать с Вашей картой сможет перемещать подпись отдельно, точку отдельно и всю группу (точку+подпись) отдельно.
Реализация перемещения и поиска объектов набора, лучше всего выполнять используя АПИ функцию.
При клике (выборе) точки, которая является основным объектом набора, Вы можете найти (или перебрать) все объекты которые входят в состав группы где выбранная точка, является главным объектом
-----------------
Код
// Запросить объект из набора по номеру (начиная с 1)
// Объект HOBJ не нужно создавать !!!
// hobjset - указатель на набора объектов
// number  - номер объекта из набора
// При ошибке возвращает 0
_MAPIMP HOBJ _MAPAPI mapObjectSetObject(HOBJSET hobjset, long int number);

результат функции это указатель на певую подпись при number=1.
Если Вы консервативно настроенны на программирование исключительно в палитре компонент ГИС конструктра для QT, тогда поиск лучше провести так:
- при клике на точку, запоминаете значение семантики 32801 например 1000.
- используя компонент QMapFind производите поиск по карте всех объектов у которых семантика 32802 = значению выбранному в пункте выше ( у нас 1000)
--------------------
Независимо от того каким образом Вы будете делать поиск объектов набора, перебирая результаты поиска (объекты), перемещайте их в цикле но одно и то же смещение, методом прибавления смещения ко всем точкам метрики или используя функции:

Код
// Сместить все координаты метрики объекта на заданную
// величину (delta) в метрах
// info   - идентификатор объекта карты в памяти
// При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapRelocateObjectPlane(HOBJ info,
DOUBLEPOINT * delta);

// Сместить все координаты метрики объекта на заданную
// величину (delta) в соответствии с параметром place
// hmap  - идентификатор открытых данных
// info  - идентификатор объекта карты в памяти
// При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapRelocateObject(HMAP hmap, HOBJ info,
DOUBLEPOINT * delta,
long int place/* = PP_MAP*/);
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
прошу прощения за мою настойчивость и непонятливость) но все же..hobjset - указатель на набор объектов,как его получить? или это и есть указатель на "основной" объект?
Насколько я понимаю там целая продедура создания сета объектов, не могли бы вы описать последовательность вызова функций. Сначала hobjset = mapCreateObjectSet(),далее создаем основной объект,устанавливаем ему семантику 32801,потом подчиненный-ему 32802...а потом? mapBuildObjectSet ?
Катюш, самый главный разработчик посоветовал призводить поиск связанных объектов "ТОЧКА-ПОДПИСЬ" по значению семантики. http://www.gistoolkit.com/forum/forum.../messages/
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
В итоге:
Провести поиск существующей группы на карте в один этап невозможно, в связи с тем, что на сегодняшний момент специальной функции для этого не существует.
Чтобы организовать поиск группы по конкретному объекту нужно знать что такое группа в контексте геопространственных данных КБ Панорама:
На рисунке, прототип-аналог набора.
Рисунок
Набор, представляет собой несколько объектов у которых значение служебной семантики 32801,32802,32803 заполненно НОМЕРОМ одного из объектов группы (называемых условно первым или главным). Этот номер (значение семантик) и есть номером группы на карте. В связи с тем что номера объектов карты уникальны - то и номера наборов тоже бедет уникальны.
В идеальном (нашем) случае, семантика 32801 в объекте "точка", хранит свой же номер на карте "1111". Все подчинённые объекты набора (подпись) хранит этот же номер ТОЧКИ в семантиках 32802.
ПОлучается, Вы правы, для поиска объектов набора нужно
1. найти первый (главный объект) или его выбрать - ТОЧКА.
2. выбрать с него значение семантики 32801 - и запомнить его(в нашем случае значение "1111")
это номер набора и одновременно этого же объекта
3. Найти на карте все объекты у которых семантика 32802 будет равна "1111"
То есть произвести поиск объектов по значению семантики
Цитата
// Добавить условие в список
// select - контекст условий поиска
// code - коды условий EQUAL = 2, // РАВНО
// semcode - код семантики 32802
// value - значение для условия "1111"
// При ошибке возвращает ноль, иначе - номер условия
_MAPIMP long int _MAPAPI mapSelectSemanticAppend(HSELECT select,long int code, long int semcode, const char * value);

Перебрать все обхекы в контексте select которые будут отобраны функцие выше
Цитата
// Поиск объектов по заданным условиям среди всех объектов
// hMap - идентификатор открытой основной карты
// hSite - идентификатор открытой пользовательской карты
// info - идентификатор существующего объекта,
// созданного функцией mapCreateObject() или mapCreateSiteObject(),
// в котором будет размещен результат поиска,
// select - условия поиска объекта,
// flag - порядок поиска объектов (WO_FIRST, WO_NEXT...)
// Если объект не найден - возвращает ноль

_MAPIMP HOBJ _MAPAPI mapSeekSiteSelectObject(HMAP hMap,HSITE hSite,
HOBJ info,HSELECT select,
long int flag);
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)


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