Поиск в слое по атрибутам

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Поиск в слое по атрибутам

Сообщение Tereha »

arcgis Engine + vs 2005+ c#
На форме имеется axMapControl в котором документ карты - D:\map\РК_обзор_v16.mxd
Доступ к обычному слою в Arcgis Engine -

Код: Выделить всё

layer = (ESRI.ArcGIS.Carto.IFeatureLayer)axMapControl1.get_Layer(6) as ESRI.ArcGIS.Carto.IFeatureLayer;
А как получить доступ к слою, который входит в состав группы слоев?
Спасибо за любую ссылку или подсказку.
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Поиск в слое по атрибутам

Сообщение Дмитрий Барышников »

Смотрите в сторону ICompositeLayer
Что-то типа

Код: Выделить всё

as ESRI.ArcGIS.Carto.ICompositeLayer;
Там есть методы получения количества слоев в групповом и получения отдельного слоя по индексу
http://edndoc.esri.com/arcobjects/9.2/c ... eLayer.htm
http://help.arcgis.com/en/sdk/10.0/arco ... 02wn000000
http://help.arcgis.com/en/sdk/10.0/arco ... 02wn000000
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Спасибо, как всегда! Сейчас попробую.
Нужно до понедельника научиться рисовать на карте. Т.е. , например,
1. есть текущие ЧС (я делаю систему для МЧС) - нужно по клику - отобразить расположение ЧС на карте значками по выбору.
2. По выборке из БД каких-нибудь объектов , - тоже по клику увидеть их на карте. Т.е. сначала нужно добить поиск в слое по атрибутам, скажем, выбрать слой с населенными пунктами и находить точки их расположения , например, по наименованию и в найденной точке отобразить значек.
3. Ну и научиться по заданным координатам отображать скажем иконки из собственной библиотеки.
4. Какой нибудь инструмент для рисования - типа отобразить эллипс и менять его параметры или растягивать за точки.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Слой нашел так:

Код: Выделить всё

            ESRI.ArcGIS.esriSystem.IArray pArray;
            ESRI.ArcGIS.Carto.IFind pfind;
            ESRI.ArcGIS.Carto.IFeatureLayer layer;
            ESRI.ArcGIS.Carto.ICompositeLayer layer1;

            layer1 = axMapControl1.get_Layer(0) as ESRI.ArcGIS.Carto.ICompositeLayer; // выбрал группу

            layer = layer1.get_Layer(1) as ESRI.ArcGIS.Carto.IFeatureLayer ;  // выбрал слой
            pfind = (ESRI.ArcGIS.Carto.IFind)layer;

            pArray = pfind.Find("Пряжа", true, pfind.FindFields, axMapControl1.ActiveView.ScreenDisplay.CancelTracker);
// нашел населенный пункт "Пряжа" .
Теперь нужно в нем выбрать поле типа shape - из него как-то получить координаты центра на карте и нарисовать там, допустим, красный кружочек.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Как все непросто в arcgis Engind (пока не разберешься).
Пытаюсь задать поле, по которому производится поиск - pfind.FindFildes[6] - это вроде как поле "наименование" населенного пункта. Но пишет, что нельзя применять индекс к типу Object ...
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Так тоже находит запись

Код: Выделить всё

string[] s = pfind.FindFields as string[];
            pArray = pfind.Find("Пряжа", true, s as Object, axMapControl1.ActiveView.ScreenDisplay.CancelTracker);
Но я знаю (в отладчике видно), что поле ""Наименование НП", которое содержит нужную строку "Пряжа" - это
s[6]. Но если поставить это выражение в строку поиска

Код: Выделить всё

            pArray = pfind.Find("Пряжа", true, s[6] as Object, axMapControl1.ActiveView.ScreenDisplay.CancelTracker);
то не находит.
Кстати as Object в строке поиска

Код: Выделить всё

            pArray = pfind.Find("Пряжа", true, s as Object, axMapControl1.ActiveView.ScreenDisplay.CancelTracker);
Буквально приходится на ощупь двигаться.
А как же можно указать конкретное поле, по которому производится поиск?
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Поиск в слое по атрибутам

