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

Отображение в mapView объектов не из классификатора

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Отображение в mapView объектов не из классификатора
 
Добрый день.
Создаем объект
hobj = mapCreateSiteObject( mapHandle(), hsite );
mapRegisterDrawObject ( hobj, 1, LOCAL_SQUARE );
mapAppendDraw ( hobj, IMG_POLYGONGLASS, reinterpret_cast<const char *> ( &prm ) );
потом к нему цепляем метрику и семантику..

В axMapView приложенный сит не отображает объекты созданные не из классификатора
Выглядит это как показано в mapView.jpg

Если открывать в панарами мини то отображает все объекты (в том числе и голубенькие квадратики) в сите как и задумывалось. (панарама.jpg )
 
Изменено: Валерий Валериевич - 16.06.2019 13:16:22
 
Проверили Вашу карту на примере, входящем в GIS ToolKit Active 12 (пример FindObj).
Объекты, в том числе, графические отображаются без проблем.

Для того, чтобы визуализация соответствовала отображению карты в Панорама Мини, требуется установить такой же режим отображения карты (в Панорама Мини по умолчанию это принтерный растровый вид).


Пример показывает карту в векторном виде. Для установки принтерного растрового вида надо будет добавить такую строчку:


Без установки режима будет по умолчанию применен векторный вид, и выглядит Ваша карта с таким режимом вот так:




Приложенный архив карты не имеет классификатора. Пришлось подложить другой, переименовав его в требуемый "classifier.rsc".
Также в составе нет файла семантики.
Однако это не должно влиять на отображение.
 
Что-то попробовал и так и сяк.. ни в какую не показывает фиолетовые квадратики.. которые не из классификатора

Может что-то после mapRegisterDrawObject  еще надо добавить?
Или может еще что влияет?
Может быть что вы на более новой версии работаете?
 
Цитата
Валерий Валериевич написал:
Может быть что вы на более новой версии работаете?

Не могу ответить на этот вопрос, так как Вы не указали свою версию.
Мы всегда рекомендуем нашим пользователям следить за обновлениями на нашем сайте.
Инсталляция GIS ToolKit Active обновляется периодически, но не так часто как сборки ГИС-ядра.
И то, и другое Вы можете свободно скачивать с нашего сайта. Отличие есть только для версии Free - библиотеки для нее Вы можете также свободно скачивать с сайта, а инсталляцию необходимо запрашивать в службе техподдержки.

При обнаружении каких-либо проблем рекомендуется сначала обновиться до крайней версии с сайта, и, если проблема остается на новой версии GIS ToolKit Active и библиотек ГИС-ядра, тогда обращаться за помощью на форум,
так как мы всегда проверяем проблему на крайних версиях продукта и можем не получить тех же результатов, что у Вас.


Библиотеки ГИС-ядра для GIS ToolKit 12, GIS ToolKit Free 12, GIS ToolKit Active 12, GIS ToolKit Free Active 12
(всегда самая свежая версия тут):


для платформы x32

для платформы x64


Инсталляция GIS ToolKit Active 12 (всегда самая свежая версия тут):

GIS ToolKit Active 12


Цитата
Валерий Валериевич написал:
Может что-то после mapRegisterDrawObject  еще надо добавить?

Для проверки мы использовали Вашу карту. Да и у Вас в Панорама Мини она отображается с графическими объектами.
Соответственно, все объекты зарегистрированы корректно.
 
Нашел проблему у себя.. только пока не разобрался почему это влияло только на эти объекты.

А проблема вот в чем была.
Я прятал  слои с растительностью с карты, а применял это на все открытые карты.

   aiMapSelect = axMapWidget->querySubObject( "ViewSelect()" );

   aiMapSelect->dynamicCall("Layers_set(integer, bool)", numLayer, isVisible );

   aiMapSelect->dynamicCall("SetViewSelect(integer)", -1 );

Может в компоненте как-то объединять набор слоев?
Чтобы -1 корректно работал.. а сейчас такое ощущение что он просто для каждого слоя применяет критерии отбора по номеру слоя, не зависимо есть он у сита или нет.

Спасибо за помощь. Вцелом вопрос закрыт.
 
Цитата
Валерий Валериевич написал:
Может в компоненте как-то объединять набор слоев? Чтобы -1 корректно работал.. а сейчас такое ощущение что он просто для каждого слоя применяет критерии отбора по номеру слоя, не зависимо есть он у сита или нет.

Не совсем понял суть замечания.

