gis二次开发第1课.ppt
《gis二次开发第1课.ppt》由会员分享,可在线阅读,更多相关《gis二次开发第1课.ppt(108页珍藏版)》请在三一办公上搜索。
1、GIS二次开发,主讲:张云鹏,学习基础,掌握GIS基本原理。掌握C+/C#程序设计语言。熟悉ArcGIS Desktop应用软件。掌握空间数据库基础知识,了解Geodatabase和ArcSDE。,教材与参考材料,基于ArcObjects与C#.NET的GIS应用开发,兰小机 等编著ArcGIS Engine开发从入门到精通,邱洪钢 等编著插件式GIS应用框架的设计与实现,蒋波涛 等编著ArcGIS 开发工具包,包括ArcGIS开发帮助、组件帮助、对象模型图和示例ESRI Developer Network:http:/,第一课 GIS二次开发基础,ArcGIS 产品体系ArcObjects基
2、础组件对象模型.NET组件与COM组件的互操作基于ArcGIS的开发方式ArcGIS Visual Studio IDE Integration FrameworkArcGIS开发资源,ArcGIS 产品体系,ArcGIS 产品体系,ArcGIS Desktop高级GIS应用程序的一个集成套件。ArcGIS Engine通过多种应用程序接口建立自定义应用程序的嵌入式GIS组件库。ArcGIS Server为企业和Web计算框架建立服务器端GIS应用程序的一个平台,可用于建立Web服务和Web应用程序。ArcIMS通过开放Internet协议发布地图、数据和元数据的GIS Web服务器。,Arc
3、Objects 与 ArcGIS Engine,ArcObjects(简称AO)是ESRI公司ArcGIS系列产品的基础。ArcObjecs是基于Microsoft COM技术所构建的GIS组件。ArcGIS Engine(简称AE)是ArcObjects的子集。,ArcObjects基础,ArcObjects是一套庞大的COM组件集合,ArcGIS 各版本各种COM类型统计见下表。,ArcObjects基础,为了更好地管理ArcObjects中数目众多的COM对象,ESRI将它们放置在不同的组件库中,对于.NET 来说,一个组件库就是一个assembly(程序集),一个assembly有多个
4、不同的命名空间。如ESRI.ArcGIS.ADF Assembly 的Namespaces:ESRI.ArcGIS.ADF,ESRI.ArcGIS.ADF.BaseClasses,ESRI.ArcGIS.ADF.CATIDs,ESRI.ArcGIS.ADF.COMSupport,ESRI.ArcGIS.ADF.Resources 组件库是对一个或多个COM组件中的类、接口、方法和类型的描述。所有的这些组件库组件都位于com文件夹中,而其真正的实现在bin文件夹的众多DLL文件中。,ArcObjects 10的组件库共65个(65assemblies),详细内容参见Learning ArcObj
5、ects、ArcObjects SDK API Reference如果不记得某个接口或对象属于哪个命名空间的时候,可以通过开发帮助查找。,ArcObjects基础,ArcGIS Engine组件,基本服务由核心ArcObjects构成,几乎所有GIS应用程序都需要,如要素几何体和显示。,数据存取用于对栅格和矢量格式进行存取,包括强大而灵活的地理数据库。,地图表达用于创建和显示带有符号体系和标注功能的ArcObjects,及包括创建自定义的专题制图功能的ArcObjects。,开发组件用于快速应用程序开发的高级用户接口控件和用于高效开发的一个综合帮助系统。,运行时选项运行时可以与标准功能或其他高
6、级功能一起部署。,ArcGIS Engine组件,理解对象模型图,ESRI提供多种方法让用户了解ArcObjects组件及组件之间的关系。对象浏览器(ESRI Object Browser)ESRI提供的一系列OMD的PDF文件开发帮助通过阅读ArcObjects的对象模型图(Object Model Diagram,OMD),可以快速了解ArcObjects的结构和不同组件之间的关系。OMD是基于UML(Unified Modeling Language,统一建模语言)基础上的,它补充了在对象浏览器中看不到的信息。OMD好比城市的道路图,可以帮助程序员来了解类之间的关系,如何从一个类到另一个
7、类,选择正确的接口,获取需要的属性和方法等。,理解对象模型图,ESRI提供了多种方法让用户了解ArcObjects组件及不同组件之间的关系ESRI提供的一系列OMD的PDF文件开发帮助、API ReferenceVS.NET中的对象浏览器,VS 中的对象浏览器,ArcObjects的对象模型(OMD),FeatureLayer,Map,MxDocument,Application,ArcMap,*,*,Layer,FeatureDataset,*,Geodatabase,FeatureClass,Table,DataSet,0.1,Map Layer,类与对象,在ArcObjects中存在三种
8、类型的类抽象类(Abstract Class)组件类(CoClass)普通类(Class)抽象类不能用于产生一个新的对象,但是可以用于定义一个子类。组件类是一个可以直接用new创建对象实例的类,它的实例对象不依赖其他对象的存在而存在,其生存周期也不用其他的对象管理。普通类不能够直接产生一个对象,但它可以用其他的普通类或组件类的方法产生,而不是使用new关键字来完成。,类与对象,ArcObjects的类之间存在四种关系依赖关系关联关系组合关系类型继承,对象模型示例,什么是组件对象模型,软件重用和开发效率始终是软件开发的核心问题。在早期(面向过程语言),人们为了重用,将一些基本的数学计算函数和界面
9、设计函数设计成函数库,让其他软件开发人员调用。它为应用开发者提供了方便,但是重用的粒度太小。面向对象语言的出现,提高编程的粒度。面向对象语言的基本单位是类,它封装了数据成员和函数成员,将最小组件的粒度提高了一个等级。但是,一个类提供很多种方法和属性,使用和管理很不方便。COM技术(接口)的出现,解决了以上问题,将类的内部属性和方法进行分类。例如在Map类中有好几个接口,在这些接口中定义不同功能组的方法和属性,Map实现了这些接口,这样就可以使用接口进行定义。,什么是组件对象模型,组件技术标准有COM、JavaBean和CORBA,但微软提出的COM使用最为广泛。微软的COM模型是一种二进制标准
10、,它允许任意两个组件按照一定规则互相通信。COM(Component Object Model)的核心是接口(Interface)。接口是一种用来定义程序的协定。实现接口的类要与接口的定义严格一致。接口可以继承多个父接口,而类可以实现多个接口,一个接口也可以被多个类实现。接口可以包含方法、属性、事件和索引器。,COM知识要点,COM是一种二进制级别的组件通信标准。它告诉组件之间该如何通信、一个COM对象之间的不同接口如何查询等。COM对象也是基于面向对象标准的。COM对象能够以DLL或者EXE文件形式存在,它包含着接口的具体实现。使用者可以通过接口来获取它内部的方法、属性。COM对象的接口一旦
11、被公布,就不能再修改。COM对象必须实现IUnknown接口,它负责管理COM对象生命周期并在运行时刻提供类型查询,当COM对象不使用的时候,是这个接口定义的方法负责释放内存。,COM知识要点,QI(Query Interface),即所谓查询接口由于一个COM对象有很多个接口,不同的接口管理着COM的不同类型的方法、属性,因此从一个接口可以使用的属性方法转到另一个接口可以使用的属性方法的过程称为QI。这个过程也是由IUnknown接口管理的。IMap pMap;IActiveView pActiveView;pMap=axMapControl1.Map;/获取控件中的地图 pActiveVi
12、ew=pMap as IActiveView;/QI(或者 pActiveView=(IActiveView)pMap;),COM知识要点,每个组件都有一个独一无二的标识GUID。接口的GUID称为IID,而组件类的GUID称为CLSID。CLSID还有一个文本别名,即所谓的ProgID,它是一个由项目名加组件类类名组成的字符串。一个COM对象可以有多个接口,一个接口也可以被多个COM对象实现。接口分为两种,即内向接口和外向接口。内向接口(Inbound Interface)是组织COM对象相关的方法和属性,COM对象必须实现所有的接口内容;外向接口(Outbound Interface)是用
13、于组织COM对象相关的事件,开发人员根据需要实现事件接口。,COM知识要点,接口可以从多个父接口继承接口继承机制非常有用,在很多时候程序员可以将一个子接口类型的对象定义为父接口类型的对象,从而实现一般化的操作,如:Private void CreateGeometry(IPolygon pPolygon)Private void CreateGeometry(IGeometry pPolygon)COM对象的接口一旦被公布,就不能再修改,但可以增加新接口,在ArcObjects中有很多以“2”、“3”结尾的接口,都是这样发展的产物。COM组件必须被注册后才能使用。,COM知识要点,COM的缺陷
14、由于COM对象可以被重用,这样多个程序可能共用一个COM对象,如果这个COM组件升级了,就很可能出现其中某个程序无法使用新组件,导致程序不能运行的情况,这种情况称为“DLL HELL”(DLL灾难)。.NET的解决方案在.Net产生前,使用唯一的Guid来标识每一个COM组件,为了运行COM组件就必须在组册表中对其进行注册。多个应用程序可以共享相同的COM组件,当COM组件版本升级时,可能导致原来引用此COM组件的程序不能正确运行。在.Net中,微软引入了的解决方案:强命名程序集(Strong Name),以及与之配套的全局程序集缓存(GAC-Global Assembly Cache)来解决
15、这个问题。,.NET组件与COM组件的互操作,COM包装(COM Wrappers),为了实现传统的COM程序与.NET程序之间的相互调用,.NET提供了两个包装类:运行时可调用包装(runtime callable wrapper,RCW)和COM可调用包装(COM callable wrapper,CCW)。每当一个.NET客户程序调用一个COM对象的方法时就会创建一个RCW对象;相反,每当一个COM客户程序调用一个.NET对象的方法时就会创建一个CCW对象。,COM包装(COM Wrappers),COM包装(COM Wrappers),ESRI提供的Primary Interop As
16、semblies,Primary interop assemblies(PIAs,主互操作程序集)是COM软件厂商提供的为其COM组件在.NET环境下运行的互操作程序集,PIAs暴露COM组件中的所有类、接口和常量,作为.NET 托管类。ESRI为所有的ArcObjects类型库提供了PIAs,ArcGIS的.NET开发人员只能使用这些安装在GAC(Global Assembly Cache,缺省安装目录为C:WINDOWSassembly)下的PIAs。这些PIAs的公钥标记(public key)为8FC3CC631E44AD86。,向COM公开.NET对象,注册.NET组件定制.NET组
17、件来扩展ArcGIS桌面应用程序,需要在COM注册表中注册.NET组件,并将.NET的程序集(assemblies)输出为COM的类型库(tlb),这一工作可以通过以下2个途径:使用.NET Framework提供的程序集注册工具(Regasm.exe)regasm PATH*.dll/tlb:*tlb使用Visual Studio.NET开发环境(Register for COM Interop)在COM组件类目中注册.NET类大部分定制的ArcGIS组件必须注册到适合的COM组件类目中才能正常使用,这一工作可以通过以下2个途径:通过ArcGIS的Customize对话框直接添加TLB文件。
18、使用组件类目管理工具Component Catesories Manager(Categories.exe)使用COM注册函数(COMRegisterFunction),在Visual Studio.NET开发环境中,通过下列步骤来来自动完成.NET组件的注册:在“解决方案资源管理器”中,鼠标右键点击要注册的项目(即正在开发的.NET组件),然后点击“属性”;在项目“属性页”对话框中,点击“生成”,在右边的窗格中,选中“为COM Interop注册”,点击“确定”按钮,即可完成.NET组件的自动注册。,(a)注册.NET组件,(b)在COM组件类目中注册.NET类,大量的ArcGIS扩展都依赖
19、COM组件类目。事实上,大部分定制的ArcGIS组件必须注册到合适的COM组件类目中才能正常使用。例如:所有的ArcMap命令和工具必须注册到“ESRI Mx Commands”组件类目中。可以通过下列途径将.Net 类注册到COM组件类目中。自定义对话框组件类目管理工具使用COM注册函数(COMRegisterFunction),自定义对话框,在.NET环境下自定义的ArcGIS命令和工具可以通过ArcGIS的Customize对话框中的Add From File按钮快速地添加到工具条中。在这种情况下,只需要简单地浏览一下TLB并打开它。ArcGIS框架会自动地将从类型库中选中的类添加到合适
20、的组件类目中。,组件类目管理工具,使用Component Catesories Manager(Categories.exe),浏览类型库,并选择合适的类目。,使用COM注册函数(COMRegisterFunction),添加注册代码到.NET类中,这样每当注册.NET组件的时候,会在特定的组件类目中自动注册.NET类。.NET Framework类库中包含两个属性类(ComRegisterFunction和ComUnregisterFunction),它们允许用户指定方法注册或注销.NET类。在组件类目内注册一个组件类,需要程序员知道组件类目的唯一ID(CATID)。为了帮助程序员简化这一注
21、册过程,ESRI提供了utility程序集(ESRI.ArcGIS.ADF.dll),其中包含ESRI.ArcGIS.ADF.CATIDs名称空间,这个名称空间中包含代表ArcGIS组件类目的类,这些类知道组件类目的CATID,并提供两个静态方法(Register and Unregister)来添加或删除组件类。,Guid(d36096cd-4680-42d6-8e5a-8c88cf86170b)public sealed class PanTool:BaseTool#region Component Category RegistrationComRegisterFunction()sta
22、tic void Reg(string regKey)MxCommands.Register(regKey);ComUnregisterFunction()static void Unreg(string regKey)MxCommands.Unregister(regKey);#endregion.,示例:使用COM注册函数,COM到.NET的类型转换,命名空间:ESRI.AICGIS加上库名。例如Geometry库的命名空间是ESRI.ArcGIS.Geometry。所有类型通过它们的完整的命名空间和类型名识别。所有的COM组件类被转换成为托管类;托管类的类名为起初的类名加上“Class”
23、,例如,Point组件类的运行时可调用包装(RCW)为 PointClass,Map组件类的运行时可调用包装为MapClass.C中不支带参数的属性。ILayer pLayer=axMapControl1.get_Layer(0);在上例中带参数的Layer属性,在C#中是不支持的,所以改用get_Layer()方法。,基于ArcGIS的开发方式,ArcGIS桌面应用程序定制/扩展方式使用VBA/Python 脚本,定制/扩展ArcGIS桌面应用程序ArcGIS10后续版本不再支持VBA定制开发插件(add-in),定制/扩展ArcGIS 桌面应用程序ArcGIS10新推出的扩展桌面应用程序的
24、方式开发定制组件,扩展ArcGIS 桌面应用程序功能最强大的扩展ArcGIS桌面应用程序的方式ArcGIS Engine开发ArcGIS Server开发Mobile GIS开发,使用Pyhton脚本,Python 是一种免费的、跨平台的开源编程语言,它功能强大且简单易学,已经得到广泛的应用和支持。ESRI 已将 Python 完全纳入 ArcGIS,成为一种用于数据分析、数据转换、数据管理和地图自动化的语言。易于学习,非常适合初学者,也特别适合专家使用可伸缩程度高,适于大型项目或小型的一次性程序(称为脚本)可移植,跨平台可嵌入(使 ArcGIS 可脚本化)稳定成熟用户社区规模大,Python
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gis 二次开发

链接地址:https://www.31ppt.com/p-2775432.html