




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
地图查询、统计是一个GIS系统的基本的功能模块,实际上统计功能的前提也是通过查询获取结果以文字或者图表等报表的形式展现查询结果数据。地图查询有两种类型的查询:1.空间查询:在地图上设置一定范围,查询这一范围内的要素。例如在地图上画一范围查询这一区域内的所有消防栓,这一范围的所有消防栓高亮显示(或者其他显示方式)并展现出所有的消防栓的属性信息。2.属性查询:通过一定的查询条件获取目标要素。例如我们需要查询中国行政区上人口大于5000万,同时GDP大于1万亿的省份,通过执行查询,符号条件的省份高亮显示(或者其他显示方式)并展现出这些省份的属性信息。ArcGIS Engine9.3为开发者提供了无需写代码即可进行查询功能的Identify工具,但是这个工具是一个通用的信息查询新工具。而开发者通常需要自己开发一套符合自己业务需求更加灵活的查询功能模块,甚至一些功能不仅仅是查询信息,很多编辑编辑功能以及和业务相结合的功能开发都用到查询功能。所以很有必要了解ArcGIS Engine的查询机制。5.1目标.熟悉Cursor,FeatureCursor对象,使用IFeatureCursor接口.熟悉QueryFilter, SpatialFilter对象使用IQueryFilter,ISpatialFilter接口.熟悉要素选择集SelectionSet对象,会使用IFeatureSelection,ISelectionSet接口.开发一个属性查询小功能Demo, 获取符号查询条件的Feature,并IFeatureLayerDefinition接口创建一个新的要素图层加载到Mapcontrol上.开发一个空间多边形查询功能的小Demo, 学会创建内存半透明图层用于显示选择范围5.2准备工作1.IDE:Visual Studio 2005/20082.ArcGIS Engine Developer kit 9.33.准备一份用于查询的的矢量数据(文章内有说明)5.3Cursor对象Cursor(游标)本质上是一个指向数据的指针,本身并不包含数据内容,它是连接到Row对象或要素对象的桥梁。 游标有三种类型,即查询游标、插入游标和更新游标。每一种游标都是通过与之相适应的方法来获得的,如Search、Insert和Update方法。更新和插入游标都需要使用一个过滤器(Filter)对象,因为它们首先必须获得需要进行操作的要素。 Cursor对象支持的接口是ICursor,它定义了操作一个Row集合或一个Row对象的属性和方法,下面是获得插入型、更新型和查询型游标的方法: pCursor = IFeatureClass.Insert()使用IFeatureClass的Insert方法返回一个插入型游标,它通常用于往表中插入一条记录。 pCursor = IFeatureClass.Update()使用IFeatureClass的Update方法会返回一个更新型游标,它用于更新或者删除一条记录。 pCursor= IFeatureClass.Search()使用IFeatureClass的Sarch方法对表进行查询后,可以得到一个查询型Cursor对象,它指向一个或多个Row对象。 以我们这章的内容主要使用查询游标。 FeatureCursor是Cursor的一个子类,指向一个或多个要素,它实现了IFeatureCursor接口,ArcGIS Engine开发所对矢量图层实现查询功能都是实行IFeatureCursor。5.4QueryFilter对象与SpatialFilter对象 在关系型数据库中,查询条件是通过SQL语句的Where子语句来完成的。在ArcGIS Engine中不能直接使用SQL语句,但ArcGIS Engine提供了QueryFilter和SpatialFilter两个过滤器对象来配合完成查询条件的设置,从而查询到想要的数据。 QueryFilter过滤器主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口从而实现属性查询功能。CODE:IQueryFilter pQueryFilter = new QueryFilterClass();/设置过滤器对象的属性pQueryFilter.WhereClause = 人口 10000000; SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter(继承 IQueryFilter接口)接口从而实现空间查询功能。 CODE:ISpatialFilter pSpatialFilter = new SpatialFilterClass();/设置空间过滤器的范围(多边形)pSpatialFilter.Geometry = pGeometry;/设置空间过滤器空间关系类型pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; 空间过滤器空间关系类型主要有以下几种类型如表一所示:表1空间过滤器空间关系类型描述(A是待查询图形,B是过滤条件图形)esriSpatialRelUndefined未定义esriSpatialRelIntersectsA与B图形相交esriSpatialRelEnvelopeIntersectsA的Envelope和B的Envelope相交esriSpatialRelIndexIntersectsA与B索引相交esriSpatialRelTouches与B边界相接esriSpatialRelOverlapsA与B相叠加esriSpatialRelCrossesA与B相交(两条线相交于一点,一条线和一个面相交)esriSpatialRelWithinA在B内esriSpatialRelContainsA包含BesriSpatialRelRelationA与B空间关联5.5SelectionSet要素选择集对象熟悉ArcGIS Desktop使用的开发者一定会知道当在ArcMap中显示查询结果的时,所有的符号查询调教的要素都以蓝色高亮的形式显示在地图控件上,蓝色高亮显示表示高亮选中,这些高亮显示选中的要素对应一个要素选择集对象中。通过IFeatureSelection的SelectionSet属性可以获取选择集,FeatureLayer对象实现了IFeatureSelection接口。实现代码如下:IFeatureLayerpFeatureLayer =this.axMapControl1.get_Layer(0)asIFeatureLayer;/QI至IFeatureSelectionIFeatureSelectionpFeatureSelection = pFeatureLayerasIFeatureSelection; /创建过滤器IQueryFilterpQueryFilter =newQueryFilterClass(); /设置过滤器对象的查询条件pQueryFilter.WhereClause =人口 10000000;/选择要素pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false); /获取选择集对象ISelectionSetpSelectinSet=pFeatureSelection.SelectionSet;/设置选择集的符号pFeatureSelection.SelectionSymbol = pSymbol;5.6属性查询实例5.6.1程序实现目标:查询人口大于5000000的城市,并把查询结果创建为一个新的图层,如图1-3所示:代码片段如下:CODE:private void button1_Click(object sender, EventArgs e)IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer; /QI到FeatureSelection IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection; /创建过滤器IQueryFilter pQueryFilter = new QueryFilterClass(); /设置过滤器对象的查询条件pQueryFilter.WhereClause = 人口 5000000;/根据查询条件选择要素pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false); /QI到ISelectionSetISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;if (pSelectionSet.Count 0)IFeatureLayerDefinition pFDefinition = pFeatureLayer as IFeatureLayerDefinition; /创建新图层IFeatureLayer pNewFeatureLayer = pFDefinition.CreateSelectionLayer(newlayerName, true, null, null);pNewFeatureLayer.Name = 查询结果城市;axMapControl1.AddLayer(pNewFeatureLayer as ILayer);5.7空间查询实例5.7.1目标 实现多边形查询功能5.7.2功能开发 代码片段如下:引用的命名空间:codeusing System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.IO;using System.Runtime.InteropServices;using System.Collections.Generic;using ESRI.ArcGIS.esriSystem;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.ADF;using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.DataSourcesGDB;/在程序运行时的内存中创建矢量要素层,并加到地图控件最顶端/ /地图控件/IFeatureLayer 新加的要素层privateIFeatureLayer AddFeatureLayerByMemoryWS(AxMapControl pMapCtrl,ISpatialReference pSReference) try if (pMapCtrl = null) return null;#region创建新的内存工作空间IWorkspaceFactory pWSF = new InMemoryWorkspaceFactoryClass();IWorkspaceName pWSName = pWSF.Create(, Temp, null, 0);IName pName = (IName)pWSName;IWorkspace pMemoryWS = (IWorkspace)pName.Open();#endregionIField Field = new FieldClass();IFields Fields = new FieldsClass();IFieldsEdit FieldsEdit = null;IFieldEdit FieldEdit = null;IFeatureClass FeatureClass = null;IFeatureLayer FeatureLayer = null;tryFieldsEdit = oFields as IFieldsEdit;oFieldEdit = oField as IFieldEdit;oFieldEdit.Name_2 = OBJECTID;oFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;oFieldEdit.IsNullable_2 = false;oFieldEdit.Required_2 = false;oFieldsEdit.AddField(oField);oField = new FieldClass();oFieldEdit = oField as IFieldEdit;IGeometryDef pGeoDef = new GeometryDefClass();IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;pGeoDefEdit.AvgNumPoints_2 = 5;pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;pGeoDefEdit.GridCount_2 = 1;pGeoDefEdit.HasM_2 = false;pGeoDefEdit.HasZ_2 = false;pGeoDefEdit.SpatialReference_2 = pSReference;oFieldEdit.Name_2 = SHAPE;oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;oFieldEdit.GeometryDef_2 = pGeoDef;oFieldEdit.IsNullable_2 = true;oFieldEdit.Required_2 = true;oFieldsEdit.AddField(oField);oField = new FieldClass();oFieldEdit = oField as IFieldEdit;oFieldEdit.Name_2 = Code;oFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;oFieldEdit.IsNullable_2 = true;oFieldsEdit.AddField(oField);/创建要素类oFeatureClass = (pMemoryWS as IFeatureWorkspace).CreateFeatureClass(Temp, oFields, null, null, esriFeatureType.esriFTSimple, SHAPE, );oFeatureLayer = new FeatureLayerClass();oFeatureLayer.Name = TransTemp;oFeatureLayer.FeatureClass = oFeatureClass;/创建唯一值符号化对象IUniqueValueRenderer pURender = new UniqueValueRendererClass();pURender.FieldCount = 1;pURender.set_Field(0, Code);pURender.UseDefaultSymbol = false;ISimpleFillSymbol pFillSym = new SimpleFillSymbolClass();pFillSym.Style. = esriSimpleFillStyle.esriSFSSolid;/半透明颜色IRgbColor pColor = new RgbColorClass();pColor.Red = 255;pColor.Green = 255;pFillSym.Color = pColor;pURender.AddValue(1, , pFillSym as ISymbol);pFillSym = new SimpleFillSymbolClass();pFillSym.Style. = esriSimpleFillStyle.esriSFSSolid;/唯一值符号化内存图层(oFeatureLayer as IGeoFeatureLayer).Renderer = pURender as IFeatureRenderer;ILayerEffects pLyrEffect = oFeatureLayer as ILayerEffects;/透明度pLyrEffect.Transparency = 80;catch(Exception Err) MessageBox.Show(Err.Message);finally tryystem.Runtime.InteropServices.Marshal.ReleaseComObject(oField);System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit);System.Runtime.InteropServices.Marshal.ReleaseComObject(pName);System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSF);System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSName);System.Runtime.InteropServices.Marshal.ReleaseComObject(pMemoryWS);System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);catchGC.Collect(); return oFeatureLayer;catch (Exception Err)MessageBox.Show(Err.Message, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information);return null;CODE:/ 在地图控件上添加透明临时图元/ / 地图控件/ Envelope或Polygon几何实体/ 是否清除原有内容publicvoid AddTransTempEle(AxMapControl pMapCtrl, IGeometry pGeo, bool bAutoClear) try if (pMapCtrl = null) return; if (pGeo = null) return; if (pGeo.IsEmpty) return; IGeometry pPolygon = null; if (pGeo is IEnvelope) object Miss = Type.Missing; pPolygon = new PolygonClass(); IGeometryCollection pGeoColl = pPolygon as IGeometryCollection; pGeoColl.AddGeometry(pGeo, ref Miss, ref Miss); else if (pGeo is IPolygon) (pGeo as ITopologicalOperator).Simplify(); pPolygon = pGeo; else MessageBox.Show( 几何实体类型不匹配,提示 ,MessageBoxButtons.OK, MessageBoxIcon.Information); return; /获取透明要素层 IFeatureLayer pFlyr = null; for (int i = 0; i 0) IFeatureCursor pFCursor = pFC.Search(null, false); if (pFCursor != null) IFeature pFeature = pFCursor.NextFeature(); if (pFeature != null) while (pFeature != null) pFeature.Delete(); pFeature = pFCursor.NextFeature(); System.Runtime.InteropServices.Marshal.ReleaseComObject(pFCursor); /创建要素 IFeature pNFeature = pFC.CreateFeature(); pNFeature.Shape = pPolygon; pNFeature.set_Value(pFC.FindField(Code),1); pNFeature.Store(); pMapCtrl.Refresh(esriViewDrawPhase.esriViewGeography, pFlyr, pFlyr.AreaOfInterest); catch (Exception Err) MessageBox.Show(Err.Message, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information); CODE:/ / 获取查询要素 / / 要素图层 / 图形范围参数 / 符号条件要素集合 private List GetSeartchFeatures( IFeatureLayer pFeatureLayer,IGeometry pGeometry) try List pList = new List(); /创建SpatialFilter空间过滤器对象 ISpatialFilter pSpatialFilter = new SpatialFilterClass(); IQueryFilter pQueryFilter = pSpatialFilter as ISpatialFilter; /设置过滤器的Geometry pSpatialFilter.Geometry = pGeometry; /设置空间关系类型 pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; /获取FeatureCursor游标 IFeatureCursor pFeatureCursor = pFeatureLayer.Search(pQueryFilter, false); /遍历FeatureCursor IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) /获取要素对象 pList.Add(pFeature); pFeature = pFeatureCursor.NextFeature(); System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor); return pList; catch (Exception Err) MessageBox.Show(Err.Message, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information); return null; CODE:bool bSearch = false;/定义bool变量用于启动多边形查询功能 private void button1_Click(object sender, EventArgs e) try /向地图控件添加内存图层 IFeatureLayer pFeatureLayer = this.AddFeatureLayerByMemoryWS(this.axMapControl1,this.axMapControl1.SpatialReference); this.axMapControl1.AddLayer(pFeatureLayer); /设置鼠标样式为十字丝 this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;/启动范围查询功能 bSearch = true; 添加一个新的Form在Form上添加一个DataGridView控件用于显示查询结果信息。如图4所示:CODE:private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) if (bSearch) /设置鼠标样式为十字丝 this.axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair; /获取画定范围的Geometry IGeometry pGeometry = this.axMapControl1.TrackPolygon(); /添加半透名临时图形 this.AddTransTempEle(this.axMapControl1, pGeometry, false); IFeatureLayer pFeatureLayer=this.axMapControl1.get_Layer(1) as IFeatureLayer; /执行查询获取符号条件的要素 List pFList = this.GetSeartchFeatures(pFeatureLayer, pGeometry); attribute pAttribute = new attribute(); /设置信息显示窗体中DataGridView的属性 /设置行数pFList.Count+1包括字段名哪一行即表头 pAttribute.dataGridView1.RowCount = pFList.Count+1; /设置边界风格 pAttribute.dataGridView1.ColumnHeadersBorderStyle. = DataGridViewHeaderBorderStyle.Sunken; /设置列数 pAttribute.dataGridView1.ColumnCount = pFList0.Fields.FieldCount; /遍历第一个要素的字段用于给列头赋值(字段的名称) for(int m=0;mpFList0.Fields.FieldCount;m+) pAttribute.dataGridView1.Columnsm.HeaderText = pFList0.Fields.get_Field(m).AliasName; /遍历要素 for (int i = 0; i pFList.Count; i+) IFeature pFeature=pFList; for(int j=0;jpFeature.Fields.FieldCount;j+) /填充字段值 pAttribute.dataGridView1j, i.Value = pFeature.get_Value(j).ToString(); pAttribute.Show(); 5.7.3功能演示1.单击按钮向地图控件上添加一内存图层,并启动多边形查询功能如图5示: 2.点击鼠标左键在地图上画以多边形范围,双击结束,将看到在所画的范围以半透明的形式添加在地图之上,并显示出查询结果的属性信息如图所示:5.7.4 Demo总结:1.使用IWorkspaceFactory,IWorkspaceName,IName,IWorkspace等接口以及InMemoryWorkspaceFactoryClass对象创建在程序运行时的内存中的矢量要素层2.复习IUniqueValueRenderer等接口以及UniqueValueRendererClass对象唯一值符号化要素图层3.使用ILayerEffects接口创建半透明效果要素图层4.使用ISpatialFilter,IQueryFilter 等接口以及SpatialFilterClass对象获取符号条件的FeatureCursor,并学会通过遍历整个FeatureCursor中Feature对象,获取符号查询条件的Feature集合5.使用IFeatureLayerDefinition根据要素选择集创建新要素图层5.8附IFeatureClass.Search(IQuery Filter,bool Recycling)参数说明FeatureClass的Search方法大家经常用到,很多人对Search方法的其中一个参数bool Recycling不是很理解。先做以下解释:1.pFeatureCursor存储的是所有符合条件的Feature对象的引用,2.Recycling的意思是回收,参数Recycling为True的时当执行这个方法IFeature pFeature=pFeatureCursor.NextFeature()上一条记录的图形值在内存中所占的地址就会被销毁回收,为False的时候当执行这个方法IFeature pFeature=pFeatureCursor.NextFeature()上一条记录的图形值依然存在在内存中。1.参数Recycling设置
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 龙江物流面试题及答案
- 高考疫情测试题及答案
- java中垃圾回收面试题及答案
- 导图揭秘文言文难题
- 家电公司客户服务管理细则
- 贵州省贵阳市清镇北大培文学校2026届高三化学第一学期期末复习检测模拟试题含解析
- springboot教学管理自动化系统设计与实现
- 21.2.2解一元二次方程-公式法(第1课时)(教学课件)数学人教版九年级上册
- 保安队安全知识培训课件
- 保安灭火器知识培训课件
- 运用PDCA降低I类切口感染率模板课件
- 特种设备安全管理课件-电梯安全知识
- 车辆转让合同电子版下载可打印
- 深圳填海工程施工实施方案
- BB/T 0023-2017纸护角
- 建设集团有限公司安全生产管理制度汇编
- 行为习惯养成教育校本教材
- 疫苗运输温度记录表
- logopress3培训视频教程整套模具大纲
- DB32-T 2945-2016硬质合金刀具PVD涂层测试方法-(高清现行)
- TB∕T 3526-2018 机车车辆电气设备 接触器
评论
0/150
提交评论