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

mapSelectSeekAreaFrame, поиск и векторные знаки

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

ГИС Конструктор для Qt Designer x64 (версия 11.10.4), ОС Astra Linux

При поиске объектов по установленной прямоугольной области (mapSelectSeekAreaFrame) при помощи mapSeekSelectObject не находятся векторные знаки в случае если воображаемая линия между точками метрики знака не пересекает область поиска.
Т.е. в случае если пытаться найти объект (какой-нидь ПУ) в области полотнища, то результат поиска - пусто. Объект находится только в случае, если искать в области основания флага.

Пытаюсь использовать функции поиска для выделения рамкой нескольких объектов, но в одном случае не выделяются векторные (вероятно и точечные, и подписи), в другом - площадные (Поиск и площадные объекты)
Как быть?

С уважением,
Матвеев П.В.
 
Цитата
Павел Матвеев написал:
Т.е. в случае если пытаться найти объект (какой-нидь ПУ) в области полотнища, то результат поиска - пусто. Объект находится только в случае, если искать в области основания флага.
Вы что ищите - условный знак ПУ, или объект ПУ? Если объект, то что здесь ошибочного? Вы представьте себе "физику процесса". ПУ находится в конкретном месте (как Вы пишите - "основание флага") ... на карте показан условный знак... с учетом масштаба, между основанием (нахождение ПУ) и верхом знака (полотнища) - километры на местности!
 
Приветствую!

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

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

ЗЫ. В Ваших функциях отрисовки данная проблема тоже проявляется как следствие такого поведения. Часто знаки не рисуются на краю области отрисовки, т.к. отсекаются при выборе для отрисовки по метрике. И получается, что вроде на текущем маштабе на картинке должно быть нарисовано полотнище флага, а на самом деле оно не рисуется.

С уважением,
Матвеев П.В.
 
Для поиска объектов в заданной области по их изображению применяется функции типа mapWhatObject.
Но у них есть ограничение по размеру области поиска в пикселах:
Код
 // Поиск объектов в окрестности точки, заданной прямоугольной рамкой
 // Применяется для выбора объекта при нажатии левой кнопки мыши на карте
 // hMap - идентификатор открытой карты.
 // info - идентификатор объекта в памяти,
 //        предварительно созданного функцией mapCreateObject()
 //        или mapCreateSiteObject(),
 //        в котором будет размещен результат поиска.
 // frame - прямоугольная область поиска объекта в системе координат,
 //         заданной переменной place (PP_PLANE,PP_GEO, ...)
 // Координаты области пересчитываются в пикселы в текущем масштабе
 // отображения. В список выбранных могут попасть объекты, которые
 // отображаются в текущем масштабе рядом с областью выбора в
 // пределах нескольких пикселов.
 // Площадные объекты выбираются в пределах рамки
 // размером 512х512 пикселов в текущем масштабе изображения
 // flag - порядок поиска объектов (WO_FIRST, WO_NEXT...)
 // Выбор объекта в "точке" лучше начинать с последнего, то
 // есть того, что нарисован поверх остальных (это чуть медленнее
 // прямого поиска).
 // При поиске с флажками WO_NEXT,WO_BACK параметр info должен
 // содержать результат предыдущего поиска.
 // Поиск выполнется среди тех объектов,которые видны на экране,
 // если не установлен флаг WO_VISUALIGNORE
 // place - система координат.
 // Если объект не найден - возвращает ноль,
 // иначе - возвращает значение info !

_MAPIMP HOBJ _MAPAPI mapWhatObject(HMAP hMap, HOBJ info, MAPDFRAME *frame, long int flag, long int place);
Можно на момент поиска менять масштаб отображения, чтобы область поиска была в пределах ограничения в 512 пикселов.
Или добирать "флажки", которые частично вошли в область по нижней полосе области поиска.

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

_MAPIMP long int _MAPAPI mapSelectAreaEx(HMAP hMap, HOBJ object,  double distance, long int filter, long int inside, long int visible,  long int action, long int nmap);
Если повторно пройти по нижней полосе функцией mapWhatObject, то найденные объекты можно добавить в список:
Код
  // Установить доступ к заданному объекту заданного листа карты.
  // select - контекст условий поиска
  // list   - номер листа карты,
  // number - номер объекта в листе.
  // В контексте условий поиска должна быть установлена карта.
  // При ошибке возвращает ноль.

_MAPIMP long int _MAPAPI mapSelectSampleByNumber(HSELECT select, long int list, long int number);
При добавлении уже найденного объекта список не меняется. list = mapGetListNumber(hobj); number = mapGetObjectNumber(number);
Страницы: 1
Читают тему (гостей: 1)



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

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