Сообщение Дмитрий Барышников »

На ощупь не надо! Есть стандартные способы.
1. У вашего IFeatureLayer получаете IFeatureClass
2. У IFeatureClass выполняете Select предварительно создав IQueryFilter и записав туда через метод WhereClause что-то типа [Field_Name] Like "Пряжа"
3. В результате выполнения метода Select возвращается IFeatureCursor
4. У IFeatureCursor вызываем метод NextFeature который возвращает IFeature
5. У IFeature запрашиваем геометрию через свойство Shape - возвращает IGeometry (для запроса значений атрибутов используем свойство Value, которое возвращает VARIANT)
6. Преобразуем IGeometry к типу IArea и вызовем метод QueryCentroid или QueryLabelPoint в зависимости от того что вы хотите получить.
Все это занимает от силы 10 строчек кода.
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Пробую сделать select

Код: Выделить всё

            ESRI.ArcGIS.Geodatabase.IQueryFilter qf = new ESRI.ArcGIS.Geodatabase.QueryFilterClass();
            qf.WhereClause = "Наименование пт='Пряжа'";
            layer.FeatureClass.Select(qf, ESRI.ArcGIS.Geodatabase.esriSelectionType.esriSelectionTypeIDSet,
                ESRI.ArcGIS.Geodatabase.esriSelectionOption.esriSelectionOptionNormal, ESRI.ArcGIS.Geodatabase.IWorkspace selectionContainer);
Не могу найти примера создания последненго параметра ESRI.ArcGIS.Geodatabase.IWorkspace.
В том ли направлении я иду?
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Поиск в слое по атрибутам

Сообщение Дмитрий Барышников »

Я тормоз!
Надо использовать не Select а Search!!!
recycling поставить в false
http://edndoc.esri.com/arcobjects/9.2/c ... Search.htm

Код: Выделить всё


//preform the search on the supplied feature class; use a cursor to hold the results
IFeatureCursor featureCursor = featureClass.Search(queryFilter, false);
//get the first feature returned
IFeature feature = featureCursor.NextFeature();
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Я получил нужное поле

Код: Выделить всё

            pSelection = layer.FeatureClass.Select(qf, ESRI.ArcGIS.Geodatabase.esriSelectionType.esriSelectionTypeIDSet,
                ESRI.ArcGIS.Geodatabase.esriSelectionOption.esriSelectionOptionNormal, null);// as ESRI.ArcGIS.Geodatabase.IFeatureCursor;


            ESRI.ArcGIS.Geodatabase.IRow row = pSelection.Target.GetRow(1);
            ESRI.ArcGIS.Geometry.IGeometry coord = row.get_Value(1) as ESRI.ArcGIS.Geometry.IGeometry ;
Но не могу его преобразовать в IArea
Tereha
Завсегдатай
Сообщения: 423
Зарегистрирован: 15 май 2010, 06:13
Репутация: 7

Re: Поиск в слое по атрибутам

Сообщение Tereha »

Так тоже получил shape -

Код: Выделить всё

            ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = layer.FeatureClass.Search(qf, false);
            ESRI.ArcGIS.Geodatabase.IFeature feature = featureCursor.NextFeature();
            ESRI.ArcGIS.Geometry.IGeometry shape = feature.Shape as ESRI.ArcGIS.Geometry.IGeometry;
Осталось как то привести это к типу IArea ?
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Поиск в слое по атрибутам

Сообщение Дмитрий Барышников »

Попробуйте так

Код: Выделить всё


ESRI.ArcGIS.Polygon.IArea area= feature.Shape as ESRI.ArcGIS.Polygon.IArea ;

Только это должен быть полигональный слой! Иначе не прокатит с Area.
или

Код: Выделить всё


ESRI.ArcGIS.Geometry.IGeometry geom = feature.Shape as ESRI.ArcGIS.Geometry.IGeometry ;
ESRI.ArcGIS.Envelope.IArea area= geom .Envelope as ESRI.ArcGIS.Envelope.IArea ;
Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя