ArcGis Engine, как выбирать объекты?

Я пытаюсь создать автономное приложение, которое загружает карту ArcGis, выбирает несколько объектов в одном слое и приближает их.

Загрузка и отображение карты работают, используя что-то вроде этого:

AxMapControl _mapControl;

// in constructor:
_mapControl = new AxMapControl();

// in loading
_mapControl.LoadMxFile(@"C:\Users\me\Documents\TestProject.mxd");

Это прекрасно работает и отображает карту в полном объеме (конечно, AxMapControl встроен в WindowsFormsHost, но это не должно быть проблемой).

Но теперь мне нужно выбрать один или несколько объектов и приблизить их. Я пробовал выделить в один слой для тестирования, но это вообще не работает:

IFeatureSelection features = _mapControl.Map.Layer[0] as IFeatureSelection;
if (features != null)
{
  QueryFilter qf = new QueryFilterClass();
  qf.WhereClause = "[Name]='FS4711000'";
  features.SelectFeatures(qf, esriSelectionResultEnum.esriSelectionResultNew, false);
}

при вызове SelectFeatures я получаю ошибку COM 80004005 (E_Fail) в ESRI.ArcGIS.Carto без особых объяснений. Наверное, я все делаю не так.

Может у кого-то есть образец, как выделять объекты в слое?


person Sam    schedule 28.02.2011    source источник


Ответы (1)


Я думаю, что ваша проблема так же проста, как [square brackets] вокруг имени вашего поля в строке запроса.

Это работает:

IFeatureSelection features = _currentLayer as IFeatureSelection;
if (features != null)
{
    QueryFilter qf = new QueryFilter();
    qf.WhereClause = "Type='1'";

    features.SelectFeatures(qf, esriSelectionResultEnum.esriSelectionResultNew, false);
}
_axMapControl.Refresh();

Тогда как это не удается с COM-ошибкой E_FAIL:

IFeatureSelection features = _currentLayer as IFeatureSelection;
if (features != null)
{
    QueryFilter qf = new QueryFilter();
    qf.WhereClause = "[Type]='1'";

    features.SelectFeatures(qf, esriSelectionResultEnum.esriSelectionResultNew, false);
}
_axMapControl.Refresh();

Также обратите внимание, что карту (или, по крайней мере, IActiveView, возвращаемый AxMapControl.ActiveView) необходимо обновить вручную, иначе выбор не отображается до перерисовки карты.

person jevakallio    schedule 28.02.2011
comment
Эээ, честно говоря, я пробовал с скобками и без них, и у меня была ошибка в обоих направлениях. Теперь попробовал еще раз, на всякий случай, и без скобок заработало?!? Спасибо, что бы вы ни сделали, чтобы мой код заработал волшебным образом! :) - person Sam; 28.02.2011
comment
Программирование с использованием плохо документированного API ESRI требует больше глупой удачи, изобретательных догадок и чистой черной магии вуду, чем навыков. Добро пожаловать в ваш худший кошмар :) - person jevakallio; 28.02.2011
comment
О, черт, я думал, что программирование старых скриптов Avenue было моим худшим кошмаром, но ESRI удалось превзойти себя в создании кошмаров? Бедный я! :) - person Sam; 28.02.2011
comment
Вы случайно не знаете, как увеличивать и панорамировать выделение? Способы Avenue не дают мне никакого представления об этом gis.stackexchange.com/questions/6603/ - person Sam; 28.02.2011
comment
@Sam Я уверен, что все, что делает ESRI, ужасно. Я думаю, они ненавидят разработчиков. Ответил на ваш вопрос по ГИС. - person jevakallio; 28.02.2011
comment
Единственное другое объяснение: у ESRI есть только умные продавцы, которые программируют настолько запутанно, насколько это возможно, поэтому они могут продать вам дорогое обучение и помощь (похоже, на обучение и помощь гораздо больше денег, чем на продажу лицензий). - person Sam; 28.02.2011