收藏 分享(赏)

二次开发初级培训班培训讲义.doc

上传人:精品资料 文档编号:10900885 上传时间:2020-01-19 格式:DOC 页数:50 大小:1.27MB
下载 相关 举报
二次开发初级培训班培训讲义.doc_第1页
第1页 / 共50页
二次开发初级培训班培训讲义.doc_第2页
第2页 / 共50页
二次开发初级培训班培训讲义.doc_第3页
第3页 / 共50页
二次开发初级培训班培训讲义.doc_第4页
第4页 / 共50页
二次开发初级培训班培训讲义.doc_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、第一讲 基于 WINDOWS 编程的基础知识1.引言11 过程化(procedural programming):程序被认为是在一个数据集合上进行的一系列操作。12 结构化(structured programming):主要思想是:功能分解并逐步求精。13 面向对象的程序设计(object_oriented programming)实质是把数据和处理这些数据的过程合并为一个单独的“对象”一个具有确定特性的自完备的实体。14 对象的程序设计的特征1) 自完备(self_contained):能够完全实现一些严格定义的功能。2) 封装3) 继承4) 多态2. 类与数据封装21 什么是类?简单的说

2、,类就是一种用户定义的数据类型,跟结构类似;并且,类具有自己的成员变量和成员函数(方法) ,通过它们可以对类自身进行操作。如:汽车可以看作是发动机、车轮、座椅等诸如此类的集合。也可以从功能的角度来研究,譬如,能移动,加速,减速,刹车等。定义(例子)VC+中讲解22 封装(encapsulation)定义:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。封装的优点: 封装允许类的客户不必关心类的工作机理就可以使用它。就象驾驶员不必了解发动机的工作原理就可以驾驶汽车一样,类的客户在使用一个类时也不必了解它是如何工作的,而只需了解它的功能即可。 所有对数据的访问和操作都必须通过特定的

3、方法,否则便无法使用,从而达到数据隐藏的目的。23 对象对象就是类的一个实例。类与对象的关系就如类型和变量的关系,所有对类的操作都必须通过对象来实现。当一个类定义了多个对象时,每个对象拥有各自的成员数据。24 类的三种成员类型 私有成员(private):缺省情况下,一个类中的所有成员都是私有的。私有成员只能被类本身的成员函数访问。并且不具有继承性。 公有成员(public):公有成员可以被类成员函数和外部函数使用。 保护成员(protected):在介绍继承时再介绍。25 构造函数与析构函数1)构造函数 是特殊的成员函数;在创建对象时首先由系统自动调用。它的作用是为新创建的对象分配空间,或为

4、该对象的数据成员赋值等。 构造函数的名称必须与其类名称完全相同,并且不允许有返回值。2)析构函数 析构函数是构造函数的逆操作。 析构函数在类名之前加来命名,它不允许有返回值,也不允许带参数,并且一个类只能有一个析构函数。26 简单介绍1)const 用法 const 变量:const int i = 5;i = 10; / Errori+; / Errorconst 型成员函数 Void SomeFunction() const ; 此方法不能改变类中的任何成员。当成员函数不改变对象的属性时,就应当把它说明为 CONST 型函数。这可以使编译程序帮助查错,比程序员亲自查错要快得多,而且开销更少

5、。错误的类型:语法错、编译错、链接错、运行错、逻辑错2)类静态成员静态成员变量被一个类所有的实例所共享。静态变量使用固定地址存放,而不使用对象。定义:在变量或函数前加关键字 static即可。例:class counter static long t1;static GetValue1() return t1; 它属于类而不属于对象。调用时,使用类范围运算符;counter:t1 = 1;counter:GetValue1();静态成员函数没有 this指针,因此不能被说明为 const类型。以因为其它的函数在访问成员变量时需要使用 this指针,所以静态成员函数不能访问任何非静态成员变量。3

6、)类的友员 使用友员函数或友员类的成员函数可以访问类的私有成员。但友员函数不属于类的成员函数。友员函数的定义:在类的任何地方定义,只须在函数前加上关键字 friend即可;例:class FriendFunfriend void Display(FriendFun*);char *name; int age;public:FriendFun(char* str, int i)name = str;age = i;void Display(FriendFun * a) cout name age CanFly();pInc = rtn = pInc-CanFly();53 虚拟函数与重载函数的区

