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

Нанесение объекта на карту из классификатора ...

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Нанесение объекта на карту из классификатора ..., Нанесение объекта на карту из классификатора ...
 
Добрый день ...
Использую GisToolKit Active в Visual Studio 2010 совместно с Qt 4.8.6.
Библиотека для меня новая, поэтому выделил время на изучения руководств операторов, документации на MAPAPI и данного форума.
Не скажу что все внимательно изучил, но общую концепцию понял.
Тем не менее вопрос. Для нанесения объекта из классификатора на карту сначала я использовал функцию:
Код
axGisToolKit::IaxMapObj::CreateObjectByInCode(0, axGisToolKit::TxMetricType::IDDOUBLE2, 53110000, axGisToolKit::TxObjectLocals::OLS_MARK);

Где в классификатор под кодом 53110000 находится "самолетик". После выполнения данной функции, присвоение метрики созданному объекту
и коммита на карте, по заданным координатам, появляется совсем другой объект - "черточка" у которой в классификаторе ключ V1000000005 и код 1000000005.
Тем не менее, если посмоттреть свойства этой "черточки", то ключ будет таким же как в классификаторе, а код будет 53110000 - т.е. "самолетика". Как так получается?
Что имеется ввиду под Incode (третий параметр данной функции)? - код в классификаторе или его порядковый номер в классификаторе (порядкового номера в классификаторе
для объекта я не нашел где подсмотреть.) Эти же вопросы относятся и к функции:
Код
axGisToolKit::IaxMapObj::CreateObjectByExcode(0, axGisToolKit::TxMetricType::IDDOUBLE2, 53110000);

Excode (также третий параметр данной функции) - это что?

Поставить нужный объект из классификатора на карту удалось только с помощью функции:
Код
axGisToolKit::IaxMapObj::CreateObjectByKey(0, axGisToolKit::TxMetricType::IDDOUBLE2, _T("P0053110000"));

P0053110000 - это ключ "самолетика" ...

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

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

Ключ - буквенно-цифровая комбинация (до 31 символа), уникально определяющая конкретный условный знак.
Это значение Вы можете увидеть и задать в редакторе классификатора.
В Вашем случае это P0053110000.


Получить внутренний код можно только запросив его в классифкаторе:
mapGetRscObjectIdentIncode
mapGetRscObjectCodeByKeyUn

Методы COM-компонентов GIS ToolKit Active являются надстройками над вызовом MAPAPI функций.

Установить условный знак можно как при создании экземпляра класса объекта (методы CreateObjectBy...), так и после создания методами Register или Describe (до сохранения объекта на карте - метода Commit).

MAPAPI для установки условного знака:
mapRegisterObject (по внешнему коду)
mapRegisterObjectByKey (по ключу)
mapDescribeObject(по внутреннему коду)
 
За разъяснение про  внутренний (InCode) код, внешний (ExCode) код и ключ (Key) знака спасибо ... очень полезно ...
Таким образом, в классификатора каждый знак имеет два кода и один ключ. При этом уникальность знака в классификаторе
выполняется либо ключом, либо внутренним кодом, либо комбинацией внешнего кода и локализацией.
Вроде все на своих местах.
После нанесения знака из классификатора на карту, знак будет будет иметь те же коды и ключ или они изменяться? Будет ли
для знака создан дополнительный код, который будет его уникально иденифицировать уже на карте а не в классификаторе? Для
поиска знака на карте можно ли использовать его коды и ключ из классификатора, или надо использовать другой код, который будет
создан при нанесении знака на карту (если конечно такой создается)?
 
Привожу код нанесения и поиска знака на карту ... (вопрос в конце кода) ...
/**********************************************

* НАНЕСЕНИЕ ЗНАКА ИЗ КЛАССИФИКАТОРА НА КАРТУ *

**********************************************/

// Запрос интерфейса знака

iAxMapObj = static_cast<axGisToolKit::IaxMapObj*>(getIUnknown(_T("axGisToolKit.axMapObj"), QUuid("{37FB6FED-E7CC-4743-BA74-51000F59A301}")));

