1) Если в "обработке" происходит, например, добавление нового линейного объекта объекта, как поведет себя перебор объектов? Появится ли этот объект в выборке?
2) Почему количество объектов из mapSeekSelectObjectCount() меньше, чем количество, фактически пройденное в цикле (при условии, что в обработке вообще ничего не происходит)?
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
Александр Савелов,сделал как вы предложили, теперь возвращаемое и обработанное количество объектов совпадают. Правильно ли я понял, если я создаю контекст поиска для sit, его нельзя использовать с функциями поиска в карте вроде mapSeekSelectObject(), а только с функциями поиска в sit?
Илья Аникин написал: Правильно ли я понял, если я создаю контекст поиска для sit, его нельзя использовать с функциями поиска в карте вроде mapSeekSelectObject(), а только с функциями поиска в sit?
Технически это возможно. Если все карты с одним классификатором, то вполне можно отобрать сразу на всех картах требуемые объекты. Вы можете открывать, например, карты OSM формата SIT на разные регионы и они будут примыкать территориально. Визуально это будет как одно покрытие. И работать с ним можно в целом функциями поиска.
Но если у Вас перекрываются разные карты с разными классификаторами, то Вы можете выполнять поиск в конкретной карте. Тогда применяете mapSeekSiteSelectObject или задаете флажок WO_FIRST|WO_INMAP, WO_NEXT|WO_INMAP и т.д.
Oleg Belenkov,да, у меня карты с разными классификаторами, а работа идет на конкретном sit. В одном месте, где то возможно, переделал поиск на mapSeekSiteSelectObjec() и все стало отлично.
Но в другом месте (работа также идет на конкретном sit) поиск нужно производить по селекту внутри фрейма. Сейчас реализовано так:
С учетом ваших замечаний, подставил "WO_INMAP". Проблема в том, что экспериментально выяснилось, что количество найденных объектов как-то завасит от текущего масштаба отображения карты. Т.е. при сильном увеличении карты этот код находит мало объектов, при небольшом - много.
Я бы хотел реализовать это функциями поиска mapSeekSite..., но, насколько вижу, для Site отдельных функций поиска по селекту и внутри фрейма нет.
mapWhatObjectBySelect - это выбор в точке с учетом масштаба, состава и т.д. Это не функция поиска. Для поиска по области есть установка условий в HSELECT.
Oleg Belenkov написал: Для поиска по области есть установка условий в HSELECT.
Спасибо за наводку, у нас много где используется mapWhatObject... в качестве именно функции поиска, будем исправлять. Для поиска по области на sit использовал mapSelectSeekAreaFrame(), теперь результат поиска не меняется в зависимости от масштаба.