7、别1)形式上,重载函数要求有相同的返回值类型和函数名,并有不同的参数序列;而虚拟函数要求三者完全相同。2)重载函数可以是成员函数或非成员函数;而虚拟函数必须是成员函数。3)调用方法上,重载函数根据所传递的参数序列的差别作为调用的依据;而虚拟函数则根据调用对象的不同而去调用不同类的函数。4)虚拟函数在运行时表现出多态功能;而重载函数不具有这一功能。54 虚拟函数的数据封装虚拟成员函数的存取要看首次定义它的类中,该函数是 public or private。纯虚函数定义:virtual type funcname(parameter)=0;C+中有时设计基类就是为了被继承,而基类中的虚拟函数不做任

8、何工作,这种情况下可以将基类中的虚拟函数定义为纯虚函数。包含纯需函数的类叫抽象类。抽象类不能定义对象,但可以定义一指向它的指针。55 虚拟基类虚拟基类的定义,及解决的问题例:class B : virtual public A;class C : virtual public A;class D : public B, public C;56 虚拟基类的构造函数调用在含虚拟基类的多层继承关系中,虚拟基类的构造函数调用由最远的派生类负责。6. 内存管理61 指针1)采用安全的编程风格,对指针进行初始化。2)NEW(调用构造函数)和 DELETE(会调用析构函数)3)每次使用关键字 NEW申请分配

9、内存时,必须检查并确认返回的指针不为空。 堆中 4)当使用 DELETE删除一个指针时,实际上是释放它所指向的内存空间。这相当于把此指针指向的内存空间交还给自由存储区。而这个指针本身还存在,可以再次对它赋值。注意:当对一个指针使用 DELETE时,它所指向的内存被释放。如果再次对它使用DELETE,有可能使程序崩溃。所以,当用 DELETE删除一个指针后,应把它置为 0(空指针)。而删除一个空指针是安全的。62 内存泄露的原因1)调用 new操作符在堆上分配了一段内存,而没有调用 delete操作符删除它;2)改变了保存在一个变量中的指针的值,因而没能删除指针所指向的内存区;3)带有指针类型成

10、员变量的类,当 new操作符分配了该指针,没有复制构造函数、赋值运算符或析构函数。 /?例:class A public: int *pi;A:A() pi = new int();*pi = 3;A first;A second;second = first;63 栈和自由存储区(堆) 通常程序员要管理内存中以下五个区域)全局变量区)自由存储区)寄存器)代码区)栈其中局部变量和函数形参位于栈中,代码位于代码区,全局变量在全局变量区,而寄存器被用于进行一些内部处理,如保存栈顶指针和指令指针等。所有剩余的内存空间都被作为自由存储区, 有时也被称为堆第二讲 编程工具 VC1熟悉 VC 开发环境11

11、 VC 向导提供的帮助;以前 Windows 编程需要程序员编写大量的框架代码,这对初学者来说简直就是一个噩梦;并且这些框架代码基本相同,因此 Microsoft 提供了向导 AppWizard 帮助生成框架代码,这极大的方便了我们编写程序12 VC 向导可以生成的工程类型ATL COM AppWizardCustom AppWizardDatabase ProjectISAPI Extension WizardMakefileMFC ActiveX ControWizardMFC AppWizard (DLL)MFC Database WizardWin32 ApplicationWin32

12、 Console ApplicationWin32 DLLWin32 Static Library13 如何获取帮助?14 建立第一个应用程序;使用向导 AppWizard 生成典型的应用程序基于多文档的可执行程序15 理解 AppWizard 代码2消息与命令21 消息 消息是 Windows编程不同于其它编程方式的地方,如 DOS环境下编程。消息就是操作系统通知应用程序某事已发生的一种方式,如:用户已输入、已单击或移动鼠标、打印机已空暇等。22 消息传递 尽管操作系统用整数来引用消息,但所有消息都通过它们的名字来引用。一个巨大的#define 语句将消息名同数值联系起来。不同消息由操作系统

13、或应用程序的不同部分处理。如,当用户在窗口上移动鼠标时,窗口得到一个 WM_MOUSEMOVE消息,它几乎全部传送给操作系统去处理。 MFC允许程序员忽略底层消息,并使得在单独类级别上声明每个类处理哪些消息更容易23 消息循环 任何 windows 程序的核心是消息循环,这通常包含 在 WinMain() 例程中。 MFC 通过消息映射来保持消息处理函数与消息处理信息的一致。 24 消息映射 消息映射是进行 windows 编程的一部分 MFC 方法,用来代替编写向用户的WinProc() 发送消息的 WinMain() 函数,及编写检查消息类型的 WinProc() 函数。用户只需编写处理消