// Установка в интерфейс знака карты (карта создана и инициализирован ранее, в коде не показано)

iAxMapObj->PutcMapView(iAxMapScreen);

// Создание пустого знака по его ключу из классификатора (знак точечный - "Самолетик")

iAxMapObj->CreateObjectByKey(0, axGisToolKit::TxMetricType::IDDOUBLE2, keyCode.toStdWString().c_str());

      //

      // Установка координаты в только что созданный пустой знак (знак точечный)

      //

      // Получание метрики только-что созданного пустого знака

      axGisToolKit::IMapMetricPtr iMapMetric = iAxMapObj->GetMetric();

      // Запрос интерфейса точки

      axGisToolKit::IaxMapPointPtr point = static_cast<axGisToolKit::IaxMapPoint*>(getIUnknown(_T("axGisToolKit.axMapPoint"), QUuid("{74507E69-97A6-4AF4-B4AA-B2ECDA235D39}")));

      // Установка в интерфейс точки карты (карта создана и инициализирован ранее, в коде не показано)

      point->PutcMapView(iAxMapScreen);

      // Значения входных и выходных координат точки будут в метрах на местности

      point->PutPlaceInp(axGisToolKit::PP_PLANE);

      point->PutPlaceOut(axGisToolKit::PP_PLANE);

      // Инициализация точки координатами

      point->SetPoint(6172190.49, 7406298.82); // Координаты принадлежат карте

      // Установка (добавление) точки в метрику знака

      iMapMetric->Append(0, point);


// Помещение знака на карту

iAxMapObj->Commit();

// В Н И М А Н И Е: Получение внутреннего кода знака. Именно  по нему планируется в

// дальнейшем поиск знака на карте для, например, изменения координат знака. Можно,

// конечно, использовать и внешний код с локализацией, но не очень хочется передавать

// в функци поиска два параметра (внешний код и локализацию), хочется обойтись одним

// параметром (внутренний код знака)

long inCode = iAxMapObj->GetInCode();

// ПОСЛЕ ВЫПОЛНЕНИЯ ВЫШЕ ОПИСАННОГО КОДА "САМОЛЕТИК" УСПЕШНО ОТОБРАЗИЛСЯ НА КАРТЕ В ЗАДАННЫХ КООРДИНАТАХ!!!


/***********************************************

* ПОИСК ТОЛЬКО-ЧТО НАНЕСЕННОГО НА КАРТУ ЗНАКА *

***********************************************/

// Запрос интерфейса знака

iAxMapObj = static_cast<axGisToolKit::IaxMapObj*>(getIUnknown(_T("axGisToolKit.axMapObj"), QUuid("{37FB6FED-E7CC-4743-BA74-51000F59A301}")));

// Установка в интерфейс знака карты (карта создана и инициализирован ранее, в коде не показано)

iAxMapObj->PutcMapView(iAxMapScreen);


// Запрос интерфейса поиска

iAxMapFind = static_cast<axGisToolKit::IaxMapFind*>(getIUnknown(_T("axGisToolKit.axMapFind"), QUuid("{FBBC1897-958F-444B-A424-EBAD4E6349BE}")));

// Получение "условия поиска" от поиска

iAxMapSelect = iAxMapFind->GetcMapSelect();

// Очистка "условия поиска" для всех карт

iAxMapSelect->ClearAll();

// Установки признака использования "условия поиска" для всего списка карт

iAxMapSelect->PutAllMaps(true);

// В Н И М А Н И Е: Установка поиска знака по его внутреннему коду.

// Это тот внутренний код знака, который был получен после нанесения созданного знака на карту

iAxMapSelect->PutInCode(inCode, true);


// Устанавка в интерфейс поиска знака (ожидается, что если знак соответствующий "условию поиск"

// будет найден, то его параметры будут установлены в этот знак)

iAxMapFind->PutcMapObj(iAxMapObj);

