0

我正在尝试创建一个独立的应用程序,它加载 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 调用中,我在 ESRI.ArcGIS.Carto 中收到 COM 错误 80004005 (E_Fail),没有更多解释。可能我做错了。

也许有人有一个示例如何选择图层中的对象?

4

1 回答 1

2

我认为您的问题就像[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)需要手动刷新,或者在重新绘制地图之前不显示选择。

于 2011-02-28T12:02:50.310 回答