Engine.轻松入门级教程 .pdf
《Engine.轻松入门级教程 .pdf》由会员分享,可在线阅读,更多相关《Engine.轻松入门级教程 .pdf(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ArcGIS Engine10.0 轻松入门级教程(3) ArcEngine10.0 查询分析功能目录 (?)-1. 属性及空间查询2. 缓冲区查询3. 叠置分析4. 网络分析GIS 中的查询分析功能是非常重要的,本节将实现这些功能。1 属性及空间查询在 Forms 文件夹右击点击“添加”“Windows窗体”,添加两个窗体,分别用于空间查询和属性查询,参数设置如下表。窗体名称( Name )Text 属性 描述SpatialQueryForm 空间查询用于空间查询参数设置AttributeQueryForm 属性查询用于属性查询参数设置同时在主窗体上的菜单项上添加一二级菜单。查询( menu
2、Query ) 属性查询( menuAttributeQuery) 空间查询( menuSpatialQuery)实现属性查询, 首先打开 “ 属性查询 ” 窗体的设计器。 添加三个 Label 控件, 两个 ComboBox, 两个 Button和一个 TextBox 。各控件属性设置如下:名称( Name) Text 属性描述lblLayer 选择图层:标签lblField 字段名称:标签lblFind 查找内容:标签cboLayer MapControl中的图层名称cboField cboLayer 选中图层的所有字段名称txtValue 输入的查询对象名称btnOk 查找查询按钮btn
3、Cancel 取消取消查询按钮名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 47 页 - - - - - - - - - 界面效果如下:进入窗体的代码编辑界面,首先添加三个引用: using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Geodatabase;然后定义两个成员变量,一个用于存储地图数据,一个用于存储当前选中图层,如下 / 地图数据 private AxMapControl
4、mMapControl; / 选中图层 private IFeatureLayer mFeatureLayer;然后修改其构造函数,构造函数中添加一个参数MapControl ,用于获取MapControl 中的数据,如下所示: public AttributeQueryForm(AxMapControl mapControl) InitializeComponent(); this.mMapControl = mapControl;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2
5、 页,共 47 页 - - - - - - - - - 在窗体的 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.m
6、MapControl.get_Layer(i); strLayerName = pLayer.Name; / 图层名称加入cboLayer this.cboLayer.Items.Add(strLayerName); / 默认显示第一个选项 this.cboLayer.SelectedIndex = 0;在 CboLayer 的 SelectedIndexChanged事件中添加代码,当选中图层发生变化时,cboField 中的字段名称重新获取,代码如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
7、- - - - 第 3 页,共 47 页 - - - - - - - - - / 获取 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 = pFeatureC
8、lass.Fields.get_Field(i).Name; / 图层名称加入cboField this.cboField.Items.Add(strFldName); / 默认显示第一个选项 this.cboField.SelectedIndex = 0;查找按钮添加事件:private void button1_Click(object sender, EventArgs e) /定义图层,要素游标,查询过滤器,要素IFeatureCursor pFeatureCursor; IQueryFilter pQueryFilter; IFeature pFeature; IPoint pPoi
9、nt; IEnvelope pEnv; pEnv = mMapControl.ActiveView.Extent; pPoint = new PointClass(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 47 页 - - - - - - - - - pPoint.X = pEnv.XMin + pEnv.Width / 2; pPoint.Y = pEnv.YMin + pEnv.Height / 2; if (this.mMapControl.LayerC
10、ount = 0) return; /获取图层mFeatureLayer = mMapControl.get_Layer(cboLayer.SelectedIndex) as IFeatureLayer; /清除上次查询结果this.mMapControl.Map.ClearSelection(); this.mMapControl.ActiveView.Refresh(); /pQueryFilter的实例化pQueryFilter = new QueryFilterClass(); /设置查询过滤条件pQueryFilter.WhereClause = cboField.Text + =
11、+ txtValue.Text; /查询pFeatureCursor = mFeatureLayer.Search(pQueryFilter, true); /获取查询到的要素pFeature = pFeatureCursor.NextFeature(); /判断是否获取到要素if (pFeature != null) /选择要素this.mMapControl.Map.SelectFeature(mFeatureLayer, pFeature); /放大到要素pFeature.Shape.Envelope.CenterAt(pPoint); this.mMapControl.Extent =
12、 pFeature.Shape.Envelope; else /没有得到pFeature 的提示MessageBox.Show(没有找到相关要素!, 提示 ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 47 页 - - - - - - - - - 取消按钮添加事件:private void btnCancel_Click(object sender, EventArgs e) this.Close(); 点击运行,这样就实现了属性查询的功能。运行效果如下图:名师资
13、料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 47 页 - - - - - - - - - 这一小结,我们进一步实现空间查询窗体的设计实现,我们的设想是通过该窗体选择查询的图层和查询的方式,然后将这两个参数传递给主窗体,主窗体实现查询,将查询得到的要素的属性显示在DataGridView 控件中,下面开始动手吧。首先打开 “ 属性查询 ” 窗体的设计器。添加两个Label 控件,两个ComboBox ,两个 Button。各控件属性设置如下:名称( Name) Text 属性
14、描述lblLayer 选择图层:标签lblMode 查询方式:标签cboLayer MapControl中的图层名称cboMode 空间查询的方式btnOk 确定确定查询按钮btnCancel 取消取消查询按钮进入窗体的代码编辑界面,首先添加三个引用: using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto;然后定义两个成员变量,一个用于存储地图数据,一个用于存储当前选中图层,如下 /获取主界面的MapControl对象 private AxMapControl mMapControl; /查询方式 public int mQueryMode;
15、/图层索引 public int mLayerIndex;然后修改其构造函数,构造函数中添加一个参数MapControl ,用于获取 MapControl 中的数据,如下所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 47 页 - - - - - - - - - public SpatialQueryForm (AxMapControl mapControl) InitializeComponent(); this.mMapControl = mapControl;
16、 在窗体的 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_Lay
17、er(i); strLayerName = pLayer.Name; /图层名称加入ComboBox this.cboLayer.Items.Add(strLayerName);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 47 页 - - - - - - - - - /加载查询方式 this.cboMode.Items.Add(矩形查询 ); this.cboMode.Items.Add(线查询 ); this.cboMode.Items.Add(点查询 ); thi
18、s.cboMode.Items.Add(圆查询 ); /初始化 ComboBox默认值 this.cboLayer.SelectedIndex = 0; this.cboMode.SelectedIndex = 0;在“确定”按钮添加代码如下: /设置鼠标点击时窗体的结果 this.DialogResult = DialogResult.OK; /判断是否存在图层 if (this.cboLayer.Items.Count = 0) MessageBox.Show(当前 MapControl 没有添加图层! , 提示 ); return; /获取选中的查询方式和图层索引 this.mLayer
19、Index = this.cboLayer.SelectedIndex; this.mQueryMode = this.cboMode.SelectedIndex;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 47 页 - - - - - - - - - 这样我们就完成了空间查询窗体的设计。由于空间查询的结果需要借助于DataGridView 进行显示, 我们首先需要添加一个方法LoadQueryResult(AxMapControl mapControl, IFeat
20、ureLayer featureLayer, IGeometry geometry),用于获取空间查询得到的要素的属性。在这个方法的参数中,IGeometry 是用于空间查询的几何对象,IFeatureLayer是查询要素所在的要素图层,AxMapControl 是当前 MapControl 。我们使用 DataTable 来存储要素的属性, 然后将 DataTable 中的数据添加到DataGridView 进行显示。 为了显示效果在主窗体上添加一个 Panel 控件,把 DataGridView控件添加上去, 并在 Panel 控件上添加一个 “关闭”按钮。然后把 Panel控件 Visi
21、ble属性设置为 False 。在这个方法实现过程中,首先利用 IFeatureClass的属性字段初始化DataTable ,然后利用 IGeometry对 IFeatureLayer图层进行空间查询返回到要素游标IFeatureCursor中,然后逐个变量要素,将值添加到DataTable 。代码如下: private DataTable LoadQueryResult(AxMapControl mapControl, IFeatureLayer featureLayer, IGeometry geometry) IFeatureClass pFeatureClass = featureL
22、ayer.FeatureClass; /根据图层属性字段初始化DataTable IFields pFields = pFeatureClass.Fields; DataTable pDataTable = new DataTable(); for (int i = 0; i pFields.FieldCount; i+) string strFldName; strFldName = pFields.get_Field(i).AliasName; pDataTable.Columns.Add(strFldName); /空间过滤器名师资料总结 - - -精品资料欢迎下载 - - - - -
23、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 47 页 - - - - - - - - - ISpatialFilter pSpatialFilter = new SpatialFilterClass(); pSpatialFilter.Geometry = geometry; /根据图层类型选择缓冲方式 switch (pFeatureClass.ShapeType) case esriGeometryType.esriGeometryPoint: pSpatialFilter.SpatialRel = esriSpatial
24、RelEnum.esriSpatialRelContains; break; case esriGeometryType.esriGeometryPolyline: pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses; break; case esriGeometryType.esriGeometryPolygon: pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; break; /定义空间过滤器的空间字段 pSp
25、atialFilter.GeometryField = pFeatureClass.ShapeFieldName; IQueryFilter pQueryFilter; IFeatureCursor pFeatureCursor; IFeature pFeature; /利用要素过滤器查询要素名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 47 页 - - - - - - - - - pQueryFilter = pSpatialFilter as IQueryFilt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Engine.轻松入门级教程 2022 Engine 轻松 入门 教程
限制150内