14、息的函数,并且在用户的类中增加一个消息映射即可,其它一切由 MFC 处理。 25 消息映射宏 在类声明的结尾部分,使用宏 DECLARE_MESSAGE_MAP来声明在类定义部分需要消息映射。在*.CPP 文件中使用宏 BEGIN_MESSAGE_MAP和END_MESSAGE_MAP来声明消息映射,在两个宏之间声明消息的映射函数。26 常用消息映射宏 ON_COMMAND 用于将特定命令的处理委派给类的一个成员函数。 ON_MESSAGE 用于将用户自定义消息的处理委派给类的一个成员函数。 27 ClassWizard 帮助用户捕获消息28 添加 windows 消息处理函数对话框29 命令

15、 命令是一种特殊的消息类型。用户在任何时候选择一个菜单项,单击一个按钮或告诉系统做什么,windows 都将产生一个命令。 ClassWizard 可帮助用户捕获命令。 3基本控件对话框与基本控件例子 SDIWindows 常用控件 MFC 对应的类按钮控件 CButton编辑框控件 Cedit复选框控件 CCheck列表框控件 CListBox进度条控件(Progress bar) CProgressCtrl滑块控件 CSliderCtrl上下控件 CSpinButtonCtrl图象列表(image list) CImageList列表视图控件(list view) CListCtrl树形控

16、件(tree view) CTreeCtrlRich Edit 控件 CrichEditCtrl4菜单、工具条、状态条菜单 编辑菜单(ResourceView) 捕获消息(ClassWizard )工具条 工具条改善用户界面,方便用户操作。 编辑工具条按钮 删除工具栏按钮 添加工具栏按钮状态条 例子(SDI)5文档、视结构简介MFC 的文档/视图结构把应用程序的数据从用户实际浏览和操纵数据的方法中分离开来。简单的说,文档对象负责存储、加载和保存数据,而视图对象允许用户在屏幕上查看数据,并用适合与应用程序的方法编辑数据。了解文档CDocument 类一个文档代表了一个数据集合,典型情况下一个文档

17、由用户通过 File Open 命令打开并通过 File Save 命令保存。用户通过与文档关联的 CView 对象操作文档。一个文档可以有多个视图关联。了解视图视图是显示存储在文档对象中的数据,并允许用户修改这些数据。视图对象保持了一个文档对象的指针。为了显示和修改数据,视图对象可用这个指针访问文档的成员变量。 一个视图对象只能与一个文档对象关联。 调用 OnUpdate() 函数可以更新一个视图。所有的屏幕显示操作可在从 CView 继承的派生类的 OnDraw 成员函数中完成。 CView 类的派生类CCtrlView 实现常用控件的视图CEditView 提供基本的文本编辑功能CRic

18、hEditView 提供复杂的文本编辑功能CFormView 通过使用对话框资源实现窗体式窗口CRecordView 提供了显示数据库记录的功能CDaoRecordView 一般与 DAO 数据库类一起使用,其余与 CRecordView 相同。CScrollView 提供滚动功能CListView 在窗口中显示 CListView 控件CTreeView 在窗口中显示 CTreeView 控件6图形设备接口理解设备环境1)户能够显示任何形式的数据,因为窗口中显示的所有东西,不论是文字、表格、位图或是其它任何类型的数据,都是以图形方式显示的。2)MFC 通过将 windows 的 GDI 函数

19、和对象封装到其设备环境(DC)类中来帮助用户显示数据。3)一个设备环境(DC)就是一个数据结构,它对窗口的绘制表面的属性保持跟踪。这些属性包括当前选择的画笔、画刷和用来在屏幕上绘制的字体。一个 DC 一次只能有一种画笔一种画刷和一种字体。设备环境对象封装了画线、写文本等 API 函数,所有的画图操作都通过 DC 对象进行。4)DC 帮助 Windows 实现了设备无关性。DC 能用来输出到屏幕、打印机和元文件。什么是元文件(metafile) 元文件就是由一系列可变长度结构组成的数组,图片以设备无关的格式存储在结构中。当元文件的记录被转换成设备命令并被合适的设备处理时,元文件被显示。5)CDC

