Получение доступа к груп. слоям MapControl

0 голосов
спросил 18 Авг, 09 от pooperec (10,820 баллов) в категории Программные продукты Esri
Доброго времени суток, разрабатываю программу на Делфи, среда разработки Делфи 2007, ArcGIS Developer Kit 9.2/

Возник вопрос, как из IMapControl`a получить все слои, а не только "сгруппированые".

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

Если IEnumLayer единственный ключ к списку слоев ,хотелось бы узнать как получить доступ к атрибутивной информации которая храниться в слое, и QueryFilter`y.

Пожалуйста тыкните носом где искать.
Ответы и примеры можно писать на VB кое-как протранслирую.

Заранее Спасибо!

=Добавлено позже=
Если конкретизировать, есть такой код:

finally
IL:=pMap.Layers[pUID,true];
IL.Reset;
Edit1.Text:='1';
FL2:=IL.Next;
while FL2.Valid do Begin
Edit1.Text:=inttostr(strtoint(Edit1.Text)+1);
FL2:=IL.Next;
End;
end;
Код должен считать количество "реальных" слоев на карте, он работает, но в конце работы (при выходе из конструкции while ??? do) выдает ошибку "Access violation...".
Испытывались следующие варианты конструкции while ??? do:
1. IL.Valid - аналогичная ошибка
2. IL<>nil - всегда тру...
3. IL<>null - ошибка компилятора
 
Подскажите пожалуйста:
0. Как правильно транслировать строку (VB6):
Do While Not pLayer Is Nothing
?
1. Как коректно работать с IEnumLayer, где ошибка в коде?
2. Нету ли другого пути к полному списку слоев в обход IEnumLayer?

Еще раз, Спасибо заранее!

5 Ответы

0 голосов
ответил 18 Авг, 09 от pooperec (10,820 баллов)
Как говориться правильно поставленый вопрос содержит в себе ответ. Итак привожу верную интерпритацию кода VB.

while IL.Next<>nil  do Begin
/// Процедура
End;


Но вопрос 2 остаеться актуальным.
0 голосов
ответил 18 Авг, 09 от pooperec (10,820 баллов)
И ещё вопрос -
3. Как от ILayer перейти к IGeoFeatureLayer?
0 голосов
ответил 18 Авг, 09 от new_sergei (2,660 баллов)
В Delphi не силён особо.
Для того, чтобы получить все слои, необходимо пройтись в цикле по всем слоям карты.

Выглядеть это будет примерно так (для VB)

Dim i as Integer
Dim ipLayer as ILayer

For i = 0 to ipMap.LayerCount - 1
Set ipLayer = ipMap.Layer(i)
' Для того, чтобы получить IFeatureLayer
' можно сделать так:
' Dim ipFeatureLayer as IFeatureLayer
' Set ipFeatureLayer = ipLayer
' И дальше уже пробовать сделать из IFeatureLayer      IGeoFeatureLayer

Nex i

0 голосов
ответил 19 Авг, 09 от pooperec (10,820 баллов)
Спасибо за ответ!

Но данный алгоритм "гуляет" только по корневым слоям и группам слоев. Добраться до инкапсулированных слоев выходит только через метод

pMap.Layers[ссылка на интерфес типа слоя,true/false]

При этом первый параметр типа IUID указывает на то какие слои мы хотим достать, а второй параметр задает искать рекурсивно либо нет, то есть лезть во вложенные слои или нет.

Возвращает эта процедура интерфейс IEnumLayer который содержит массив интерфейсов ILayer, и тут возникают не проблеммы даже, а сложности потому что у данного класса есть только методы:
1. Reset - переход к первому интерфесу слою в списке.
2. Next - переход к следующему интерфейсу слою в списке, который в свою очередь уже кое-как позволяет работать собственно с самим слоем.

При этом переприсвоенние превращение интерфейса слоя типа ILayer в тип IFeatureLayer либо IGeoFeatureLayer возможно, но при этом происходит "перескакивание" на следующий интерфейс что взрывает мозг при организации цикла перебора.
По крайне мере вчера у меня ничего достойного реализовать не удалось...

Если у кого-то есть опыт реализации цикла перебора с переприсвоением типа ILayer типом IGeoFeatureLayer, прошу подсказать алгоритм.
0 голосов
ответил 21 Авг, 09 от trent (400 баллов)
не вижу абсолютно никакой проблемы
перебираем все слои.. далее если встечаем груповой слой то заходим во внутрь

сейчас нет доступа к аркгису чтоб проверить код но будет выглядеть это примерно вот так:

Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pGLay As GroupLayer
Dim pCLay As ICompositeLayer
Dim pLay As IFeatureLayer
Dim i As Long , j as Long
    
Set pDoc = ThisDocument
Set pMap = pDoc.FocusMap
for j=0 to pMap.LayerCount-1
Set pGLay = pMap.layer(j) ' это груповой слой
If TypeOf pMap.layer(j) Is IGroupLayer Then
Set pCLay = pGLay
For i = 0 To pCLay.Count - 1
Set pLay = pCLay.layer(i) ' это слой внутри групового   
Next i
end if
next j
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...