// Установка в интерфейс поиска карты (карта создана и инициализирован ранее, в коде не показано)

iAxMapFind->PutcMapView(iAxMapScreen);

// Запуск поиска знака

iAxMapFind->PutActive(true);

// ПРОВЕРКА, НАЙДЕН ЛИ ТРЕБУЕМЫЙ ЗНАК

long foundInCode = iAxMapObj->GetInCode();

// В результате проверки foundInCode равен 0 - т.е. знак на карте не найден - почему??? ...
 


 
Продолжим ликбез.
Вы путаете систему классификации и кодирования с системой идентификации объектов на карте.
На карте может быть создан далеко не один объект с заданным классификационным кодом.
Уникальная идентификация объекта карты осуществляется по его уникальному номеру на карте: TaxMapObj.Get_Key.
Чтобы найти объект по уникальному номеру на карте нет необходимости использовать MapFind.
Достаточно воспользоваться TaxMapObj.SeekObject.

При поиске по неуникальным условиям следует использовать TaxMapFind.
Уникальный код условного знака в классификаторе не является уникальным идентификатором объекта с таким условным знаком на карте.
Поэтому в выборке может быть множество объектов, отвечающих заданным условиям.
Для перехода по объектам, отвечающим условиям поиска, используются методы First, Prior, Next, Last компонента TaxMapFind.
Результат при этом будет находиться в связанном с ним компоненте TaxMapObj.
При переходе по выборке объектов изменять или удалять объект находящийся в TaxMapObj нельзя, так как это может нарушить цепочку переходов по First, Next и т.д.

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

Далее, при наличии одного или более объектов, отвечающих условиям поиска, в TaxMapObj должно что-то быть.
Если все выполнено корректно, то объект, созданный с неким внутренним кодом, должен попасть в выборку поиска по этому внутреннему коду.
Скорее всего, у Вас объект не создан на карте, либо некорректно связаны между собой компоненты.
К примеру, методов типа PutcMapView не было в GIS ToolKit Active.

Вы проверили возвращаемое значение методов CreateObjectByKey и Commit?


Рекомендую посмотреть примеры, входящие в комплект GIS ToolKit Active.


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

Для справки. Есть еще графические объекты. Они с классификатором вообще не связаны, у них классификационные коды и ключ нулевые.
 
Мда ... намутили воду ...
Итак, внутрениий код объекта - это просто порядковый номер объекта в классификаторе и он относится только к классификатору. В редакторе классификатора просто так его посмотреть нельзя (но можно посчитать на вкладке "Объекты" на каком месте стоит искомый объект - это и будет его внутренний код). В документации на GisToolKit ActiveX ему дают имя InCode. Внешний код объекта - это значение в поле "Код" на вкладке классификатора "Объекты" - тоже относится только к классификатору. В документации на GisToolKit ActiveX ему дают имя ExCode. Недаром напротив поля "Код" есть поле "Тип" - это локализация объекта ... и для уникальной идентификации объекта должна использоваться связка "Код"+"Локализация". Теперь самое интересное начинается с поля "Ключ" на этой же вкладке - это уникальный ключ объекта (строковый тип). Очевидно, что для работы с ним в GisToolKit ActiveX должно использоваться имя Key - но не так все просто. Разработчики используют это имя в качестве двойного назначения. Если это имя в документации на GisToolKit ActiveX встречается в виде строкового типа - то это как раз тот самый уникальный ключ объекта из классификатора, но если это имя встречается в виде целого типа - то это порядковый номер этого объекта на карте ... - вот такая вот петрушка ... (почему нельзя было оперировать в этом случае не Key а просто Number?) ...
 
Цитата
kalakom написал:
почему нельзя было оперировать в этом случае не Key а просто Number?

Так сложилось исторически и с этим надо просто смириться.

У каждого класса и компонента свой набор методов и свойств. Имена их могут совпадать, но это не значит, что они означают одно и то же.


Чтобы совсем добить :)
У объекта карты помимо уникального номера, есть еще и порядковый (это как раз и будет Number).