20、 类CDC 就是设备环境对象类。CDC 对象提供了操作 DC 的成员函数。可以通过 CDC 对象类的成员函数来进行所有的绘图操作。6)CPaintDC 类 CPaintDC 类继承 CDC 类; CPaintDC 类的构造函数自动调用 OnPaint 函数,接着就可以在 DC 中绘图;类的析构函数自动调用 EndPaint 函数。 BeginPaint 函数准备绘图的窗口;EndPaint 函数表明结束窗口的绘图。 在视图类的 OnDraw 函数中 ,CPaintDC 已经由系统准备好,可以直接在 OnDraw 中绘图。并且 CPaintDC 由系统自动释放。7)CClientDC 类 CCl

21、ientDC 对象封装了所有对 Windows 客户区 DC 的操作。CClientDC 通过调用GetDC 函数得到,通过 ReleaseDC 函数释放。 8)CWindowDC 类CWindowDC 对象封装了对整个 window 窗口,包括框架的操作。9)CMetaFileDC 类CMetaFileDC 对象封装了对一个 Windows 元文件的绘图操作。但是必须自己调用OnPrepareDC 函数,来准备设备环境。图形对象(Graphic Object)Windows 提供了多种在 DC 中使用的图形对象类。这些类与 Windows GDI 的句柄类型相对应。Class Windows

22、 handle typeCPen HPENCBrush HBRUSHCFont HFONTCBitmap HBITMAPCPalette HPALETTECRgn HRGN使用 graphic object 的一般步骤: 1)定义图形对象,使用对应类的 Create 函数如 CreatePen 创建画笔对象。或者在构造函数中进行初始化。2)将创建的图形对象选进当前设备环境(DC)中,并保存旧的图形对象。3)完成使用当前图形对象后,将原图形对象选回 DC 中。4)保证分配的图形对象在结束使用后被删除。注意: 如果要反复的使用一个图形对象,可以只申请一次,然后在需要的时候将其选入 DC 中。但是必

23、须确保在不再需要使用图形对象的时候,删除它。 7编程规范书写风格大括号的对齐,锯齿状对齐、缩进;使用空白(空字符,空行)以增加可读性。 命名规范匈牙利记法变量具有一个描述性的名字,如 ClassName,名字用大写字母开始;如果变量是一多词名则每个单词词头需大写。然后,在描述性名称前,加上表示变量类型的字母如,nCount 为一整型变量, bFlag 为一 Boolean 型变量。前缀 变量 注释a Arrayb Booleand Doubleh Handlei Integer “index into”l Longlp Long pointer tolpfn Long pointer to f

24、unctionm Member variablen Integer “number of”p Pointer tos Stringsz Zero terminated stringu Unsigned integerC Class注释规则1)函数注释 函数开头必须注明函数功能、参数、返回值2)变量注释 应说明变量的作用3)其它注释 每个功能模块应加注释,如一个循环体、一个判断等都需要加注释。第三讲 地理信息系统基本概念第四讲 MAPGIS 的基本概念和体系结构1 MAPGIS 二次开发的基本概念成熟实用的地理信息系统(GIS)的重要标志就是它提供给用户的二次开发能力。MAPGIS提供完整的二次

25、开发函数库。用户完全可以在 MAPGIS平台上开发面向各自领域的应用系统。操作系统、MAPGIS 开发库及 MAPGIS应用程序的相互关系如下图所示:MAPGIS 应用程序空间分析 图库操作 图形、图象 I/OMAPGIS开发库窗口操作图 1-1 基于 MAPGIS平台的应用程序目前 MAPGIS二次开发库主要以 API函数、MFC 类库、ActiveX 控件三种方式提供。开发库被封装于若干动态链接库(DLL)中。API函数在使用方法上与 Windows的 API函数完全一样,因此是独立于开发工具的。无论您使用 VC+、VB 还是 BC+、Dephi,您在这些工具中如何调用 Windows的

26、API函数,您就怎么调用这些二次开发函数好了。MAPGIS类库是为基于 MFC(Microsoft Foundation Class)的开发者提供的多个可重用基类,将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。开发者只需从类库派生即可使自己的程序获得从窗口显示控制到图形查询编辑的各项功能。ActiveX 控件是 MAPGIS完成组件化改造的成果之一,它们基于 COM+模型,使得二次开发更为快捷便利,代码的可复用性更高。上述各类开发接口提供了从最基本数据单元的读取、保存、更新和维护到 MAPGIS地图库的建立和漫游,以及空间分析,图象处理等一系列功能。其中,API 函数是基础,使用上

27、最灵活,但技巧性要求也最高。所以本书大量篇幅用于介绍 API函数。MAPGIS 将不断丰富完善各类二次开发接口,以多种开发手段满足不同层次、不同应用的需求。这些函数所在的头文件如下表所示。函数库名称 c,c+说明文件各种头文件 MapGis.h工作区基础函数 Win_area.h图形显示输出 Map_out.h窗口操作 API函数 Win_oper.h图形显示函数 Mapdisp.h图形编辑函数 Mapedit.h拓扑操作函数 Gistopo.h剪贴板操作函数 clippaste.h数字化设备参数设置及初始化调用函数 W32_Dig.h图框生成函数 frmdll32.h投影变换 projdll

28、.h工作区投影变换 cordcvt.h工程管理及拼版文件操作 Map_prj.h窗口操作类库 CGisView.h输入编辑类库 CGisEdit.h工程管理类库 CPrjEdit.h地图库读取显示 Dbs_View.h空间分析函数 Spc_anly.hTin基本操作函数 TinBas32.hTin工作区函数 Tin_area.h工作区管理Windows 98、Windows 2000、 Windows NT网络分析函数 Net_oper.h统计分析和统计图制作函数 Att_Sta.h转换函数 GisConv.h客户化菜单 Custom.h图像输入输出 msiio.h表 1 二次开发头文件2 M

29、APGIS 基本术语下面介绍 MAPGIS 系统中经常使用的一些基本概念。地图:是按一定的数学法则和特有的符号系统及制图综合原则将地球表面的各种自然和社会经济现象缩小表示在平面上的图形,它反映制图现象的空间分布、组合、联系及在时空方面的变化和发展。窗口:是用户坐标系中的一个矩形区域。用户可以改变这个矩形的大小、或移动位置来选择所要观察的图形。窗口就象照相机的取景框,当我们瞄准不同的地方,就选取了不同的景物。离景物越远框内包括的景物越多而成像就小;当我们靠近它,所包括的景物越少,成像越大。利用窗口技术,我们可以有选择的考察图形的某一部分,观察图形的细致部分或全局。视区:是设备坐标系中的矩形区域,

30、它是图形在设备上的显示区。可视区是在一定高程和一个或多个视点内,通过计算所得到的一个或多个视点的可见区域。图层:用户按照一定的需要或标准把某些相关的物体组合在一起,我们称之为图层。如地图中水系构成一个图层,铁路构成一个图层等。我们可以把一个图层理解为一张透明薄膜,每一层上的物体在同一张薄膜上。一张图就是由若干层薄膜叠置而成的,图形分层有利于提高检索和显示速度。靶区:是屏幕上用来捕获被编辑物体(图形) 的矩形区域 ,它由用户在屏幕上形成。控制点:控制点是指已知平面位置和地表高程的点,它在图形处理中能够控制图形形状,反映图形位置。点元:点元是点图元的简称,有时也简称点,所谓点元是指由一个控制点决定

31、其位置的有确定形状的图形单元。它包括字、字符串、子图、圆、弧、直线段等几种类型。它与“线上加点”中的点概念不同。弧段:弧段是一系列有规则的,顺序的点的集合,用它们可以构成区域的轮廓线。它与曲线是两个不同的概念,前者属于面元,后者属于线元。区/区域:区/区域是由同一方向或首尾相连的弧段组成的封闭图形。拓扑:拓扑亦即位相关系,是指将点、线、及区域等图元的空间关系加以结构化的一种数学方法。主要包括:区域的定义、区域的相邻性及弧段的接序性。区域是由构成其轮廓的弧段所组成,所有的弧段都加以编码,再将区域看作由弧段代码组成;区域的相邻性是区域与区域间是否相邻,可由它们是否具有共同的边界弧段决定;弧段的接序

32、性是指对于具有方向性的弧段,可定义它们的起始结点和终止结点,便于在网络图层中查讯路径或回路。拓扑性质是变形后保持不变的属性。透明输出:与透明输出相对的为覆盖输出。用举例来解释这个名词,如果区与区、线与区或点图元与区等等叠加,用透明输出时,最上面的图元颜色发生了改变,在最终的输出时最上面图元颜色为它们的混合色。最终的输出如印刷品等。数字化:数字化是指把图形、文字等模拟信息转换成为计算机能够识别、处理、贮存的数字信息的过程。矢量:是具有一定方向和长度的量。一个矢量在二维空间里可表示为(Dx,Dy),其中 Dx表示沿 x 方向移动的距离,Dy 表示沿 y 方向移动的距离。矢量化:矢量化是指把栅格数据

