1
ArcGIS Engine 类库介绍
进行ArcGIS Engine开发,离不开接口和类,在介绍ArcGIS Engine类库之前,做个铺垫,先简单介绍一下接口和类以及对象模型图的相关知识。
1.1 接口和类
什么是接口呢?在面向对象的编程中,都会接触到。我们知道面向对象有三大特性:封装,继承,多态,相信很多人在学习多态的时候会接触接口。接口可以用一句这样的话来描述“接口就是包含一系列不被实现的方法,而把这些方法的实现交给继承它的类”,可能有些晦涩,下面我们通过例子说明。下面定义一个接口IPeople。
interface IPeople
{
void gender();
}
我们发现IPeople接口中定义了gender方法,却没有实现该方法。也就是说,通过IPeople接口的gender方法,我们不知道它实现了什么功能。如果我们想知道gender方法实现了什么功能,那么就要看继承了IPeople接口的类。这里定义两个类,分别实现这个接口。
BoyClass类代码:
class BoyClass : IPeople
{
public void gender()
{
Console.WriteLine("I am a boy.");
}
}
GrilClass类代码:
class GrilClass : IPeople
{
public void gender()
{
Console.WriteLine("I am a gril.");
}
}
通过上面两个类,我们就知道这个方法的作用了。下面在主函数中分别调用这两个类,代码如下:
static void Main(string args)
{
IPeople Person; //声明接口变量
Person = new BoyClass(); //实例化,接口变量中存放对象的引用
Person.gender(); //调用BoyClass中的gender方法
Person = new GirlClass(); //实例化,接口变量中存放对象的引用
Person.gender(); //调用GirlClass中的gender方法
Console.ReadLine();
}
运行后,输出结果为:
1.2 接口查询(QI)
在COM中,接口中仅定义了方法,而继承该接口的类中实现了该方法。由于一个接口只能使用自己内部定义的方法,不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情。这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface)。通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。我定义了两个接口:
interface IFavoriteFood
{
void Food();
}
interface IVoice
{
void Voice();
}
然后定义了一个CatClass的类继承这两个接口,并实现这两个接口中的方法:
class CatClass : IFavoriteFood, IVoice
{
public void Food()
{
Console.WriteLine("我喜欢吃老鼠。");
}
public void Voice()
{
Console.WriteLine("喵,喵,喵...");
}
}
下面在主函数中调用,代码如下:
IVoice pVoice = new CatClass();
pVoice.Voice();//只能调用IVoice中定义的方法
IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;//指向同一个类的接口可以相互转化,也就是QI
pFavoriteFood.Food();//只能调用IFavoriteFood中定义的方法
Console.ReadLine();
输出结果:
1.3 对象模型图(OMD)
ArcGIS Engine可以供开发人员使用的对象有几千个,分别位于各个不同的类库中。这些对象之间存在着各种各样的关系,例如:继承,实例化等。ArcGIS提供了用来描述这些对象之间关系的对象模型图,这些对象模型图以UML的形式来展现,以pdf文档的形式随着ArcObjects SDK安装在本地目录下面(例如:C:\Program Files (x86)\ArcGIS\DeveloperKit10.3\Diagrams),每一个类库对于一个pdf文档,我们可以通过阅读这些UML模型图来了解这些对象之间的关系。下图是UML模型图的图例。
上图中有三个类,这三个类分别属于不同的类型:
AbstractClass——抽象类,不能实例化,也不能用new关键字创建对象。抽象类的成员一般都是部分实现或者根本不实现。OMD中符号为:二维的内部有阴影的矩形。
CoClass——组件类(可创建类),可直接使用new关键字创建对象。 OMD符号为:带阴影的3D矩形符号。
Class——普通类(可实例化类),不能直接使用new关键字创建对象,但是可以借助其它对象类的方法或属性获得实例。OMD中符号为:3D矩形内部没有阴影。
类之间的关系有四种:
Inheritance——继承;在图中的空心三角箭头表示是继承关系。
Composition——组成;在图中的菱形表示是组成关系。
Association——关联:在图中的线表示是关联关系。
instantiation——实例化;在图中的虚线箭头表示是实例化关系。
Properties——属性:哑铃状的图标,Read(左侧的实心哑铃)和write(右侧的实心哑铃);属性除了我们常说的类型,还有一种属性,这个属性本身就是一个对象,符号为空心的哑铃。
Methods——方法:指向左侧的箭头。
1.4 ArcGIS Engine 类库
ArcObjects组件库有4500多个对象可供开发人员调用, ArcGIS 10.3版本包含的类和接口个数汇总如下:
ArcGIS Engine开发中,为了更好的管理这些COM对象,ESRI将这些COM对象放在不同的组件库中,而它们被物理的放在bin目录下的dll中,而逻辑上被分散到不同的命名空间中,下面我们详细对一些类库进行介绍。
Version
Version库是ArcGIS 10新出来的一个类库,该类库包含了将独立应用程序绑定到特定的ArcGIS 系列产品的函数和方法。
System
System库是ArcGIS架构中最底层的一个库,它包含了一些被其他库使用的一些组件。
SystemUI
SystemUI库定义了一些在ArcGIS中被用户界面组件使用的类型。ICommand和ITool这样的接口就在这里定义。
Geometry
Geometry库包含了核心的几何对象,比如点,线,面等。定义和实现了空间参考的对象,包括投影和地理坐标系。
Display
Display库包含了支持在输出设备上显示图形的组件,屏幕显示,符号,颜色等都在这个库中定义。
Controls
Controls库包含了应用程序开发中用到的控件,包括在控件中使用的命令和工具。
Carto
Carto库包含了为数据显示服务的对象。PageLayout和Map对象在这个库中,以及支持各种数据类型的图层,渲染。
GeoDatabase
GeoDatabase库包含了所有相关数据组织的定义类型。要素,表,网络,TIN都在这个库中定义。
DataSourcesFile
DataSourcesFile库包含了为支持的矢量数据格式提供的工作空间工厂和工作空间。
DataSourcesGDB
DataSourcesGDB库包含了为存储在RDBMS中的矢量和栅格数据提供的工作空间工厂和工作空间。
3D Analyst
包含了数据的3D分析对象,也包括显示3D数据,在这个库中有一个控件SceneControl可用。
GlobeCore
包含了globe数据分析的对象,也包含了显示globe数据,在这个库中有一个控件GlobeControl可用。
介绍完这些,让我们有个感性上的认识,在以后使用某个对象的时候,知道去哪个dll中找。
本教程各章节连接:
ArcGIS Engine入门教程_第一章_引言:
https://zhihu.geoscene.cn/?/article/532
ArcGIS Engine入门教程_第二章_类库介绍:
https://zhihu.geoscene.cn/?/article/533
ArcGIS Engine入门教程_第三章_软件安装:
https://zhihu.geoscene.cn/?/article/534
ArcGIS Engine入门教程_第四章_创建Engine应用程序:
https://zhihu.geoscene.cn/?/article/535
ArcGIS Engine入门教程_第五章_添加数据:
https://zhihu.geoscene.cn/?/article/536
ArcGIS Engine入门教程_第六章_实现右键菜单:
https://zhihu.geoscene.cn/?/article/537