Метод aiMapSelect.SetViewSelect выполняет установку настроенных в нем условий отображения объектов для карты с заданным номером, если он равен -1, то устанавливаются условия для всех открытых в axcMapView карт.
То, что у какой-то из карт, какое-то условие не выполняется в силу отсутствия в ней того, к чему эти условия можно применить, никак не должно влиять на логику работы.
Иными словами, если Вы задали таким образом условия для axcMapView в целом, чтобы отображался, например, только слой гидрографии, то отображаться будет только слой гидрографии.
Не смотря на то, что в составе есть карты, в которых этой гидрографии и в помине нет, а есть, скажем, растительность, они будут также подчиняться общему правилу - не отображать ничего, кроме гидрографии.
 
Помогите, пожалуйста, разобраться с поиском объектов не из классификатора на сите.
Вот этот код находит только точечный объект (он из классификатора), а остальные объекты не находятся. Если точечных объектов несколько - то находятся все они, но только они.

HOBJ hObj = mapCreateSiteObject( mapHandle(), hsite );
HSELECT hSel = mapCreateSiteSelectContext( mapHandle(), hsite );

while( hObj = mapSeekSiteSelectObject( mapHandle(), hsite, hObj, hSel, inx++ == 0 ? WO_FIRST : WO_NEXT ) ){
       std::cout<<inx<<" finded"<<std::endl;
   }

опять же в панарама мини - проблем с ними нет.

А так же ткните носом, пожалуйста, в функцию аналогичную mapSeekSiteSelectObject но чтобы найти все объекты в точке.. я нашел mapSeekSelectNearestObject но там вроде как флаги WO_NEXT не работают.. или может как-то hSel добавить условие поиска вокруг какой-то точки... суть задачи найти все объекты на сите в радиусе 3-5 метров (пикселей)
Изменено: Валерий Валериевич - 22.07.2019 04:02:15
 
Цитата
Валерий Валериевич написал:
Помогите, пожалуйста, разобраться с поиском объектов не из классификатора на сите. Вот этот код находит только точечный объект (он из классификатора), а остальные объекты не находятся. Если точечных объектов несколько - то находятся все они, но только они.

В контексте поиска должен быть установлен соответствующий флаг для поиска графических объектов:

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

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


Цитата
Валерий Валериевич написал:
А так же ткните носом, пожалуйста, в функцию аналогичную mapSeekSiteSelectObject но чтобы найти все объекты в точке.. я нашел mapSeekSelectNearestObject но там вроде как флаги WO_NEXT не работают.. или может как-то hSel добавить условие поиска вокруг какой-то точки... суть задачи найти все объекты на сите в радиусе 3-5 метров (пикселей)

В контекст поиска можно добавить условие поиска по прямоугольной области. Если речь идет про точку клика по карте, то это по сути +/- пиксел во все стороны от клика.
Цитата
 // Установить в контексте параметры поиска объектов по прямоугольной
 // области.
 // hselect - контекст поиска объектов
 // dframe  - габариты области поиска в метрах
 // distance - расстояние поиска в метрах
 // флажки,описывающие критерии поиска :
 // filter  - учитывать/не учитывать(1/0) фильтр объектов
 //           (параметры фильтра должны быть установлены заранее
 //           в контексте поиска)
 // inside  - границы поиска объектов по области :
 //           1 - внутри области, 2 - целиком внутри области,
 //           0 - по расстоянию.
 // visible - с учетом/без учета(1/0) видимости объектов на карте
 // action   - порядок поиска объектов :
 //            0 - последовательный поиск по мере запроса объектов,
 //            1 - предварительный отбор всех объектов (главному
 //            окну приложения посылается WM_PROGRESSBAR - maptype.h),
 //            ускоряет многократный запрос отобранных объектов;
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSelectSeekAreaFrame(HSELECT hselect,
                                               DFRAME *dframe,
                                               double distance = 0.0,
                                               long int filter = 0,
                                               long int inside = 1,
                                               long int visible = 0,
                                               long int action = 0);

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

Цитата
// Поиск объектов в окрестности точки, заданной прямоугольной рамкой,
// удовлетворяющих условиям поиска
// Поиск выполнется среди тех объектов,которые
// соответствуют условиям, заданным в HSELECT
// hMap - идентификатор открытой карты.
// info - идентификатор объекта в памяти,
//        предварительно созданного функцией mapCreateObject()
//        или mapCreateSiteObject(),
//        в котором будет размещен результат поиска.
// frame - прямоугольная область поиска объекта в системе координат,
//         заданной переменной place (PP_PLANE,PP_GEO, ...)
// select- контекст условий выбора объектов,
// flag  - порядок поиска объектов (WO_FIRST, WO_NEXT...)
// Выбор объекта в "точке" лучше начинать с последнего, то
// есть того, что нарисован поверх остальных (это чуть медленнее
// прямого поиска). При поиске с флажками WO_NEXT,WO_BACK параметр
// info должен содержать результат предыдущего поиска.
// place - система координат,
// Если объект не найден - возвращает ноль
_MAPIMP HOBJ _MAPAPI mapWhatObjectBySelect(HMAP hMap,HOBJ info,
                                   MAPDFRAME * frame,
                                   HSELECT select,
                                   long int flag , long int place);

