ArcGIS Engine二次开发 - 基础篇 联系客服

发布时间 : 星期六 文章ArcGIS Engine二次开发 - 基础篇更新完毕开始阅读c1826921192e45361066f5ac

ArcGIS Engine二次开发——基础篇

向其中的OnMouseMove函数添加如下代码:

//判断是否鼠标左键 if (Button != 1) return; //是否漫游状态

if (!m_PanOperation) return; //追踪鼠标

IPoint pPoint = m_focusScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); m_focusScreenDisplay.PanMoveTo(pPoint);

向其中的OnMouseUp函数添加如下代码:

//判断是否鼠标左键 if (Button != 1) return; //是否漫游状态

if (!m_PanOperation) return;

IEnvelope pExtent = m_focusScreenDisplay.PanStop();

//判断移动区域是否为空 if (pExtent != null) {

m_focusScreenDisplay.DisplayTransformation.VisibleBounds = pExtent; m_focusScreenDisplay.Invalidate(null, true, (short)esriScreenCache.esriAllScreenCaches); }

//关闭漫游状态

m_PanOperation = false;

这样就完成了Pan.cs类的制作。在下面的程序中,调用这个类,即可完成“漫游”的功能。

按照之前两个小节讲述的做法,完成其余类的制作,具体方法这里不一一列举出,您可以参考提供的例子程序MyGIS,详细查看其中每一个类的制作方法,代码方面的问题如果有疑问,可以参看帮助系统,具体帮助系统的使用方法在第六章中有详细讲述。

1.7.5 实现属性查询

前面我们已经实现过属性查询,但是我们的程序只能查询固定的bou2_4p图层的NAME字段,在这里我们将对程序进行修改完善,实现图层和字段的可选查询。

首先打开“属性查询”窗体的设计器。添加三个Label控件,两个ComboBox,两个Button和一个TextBox。各控件属性设置如下:

表 5控件参数设置

名称(Name) Text属性 lblLayer 选择图层: 描述 标签 ArcGIS Engine二次开发——基础篇

lblField lblFind cboLayer cboField txtValue btnOk btnCancel

界面效果如下:

字段名称: 查找内容: 查找 取消 标签 标签 MapControl中的图层名称 cboLayer选中图层的所有字段名称 输入的查询对象名称 查询按钮 取消查询按钮

图 25 属性查询窗口布局

进入窗体的代码编辑界面,首先添加三个引用:

using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase;

然后定义两个成员变量,一个用于存储地图数据,一个用于存储当前选中图层,如下

//地图数据

private AxMapControl mMapControl; //选中图层

private IFeatureLayer mFeatureLayer;

然后修改其构造函数,构造函数中添加一个参数MapControl,用于获取MapControl中的数据,如下所示:

public AttributeQueryForm(AxMapControl mapControl) {

InitializeComponent();

this.mMapControl = mapControl; }

ArcGIS Engine二次开发——基础篇

在窗体的Load事件中添加代码,用于初始化cboLayer,获取MapControl中的图层名称,如下:

//MapControl中没有图层时返回 if (this.mMapControl.LayerCount <= 0) return;

//获取MapControl中的全部图层名称,并加入ComboBox //图层 ILayer pLayer; //图层名称

string strLayerName;

for (int i = 0; i < this.mMapControl.LayerCount; i++) {

pLayer = this.mMapControl.get_Layer(i); strLayerName = pLayer.Name; //图层名称加入cboLayer

this.cboLayer.Items.Add(strLayerName); }

//默认显示第一个选项

this.cboLayer.SelectedIndex = 0;

在CboLayer的SelectedIndexChanged事件中添加代码,当选中图层发生变化时,cboField中的字段名称重新获取,代码如下:

//获取cboLayer中选中的图层

mFeatureLayer = mMapControl.get_Layer(cboLayer.SelectedIndex) as IFeatureLayer; IFeatureClass pFeatureClass = mFeatureLayer.FeatureClass; //字段名称 string strFldName;

for (int i = 0; i < pFeatureClass.Fields.FieldCount;i++ ) {

strFldName = pFeatureClass.Fields.get_Field(i).Name; //图层名称加入cboField

this.cboField.Items.Add(strFldName); }

//默认显示第一个选项

this.cboField.SelectedIndex = 0;

然后按照我们之前所讲的查询属性要素的方法在“查找”按钮的Click事件中添加代码,请你参照前面章节所述方式和示例程序尝试自行完成。这样我们就完成了“属性查询”窗体的设计实现。

1.7.6 实现空间查询

这一小结,我们进一步实现空间查询窗体的设计实现,我们的设想是通过该窗体选择查询的图层和查询的方式,然后将这两个参数传递给主窗体,主窗体实现查询,将查询得到

ArcGIS Engine二次开发——基础篇

的要素的属性显示在DataGridView控件中,下面开始动手吧。

首先打开“属性查询”窗体的设计器。添加两个Label控件,两个ComboBox,两个Button。各控件属性设置如下:

表 6控件参数设置

名称(Name) Text属性 lblLayer lblMode cboLayer cboMode btnOk btnCancel

界面效果如下:

选择图层: 查询方式: 确定 取消 描述 标签 标签 MapControl中的图层名称 空间查询的方式 确定查询按钮 取消查询按钮

图 26空间查询窗口布局

进入窗体的代码编辑界面,首先添加三个引用:

using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto;

然后定义两个成员变量,一个用于存储地图数据,一个用于存储当前选中图层,如下

//获取主界面的MapControl对象 private AxMapControl mMapControl; //查询方式

public int mQueryMode; //图层索引

public int mLayerIndex;

然后修改其构造函数,构造函数中添加一个参数MapControl,用于获取MapControl中

的数据,如下所示:

public SpatialQueryForm (AxMapControl mapControl) {