Но! Как и InCode в случае классификатора - это внутренняя кухня, которую без особой надобности и наличия знаний внутреннего устройства  использовать не стоит.
Внутренние коды и порядковые номера - это здесь и сейчас. Они могут меняться в ходе жизненного цикла классификатора или карты.
Соответственно, полагаться на них нельзя. Точнее можно, но надо себе отдавать отчет в том, что Вы делаете.

Внутренний код классификатора и порядковый номер объекта на карте обеспечивают большее быстродействие, что полезно в потоковых операциях. Но использовать их надо с осторожностью.
 
Денис, спасибо за ответ ... многое разъясняет и уже во многом подтверждает мой еще небольшой опыт работы с библиотекой.
Цитата
На карте может быть создан далеко не один объект с заданным классификационным кодом
Классификационный код - это и есть уникальный ключ объекта который можно увидеть в поле "Ключ" на вкладке "Объекты" классификатора?
Цитата
Уникальная идентификация объекта карты осуществляется по его уникальному номеру на карте: TaxMapObj.Get_Key.
Да - это уже понятно ... только сбивает с толку Get_Key - ожидается что будет получен как раз классификационный код, но не как порядковый номер объекта на карте, почему не назвать Get_Number? или Get_InCodeMap? Даже в документации на этот метод нет четкой формулировки что это просто порядковый номер объекта на карте, который ему присваивается после вызовов функций вида Commit...
Цитата
Чтобы найти объект по уникальному номеру на карте нет необходимости использовать MapFind.
Достаточно воспользоваться TaxMapObj.SeekObject.
Да - спасибо ... как этот функционал мне был очень нужен - найти объект на карте по его порядковому номеру на карте. Только почему этой возможности нет через TaxMapSelect - думаю это одно из тех мест где не только мне придет в голову искать данный функционал.
Цитата
Уникальный код условного знака в классификаторе не является уникальным идентификатором объекта с таким условным знаком на карте.
Одно из возможных припятствий в легком (простом) изучении сторонней библиотеки кроется в наличие (в том числе и в документации и на форуме) различных наименований одних и тех же сущностей. Уникальный код, это же ведь тоже самое что и классификационный код - так? Да - на карту можно нанести сто экземпляров одного и того же объекта из классификатора, при этом поиск по классификационному коду даст множественный результат (100 объектов). Чтобы поиск выдал только один объект на карте, необходимо искать этот объект либо по номеру (порядковому номеру) этого объекта на карте либо по комбинации внешнего ключа объекта и его локализации ... - это я уже для себя ... надеюсь что ничего не перепутал.

Далее про работу TaxMapFind взял за заметку - спасибо ...
Цитата
Таким образом, при активации Вашего поиска, связанный с TaxMapFind компонент TaxMapObj будет установлен на первый найденный объект с заданным Вами внутренним кодом.
Т.е. тот объект у которого внутренний код (тобишь порядковый номер этого объекта в классификаторе, который никак не связан с какой-либо системой нумерации объекта на карте) равен установленному? - так?
Цитата
Скорее всего, у Вас объект не создан на карте, либо некорректно связаны между собой компоненты.
К примеру, методов типа PutcMapView не было в GIS ToolKit Active.
Вы проверили возвращаемое значение методов CreateObjectByKey и Commit?
В реальной программе все возвращаемые значения методов проверяются (я убрал проверки для читабельности кода). При этом объект появляется на карте!
В документации нет метода PutcMapView - зато он есть в библиотеки типов axGisToolKit.tlh.
Цитата
Да, и отвечаю на Ваш вопрос. В отдельных случаях при сохранении объекта на карту его классификационный ключ и внутренний код может быть изменен.
Это возможно, если в классификаторе этот условный знак входит в серию. Для серии условный знак определяется по значениям влияющих на внешний вид семантик.
Догадываюсь - я задумался над этим после изучения руководство оператора на классификтор. Пока в коде серией не пользуюсь, но не исключаю что скоро будет необходимость.
Цитата
Для справки. Есть еще графические объекты. Они с классификатором вообще не связаны, у них классификационные коды и ключ нулевые.
Да - знаю, спасибо ...

