1、ArcGIS Engine基础开发教程5学习地图输出ArcGIS Engine基础开发教程(5)学习地图查询 地图查询 地图查询、统计是一个GIS系统的基本的功能模块,实际上统计功能的前提也是通过查询获取结果以文字或者图表等报表的形式展现查询结果数据。地图查询有两种类型的查询:1.空间查询:在地图上设置一定范围,查询这一范围内的要素。例如在地图上画一范围查询这一区域内的所有消防栓,这一范围的所有消防栓高亮显示(或者其他显示方式)并展现出所有的消防栓的属性信息。2.属性查询:通过一定的查询条件获取目标要素。例如我们需要查询中国行政区上人口大于5000万,同时GDP大于1万亿的省份,通过执行查询,
2、符号条件的省份高亮显示(或者其他显示方式)并展现出这些省份的属性信息。ArcGIS Engine9.3为开发者提供了无需写代码即可进行查询功能的Identify工具,但是这个工具是一个通用的信息查询新工具。而开发者通常需要自己开发一套符合自己业务需求更加灵活的查询功能模块,甚至一些功能不仅仅是查询信息,很多编辑编辑功能以及和业务相结合的功能开发都用到查询功能。所以很有必要了解ArcGIS Engine的查询机制。5.1目标.熟悉Cursor,FeatureCursor对象,使用IFeatureCursor接口.熟悉QueryFilter, SpatialFilter对象使用IQueryFilt
3、er,ISpatialFilter接口.熟悉要素选择集SelectionSet对象,会使用IFeatureSelection,ISelectionSet接口.开发一个属性查询小功能Demo, 获取符号查询条件的Feature,并IFeatureLayerDefinition接口创建一个新的要素图层加载到Mapcontrol上.开发一个空间多边形查询功能的小Demo, 学会创建内存半透明图层用于显示选择范围5.2准备工作1.IDE:Visual Studio 2005/20082.ArcGIS Engine Developer kit 9.33.准备一份用于查询的的矢量数据(文章内有说明)5.3
4、Cursor对象Cursor(游标)本质上是一个指向数据的指针,本身并不包含数据内容,它是连接到Row对象或要素对象的桥梁。 游标有三种类型,即查询游标、插入游标和更新游标。每一种游标都是通过与之相适应的方法来获得的,如Search、Insert和Update方法。更新和插入游标都需要使用一个过滤器(Filter)对象,因为它们首先必须获得需要进行操作的要素。 Cursor对象支持的接口是ICursor,它定义了操作一个Row集合或一个Row对象的属性和方法,下面是获得插入型、更新型和查询型游标的方法: pCursor = IFeatureClass.Insert()使用IFeatureCla
5、ss的Insert方法返回一个插入型游标,它通常用于往表中插入一条记录。 pCursor = IFeatureClass.Update()使用IFeatureClass的Update方法会返回一个更新型游标,它用于更新或者删除一条记录。 pCursor= IFeatureClass.Search()使用IFeatureClass的Sarch方法对表进行查询后,可以得到一个查询型Cursor对象,它指向一个或多个Row对象。 以我们这章的内容主要使用查询游标。 FeatureCursor是Cursor的一个子类,指向一个或多个要素,它实现了IFeatureCursor接口,ArcGIS Engi
6、ne开发所对矢量图层实现查询功能都是实行IFeatureCursor。5.4QueryFilter对象与SpatialFilter对象 在关系型数据库中,查询条件是通过SQL语句的Where子语句来完成的。在ArcGIS Engine中不能直接使用SQL语句,但ArcGIS Engine提供了QueryFilter和SpatialFilter两个过滤器对象来配合完成查询条件的设置,从而查询到想要的数据。 QueryFilter过滤器主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口从而实现属性查询功能。1. 2. IQueryFilter pQueryFilter = n
7、ew QueryFilterClass();3. 4. 5. /设置过滤器对象的属性6. pQueryFilter.WhereClause = 人口 10000000;复制代码 SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter(继承 IQueryFilter接口)接口从而实现空间查询功能。1. 2. ISpatialFilter pSpatialFilter = new SpatialFilterClass();3. 4. 5. /设置空间过滤器的范围(多边形)6. pSpatialFilter.Geometry = pGeometry;7
8、. 8. 9. /设置空间过滤器空间关系类型10. pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;复制代码空间过滤器空间关系类型主要有以下几种类型如表一所示:表1空间过滤器空间关系类型描述(A是待查询图形,B是过滤条件图形)esriSpatialRelUndefined未定义esriSpatialRelIntersectsA与B图形相交esriSpatialRelEnvelopeIntersectsA的Envelope和B的Envelope相交esriSpatialRelIndexIntersects
9、A与B索引相交esriSpatialRelTouches与B边界相接esriSpatialRelOverlapsA与B相叠加esriSpatialRelCrossesA与B相交(两条线相交于一点,一条线和一个面相交)esriSpatialRelWithinA在B内esriSpatialRelContainsA包含BesriSpatialRelRelationA与B空间关联5.5SelectionSet要素选择集对象熟悉ArcGIS Desktop使用的开发者一定会知道当在ArcMap中显示查询结果的时,所有的符号查询调教的要素都以蓝色高亮的形式显示在地图控件上,蓝色高亮显示表示高亮选中,这些高
10、亮显示选中的要素对应一个要素选择集对象中。通过IFeatureSelection的SelectionSet属性可以获取选择集,FeatureLayer对象实现了IFeatureSelection接口。实现代码如下:IFeatureLayer pFeatureLayer = this.axMapControl1.get_Layer(0) as IFeatureLayer;/QI至IFeatureSelectionIFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection; /创建过滤器IQueryFilter
11、pQueryFilter = new QueryFilterClass(); /设置过滤器对象的查询条件pQueryFilter.WhereClause = 人口 10000000;/选择要素pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew,false); /获取选择集对象ISelectionSet pSelectinSet=pFeatureSelection.SelectionSet;/设置选择集的符号pFeatureSelection.Selection
12、Symbol = pSymbol;5.6属性查询实例5.6.1程序实现目标:查询人口大于5000000的城市,并把查询结果创建为一个新的图层,如图1-3所示: 下载 (77.83 KB)2009-5-31 22:45 图1下载 (94.15 KB)2009-5-31 22:45 图2下载 (61.71 KB)2009-5-31 22:45 图3代码片段如下:1. 2. private void button1_Click(object sender, EventArgs e)3. 4. IFeatureLayer pFeatureLayer = this.axMapControl1.get_L
13、ayer(0) as IFeatureLayer;5. /QI到FeatureSelection6. IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;7. 8. /创建过滤器9. IQueryFilter pQueryFilter = new QueryFilterClass();10. 11. /设置过滤器对象的查询条件12. pQueryFilter.WhereClause = 人口 5000000;13. /根据查询条件选择要素14. pFeatureSelection.SelectFeat
14、ures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);15. 16. /QI到ISelectionSet17. ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;18. 19. if (pSelectionSet.Count 0)20. 21. 22. IFeatureLayerDefinition pFDefinition = pFeatureLayer as IFeatureLayerDefinition;23. 24. /创
15、建新图层25. 26. IFeatureLayer pNewFeatureLayer = pFDefinition.CreateSelectionLayer(newlayerName, true, null, null);27. pNewFeatureLayer.Name = 查询结果城市;28. axMapControl1.AddLayer(pNewFeatureLayer as ILayer);29. 30. 31. code32. 33. 5.7空间查询实例34. 5.7.1目标35. 实现多边形查询功能36. 5.7.2功能开发37. 代码片段如下:38. 39. 引用的命名空间:40
16、. 41. code 42. using System;43. using System.Drawing;44. using System.Collections;45. using System.ComponentModel;46. using System.Windows.Forms;47. using System.Data;48. using System.IO;49. using System.Runtime.InteropServices;50. using System.Collections.Generic;51. using ESRI.ArcGIS.esriSystem;52
17、. using ESRI.ArcGIS.Carto;53. using ESRI.ArcGIS.Controls;54. using ESRI.ArcGIS.ADF;55. using ESRI.ArcGIS.SystemUI;56. using ESRI.ArcGIS.Display;57. using ESRI.ArcGIS.Geodatabase;58. using ESRI.ArcGIS.Geometry;59. using ESRI.ArcGIS.DataSourcesGDB;60. 61. 62. /63. 在程序运行时的内存中创建矢量要素层,并加到地图控件最顶端64. / /65
18、. 地图控件66. /IFeatureLayer 新加的要素层67. privateIFeatureLayer AddFeatureLayerByMemoryWS(AxMapControl pMapCtrl,ISpatialReference pSReference)68. 69. try70. 71. if (pMapCtrl = null) return null;72. #region73. 创建新的内存工作空间74. IWorkspaceFactory pWSF = new InMemoryWorkspaceFactoryClass();75. IWorkspaceName pWSNa
19、me = pWSF.Create(, Temp, null, 0);76. 77. IName pName = (IName)pWSName;78. IWorkspace pMemoryWS = (IWorkspace)pName.Open();79. #endregion80. 81. IField oField = new FieldClass();82. IFields oFields = new FieldsClass();83. IFieldsEdit oFieldsEdit = null;84. IFieldEdit oFieldEdit = null;85. IFeatureCl
20、ass oFeatureClass = null;86. IFeatureLayer oFeatureLayer = null;87. try88. 89. FieldsEdit = oFields as IFieldsEdit;90. oFieldEdit = oField as IFieldEdit;91. oFieldEdit.Name_2 = OBJECTID;92. oFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;93. oFieldEdit.IsNullable_2 = false;94. oFieldEdit.Required
21、_2 = false;95. oFieldsEdit.AddField(oField);96. 97. oField = new FieldClass();98. oFieldEdit = oField as IFieldEdit;99. IGeometryDef pGeoDef = new GeometryDefClass();100. IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;101. pGeoDefEdit.AvgNumPoints_2 = 5;102. pGeoDefEdit.GeometryType_2 = es
22、riGeometryType.esriGeometryPolygon;103. pGeoDefEdit.GridCount_2 = 1;104. pGeoDefEdit.HasM_2 = false;105. pGeoDefEdit.HasZ_2 = false;106. pGeoDefEdit.SpatialReference_2 = pSReference;107. oFieldEdit.Name_2 = SHAPE;108. oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;109. oFieldEdit.GeometryDe
23、f_2 = pGeoDef;110. oFieldEdit.IsNullable_2 = true;111. oFieldEdit.Required_2 = true;112. oFieldsEdit.AddField(oField);113. 114. oField = new FieldClass();115. oFieldEdit = oField as IFieldEdit;116. oFieldEdit.Name_2 = Code;117. oFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;118. oFieldE
24、dit.IsNullable_2 = true;119. oFieldsEdit.AddField(oField);120. 121. /创建要素类122. oFeatureClass = (pMemoryWS as IFeatureWorkspace).CreateFeatureClass(Temp, oFields, null, null, esriFeatureType.esriFTSimple, SHAPE, );123. oFeatureLayer = new FeatureLayerClass();124. oFeatureLayer.Name = TransTemp;125. o
25、FeatureLayer.FeatureClass = oFeatureClass;126. /创建唯一值符号化对象127. IUniqueValueRenderer pURender = new UniqueValueRendererClass();128. pURender.FieldCount = 1;129. pURender.set_Field(0, Code);130. pURender.UseDefaultSymbol = false;131. ISimpleFillSymbol pFillSym = new SimpleFillSymbolClass();132. pFillS
26、ym.Style = esriSimpleFillStyle.esriSFSSolid;133. /半透明颜色134. IRgbColor pColor = new RgbColorClass();135. pColor.Red = 255;136. pColor.Green = 255;137. pFillSym.Color = pColor;138. pURender.AddValue(1, , pFillSym as ISymbol);139. pFillSym = new SimpleFillSymbolClass();140. pFillSym.Style = esriSimpleF
27、illStyle.esriSFSSolid;141. /唯一值符号化内存图层142. (oFeatureLayer as IGeoFeatureLayer).Renderer = pURender as IFeatureRenderer;143. ILayerEffects pLyrEffect = oFeatureLayer as ILayerEffects;144. /透明度145. pLyrEffect.Transparency = 80;146. 147. catch(Exception Err)148. 149. MessageBox.Show(Err.Message);150. 1
28、51. 152. 153. finally154. 155. try156. ystem.Runtime.InteropServices.Marshal.ReleaseComObject(oField);157. System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields);158. System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit);159. System.Runtime.InteropServices.Marshal.ReleaseCom
29、Object(oFieldEdit);160. System.Runtime.InteropServices.Marshal.ReleaseComObject(pName);161. System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSF);162. System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSName);163. System.Runtime.InteropServices.Marshal.ReleaseComObject(pMemoryWS);164. System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass);165. 166. catch167. 168. 169. 170. 171. 172. GC.Collect();173. 174. return oFeatureLayer;175. 176. catch (Exception Err)177. 178. MessageBox.Show(Err.Message, 提示, MessageBoxButtons.OK, MessageBoxIcon.Information);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1