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

Выборки объектов через QDMapSelect

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

Хочу выделить несколько объектов в пределах площади.
1.Предварительно выставляю доступность объектов через QDMapSelect::SelectSample.
2.Выделяю с помощью QDMapSelect::SelectSeekArea
Код
mapSelect->SelectSeekArea(-1, obj, 0, 1, 1, 1, 1);

В итоге выделяются все объекты попавшие в область. Я же хочу выделять только доступные. Как это сделать?
Может я неправильно понял смысл функции QDMapSelect::SelectSample.

Почему-то функция QDMapSelect::GetSelectObjectCount ведёт себя так:
при выставлении флага объекту через QDMapSelect::SelectSample на карте номер 2, вызов
Код
mapSelect->GetSelectObjectCount(2);
выдаёт ожидаемое значение, если же сделать запрос по всем картам
Код
mapSelect->GetSelectObjectCount(-1);
то возвращает 0. Это нормально поведение или нет? Если да, то объясните, пожалуйста, подробнее что эта функция возвращает.

Спасибо.
 
Прошло больше двух суток помощи так и не дождался.
В итоге не нашёл способа сделать красиво. Сделал так:
1. Выбираю объекты в области mapSelectAreaEx(map->GetMapHandle(), hObj, 0, 0, 1, 1, 0, -1);
2. Отсеиваю ненужные
3. Очищаю выделение QDMapView::SetObjSelected(nullptr, 0, false);
4. Для каждой карты делаю
mapSelect->SetSiteNumber(i);
QDMapSelect::SetIncode(-1, false);
и устанавливаю доступ к объектам через QDMapSelect::SelectSample
5. Подаю в QDMapView::SetObjSelected

В итоге выделение объектов происходит не всегда и не всех. QDMapSelect::GetSelectObjectCount для конкретной карты и для всех карт неправильный.
Кто-то может помочь?
Изменено: Сергей О - 19.07.2017 16:49:49 (Дополнение)
 

1. Пример применения функции QDMapSelect::SelectSeekArea

Код
QDMapSelect * qselect = ui.DMapView1->VarViewSelect;
QDMapObj * mapObj = new QDMapObj(ui.DMapView1);
mapObj->SetMapView(ui.DMapView1);
mapObj->CreateObject(0, IDDOUBLE2, FALSE, 1, 45200000, LOCAL_SQUARE);
QDMapPoint * pt = new QDMapPoint(ui.DMapView1);
pt->SetMapView(ui.DMapView1);
pt->SetPlaceIn(PP_PLANE);
pt->SetPoint(6172237, 7406142);
mapObj->VarMetric->Append(0, pt->VarMapPoint);
pt->SetPoint(6170493, 7406142);
mapObj->VarMetric->Append(0, pt->VarMapPoint);
pt->SetPoint(6170493, 7408426);
mapObj->VarMetric->Append(0, pt->VarMapPoint);
pt->SetPoint(6172237, 7408426);
mapObj->VarMetric->Append(0, pt->VarMapPoint);
pt->SetPoint(6172237, 7406142);
mapObj->VarMetric->Append(0, pt->VarMapPoint);
int siten = 0;
double distance = 0.0;
int filter = 1;
int inside = 2;
int visible = 0;
int action = 1;
qselect->SelectSeekArea(siten, mapObj, distance, filter, inside, visible, action);
ui.DMapView1->SetViewSelected(TRUE);
fprintf(stderr, "%d\n", mapSeekSelectObjectCount(hMap, ui.DMapView1->GetViewSelectHandle()));

2. Пример применения функции QDMapSelect::SelectSample

Код
QDMapSelect *qselect = new QDMapSelect(ui.DMapView1->GetMapViewAcces());
HOBJ hObj = mapCreateObject(hMap);
mapSeekSiteObject(hMap, hMap, hObj, 16789660);
char list[MAX_PATH];
mapGetListNameEx(hMap, 1, list, MAX_PATH);
fprintf(stderr, "%s\n", list);
qselect->UnselectSeekArea(-1);
int key = mapObjectKey(hObj);
qselect->SelectSample(TRUE, list, key);
ui.DMapView1->SetObjSelected(qselect, 0xffff00, TRUE);

3. Функция GetSelectObjecCount работает некорректно - исправленная версия войдет в следующий выпуск ГИС Конструктор. Вместо нее можно запросить количество объектов как в первом примере: mapSeekSelectObjectCount(hMap, ui.DMapView1→GetViewSelectHandle());

Изменено: Андрей Коржилов - 21.07.2017 12:02:14
 
Спасибо.

Создание объектов через QDMapObj работает странно, объекты создаются в виде розовых крестов:
Код
for(auto p : points){
    QDMapObj *mapObj = new QDMapObj(mapView);
    mapObj->SetMapView(mapView);
    mapObj->CreateObject(site, IDDOUBLE2, FALSE, 0, 54, LOCAL_POINT);
    QDMapPoint *pt = new QDMapPoint(mapView);
    pt->SetMapView(mapView);
    pt->SetPlaceIn(PP_GEO);
    pt->SetPlaceOut(PP_PLANE);
    pt->SetPoint(p.x(), p.y());
    mapObj->VarMetric->Append(0, pt->VarMapPoint);
    mapObj->Commit();
    mapObj->FreeCurrentObj();
}
Такой код работает штатно:
Код
for(auto p : points){
    auto hObj = mapCreateSiteObject(mapView->GetMapHandle(), site);
    mapRegisterObject(hObj, 54, LOCAL_POINT);
    mapAppendPointGeo(hObj, p.x(), p.y());
    mapCommitObject(hObj);
    keys << mapObjectKey(hObj);
    mapFreeObject(hObj);
}
По второму пункту. Получилось выделить список объектов по ключам:
Код
  if(!qselect){
    qselect = new QDMapSelect(mapView->GetMapViewAcces());
  }
  qselect->ClearSampleAll();
  qselect->SetMapSites(0, false);
  uint count = 0;
  for(auto key : keys){
    if(::qrand() % 2){
      HOBJ hObj = mapCreateObject(mapView->GetMapHandle(), site);
      mapSeekSiteObject(mapView->GetMapHandle(), site, hObj, key);
      char list[MAX_PATH];
      mapListNameEx(hObj, list, MAX_PATH);
      qselect->SelectSample(true, list, key);
      mapFreeObject(hObj);
      count++;
     }
  }

  mapView->SetObjSelected(qselect, 0xffff00, true);
Но подсчёт выделенных объектов по прежнему работает некорректно.
count: 64
mapSeekSelectObjectCount(site, mapView->GetViewSelectHandle()): 477741

Дальше буду пробовать совместить с выделением по площади.
Можно ли одним действием сделать выделение по области и по заданным ключам?
Изменено: Сергей О - 24.07.2017 09:12:01 (Дополнение)
 
Здравствуйте, Сергей.

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

По второму пункту - попробуйте вместо

mapSeekSelectObjectCount(site, mapView->GetViewSelectHandle())

указать созданный Вами контекст

mapSeekSelectObjectCount(site, qselect->GetHSelect(0))
Изменено: Андрей Коржилов - 24.07.2017 15:06:54
 
Групповое выделение реализовать получилось, спасибо.
Страницы: 1
Читают тему (гостей: 1)



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

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