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

Поиск по селекту

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


Код
HSELECT select = mapCreateSiteSelectContext( h_gd, hSite );     
mapSelectLocal( select, -1, 0);             
mapSelectLocal( select, LOCAL_LINE, 1); 

long nAll = mapSeekSelectObjectCount( h_gd, select );

while( mapSeekSelectObject( h_gd, hObj, select, flag) )
{
     flag = WO_NEXT;

     //обработка
}

1) Если в "обработке" происходит, например, добавление нового линейного объекта объекта, как поведет себя перебор объектов? Появится ли этот объект в выборке?

2) Почему количество объектов из mapSeekSelectObjectCount() меньше, чем количество, фактически пройденное в цикле (при условии, что в обработке вообще ничего не происходит)?
Изменено: Илья Аникин - 17.12.2020 11:02:45 (дополнил вопрос)
 
Здравствуйте!

1) Информация о попавших в выборку объектах заносится в контекст поиска в момент его заполнения. Созданные в процессе работы объекты туда заноситься не будут.

2) Для исключения проблем с перебором объектов на пользовательских картах лучше использовать однотипные функции со словом "Site" в имени функции. Структура кода будет выглядить следующим образом:
Код
  HSELECT hselect = mapCreateSiteSelectContext(hmap, hsite);
  // Заполнение контекста...
  int count = mapSeekSiteSelectCount(hmap, hsite, hselect);

  HOBJ hobj = mapCreateSiteObject(hmap, hsite);
  int flag = WO_FIRST;
  while (mapSeekSiteSelectObject(hmap, hsite, hobj, hselect, flag) != 0)
  {
    // Обработка...

    flag = WO_NEXT;
  }

  mapDeleteSelectContext(hselect);
  mapFreeObject(hobj);
 
Если в цикле перебора линейных объектов создать новый линейный объект, то он появится в выборке.
Чтобы отбросить новые объекты нужно перед циклом перебора запомнить число объектов
и при выборке объекта с номером больше этого количества выйти из цикла.

Если условия отбора заполнены номерами объектов (функции со словом Sample), то на них не влияет добавление объектов.

Число объектов, которое возвращает mapSeekSelectObjectCount, соответствует числу объектов, которые вернет
mapSeekSelectObject при поиске по одной карте. Поиск нужно начинать с WO_FIRST.

Чтобы явно искать объекты по одной карте используется функция mapSeekSiteSelectObject или добавляется флаг WO_INMAP
 
Александр Савелов, Oleg Belenkov,полезная информация, спасибо
 
Александр Савелов,сделал как вы предложили, теперь возвращаемое и обработанное количество объектов совпадают.
Правильно ли я понял, если я создаю контекст поиска для sit, его нельзя использовать с функциями поиска в карте вроде mapSeekSelectObject(), а только с функциями поиска в sit?
 
Да, при поиске объектов на пользовательских картах нужно использовать функции со словом "Site" в имени функции.
Изменено: Александр Савелов - 21.12.2020 11:13:44
 
Цитата
Илья Аникин написал:
Правильно ли я понял, если я создаю контекст поиска для sit, его нельзя использовать с функциями поиска в карте вроде mapSeekSelectObject(), а только с функциями поиска в sit?
Технически это возможно. Если все карты с одним классификатором, то вполне можно отобрать сразу на всех картах требуемые объекты.
Вы можете открывать, например, карты OSM формата SIT на разные регионы и они будут примыкать территориально. Визуально это будет как одно покрытие.
И работать с ним можно в целом функциями поиска.

Но если у Вас перекрываются разные карты с разными классификаторами, то Вы можете выполнять поиск в конкретной карте. Тогда применяете
mapSeekSiteSelectObject или задаете флажок WO_FIRST|WO_INMAP, WO_NEXT|WO_INMAP и т.д.
 
Oleg Belenkov,да, у меня карты с разными классификаторами, а работа идет на конкретном sit.
В одном месте, где то возможно, переделал поиск на mapSeekSiteSelectObjec() и все стало отлично.

Но в другом месте (работа также идет на конкретном sit) поиск нужно производить по селекту внутри фрейма.
Сейчас реализовано так:
Код
long flag = WO_LAST | WO_INMAP;
HOBJ hObj = mapCreateSiteObject( h_gd, hSite );
hObj = mapWhatObjectBySelect(h_gd, hObj, &frame, select, flag, PP_PLANE);
while(hObj)
{
    flag = WO_BACK | WO_INMAP;
    //обработка

    hObj = mapWhatObjectBySelect(h_gd, hObj, &frame, select, flag, PP_PLANE);
}
С учетом ваших замечаний, подставил "WO_INMAP". Проблема в том, что экспериментально выяснилось, что количество найденных объектов как-то завасит от текущего масштаба отображения карты. Т.е. при сильном увеличении карты этот код находит мало объектов, при небольшом - много.

Я бы хотел реализовать это функциями поиска mapSeekSite..., но, насколько вижу, для Site отдельных функций поиска по селекту и внутри фрейма нет.
Изменено: Илья Аникин - 25.12.2020 11:35:00 (опечатка)
 
mapWhatObjectBySelect - это выбор в точке с учетом масштаба, состава и т.д. Это не функция поиска.
Для поиска по области есть установка условий в HSELECT.
 
Цитата
Oleg Belenkov написал:
Для поиска по области есть установка условий в HSELECT.
Спасибо за наводку, у нас много где используется mapWhatObject... в качестве именно функции поиска, будем исправлять.
Для поиска по области на sit использовал mapSelectSeekAreaFrame(), теперь результат поиска не меняется в зависимости от масштаба.
Страницы: 1
Читают тему (гостей: 1)



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

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