33、转换成矢量数据的过程。细化:细化是指将栅格数据中,具有一定宽度的图元,抽取其中心骨架的过程。网格化(构网):网格化是指将不规则的观测点按照一定的网格结构及某种算法转换成有规则排列的网格的过程。网格化分为规则网格化和不规则网格化,其中规则网格化是指在制图区域上构成有小长方形或正方形网眼排成矩阵式的网格的过程;不规则网格化是指直接由离散点连成的四边形或三角形网的过程。网格化主要用于绘制等值线。光栅化:光栅化是指把矢量数据转换成栅格数据的过程。曲线光滑:就是根据给定点列用插值法或曲线拟合法建立某一符合实际要求的连续光滑曲线的函数,使给定点满足这个函数关系,并按该函数关系用计算加密点列来完成光滑连接的

34、过程。结点:结点是某弧段的端点,或者是数条弧段间的交叉点。结点平差(顶点匹配):本来是同一个结点,由于数字化误差,几条弧段在交叉处,即结点处没有闭合或吻合,留有空隙,为此将它们在交叉处的端点按照一定的匹配半径捏合起来,成为一个真正结点的过程,称为结点平差。BUF 检索:本来是靠近某一条弧段上的几条弧段,由于数字化误差,这几条弧段在与弧段交叉或连接处的结点没有落在弧段上,为此将弧段按照一定的检索深度检索其周围几条弧段的结点,若落在该深度范围内,就将这些结点落到弧段上,从而使这些弧段靠近于弧段,我们称这个过程为 BUF 检索。缓冲区(Buffer):是绕点、线、面而建立的区域,可视为地物在一定空间

35、范围内的延伸,任何目标所产生的缓冲区总是一些多边形,如建立以湖泊和河道 500 米宽的砍伐区。缓冲分析的应用包括道路的噪声缓冲区、危险设施的安全区等。裁剪:裁剪是指将图形中的某一部分或全部按照给定多边形所圈定的边界范围提取出来进行单独处理的过程。这个给定的多边形通常称作裁剪框。在裁剪实用处理程序中,裁剪方式有内裁剪和外裁剪,其中内裁剪是指裁剪后保留裁剪框内的部分,外裁剪是指裁剪后保留裁剪框外面的部分。属性:就是一个实体的特征,属性数据是描述真实实体特征的数据集。显示地物属性的表通常称为属性表,属性表常用来组织属性数据。重采样:就是根据一类象元的信息内插另一类象元信息的过程。遥感:广义上讲,遥感

36、就是不直接接触所测量的地物或现象,远距离取得测量地物或现象的信息的技术方法。狭义而言,主要指从远距离、高空以至外层空间的平台上,利用可见光、红外、微波等探测仪器,通过摄影和扫描、信息传感、传输和处理,从而识别地面物质的性质和运动状态的现代化技术系统。监督分类:根据样本区特征建立反射与分类值的关系,然后再推广到影像的其它位置。它以统计识别函数为理论基础。而非监督分类以集群理论为基础,自动建立规则。网络(Network):由节点和边组成的有规则的线的集合,如道路网络、管道网络。节点是线的交叉点或线的端点,边是数据库模型中的链(即定义复杂的线或边界的坐标串) ,节点度是节点处边的数目。网络分析多种多

37、样,如交通规划、航线安排等。TIN:是由一组不规则的具有 X、Y 坐标和 Z 值的空间点建立起来的不相交的相邻三角形,包括节点、线和三角形面,用来描述表面的小面区。TIN 的数据结构包括了点和它们最相邻点的拓扑关系,所以 TIN 不仅能高效率地产生各种各样的表面模型,而且也是十分有效的地形表示方法。TIN 的模型化能力包括计算坡度、坡向、体积、表面长,决定河网和山脊线,生成泰森多边形等。数字高程模型(DEM):即 Digital Elevation Model,是数字形式的地形定量模型。数字地形模型(DTM) :即 Digital Terrain Model,是数字形式表示的地表面,即区域地形

38、的数字表示,它是由一系列地面点的 X,Y 位置及其相联系的高程 Z 所组成。这种数字形式的地形模型是为适应计算机处理而产生的,又为各种地形特征及专题属性的定量分析和不同类型专题图的自动绘制提供了基本数据。在专题地图上,第三维 Z 不一定代表高程,而可代表专题地图的量测值,如地震烈度、气压值等。地图投影(Map Projection):地图投影是按照一定的数学法则,将地球椭球面经纬网相应投影到平面上的方法。坡度和坡向:若输入高程,则通过计算相邻象元值的差异可求得坡度;斜坡倾斜的水平方向称为坡向。3 MAPGIS 的数据管理(工作区)31 工作区的概念MAPGIS数据管理的核心就是对工作区的操作。

39、工作区是 MAPGIS提出的一个概念,简单地说,工作区就是一个数据池,存放实体的空间数据、拓扑数据、图形数据和属性数据,每个工作区都对应于一个 MAPGIS数据文件。MAPGIS开发函数库提供对工作区实施操作的一系列函数,如将工作区中的内容存盘,从盘上将数据装入工作区,对工作区中内容进行添加、修改、删除、检索等等。对硬盘数据的存取及虚拟内存的管理等等复杂繁琐的工作无需应用程序的编写者去关心,而是由 MAPGIS工作区管理模块自动完成。如图所示。由此可见,深入了解工作区的逻辑结构和工作区操作函数的使用,是进行成功的二次开发的关键。32 .工作区管理模块的地位工作区管理模块的地位33 工作区的分类

40、MAPGIS将工作区分为点、线、区、网、表五种类型,它们的差别主要表现在其中包含MAPGIS 应用程序工作区 API 函数界面工 作 区 管 理 模 块工作区(空间数据、图形数据及属性数据)的空间实体的类型不同。详见下表:工作区类型 实体类型点工作区(.WT 文件) 点(PNT)线工作区(.WL 文件) 线(LIN)、结点(NOD)区工作区(.WP 文件) 线(LIN)、结点(NOD)、区(REG)网工作区(.WN 文件) 线(LIN)、结点(NOD)、网(NET)表工作区(.WB 文件) 无空间实体,仅有表格记录各类工作区中可以包含的实体类型由于不同种类的工作区中空间实体的类型不同,各类型的

41、工作区所适用的数据操作函数也就不同。例如,对点工作区只能使用操作点实体数据的函数;而对区工作区则可对线、结点和区实体的数据进行操作。4 MAPGIS 的空间实体及其数据组织空间实体是 MAPGIS数据操作的基本单位,在一个工作区中,一类实体可有多达 2G的个体,每个个体都有唯一的序号,称为实体号(点号、线号、区号、网号、记录号等) 。对实体数据的存取主要依据实体号。每个实体在工作区中都存储有对应的空间数据、拓扑数据、图形参数及属性记录。当然,实体类型不同,上述几方面的数据就有不同的特点,见下表。1.实体类型:点,线,区,节点,网2.实体数据:空间数据,拓扑数据,图形数据,属性数据3.实体数据的

42、逻辑组织实体类型 空间数据及拓扑数据 图形参数 缺省属性点 PNT 位置(x,y)D_DOTPNT_INFO(字符串、文本、子图、圆、弧、图象)ID(长整型)位置(x 0,y0),(x n,yn)线 LIN拓扑 LIN_TOPLIN_INFOID(长整型)长度(浮点型)位置(x,y)D_DOT连接的弧段(l 0,l1,ln)结点 NOD 附加数据:连通方阵、中心数据、站点数据、转角数据等PNT_INFO,也可没有图形参数 ID(长整型)区 REG 区数据:边界弧段号 REG_INFO ID(长整型)周长(浮点型)面积(浮点型)网 NET 网数据:组成网的弧段号 NET_INFO ID(长整型)

43、不同类型实体的相关数据说明:1. D_DOT 是描述二维空间位置的数据结构,就是(x,y)座标对。见后边“宏定义及数据结构” 。2. LIN_INFO 是描述线的拓扑关系的数据结构,主要记录线两端的结点、线两边的区等信息。见后边“宏定义及数据结构” 。3. PNT_INFO、LIN_INFO、REG_INFO、NET_INFO 分别是描述点、线、区、网图形特征(用于显示或输出)的数据结构,其定义见后边“宏定义及数据结构” 。4 上表中仅列出不同类实体的缺省属性域,它们是最基本的。用户可以在此基础上任意扩充新的各种数据类型的数据域以满足自己的需要。对每种空间实体的空间数据、拓扑数据、图形参数及属