Переработаю код на рабочий - отпишу ...
 
Цитата
Чтобы совсем добить
У объекта карты помимо уникального номера, есть еще и порядковый (это как раз и будет Number).
Да, меня действительно это ввело в ступор. Я думал что уникальный номер объекта карты это и есть его порядковый номер на карте. Тогда в чем разница уникального номера объекта карты и его порядковым номером? Как получить уникальный номер объект карты?
Цитата
Но! Как и InCode в случае классификатора - это внутренняя кухня, которую без особой надобности и наличия знаний внутреннего устройства  использовать не стоит.
Внутренние коды и порядковые номера - это здесь и сейчас. Они могут меняться в ходе жизненного цикла классификатора или карты.
Соответственно, полагаться на них нельзя. Точнее можно, но надо себе отдавать отчет в том, что Вы делаете.
Хотелось бы конечно иметь уникальный номер объекта на карте который бы не менялся от внешних факторов - очень удобно для поиска, чтобы не заниматься с комбинацией внешнего кода и локализацией или делать вложенные поиски.
 
Цитата
kalakom написал:
Чтобы поиск выдал только один объект на карте, необходимо искать этот объект либо по номеру (порядковому номеру) этого объекта на карте либо по комбинации внешнего ключа объекта и его локализации ... - это я уже для себя ... надеюсь что ничего не перепутал.

Нет.
Есть классификатор.
Есть карта.
Объекты классификатора - это условные знаки.
Объекты карты - это объекты карты.
Объект классификатора != объект карты.
У объекта карты есть условный знак - это объект классификатора.

Уникальная идентификация:

- для объекта классификатора:
  - внешний код + локализация;
  - ключ (символьный код);
  - внутренний код.

- для объекта карты:
  - уникальный номер (ключ - всегда остается);
  - порядковый номер (изменяется после сортировки карты, загрузки из SXF и пр.).

Поиск на карте по комбинации внешнего ключа объекта и его локализации даст множество объектов с указанным внешним ключом и его локализацией.
Пример: найти все линейные реки.

Цитата
kalakom написал:
Хотелось бы конечно иметь уникальный номер объекта на карте который бы не менялся от внешних факторов - очень удобно для поиска, чтобы не заниматься с комбинацией внешнего кода и локализацией или делать вложенные поиски.
Это и есть уникальный номер объекта карты.

Цитата
kalakom написал:
как этот функционал мне был очень нужен - найти объект на карте по его порядковому номеру на карте. Только почему этой возможности нет через TaxMapSelect - думаю это одно из тех мест где не только мне придет в голову искать данный функционал.
не по порядковому, а по уникальному.
TaxMapSelect - компонент для выборки множества объектов по набору условий. Чтобы установить компонент TaxMapObj на один конкретный уникально идентифицируемый объект, использовать TaxMapSelect не имеет смысла. Поэтому такой метод реализован в самом TaxMapObj.

Цитата
kalakom написал:
Классификационный код - это и есть уникальный ключ объекта который можно увидеть в поле "Ключ" на вкладке "Объекты" классификатора?
Пусть будет так: классификационный код - это внешний код, классификационный ключ - это ключ.
Хотя под термином "Классификационный код" обычно понимают любой классификационный признак объекта карты, с помощью которого он относится к определенному классу и слою в классификаторе и получает соответствующий условный знак.

Цитата
kalakom написал:
Get_Key - ожидается что будет получен как раз классификационный код
У объекта карты можно запросить и его классификационный код, и локализацию, и классификационный ключ, и внутренний код классификатора.
Поскольку термин "ключ" тут используется дважды - как уникальный номер объекта на карте и как классификационный ключ, то методы разделены:
Get_Key - возвращает уникальный номер объекта,
Get_KeyName - возвращает классификационный ключ.
Страницы: 1
Читают тему (гостей: 1)



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

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