Страница 1 из 1
Поиск в слое по атрибутам
Добавлено: 08 дек 2010, 16:44
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;
А как получить доступ к слою, который входит в состав группы слоев?
Спасибо за любую ссылку или подсказку.
Re: Поиск в слое по атрибутам
Добавлено: 08 дек 2010, 22:51
Дмитрий Барышников
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 03:28
Tereha
Спасибо, как всегда! Сейчас попробую.
Нужно до понедельника научиться рисовать на карте. Т.е. , например,
1. есть текущие ЧС (я делаю систему для МЧС) - нужно по клику - отобразить расположение ЧС на карте значками по выбору.
2. По выборке из БД каких-нибудь объектов , - тоже по клику увидеть их на карте. Т.е. сначала нужно добить поиск в слое по атрибутам, скажем, выбрать слой с населенными пунктами и находить точки их расположения , например, по наименованию и в найденной точке отобразить значек.
3. Ну и научиться по заданным координатам отображать скажем иконки из собственной библиотеки.
4. Какой нибудь инструмент для рисования - типа отобразить эллипс и менять его параметры или растягивать за точки.
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 04:22
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 - из него как-то получить координаты центра на карте и нарисовать там, допустим, красный кружочек.
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 04:32
Tereha
Как все непросто в arcgis Engind (пока не разберешься).
Пытаюсь задать поле, по которому производится поиск - pfind.FindFildes[6] - это вроде как поле "наименование" населенного пункта. Но пишет, что нельзя применять индекс к типу Object ...
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 04:53
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);
Буквально приходится на ощупь двигаться.
А как же можно указать конкретное поле, по которому производится поиск?
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 08:34
Дмитрий Барышников
На ощупь не надо! Есть стандартные способы.
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 строчек кода.
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 11:02
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.
В том ли направлении я иду?
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 14:36
Дмитрий Барышников
Я тормоз!
Надо использовать не 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();
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 15:27
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
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 15:39
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 ?
Re: Поиск в слое по атрибутам
Добавлено: 09 дек 2010, 17:30
Дмитрий Барышников
Попробуйте так
Код: Выделить всё
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 ;