44、性记录,MAPGIS 都提供相应的函数来实施获取、修改、删除等操作。下面以例子来详细说明线实体、结点实体、区实体在工作区中的数据组织。L1 n2n1 n4R1 R2 L3L4L2 n3一个区工作区中的空间实体图 1-3 给出了一个区工作区中的空间实体。在这个工作区中有四条线(线号分别用L1、L2、L3、L4 表示) ,有四个结点(结点号分别用 n1、n2、n3、n4 表示) ,有两个区(设区号分别为 R1、R2) 。1、线实体MAPGIS 中的线由多个座标点组成,线实体的空间数据就是存放在工作区中的座标点序列(D_DOT 结构) 。如果线 L1 由 8 个点组成,它的空间数据就如下所示:(x0

45、,y0) (x1,y1) (x7,y7)线拓扑(LIN_TOP 结构)记录线两端的结点和线两旁的区。如线 L2 的拓扑数据如下:n3 N1 0 R1 0 0而 L4 的拓扑数据如下:N4 n4 1 2 0 0起始结点 左区 右区终止结点2、结点实体结点的空间数据与点实体一样,是二维座标点,其拓扑数据记录它所连接的线,如 n1的拓扑数据是:L1 L2而 n4 的拓扑数据是:L43、区实体区由线实体(在区工作区中又被称为弧段)围成,它的空间数据主要记录这些线的序号。如果线 L1、L2、L3、L4 的方向如图 1-3 所示,且所含座标点的数目分别为d1、d2、d3、d4,假设我们将顺时针方向定为 R

46、1 的方向(这并不是硬性的规定,也可以将一个区的方向定为逆时针) ,则区 R1 的空间数据如下:(p137)D1+d2+d3+d4+2 L1 -L3 L2 0 L4注意:第一个单元存放的并不是线号,而是全部线的座标点数目的总和加上区边界的圈数;边界各圈的线号用 0 相隔;在数据中与区方向一致的线用正数表示,与区方向相反的线则存储线号的相反数。4、属性记录图 1-3 中各个实体对应的属性记录都具有如下结构:偏移字节 0 1(fldEntry0.fieldoffset) fldEntry1.fieldoffsetFlag 字段 1:ID(长整型) 字段 2 字段 m5 MAPGIS 的 C+类组织

47、MAPGIS 二次开发类库是建立在 MAPGIS API 之上的一个类库层,用于支持基于 MFC类库的面向对象的 Windows 程序设计。MAPGIS 二次开发类库,提供了一套强有力的 C+类,它屏蔽了基于 MAPGIS API 之上开发 MAPGIS 实用程序的许多复杂性,同时仍然允许有经验的程序员使用底层的 MAPGIS API 功能。如何有效地使用这个类库,且看下面介绍。删除标记(0: 存在;1:已删除)CGisViewCViewCGisEditViewCPrjEditView图 13-1 MAPGIS 二次开发类库结构图CGisView类继承了 Visual C+的 CView类,它

48、封装了窗口管理的各种功能及操作,它管理了窗口的图形显示参数、操作状态,滚动条的位置、范围等基本窗口属性,以及放大窗口、缩小窗口、移动窗口、显示范围、显示比例、坐标转换等功能。CGisView 类还支持窗口的保护和快速恢复等功能。CGisView 类是 MAPGIS类库中大多数类的基类。CGisEditView 类继承了 CGisView 类。它封装了 MAPGIS编辑处理的基本数据对象和方法。包括几乎所有的点、线、区的编辑功能以及图层的处理函数、矢量化函数、节点平差函数、数字化函数、最基本的文件操作功能。CGisEditView 类及其基类组成了十分强大的图形编辑函数库。用户开发自己的软件时最

49、好是继承 CGisEditView类,这样用户可以同时使用BaseEditWindow 、CGisView 、CGisEditView 类及 VC+的 Cview类所提供的所有功能。CPrjEditView类继承了 CGisEditView 类,它集成了对工程文件进行编辑处理所必需的数据对象的方法,具有对整个工程文件的各个文件编辑处理功能。6 MAPGIS 的开发环境介绍使用 VC+开发 MAPGIS应用程序的最快速有效的方法就是使用 MAPGIS类库。这些类已经为用户的程序与 MAPGIS操作平台的接口做好了准备,用户可以体会到使用这些类可以很容易地实现 MAPGIS系统里的功能,而且在实现 MAPGIS系统功能的基础上用户还可以随意地添加自己想要的功能。下面我们以 CGisEdit

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报