1、GISGIS设计与开发设计与开发草环学院农资系草环学院农资系 努尔麦麦提努尔麦麦提.艾尔肯艾尔肯 2014年年3月月第二章第二章GISGIS基本功能开发技术基本功能开发技术v主要内容主要内容lArcGISArcGIS开发平台介绍开发平台介绍lArcGIS EngineArcGIS Engine的组件的组件lGISGIS基本功能开发基本功能开发l信息检索功能的设计与实现信息检索功能的设计与实现1,ArcGIS 产品组成v四个关键部分:四个关键部分:ArcGIS DesktopArcGIS EngineArcGIS ServerArcIMSArcGIS第一节 ArcGIS 开发平台介绍v2.1.1
2、,ArcGIS简介1,ArcGIS 9产品组成第一节 ArcGIS 开发平台介绍2,ArcObjects与ArcGIS产品2,ArcObjects与ArcGIS产品3,ArcObjects组件库vArcObjects组件库有3000多个对象可供开发人员调用,其中有细粒度的小对象,例如:Geometry对象,也有粗粒度的大对象,例如:Map对象v可以通过ArcObjects来扩展ArcGIS Desktop,定制ArcGIS Engine应用,使用ArcGIS Server实现企业级GIS应用v采用ArcObjects可以在多种编程环境中开发,包括C+、支持COM的编程语言、.NET、Java等
3、3,ArcObjects组件库v可以应用ArcGIS Desktop SDK来扩展ArcGIS Desktop的功能,如添加新的工具、定制用户界面、增加新的扩展模块等,甚至对ArcGIS Desktop应用程序进行完全扩展以提高专业GIS生产能力vArcGIS Server实现了一套标准的Web GIS服务,支持企业级应用,可以建立集中式的GIS服务器来实现GIS功能,发布基于Web的GIS应用,执行分布式GIS运算等v2.1.2 ArcGIS的开发方式v1)VBA开发vVBA自动包含了ESRI对象库参考,用户可以编写并调试在ArcMap或ArcCatalog中使用的VB宏以及ESRI的对象库
4、,宏命令可以将VB的功能和GIS的功能集成起来。v可以使用ArcObjects的所有组;v其运行离不开ArcGIS系统框架;第一节 ArcGIS 开发平台介绍v2.1.2 ArcGIS的开发方式v2)插件开发v采用COM技术开发基于AE的标准DLLv3)基于COM的可执行应用程序开发第一节 ArcGIS 开发平台介绍v2.1.3 ArcGIS ArcGIS EngineEngine简介简介vArcGIS Engine是一个简单的、独立于应用程序的ArcObjects编程环境。其SDK提供了一系列嵌入式、应用于ArcGIS Desktop应用程序框架之外的ArcGIS组件。vArcGIS Eng
5、ine是开发人员用于建立自定义应用程序的嵌入式GIS组件的一个完整类库第一节 ArcGIS 开发平台介绍一,ArcGIS Engine的功能v 分图层显示专题图,如:道路,河流,行政边界等v 浏览、缩放地图v 查看地图上特征要素的信息v 在地图上显示文本注记v 在地图上叠加卫星影像或航摄影像v 在地图上绘制点、线、面几何体v 通过矩形、圆形或多边形选中地图上的要素v 通过SQL语句查找要素v 用各种渲染方式绘制图层,如分级渲染、柱状图渲染、点密度渲染、按比例尺渲染等v 动态绘制实时数据v 转换空间数据的坐标系v 编辑空间数据v 空间建模与分析二,ArcGIS Engine的组成v 基本服务-几
6、乎所有GIS应用程序都需要的GIS核心模块ArcObjects构成,如几何要素和显示v 数据存取-可以对栅格和矢量格式,包括Geodatabase进行数据的存取操作v 地图表达-创建和显示带有符号、注记的地图和专题图v 开发组件-快速开发应用程序的界面控件v 扩展模块-ArcGIS Engine运行时,可以与标准功能或其他高级功能一起部署ArcGIS Engine由一个软件开发工具包(由一个软件开发工具包(SDK)和)和一个运行时(一个运行时(Runtime)组成)组成二,ArcGIS Engine的组成vArcGIS Engine Developer KitArcGIS Engine Dev
7、eloper Kitv是一个基于组件的开发产品,主要面向开发人员,能与开发环境集成,提供了开发帮助、类库对象模型以及代码示例等vArcGIS Engine的另一个组件就是其运行时。在部署应用程序时,必须安装相应版本的ArcGIS Engine运行时二,ArcGIS Engine的组成vArcGIS Engine的授权文件*.ecp.ecp文件文件 授权文件控制用户可以使用哪些功能v例如:编辑空间数据 ArcGIS Engine开发包使得用户可以创建、修改或者删除在Geodatabase或者shapefile中的矢量要素。标准ArcGIS Engine Runtime可以编辑shapefile和
8、简单的Personal Geodatabase要素,若需要编辑Enterprise Geodatabase数据,则应使用Geodatabase Update扩展第二节,ArcGIS Engine的组件v一,ArcGIS Engine包含的主要控件:MapControlMapControl PageLayoutControlPageLayoutControl SceneControlSceneControl GlobeControlGlobeControl ToolbarControlToolbarControl TOCControlTOCControl SymbologyControlSymb
9、ologyControl LicenseControlLicenseControl ToolbarControlToolbarControl二,组件的加载v示例:如何使用MapControl,ToolbarControl,TOCControl如何向工具栏添加ArcGIS Engine内置的工具和命令三,MapControl控件vMapControl的功能 管理控件的外观、显示属性和地图属性 添加并管理控件中的数据层 装载Map文档(mxd)到控件中 从其他应用程序拖放数据到控件中 显示绘制图形v实现的主要接口 IMapControlDefault IMapControl2 IMapContro
10、l3 IMapControlEvents2(事件接口)三,MapControl控件vIMapControlDefault接口 该接口是地图控件的缺省接口,多数开发环境自动使用这个接口定义的属性、方法,这个接口也代表了控件最新版本的接口 如果需要使用这个接口,则用如下代码:IMapControlDefault pMapControl;pMapControl=axMapControl1.Object as IMapControlDefault;三,MapControl控件vIMapControl2接口 这个接口是任何一个与MapControl相关的任务的出发点,如设置控件外观,设置Map对象或控件
11、的显示属性,添加或者管理数据图层、地图文档,在控件上绘制图形和返回Geometry等 控制控件外观界面的属性:Appearance、BorderStyle、BackColor 方法:获取Geometry对象:TrackLine,TrackPolygon,TrackRectangle,TrackCircle 在控件上绘制图形:DrawShape,DrawText三,MapControl控件vIMapControl3接口 该接口继承于IMapControl2,增加了8个属性和1个方法 CustomProperty:设置自定义控件属性 DocumentFilename:返回MapControl装入的
12、地图文档的文件名 DocumentMap:返回MapControl最后装入的地图名称 KeyIntercept:返回或设置MapControl截取键盘按键的信息 Object:返回潜在的MapControl控件三,MapControl控件v当使用IMapControl2接口时:IMapControl2 pMapControl;pMapControl=axMapControl1.Object as IMapControl2;v或pMapControl=axMapControl1.GetOcx()as IMapControl2;三,MapControl控件vShowMapTips:确定是否显示地图
13、的Map TipsvTipDelay:设置Map Tips的延迟时间vTipStyle:设置Map Tips的显示样式vSuppressResizeDrawing():当控件尺寸发生变化时组织数据实时重绘三,MapControl控件vIMapControlEvents2接口事件接口,定义了MapControl能够处理的全部事件,如OnMouseDown,OnAfterDraw,OnMouseMove等,其他如OnAfterscreenDraw是绘屏结束后触发的事件,OnExtentUpdated是地图的Extent属性发生变化时触发的事件四,PageLayoutControl控件v1)Page
14、对象v-管理PageLayout对象中页面v2)SnapGrid对象v-用于摆放元素而设置的辅助点,便于使用者对齐元素v3)RulerSettings对象v-辅助尺v4)MapSurround对象五,ToolbarControl控件v主要用于提供操作地图对象的工具条,是一个集成多种控制地图操作的控件。vToolbarControl上添加工具v1)通过向导添加;v2)通过代码添加;五,ToolbarControl控件v主要接口:IToolbarControl,IToolbarControlDefaultIToolbarControlEventsvToolbarControl上可以驻留三类命令:v
15、1)实现了Icommand的单击命令;v2)实现了ICommand和ITool的命令工具;v3)实现了ICommand和IToolControl接口的工具控件,用户界面组件;六,TOCControl控件v 是一个集成图层控制操作的控件,一般是通过与其他几个地图显示控件相互关联一起工作。vSetBuddyControl(object obj)vTOCControl通过上述函数来关联其他控件。vstring strToolID=;vstrToolID=esriControlTools.ControlsMapZoomInTool;v this.axToolbarControl1.AddItem(st
16、rToolID,-1,-1,false,0,esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapZoomOutTool;vaxToolbarControl1.AddItem(strToolID,-1,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapZoomInFixedCommand;vaxToolbarControl1.AddItem(strToolID,-1,-1,false
17、,0,esriCommandStyles.esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapZoomOutFixedCommand;vaxToolbarControl1.AddItem(strToolID,-1,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapPanTool;vthis.axToolbarControl1.AddItem(strToolID,-1,-1,fals
18、e,0,esriCommandStyles.esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapFullExtentCommand;vaxToolbarControl1.AddItem(strToolID,-1,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapZoomToLastExtentBackCommand;vaxToolbarControl1.AddItem(strToo
19、lID,-1,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);vstrToolID=esriControlTools.ControlsMapZoomToLastExtentForwardCommand;v axToolbarControl1.AddItem(strToolID,-1,-1,false,0,esriCommandStyles.esriCommandStyleIconOnly);六,TOCControl控件v2.2.7控件之间的关联v1)通过向导关联v2)通过代码关联 第二节,ArcGIS Engine的组件七,控件之间
20、的关联v示例1:v1)通过向导关联七,控件之间的关联v示例2:v2)通过代码关联vSetBuddyControl(Object 被关联控件);第三节 GIS基本功能的设计开发v2.3.1图层的加载 在ArcEngine中需要使用MapControl来显示地理数据,用TOCControl进行图层操作。MapControl控件中可以添加各种常用数据格式,如:SHP、mdb、CAD数据、Coverage数据、TIN数据等。u Shapefile数据是一种比较常用的,而且是容易获得(从其他格式的数据转换而来)的文件数据格式。u Shapefile采用早期的dBase数据的管理模式,即以文件夹作为数据库
21、,文件夹下的文件组成了数据库中的表,对于Shapefile文件来说就是图层。u 一个Shapefile图层至少需要三个文件:*.SHP,*.SHX,*.DBF,它们分别用于存储空间数据、空间索引信息和属性数据。1 加载图层加载图层使用属性向MapControl中添加图层v 在窗体上添加MapControl控件成功后,在控件上点击右击查看其属性框。打开属性对话框的”Map”选项卡,点击 按钮可以任意加载几个图层。1 加载图层加载图层使用程序动态地添加图层 图层的常规加载方法首先向工程里添加如下引用:ESRI.ArcGIS.DataSourcesFile;ESRI.ArcGIS.GeoDataBa
22、se;ESRI.ArcGIS.Carto;1 加载图层加载图层打开图层的常用步骤:v1.创建一个类工厂v2.使用类工厂创建一个要使用的工作区v3.使用工作区打开并得到图层的datasetv4.把dataset装入到新建的图层实例v5.把图层加载到MapControl控件1 加载图层加载图层涉及的类和接口相关类说明vWorkSpace类WorkSpace类是一个包含空间数据集和非空间数据集的数据容器。根据数据集的物理存储形式可以分为三种类型:1)基于文件形式的FileSystemWorkspace2)基于本地数据库文件形式的LocalDatabaseWorkspace3)基于远程数据库管理系统(
23、RDBMS)并通过ArcSDE访问的RemoteDatabaseWorkspace1 加载图层加载图层vWorkSpaceFactory类WorkSpaceFactory是工作空间分配者,用户进行相应的属性设置并通过它来连接各种工作空间。从该类中派生出了很多其他的类,如用于连接本地shp格式数据的ShapeFileWorkspaceFactory,以及用于连接远程SDE数据的SdeWorkspaceFactory还有:RasterWorkspaceFactoryAccessWorkspaceFactoryCadWorkspaceFactoryArcinfoWorkspaceFactoryTin
24、WorkspaceFactory等。涉及的类和接口涉及的类和接口1 加载图层加载图层IWorkspaceFactory接口 该接口主要用于打开和创建工作空间,并提供Workspace的相关信息。该接口共提供了1种属性和11种方法。下面介绍其中两种方法。涉及的类和接口涉及的类和接口1 加载图层加载图层vOpen方法该方法通过连接属性打开工作空间,其形式为:IWorkspace Open(IPropertySet propSet,int hWnd);参数:propSet连接属性,IPropertySet对象。hWnd整型变量,一般为0。涉及的类和接口涉及的类和接口1 加载图层加载图层vOpenFr
25、omFile方法通过文件路径和名称打开指定的本地工作空间,其形式为:IWorkspace OpenFromFile(string fileName,int hWnd);参数:fileName表示所要打开工作空间的路径文件名称。hWnd整型变量,一般为0。涉及的类和接口涉及的类和接口1 加载图层加载图层vIPropertySet接口该接口提供了1种属性和7种方法来管理连接属性。常见属性和方法有:SetProperty方法该方法用于设置指定的连接属性值。GetProperty方法返回指定连接属性值。涉及的类和接口涉及的类和接口1 加载图层加载图层vIFeatureWorkspace:v提供创建和打
26、开各种数据集等有关的功能。vOpenFeatureClass:打开一个要素类,就是存在于FeatureWorkspace里面的一个FeatureClass涉及的类和接口涉及的类和接口1 加载图层加载图层v AddLayer:地图空间上添加指定图层。地图空间上添加指定图层。v用法:用法:AddLayer(pLayer)v pLayer:是一个图层对象是一个图层对象v AddLayerFromFile:将图层文件加载到地图控件上指定的将图层文件加载到地图控件上指定的位置。这里的位置是各图层在位置。这里的位置是各图层在Mapcontrol上的上的Index。v 用法:用法:v MapControl1
27、.AddLayerFromFile(C:TempmyLayer.lyr“,2);v“C:TempmyLayer.lyr“:图层文件路径名称图层文件路径名称;v 2:是在:是在MapControl上的图层的上的图层的显示指数显示指数;涉及的类和接口涉及的类和接口1 加载图层加载图层v IWorkspaceFactory wsf=new ShapefileWorkspaceFactory();v IWorkspace ws=wsf.OpenFromFile(E:博湖县表三移动,2);v IFeatureWorkspace fws=ws as IFeatureWorkspace;v IFeature
28、Class fc=fws.OpenFeatureClass(博湖县调查点.shp);v IFeatureLayer fl=new FeatureLayerClass();v fl.FeatureClass=fc;v ILayer lyr=fl as ILayer;v lyr.Name=fc.AliasName;v this.axMapControl1.Map.AddLayer(lyr);1 加载图层加载图层 v上面演示的是图层的常规加载方法,但是Shapefile作为一种应用非常广泛的地理数据格式,MapControl控件提供了更方便的加载方法,省去了建工作区、找数据集等步骤。可以用下面代码完
29、成:v object.AddShapeFile(Path,fileName)Map Control1.AddShapeFile(“F:Shapefile”,“县界.shp);参数:F:Shapefile:是包含要打开的shp文件的路径;县界.shp:是在上面的路径下shape文件的文件名。1 加载图层加载图层向MapControl中加载栅格数据u ArcEngine支持的栅格数据格式有:IMG,TIF,JPG,SID,BMP等1 加载图层加载图层v ArcEngine的功能既强大也很灵活,直接从文件创建Raster图层也是被支持的:using ESRI.ArcGIS.DataSourcesRa
30、ster;/创建栅格图层类v IRasterLayer rasterLayer=new RasterLayerClass();v /从路径创建栅格图层rasterLayer.CreateFromFilePath(“E:test县界.tif”);v/图层添加到地图控件this.axMapControl1.AddLayer(rasterLayer);1 加载图层加载图层向MapControl中加载CAD数据u DWG数据是GIS的一个重要数据源,ArcEngine对CAD数据支持得非常好。u下面示例程序加载文件”F:testdl.dwg”1 加载图层加载图层/设置workspace IWorksp
31、aceFactory pWorkspaceFact=new CadWorkspaceFactoryClass();/Open the Workspace IWorkspace pWorkspace;pWorkspace=pWorkspaceFact.OpenFromFile(d:test,0);/设置CadDrawingWorkspace ICadDrawingWorkspace pCadDwgWorkspace=(ICadDrawingWorkspace)pWorkspace;/Open the CadDrawingDataset ICadDrawingDataset pCadDwgData
32、set;pCadDwgDataset=pCadDwgWorkspace.OpenCadDrawingDataset(dl.dwg);/在Mapcontrol中打开图形if(pCadDwgDataset=null)return;ICadLayer pCadLayer=new CadLayerClass();pCadLayer.CadDrawingDataset=pCadDwgDataset;this.axMapControl2.AddLayer(pCadLayer,0);1 加载图层加载图层向MapControl中加载Coverage数据v Coverage数据的格式为”*.adf”示例给出加载
33、Coverage数据的一个方法:IWorkspaceFactory wf=new ArcInfoWorkspaceFactoryClass();IWorkspace ws=wf.OpenFromFile(d:testadfdata,0);IFeatureWorkspace fws=ws as IFeatureWorkspace;IFeatureClass fc=fws.OpenFeatureClass(w001001);IFeatureLayer flr=new FeatureLayerClass();flr.FeatureClass=fc;ILayer lyr=flr as ILayer;t
34、his.axMapControl1.AddLayer(lyr);1 加载图层加载图层向MapControl中加载TIN数据v 示例代码如下:IWorkspaceFactory pTinWSFactory;ITinWokspace pTinWS;ITinLayer pTinLyr;pTinWSFactory=new TinWorkspaceFactoryClass();pTinWS=pTinWSFactory.OpenFromFile(“F:TIN”,0);pTinLyr=new TinLayerClass();pTinLyr.Dataset=pTinWS.OpenTin(“地形”);pTinL
35、yr.Name=“地形”;axMapControl1.AddLayer(pTinLyr);1 加载图层加载图层图层的选择图层的选择u MapControl通过对图层进行索引来定位图层,如果想得到索引为2的图层(首先保证其存在),方法如下:layer=axMapControl1.get_layer(2);u但在程序开发中,我们不容易知道具体的图层索引号,因此用名称来获取图层比较合适,下面定义的函数可用名称来获得图层,代码如下:1 加载图层加载图层 调用以上函数可以获得相应的图层。v private ILayer GetLayerByName(AxMapControl mapCtrl,string
36、 lyrName)v v ILayer lyr=null;v for(int i=0;i mapCtrl.LayerCount;i+)v v if(mapCtrl.get_Layer(i).Name=lyrName)v lyr=mapCtrl.get_Layer(i);v elsev lyr=null;v v return lyr;v ILayer lyer=GetLayerByName(axMapControl1,”分市州”);Lyer.Visible=false;/隐藏分市州图层axMapControl1.Refresh();1 加载图层加载图层图层的卸载u 卸载指定图层:axMapCon
37、trol1.DeleteLayer(3);u 卸载所有图层:axMapControl1.ClearLayers();axMapControl1.Refresh();1 加载图层加载图层控制图层显示的范围v当MapControl中加载了很多图层之后,在缩放过程中,用户并不希望所有图层都显示,比如在浏览中国轮廓的时候,县级的行政区划就不必要再显示了,这样可以减小地图负载,使地图更清晰。v实现这个功能,具体的做法就是设置图层的可见比例尺范围,代码如下:axMapControl1.get_Layer(3).MaximumScale=500000;axMapControl1.get_Layer(3).M
38、inimumScale=1000000;axMapControl1.Refresh();1 加载图层加载图层第三节 GIS基本功能的设计开发v2.3.2鹰眼功能的实现ArcEngine实现鹰眼功能v下面给出一个简单鹰眼模块示例。关于鹰眼的实现方式,最常用的是用一个 MapControl 控件显示地图全图,并在上面画一个红色矩形框表示当前地图的显示范围,并实现鹰眼 MapControl 与主窗体的 MapControl 互动。1、添加鹰眼控件、添加鹰眼控件 2、鹰眼的实现、鹰眼的实现 当地图载入到主 Map 控件时,同时也载入到鹰眼控件,代码如下:鹰眼功能的实现ArcEngine实现鹰眼功能v1
39、、添加鹰眼控件、添加鹰眼控件鹰眼功能的实现数据的同步加载OnMapReplacedv private void axMapControl2_OnMapReplaced(object sender,IMapControlEvents2_OnMapReplacedEvent e)v v IMap pMap=this.axMapControl2.Map;v for(int i=0;i 添加一个属性表窗体。二,图层属性表显示2 为属性表窗体添加DataGridView控件,并修改控件Anchor属性为(Top,Bottom,Left,Right)。二,图层属性表显示 3 为属性表窗体编写相关代码,实现
40、图层属性信息往属性表中的添加。(构造函数和析构函数)public partial class TableForm:Form private ILayer layer;public TableForm(ILayer lyr)/对属性表窗口进行初始化 InitializeComponent();layer=lyr;this.Text=+layer.Name+属性表;二,图层属性表显示 ITable 接口 提供操作属性表有关的方法和属性。获取方法:ILayer as Itable(ITable)ILayer 二,图层属性表显示 IField 接口 提供操作属性表字段有关的方法和属性。获取方法:tab
41、le.Fields.get_Field(index);IFeature.Fields.get_Field(index)过滤IFeatureCursor.FindField(name);过滤IFeatureCursor.Fields.get_Field(index)二,图层属性表显示 private void TableForm_Load(object sender,EventArgs e)try ITable lyrtable=(ITable)layer;DataTable table=new DataTable();IField field;for(int i=0;i lyrtable.Fi
42、elds.FieldCount;i+)field=lyrtable.Fields.get_Field(i);table.Columns.Add(field.Name);object values=new objectlyrtable.Fields.FieldCount;IQueryFilter queryFilter=new QueryFilterClass();ICursor cursor=lyrtable.Search(queryFilter,true);IRow row;二,图层属性表显示 while(row=cursor.NextRow()!=null)for(int j=0;j ly
43、rtable.Fields.FieldCount;j+)object ob=row.get_Value(j);valuesj=ob;table.Rows.Add(values);this.dataGridView1.DataSource=table;catch(Exception e1)MessageBox.Show(无法显示属性表!);this.Close();二,图层属性表显示v步骤4:建立图层控制菜单与属性表的连接,实现属性表界面的显示。双击图层控制菜单上的“显示属性表”菜单项,在响应的Click事件中添加如下代码:private void menuItemShowTb_Click(object sender,EventArgs e)TableForm tbfrm=new TableForm(layer);tbfrm.Show();二,图层属性表显示v步骤5:运行程序,查看图层属性。二,图层属性表显示