ArcGIS Engine基础开发教程5学习地图输出.docx
《ArcGIS Engine基础开发教程5学习地图输出.docx》由会员分享,可在线阅读,更多相关《ArcGIS Engine基础开发教程5学习地图输出.docx(25页珍藏版)》请在冰豆网上搜索。
![ArcGIS Engine基础开发教程5学习地图输出.docx](https://file1.bdocx.com/fileroot1/2022-12/15/0feaeea6-78a2-4db6-a6ee-5bbb22b93809/0feaeea6-78a2-4db6-a6ee-5bbb22b938091.gif)
ArcGISEngine基础开发教程5学习地图输出
ArcGISEngine基础开发教程(5)——学习地图查询
地图查询
地图查询、统计是一个GIS系统的基本的功能模块,实际上统计功能的前提也是通过查询获取结果以文字或者图表等报表的形式展现查询结果数据。
地图查询有两种类型的查询:
1.空间查询:
在地图上设置一定范围,查询这一范围内的要素。
例如在地图上画一范围查询这一区域内的所有消防栓,这一范围的所有消防栓高亮显示(或者其他显示方式)并展现出所有的消防栓的属性信息。
2.属性查询:
通过一定的查询条件获取目标要素。
例如我们需要查询中国行政区上人口大于5000万,同时GDP大于1万亿的省份,通过执行查询,符号条件的省份高亮显示(或者其他显示方式)并展现出这些省份的属性信息。
ArcGISEngine9.3为开发者提供了无需写代码即可进行查询功能的Identify工具,但是这个工具是一个通用的信息查询新工具。
而开发者通常需要自己开发一套符合自己业务需求更加灵活的查询功能模块,甚至一些功能不仅仅是查询信息,很多编辑编辑功能以及和业务相结合的功能开发都用到查询功能。
所以很有必要了解ArcGISEngine的查询机制。
5.1目标
1.熟悉Cursor,FeatureCursor对象,使用IFeatureCursor接口
2.熟悉QueryFilter,SpatialFilter对象使用IQueryFilter,ISpatialFilter接口
3.熟悉要素选择集SelectionSet对象,会使用IFeatureSelection,ISelectionSet接口
4.开发一个属性查询小功能Demo,获取符号查询条件的Feature,并IFeatureLayerDefinition接口创建一个新的要素图层加载到Mapcontrol上
5.开发一个空间多边形查询功能的小Demo,学会创建内存半透明图层用于显示选择范围
5.2准备工作
1.IDE:
VisualStudio2005/2008
2.ArcGISEngineDeveloperkit9.3
3.准备一份用于查询的的矢量数据(文章内有说明)
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接口,ArcGISEngine开发所对矢量图层实现查询功能都是实行IFeatureCursor。
5.4QueryFilter对象与SpatialFilter对象
在关系型数据库中,查询条件是通过SQL语句的Where子语句来完成的。
在ArcGISEngine中不能直接使用SQL语句,但ArcGISEngine提供了QueryFilter和SpatialFilter两个过滤器对象来配合完成查询条件的设置,从而查询到想要的数据。
QueryFilter过滤器主要用于对属性数据查询条件的设置,它主要实现IQueryFilter接口从而实现属性查询功能。
1.
2.IQueryFilterpQueryFilter=newQueryFilterClass();
3.
4.
5.//设置过滤器对象的属性
6.pQueryFilter.WhereClause="人口>10000000";
复制代码
SpatialFilter过滤器主要用于空间范围查询条件的设置,它主要实现ISpatialFilter(继承IQueryFilter接口)接口从而实现空间查询功能。
1.
2.ISpatialFilterpSpatialFilter=newSpatialFilterClass();
3.
4.
5.//设置空间过滤器的范围(多边形)
6.pSpatialFilter.Geometry=pGeometry;
7.
8.
9.//设置空间过滤器空间关系类型
10.pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;
复制代码
空间过滤器空间关系类型主要有以下几种类型如表一所示:
表1
空间过滤器空间关系类型
描述(A是待查询图形,B是过滤条件图形)
esriSpatialRelUndefined
未定义
esriSpatialRelIntersects
A与B图形相交
esriSpatialRelEnvelopeIntersects
A的Envelope和B的Envelope相交
esriSpatialRelIndexIntersects
A与B索引相交
esriSpatialRelTouches
A与B边界相接
esriSpatialRelOverlaps
A与B相叠加
esriSpatialRelCrosses
A与B相交(两条线相交于一点,一条线和一个面相交)
esriSpatialRelWithin
A在B内
esriSpatialRelContains
A包含B
esriSpatialRelRelation
A与B空间关联
5.5SelectionSet要素选择集对象
熟悉ArcGISDesktop使用的开发者一定会知道当在ArcMap中显示查询结果的时,所有的符号查询调教的要素都以蓝色高亮的形式显示在地图控件上,蓝色高亮显示表示高亮选中,这些高亮显示选中的要素对应一个要素选择集对象中。
通过IFeatureSelection的SelectionSet属性可以获取选择集,FeatureLayer对象实现了IFeatureSelection接口。
实现代码如下:
IFeatureLayerpFeatureLayer=this.axMapControl1.get_Layer(0)asIFeatureLayer;
//QI至IFeatureSelection
IFeatureSelectionpFeatureSelection=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所示:
下载(77.83KB)
2009-5-3122:
45
图1
下载(94.15KB)
2009-5-3122:
45
图2
下载(61.71KB)
2009-5-3122:
45
图3
代码片段如下:
1.
2.privatevoidbutton1_Click(objectsender,EventArgse)
3.{
4. IFeatureLayerpFeatureLayer=this.axMapControl1.get_Layer(0)asIFeatureLayer;
5. //QI到FeatureSelection
6. IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;
7.
8. //创建过滤器
9. IQueryFilterpQueryFilter=newQueryFilterClass();
10.
11. //设置过滤器对象的查询条件
12.pQueryFilter.WhereClause="人口>5000000";
13.//根据查询条件选择要素
14.pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
15.
16.//QI到ISelectionSet
17.ISelectionSetpSelectionSet=pFeatureSelection.SelectionSet;
18.
19.if(pSelectionSet.Count>0)
20.{
21.
22.IFeatureLayerDefinitionpFDefinition=pFeatureLayerasIFeatureLayerDefinition;
23.
24.//创建新图层
25.
26.IFeatureLayerpNewFeatureLayer=pFDefinition.CreateSelectionLayer("newlayerName",true,null,null);
27.pNewFeatureLayer.Name="查询结果城市";
28.axMapControl1.AddLayer(pNewFeatureLayerasILayer);
29. }
30.}
31.code]
32.
33.5.7空间查询实例
34.5.7.1目标
35. 实现多边形查询功能
36.5.7.2功能开发
37. 代码片段如下:
38.
39.引用的命名空间:
40.
41.[code]
42.usingSystem;
43.usingSystem.Drawing;
44.usingSystem.Collections;
45.usingSystem.ComponentModel;
46.usingSystem.Windows.Forms;
47.usingSystem.Data;
48.usingSystem.IO;
49.usingSystem.Runtime.InteropServices;
50.usingSystem.Collections.Generic;
51.usingESRI.ArcGIS.esriSystem;
52.usingESRI.ArcGIS.Carto;
53.usingESRI.ArcGIS.Controls;
54.usingESRI.ArcGIS.ADF;
55.usingESRI.ArcGIS.SystemUI;
56.usingESRI.ArcGIS.Display;
57.usingESRI.ArcGIS.Geodatabase;
58.usingESRI.ArcGIS.Geometry;
59.usingESRI.ArcGIS.DataSourcesGDB;
60.
61.
62.//////
63.在程序运行时的内存中创建矢量要素层,并加到地图控件最顶端
64.//////
65.地图控件
66.///IFeatureLayer新加的要素层
67.private IFeatureLayerAddFeatureLayerByMemoryWS(AxMapControlpMapCtrl,ISpatialReferencepSReference)
68.{
69. try
70. {
71. if(pMapCtrl==null)returnnull;
72.#region
73.创建新的内存工作空间
74.IWorkspaceFactorypWSF=newInMemoryWorkspaceFactoryClass();
75.IWorkspaceNamepWSName=pWSF.Create("","Temp",null,0);
76.
77.INamepName=(IName)pWSName;
78.IWorkspacepMemoryWS=(IWorkspace)pName.Open();
79.#endregion
80.
81.IFieldoField=newFieldClass();
82.IFieldsoFields=newFieldsClass();
83.IFieldsEditoFieldsEdit=null;
84.IFieldEditoFieldEdit=null;
85.IFeatureClassoFeatureClass=null;
86.IFeatureLayeroFeatureLayer=null;
87.try
88.{
89.FieldsEdit=oFieldsasIFieldsEdit;
90.oFieldEdit=oFieldasIFieldEdit;
91.oFieldEdit.Name_2="OBJECTID";
92.oFieldEdit.Type_2=esriFieldType.esriFieldTypeOID;
93.oFieldEdit.IsNullable_2=false;
94.oFieldEdit.Required_2=false;
95.oFieldsEdit.AddField(oField);
96.
97.oField=newFieldClass();
98.oFieldEdit=oFieldasIFieldEdit;
99.IGeometryDefpGeoDef=newGeometryDefClass();
100.IGeometryDefEditpGeoDefEdit=(IGeometryDefEdit)pGeoDef;
101.pGeoDefEdit.AvgNumPoints_2=5;
102.pGeoDefEdit.GeometryType_2=esriGeometryType.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.GeometryDef_2=pGeoDef;
110.oFieldEdit.IsNullable_2=true;
111.oFieldEdit.Required_2=true;
112.oFieldsEdit.AddField(oField);
113.
114.oField=newFieldClass();
115.oFieldEdit=oFieldasIFieldEdit;
116.oFieldEdit.Name_2="Code";
117.oFieldEdit.Type_2=esriFieldType.esriFieldTypeSmallInteger;
118.oFieldEdit.IsNullable_2=true;
119.oFieldsEdit.AddField(oField);
120.
121.//创建要素类
122.oFeatureClass=(pMemoryWSasIFeatureWorkspace).CreateFeatureClass("Temp",oFields,null,null,esriFeatureType.esriFTSimple,"SHAPE","");
123.oFeatureLayer=newFeatureLayerClass();
124.oFeatureLayer.Name="TransTemp";
125.oFeatureLayer.FeatureClass=oFeatureClass;
126.//创建唯一值符号化对象
127.IUniqueValueRendererpURender=newUniqueValueRendererClass();
128.pURender.FieldCount=1;
129.pURender.set_Field(0,"Code");
130.pURender.UseDefaultSymbol=false;
131.ISimpleFillSymbolpFillSym=newSimpleFillSymbolClass();
132.pFillSym.Style=esriSimpleFillStyle.esriSFSSolid;
133.//半透明颜色
134.IRgbColorpColor=newRgbColorClass();
135.pColor.Red=255;
136.pColor.Green=255;
137.pFillSym.Color=pColor;
138.pURender.AddValue("1","",pFillSymasISymbol);
139.pFillSym=newSimpleFillSymbolClass();
140.pFillSym.Style=esriSimpleFillStyle.esriSFSSolid;
141.//唯一值符号化内存图层
142.(oFeatureLayerasIGeoFeatureLayer).Renderer=pURenderasIFeatureRenderer;
143.ILayerEffectspLyrEffect=oFeatureLayerasILayerEffects;
144.//透明度
145.pLyrEffect.Transparency=80;
146.}
147.catch(ExceptionErr)
148.{
149. MessageBox.Show(Err.Message);
150.}
151.
152.
153.finally
154.{
155. try{
156.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.ReleaseComObject(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.catch
167.{
168.
169.
170.
171.}
172.GC.Collect();
173.}
174. returnoFeatureLayer;
175.}
176. catch(ExceptionErr)
177.{
178.MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);