Если требуется обработать только точечные объекты, то можно использовать функцию поиска точечных объектов на заданном удалении от заданной точки (не учитывает условия поиска):
Цитата
 // Найти точечный объект на заданной карте в окрестности заданной
 // точки
 // hMap     - идентификатор открытого документа (карты),
 // hSite    - идентификатор открытой в документе пользовательской карты,
 // info     - идентификатор существующего объекта,
 //            в котором будет размещен результат поиска;
 // point    - координаты точки в метрах в системе координат документа,
 // distance - радиус области поиска в метрах (от 1 мкм до метров)
 // visible  - флаг поиска только среди видимых на карте объектов
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapSeekPointObjectByDistance(HMAP hmap, HSITE hsite,
                                                     HOBJ info,
                                                     DOUBLEPOINT *point,
                                                     double distance, long int visible = 0);
 
По первому вопросу вопрос решился. Спасибо.

По поиску объектов по клику. Делаю аналогично поиску по всей карте

HOBJ hObj = mapCreateSiteObject( mapHandle(), hsite );

HSELECT hSel = mapCreateSiteSelectContext( mapHandle(), hsite );

mapSetDrawObjectsFlag( hSel, 0 );

DFRAME mframe;
   mframe.X1 = PointX + 50;
   mframe.Y1 = PointY - 50;
   mframe.X2 = PointX - 50;
   mframe.Y2 = PointY + 50;

   mapSelectSeekAreaFrame( hSel, &mframe );

while( hObj = mapSeekSiteSelectObject( mapHandle(), hsite, hObj, hSel, inx++ == 0 ? WO_FIRST : WO_NEXT ) ){
      std::cout<<inx<<" finded"<<std::endl;
  }

Если на карте только точечные объекты то все ищет отлично. Единственное не на всех масштабах находит.
Если есть эти мои уже излюбленные квадратики(их тыщи полторы на сите).. то зависает на mapSeekSiteSelectObject не выдав ни одного каута в консоль. Так же зависает на запросе количества найденных объектов mapSeekSiteSelectCount( mapHandle(), hsite, hSel )
Подскажите, пожалуйста, чего не хватает?

И по масштабу (в примере +-50).. у меня PointX, PointY  в прямоугольной системе (PP_PICTURE)... Как габариты области поиска устанавливать правильно в зависимости от масштаба?
Изменено: Валерий Валериевич - 05.08.2019 09:01:26
 
Цитата
Валерий Валериевич написал:
Если на карте только точечные объекты то все ищет отлично. Единственное не на всех масштабах находит.

Поиск может осуществляться как с учетом видимости, так и без. Если у Вас объекты имеют определенный масштабный ряд отображения, а искать надо на всех масштабах или наоборот - только на тех, где объекты видны, то надо корректно установить значение
visible - с учетом/без учета(1/0) видимости объектов на карте при вызове mapSelectSeekAreaFrame.

Также влияет корректность установки "рамки" поиска в mapSelectSeekAreaFrame.

Цитата
// Установить в контексте параметры поиска объектов по прямоугольной
// области.
// hselect - контекст поиска объектов
// dframe  - габариты области поиска в метрах
// distance - расстояние поиска в метрах
// флажки,описывающие критерии поиска :
// filter  - учитывать/не учитывать(1/0) фильтр объектов
//           (параметры фильтра должны быть установлены заранее
//           в контексте поиска)
// inside  - границы поиска объектов по области :
//           1 - внутри области, 2 - целиком внутри области,
//           0 - по расстоянию.
// visible - с учетом/без учета(1/0) видимости объектов на карте
// action   - порядок поиска объектов :
//            0 - последовательный поиск по мере запроса объектов,
//            1 - предварительный отбор всех объектов (главному
//            окну приложения посылается WM_PROGRESSBAR - maptype.h),
//            ускоряет многократный запрос отобранных объектов;
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSelectSeekAreaFrame(HSELECT hselect,
                                              DFRAME *dframe,
                                              double distance = 0.0,
                                              long int filter = 0,
                                              long int inside = 1,
                                              long int visible = 0,
                                              long int action = 0);

"Рамка" задается в метрах, поэтому никаких дополнительных обработок для текущего масштаба не требуется.

Вот так делать не стоит:
Цитата
hObj = mapSeekSiteSelectObject
Вам надо контролировать возвращаемой значение от функции, но не устанавливать его в переменную, в которую Вы записали указатель выделенного в памяти объекта mapCreateSiteObject.
В противном случае, дойдя поиском до конца, Вы получите в этой переменной NULL.
Выделенную память в mapCreateSiteObject необходимо освобождать по окончании работы с ней - mapFreeObject.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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