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

Поиск объектов внутри указанной области и выделение их цветом

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

Используем "ГИС Конструктор FREE для Qt Designer x64 (версия 12.3.2, Qt4, Qt5, ОС Astra Linux SE, релиз Смоленск)"
Работаем под Astra Linux SE 1.6, Qt 5.11.

В процессе работы столкнулись со следующей проблеммой.
Пытаемся выделить объекты на карте, с помощью компонента QDMapSelectRect.

Код
void MapWindow::slotRectSelectFinish(double left, double top, double right, double bottom)
{
    HMAP Map = ui->MapWidget->GetMapHandle(); // Получаем "Карту"
    HSITE Site = /**/ // Получаем используемый сит
    qint32 SiteNumber =  mapGetSiteNumber(Map, Site); // Получаем № сита

    // Пересчитываем пиксели в координаты
    mapPictureToPlane(Map, &left, &top);
    mapPictureToPlane(Map, &right, &bottom);


    QDMapObj FrameObject; // Инициализируем новый объект карты
    FrameObject.SetMapView(ui->MapWidget); // "Привязываем" его к компоненту отображения
    FrameObject.CreateNullObj(SiteNumber); // Создаём пустой объект на нашем сите
    // Задаём метрику объекта (Рамки)
    DOUBLEPOINT FramePoint = {left, top};
    FrameObject.AppendPlanePoint(0, &FramePoint);
    FramePoint = {left, bottom};
    FrameObject.AppendPlanePoint(0, &FramePoint);
    FramePoint = {right, bottom};
    FrameObject.AppendPlanePoint(0, &FramePoint);
    FramePoint = {right, top};
    FrameObject.AppendPlanePoint(0, &FramePoint);
    FramePoint = {left, top};
    FrameObject.AppendPlanePoint(0, &FramePoint);


    FrameObject.Commit(); // Для наглядности)


    QDMapFind Finder(this); // Инициализируем компонент поиска
    Finder.SetMapView(ui->MapWidget); // "Привязываем" его к компоненту отображения
    Finder.VarMapSelect->ClearAll(); // Очищаем
    Finder.SetActive(false); // Отключаем
    Finder.SetFindPoint(false); // Отключаем поиск по точке


    Finder.VarMapSelect->SetSiteNumber(SiteNumber); // Устанавливаем номер сита


    if (Finder.VarMapSelect->SelectSeekArea(SiteNumber, &FrameObject, 0.0, 1, 1, 1, 0)) // Ищем в заданной "рамке"
    {
        int FindCount = Finder.VarMapSelect->GetSelectObjectCount(SiteNumber); // Получаем количество найденных объектов (Дебаг)
        qDebug() << "Site =" << SiteNumber << "FindCount =" << FindCount; // Выводим количество найденных объектов (Дебаг)


        Finder.SetActive(true); // Активируем поисковик
        ui->MapWidget->SetObjSelected(Finder.VarMapSelect, 0xFF, true); // Задаём выделение
    }


    //FrameObject.Delete(); // Для наглядности)
}

Объекты действительно находятся, а вот выделение в любом случаи срабатывает на всю карту.
https://ibb.co/zsM0fbq
https://ibb.co/WK5vtXp
Пожалуйста подскажите, что мы делаем не правильно. Заранее спасибо.
 
У вас несколько карт открыто в одном документе?
 
Да, одновременно 2. + могут быть открыты дополнительные.
 
QDMapSelect содержит в себе контексты поиска для всех открытых карт в документе. Когда Вы вычисляете число объектов, Вы подаете номер карты в GetSelectObjectCount. Когда выполняется отображение, выделение рисуется для каждой карты отдельно. Поэтому необходимо отключить контексты поиска для других слоев. На текущий момент это можно сделать вызвав у QDMapSelect метод SetExcode(int excode, int local, bool value) с параметрами: excode = -1(применить для всех объектов карты), local = 0(не важно, потому что ранее указано -1), value = false (выключить видимость). Вызывать необходимо для каждой карты, которая не используется в данном контексте поиска (если убрать и у используемой карты, то ничего не выведет). Количество внутренних контекстов указывается в CountSelect, а текущий номер записывается в VarSite.

Код
for (int i = 0; i < Finder.VarMapSelect->CountSelect; i++)
{
  if (i == SiteNumber) 
    continue;
  Finder.VarMapSelect->VarSite = i;
  Finder.VarMapSelect->SetExcode(-1, 0, false);
}

Приведенный код можно вставить вместо строки:
   Finder.VarMapSelect->SetSiteNumber(SiteNumber); // Устанавливаем номер сита

В будущем добавим учет активности контекста поиска для каждой карты в отдельности и более простой способ выключения всех карт.
 
Спасибо за развёрнутый ответ. Но добавление данного кода проблемму "всеобщего" выделения не решило...
https://ibb.co/gvMLv9c
Есть ещё какая либо возможность решения данной проблеммы. Спасибо.
 
Ваше молчание означает что другого способа нет?
 
Выполнил проверку на последней версии ГИС Конструктор для Astra Linux с нашего сайта. В примере myfirst вставил Ваш код в один из пунктов меню. Указал свои координаты и вызвал пункт меню. На карте были выделены только объекты 2-й карты в заданном регионе. Пожалуйста, попробуйте на версии с сайта.
Страницы: 1
Читают тему (гостей: 1)



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

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