一种基于MFC的GIS多文档多视图技术实现
MFC多文档多视图编程
深入了解MFC中的文挡/视结构李泽宇金刚熊联欢姜军(华中理工大学图象识别与人工智能研究所)Visual C++ 5.0 以其功能强大、用户界面友好而倍受程序员们的青睐。
但是,在当前的Microsoft 基本类库4.2 版本中,大约有将近200 个类,数千个函数,加之Microsoft 公司隐藏了一些技术细节,使得人们深入学习MFC变得十分困难。
MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用、单文档应用(SDI)和多文档应用(MDI)。
前两者的结构较简单,本文不再赘叙。
笔者拟从MFC中的文档/视结构入手,分析一些函数的流程,并解决编制MDI 应用程序过程中的一些常见问题。
(一)、了解文档/视结构MFC应用程序模型历经多年以有了相当大的发展。
有一个时期,它只是个使用应用程序对象和主窗口对象的简单模型。
在这个模型中,应用程序的数据作为成员变量保持在框架窗口类中,在框架窗口的客户区中,该数据被提交显示器。
随着MFC2。
0的问世,一种应用程序结构的新方式----MFC文档/视结构出现了。
在这种结构中,CFrameWnd繁重的任务被委派给几个不同类,实现了数据存储和显示的分离。
一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:。
应用程序是一个CwinApp派生对象,它充当全部应用程序的容器。
应用程序沿消息映射网络分配消息给它的所有子程序。
框架窗口是一CfrmeWnd派生对象。
文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分。
视窗是Cview派生对象,它与其父框架窗口用户区对齐。
视窗接受用户对应用程序的输入并显示相关联的文档数据。
通常,应用程序数据存在于简单模型中的框架窗口中。
在文档/视方式中,该数据移入称为document 的独立数据对象。
当然,文档不一定是文字,文档是可以表现应用程序使用的数据集的抽象术语。
而用户输入处理及图形输出功能从框架窗口转向视图。
如何在MFC单文档中创建多视图
u 一个文档可以有多个视图,由Document中成员变量CPtrList m_ViewList维护。
u CFrameWnd拥有一个成员变量CView* m_pActiveView指向当前活动的View。
u CView中拥有一个成员变量CDocument* m_pDocument指向该视图相关的Document。
!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) ||
!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) ||
/wang_qingyuan/blog/item/60870400275c5b087bec2cbd.html
深入分析MFC文档视图结构
2008-10-16 19:40
文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分开,提供了很好的数据层次和表现层次的解耦。然而,虽然我们使用MFC AppWizard就可以很轻松地获得一个支持Document/View Architecture的MFC程序框架,Document/View Architecture本身的复杂性加上VC产生的一系列代码足够让我们眼花缭乱,一时陷入云里雾里不可自拔。加上我们更多的人都没有经过Windows SDK Programming 的学习和经历就直接进行MFC Programming的学习和开发,更是面对一堆的代码不知所措。
第12章 MFC CRgn区域类与GIS的空间分析算法
参数: pRgn1 表示一个已经存在的区域。 pRgn2 表示一个已经存在的区域。 nCombineMode 指定当组合两个源区域时要执行的操作。它可以是下列值之一: · RGN_AND 使用两个区域互相重叠的区域(相交区域)。 · RGN_COPY 创建区域1(由pRgn1标识)的一个拷贝 · RGN_DIEF 创建一个区域,该区域由区域1(由pRgn1标识)的不是区域2(由pRgn2标识) 的那一部分区域组成。 · RGN_OR 组合两个区域的整个部分(两个区域的并)。 · RGN_XOR 组合两个区域,但去掉相互重叠的区域。
12.1.3 CRgn创建 (4)多边形
BOOL CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode ); 参数: lpPoints 指向一个POINT结构数组,或指向一个 CPoint对象数组。每一个结构指定多边形的一个顶点的x坐 标和y坐标。 nCount 指定由lpPoints指向的数组中的POINT结构或 CPoint对象的数目。 nMode 指定区域的填充模式。这个参数可以是 ALTERNATE或WINDING。
12.5 CRgn的保存
2、 CRgn 转换成 RGNDATA
RGNDATA* DTIS_RgnToData( CRgn* pRgn, long& nCount ) { nCount = pRgn->GetRegionData(NULL,1); if( nCount==0 ) return FALSE; RGNDATA* pRgnData = (RGNDATA*)(new char[nCount]); pRgn->GetRegionData( pRgnData, nCount ); return pRgnData; }
MFC的窗口分割实例以及CSplitterWnd类
3 分割窗口ቤተ መጻሕፍቲ ባይዱ
如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基 于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文 本框及发送、清除按钮,发送按钮用来向右上视图传送消息。
图 1 设计样式 打开 Microsoft VC++ 6.0,通过 MFC AppWizard(exe)新建名为 SplitWnd 的单文档(SDI) 工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,故不阐述,有兴趣读者可与作者联系),由于需要三个视图窗口对应三个
视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序 添加两个 MFC 类(菜单“Insert | New Class>”),因为在右上视图用于显示文本,故其基类选 CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为 CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对 应,故应先在资源中新建对话框,对话框中的控件如图 1)。
void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,文本框对应的变量为 m_sText //通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); CWnd * pWnd = pMainFrm->m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView ->GetMsg( m_sText + "\r\n" );//CLeftTopView 成员函数,接收数据 } 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg += sMsg; // m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。
三维GIS开发工具VC-MFC在Windows应用程序中的封装
信 息科学 Jj l
三维 G s I 开发工具 VC MF - C在 Wid ws n o 应用程序中的封装
徐 磊
( 浙江师范大学旅 游与资源管理学院。 浙江 金 华 3 10 பைடு நூலகம் 2 0 4
摘 要: 微软 的 MF Mirsf F I】 o 是一套面向对象的应 用程序框架, C( coot ol出d n da l 它封装 了 Wi3 DK 中的 AP 接 口。vc+ n2S I +及 MF C是进
行三维 GS I开发的重要 工具 。以一个基于 MF C的单文档应 用程序 为例, 剖析 MF C的封装过程 , 点是程序 的初 始化和窗 口 建, 重 创 显示, 更新过程 中的封 装细节, 为读者揭示 MF C的封装机制。
关键词 : C; MF 封装 ; n 2A I应用程序框架 Wi P ; 3
1 概述 下 文件 WI MA NC P: N I .P ) cs hl om n 函数内部, e SeCm ad s l 可以看到其中有如 m X P x n i H N T n B NT M C F 是微软公司提供的一整套应用程序框 i AF A IAfWiMan {I S ANCE hl蛐 c HI S ANCE 下代码( M C 参见 F 源文件 A P ICD: P UZ P h Pmrn tn e ls e, a B O C n px r esh l o m n CC m n Ln l o O L W/ lPc s e C m a d A : m S [ o mad i n & ef 架, 它利用 c + + 语言全面封装 了微软的 Wi o s n w d L I T l m Ln, a n md hw P S R p d i ̄ h C S o) C t d AI P 接口, 在开发 Wi
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据
如何在MFC中其他类访问和交换文档Doc类与视图View类的数据在MFC的单文档里,每个类都有获得其他类指针的一套方法每个类都有获得其他类指针的一套方法.现归纳如下.为方便说明,现假设已用app wizard生成了一个SDI应用程序test,包含如下几个类: CT estApp,CTestDoc,CTestView,CMaimFrame 1:从视图类获得文档类指针如前所述,在视图类中需要引用文档类的地方之前,使用如下语句: CTestDoc *pDoc=(CTestDoc *)GetDocument();以后便可使用pDoc指针访问文档类.此处的强制类型转换在test应用程序中并不需要,因为该程序只有一个视图类,并且在InitInstance()重用SDI文档模板进行了装配.你可以在Test.cpp种的InitInstance()方法中看到如下语句:CSingleDocTemplate *pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINRAME,RUNTIME_CLASS(CTe stDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CTestView));AddDocTemplate(pDocTemplate);以及TestView.h中的定义:inline CTestDoc *CTestView::GetDocument(){return (CTestDoc *)m_pDocument;}简而言之,就是说CT estView的GetDocument()函数自然而然的认为CTestDoc是与它"相配"的.当生成了一个具有多个视图类的应用程序时,(如用CSplitterWnd将窗口分为两栏,但这两栏并非从同一种视图类派生就属于这种情况。
具体实现在本文讨论范围之外),只有一个视图类能与唯一的文档类用文档模板进行装配,那么在另外一个未经装配的类中要取得文档类的指针,则需进行强制类型转换。
第2章_ArcGIS组件式开发
4、成本低。 、成本低。
组件的重用率极高。 组件的重用率极高。同一个组件可以在不同的软件中 重复使用。 重复使用。
GIS设计与开发 GIS设计与开发 8
常用组件式GIS软件简介 常用组件式GIS软件简介
全球最大的GIS厂商 厂商ESRI(美国环境研究所 公司: 美国环境研究所)公司 全球最大的 厂商 美国环境研究所 公司:
GIS设计与开发 GIS设计与开发 17
MapX 公司1996年10月开始推出的基于 月开始推出的基于ActiveX技术 是MapInfo公司 公司 年 月开始推出的基于 技术 可编程的控件MapInfo MapX。 可编程的控件 。 是一个基于ActiveX(OCX)技术的可编程控件。它使用与 技术的可编程控件。 是一个基于 技术的可编程控件 MapInfo Professional一致的地图数据格式,并可实现 一致的地图数据格式, 一致的地图数据格式 大多数的MapInfo Professional的功能。 的功能。 大多数的 的功能 提供了四十多个父类( 基础类(MFC)的OLE 提供了四十多个父类(为Microsoft基础类 基础类 的 对象),应用程序员可以使用任何支持ActiveX的程序开 ),应用程序员可以使用任何支持 对象),应用程序员可以使用任何支持 的程序开 发环境, 发环境,如VisualC++、、Delphi、 、 、 、 Power-Builder等嵌入 等嵌入MapX控件开发 控件开发GIS应用程序。 应用程序。 等嵌入 控件开发 应用程序
GIS设计与开发 GIS设计与开发 16
TITAN(泰坦) TITAN(泰坦)
提供一组TITAN ActiveX控件; 控件; 提供一组 控件 应用程序员可以在标准的程序设计环境 (如Visual ,Visual , C++,Power Builder、Visual FoxPro和 、 和 Delphi等)中将 等 中将TITAN GIS的强大功能嵌 的强大功能嵌 入到应用程序中,开发嵌入式GIS应用系统。 应用系统。 入到应用程序中,开发嵌入式 应用系统
MapWinGIS应用于GIS程序设计实践
MapWinGIS应用于GIS程序设计实践吕秀琴;张毅【摘要】介绍了开源GIS平台的功能特点,通过比较各种开源GIS平台特点,选择基于MapWinGIS进行GIS程序设计,包括程序框架建立、矢量与栅格数据类型支持、访问方式和基本功能操作.利用实例说明了MapWinGIS程序开发便捷、开放的特点,有助于GIS软件程序的升级、维护和扩展.%This paper introduces the function features of Open Source GIS platform. MapWinGIS is selected for GIS programming by comparing several Open Source GIS platforms. It includes procedural framework establishment, the supported types and accessing methods of vector and raster data, and basic operation functions. The convenient and open characteristics of MapWinGIS programming, helping upgrade, maintenance and expansion for GIS programming are explained by examples.【期刊名称】《实验技术与管理》【年(卷),期】2012(029)010【总页数】4页(P110-113)【关键词】程序设计;开源GIS;MapWinGIS;接口对象;矢量数据;栅格数据【作者】吕秀琴;张毅【作者单位】武汉大学资源与环境科学学院,湖北武汉 430079;武汉大学测绘学院,湖北武汉 430079【正文语种】中文【中图分类】TP31Abstract:This paper introduces the function features of Open Source GIS platform.MapWinGIS is selected for GIS programming by comparing several Open Source GIS platforms.It includes procedural framework establishment,the supported types and accessing methods of vector and raster data,and basic operation functions.The convenient and open characteristics of MapWinGIS programming,helping upgrade,maintenance and expansion for GIS programming are explained by examples.Key words:programming;open source GIS;MapWinGIS;interface object;vector data;raster data本文介绍了MapWinGIS应用于GIS程序设计的实践过程,包括程序框架的建立、数据类型及其访问方式和基本功能。
mapgis二次开发教程
mapgis二次开发教程默认分类 2009-09-08 10:18:14 阅读898 评论1 字号:大中小订阅目前MAPGIS二次开发库主要以API函数、MFC(Microsof t Foundation Class)类库、Com组件、Activ eX 控件四种方式提供。
开发库被封装在若干动态链接库(DLL)中。
API函数在使用方法上与Windows的API函数完全一样,因此是独立于开发工具的。
无论您使用VC++、VB还是BC++、Dephi…,您在这些工具中如何调用Windows的API函数,您就可以怎么调用这些二次开发函数。
MAPGIS类库是为基于MFC类库的C++开发者提供的多个可重用基类,它将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。
开发者只需从类库派生即可使自己的程序获得从窗口显示控制到图形查询编辑的各项功能。
MAPGIS COM组件是MAPGIS新一代体系结构的表现,功能更加强大,使用更加便利。
具有二次开发方便、易于集成、无限扩展等特点。
支持多种开发软件,包括Visual C++、Visual Basic、Delphi、script、InterDev、Power Builder等,开发者可以多层次的访问MAPGIS组件的数据层、功能层和界面层。
Activ eX 控件是MAPGIS完成组件化改造的成果之一,它们使得二次开发更为快捷便利,代码的可复用性更高。
上述各类开发接口提供了从最基本数据单元的读取、保存、更新和维护到MAPGIS地图库的建立和漫游,以及空间分析,图象处理等一系列功能。
其中,API函数是基础,使用上最灵活,但技巧性要求也最高。
所以本书大量篇幅用于介绍C++ API函数。
MAPGIS将不断丰富完善各类二次开发接口,以多种开发手段满足不同层次、不同应用的需求。
这些函数所在的C++头文件表4-1所示:表4-1 二次开发头文件4.2 MAPGIS基本术语下面介绍MAPGIS系统中经常使用的一些基本概念。
MFC中实现多文档
MFC中实现多文档MFC(Microsoft Foundation Class)是用于Microsoft Windows操作系统的应用程序框架。
多文档是指在一个应用程序中同时打开和管理多个文档的能力。
下面是如何在MFC中实现多文档的步骤:1.创建一个新的MFC应用程序项目:- 在Visual Studio中选择“文件”>“新建”>“项目”。
- 在“左侧导航栏”中选择“Visual C++”>“MFC”。
-选择“MFC应用程序”并点击“下一步”。
-输入项目名称,并选择存储位置,然后点击“下一步”。
-选择“多文档”应用程序类型,并确保“使用多文档视图”选中,然后点击“完成”。
2.修改文档类:- 打开“xxxDoc.h”文件(xxx为你的应用程序名称)。
-在文档类声明中添加一个成员变量来保存文档的数据。
3.修改视图类:- 打开“xxxView.h”文件。
-在视图类声明中添加用户界面控件(如按钮、菜单等)来实现文档的交互操作。
-在视图类声明中,添加成员变量来保存文档数据的指针。
- 在视图类的实现文件中,重写OnInitialUpdate(函数,初始化视图。
4.修改主框架窗口类:- 打开“MainFrm.h”文件。
-在主框架窗口类声明中,添加成员变量来保存文档视图的指针。
- 在主框架窗口类的实现文件中,重写OnCreateClient(函数,创建并管理多个文档视图的布局。
5.添加命令处理函数:- 打开“xxxView.cpp”文件。
-在视图类的实现文件中,添加命令处理函数,例如保存文档、打开新文档等。
6.调试和测试:-编译并运行应用程序。
-打开多个文档,观察每个文档的窗口布局和视图。
-测试各种文档操作,如保存、打开、关闭等。
以上是使用MFC框架实现多文档的基本步骤。
根据你的具体需求,你可以进一步定制和扩展多文档功能,例如添加更多自定义的菜单和工具栏选项、实现文档之间的数据交互等。
《用Visual-C开发GIS系统》第2章-MFC应用程序设计的开发工具PPT课件
.ቤተ መጻሕፍቲ ባይዱ
9
视化管理的工具。利用它调用AppStudio可以对 程序所拥有的各种资源(菜单、工具条、对话 框、加速键、热键等)进行可视化管理。
FileView(文件视图)是管理一个开发项目所包含 的所有文件的工具。通过它可以用来管理一个 开发项目所包含的源文件。
.
20
.
21
.
22
.
23
.
24
⑦ 在图2-7所示的MFC AppWizard-Step 5 of 6对话框中, 用户需要对是否在生成的程序源代码中加入注释进 行选择。在本例中,选择“Yes, please”(加入注释) 选项。另外有一个选项是选择在产生的应用程序中 如何应用MFC,有两种选择:“As a shared DLL”(作 为共享动态链接库)和“As a statically linked library”(作为静态链接库)。选择“As a shared DLL” 选项,单击Next按钮,就会进入图2-8所示的MFC AppWizard-Step 6 of 6对话框。
.
16
2.1.2 利用MFC AppWizard产生MFC应用程序的步骤
在这一节中,应用MFC AppWizard生成一个叫做Draw的应 用程序。以下是利用AppWizard产生MFC应用程序框架 的步骤:
首先,进入VC++的工作区,运行工作区上的“File”菜单 下的“New”命令,打开New对话框,然后进行如下步 骤的操作:
.
13
图2 AppWizard创建.框架程序对话框
14
表2-1 AppWizard创建的应用程序类型
二次开发初级培训班培训讲义
第一讲基于WINDOWS编程的基础知识1。
引言1.1 过程化(procedural programming):程序被认为是在一个数据集合上进行的一系列操作。
1.2 结构化(structured programming):主要思想是:功能分解并逐步求精。
1.3 面向对象的程序设计(object_oriented programming)实质是把数据和处理这些数据的过程合并为一个单独的“对象”――一个具有确定特性的自完备的实体。
1.4 对象的程序设计的特征1)自完备(self_contained):能够完全实现一些严格定义的功能.2)封装3)继承4) 多态2. 类与数据封装2.1 什么是类?简单的说,类就是一种用户定义的数据类型,跟结构类似;并且,类具有自己的成员变量和成员函数(方法),通过它们可以对类自身进行操作。
如:汽车可以看作是发动机、车轮、座椅等诸如此类的集合。
也可以从功能的角度来研究,譬如,能移动,加速,减速,刹车等.定义(例子)VC++中讲解2.2 封装(encapsulation)定义:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
封装的优点:◆封装允许类的客户不必关心类的工作机理就可以使用它。
就象驾驶员不必了解发动机的工作原理就可以驾驶汽车一样,类的客户在使用一个类时也不必了解它是如何工作的,而只需了解它的功能即可。
◆所有对数据的访问和操作都必须通过特定的方法,否则便无法使用,从而达到数据隐藏的目的。
2.3 对象对象就是类的一个实例。
类与对象的关系就如类型和变量的关系,所有对类的操作都必须通过对象来实现.当一个类定义了多个对象时,每个对象拥有各自的成员数据。
2.4 类的三种成员类型◆私有成员(private):缺省情况下,一个类中的所有成员都是私有的.私有成员只能被类本身的成员函数访问。
并且不具有继承性。
◆公有成员(public):公有成员可以被类成员函数和外部函数使用。
关于VisualC++开发GIS系统——开发实例剖析
关于VisualC++开发GIS系统——开发实例剖析xxxxxxxxxxx摘要:本文全面介绍和分析了MFC程序的框架结构和各种MFC辅助工具的使用方法,实例剖析了MFC中与图形和数据库应用程序设计有关的类。
介绍了GIS系统开发的方法和思路,结合具体代码开发实现了矢量图形系统、数据库管理系统、矢量系统和数据库管理系统之间的链接、信息查询功能、空间信息设计和分析功能等,实现了一个基本GIS系统。
关键词:MFC程序框架矢量图形系统数据库管理系统近几年来,GIS技术在全球得到了迅猛的发展,已经成为了IT的重要组成部分,用于开发GIS系统的专业开发工具得到了飞速发展。
本文以开发一个基本GIS系统为主线,介绍面向程序设计的精髓,全面分析MFC程序框架的组成和结构,呈现GIS系统的开发思路和开发方法。
(一)、用MFC AppWizard产生的应用程序Draw的基础上,去具体组织一个基本矢量图形系统的开发,讲解与矢量图形系统设计有关的类及其主要操作,从矢量图形系统的类组织、文档管理、视图组织、图形绘制、图形操作、图形选中、图形删除、文档你操作、图形保存等各个方面,实例开发一个用于GIS系统的基本矢量图形系统。
用MFC AppWizard产生了一个应用程序Draw,我们将在这个应用程序基础上来组织矢量图形系统的开发工作。
把这些图形元素中共性的东西组织存放在一个图形元素基类中,直线类、连续直线类、圆类、圆弧类、标注文本类由这个类派生,具体代码如下:class CCircle :public CDraw,class CArc:public CCircle,class CLine:public CDraw,class CPline:public CDraw,class CText:public CDraw。
组织实现了一个基本矢量图形系统的图形元素类后,将使用这些类,利用MFC应用程序的文档管理体系组织文档,实现基本矢量图形的文档管理功能。
地理信息系统开发关键技术研究
地理信息系统开发关键技术研究作者:夏梦来源:《电子世界》2012年第18期【摘要】为了提高地理信息系统的开放性、可重用性及其分布式的特点,本文指出了现阶段地理信息系统的缺陷,提出了利用面向对象的组件技术、基于Agent思想的分布式策略以及知识管理相关模式来促进地理信息系统的高效开发和简便应用,最后,在上述技术的基础上,开发了高效的地理信息系统。
【关键词】GIS;COM;软件工程;ATL1.引言地理信息系统(Geographic Informa—tion System,简称GIS)[1]是一种采集、输入、存储、管理、检索、分析、描述和显示空间信息的计算机系统,是分析和处理地理空间数据的通用技术,是信息技术的一个重要组成部分,它也是一门集计算机科学、信息科学、数学和统计科学、现代地理学、测绘遥感学、环境科学、城市科学、空间科学和管理科学为一体的新兴边缘学科[1—3]。
GIS开发属于软件工程开发范畴,由于GIS的空间信息管理属性及其应用模式,增加了GIS开发的难度和复杂度,现阶段GIS的缺陷主要表现在:1)采用效率不高的开发语言。
例如MFC并不全面支持GIS的COM组件开发,且加上庞大的命令、函数库,使得开发难度增加,产品开发周期增长。
2)空间数据库及其知识管理系统通常由GIS厂商提供,这导致了GIS系统价格的昂贵。
3)传统GIS与多媒体开发工具及多地域协作的链接均不甚方便,数据交换不直接,直接影响通讯效率。
本文针对以上GIS的缺陷,提出了面向对象思想的组件技术、基于Agent思想的GIS技术及知识管理技术来开发简便、有效的GIS系统。
2.基于面向对象思想的组件技术GIS设计需考虑问题较多,涉及面较广,系统开发时,大多采用模块化的设计方法。
其中模块化的程序设计方法指的是把要共用的功能或相近的功能划分模块,以模块化的思想设计GIS。
此时,整个GIS通过若干个互相关联的过程调用不同的模块构成。
每一模块拥有自己的数据及实现方法,有利于系统维护和后续开发,同时,各模块可以通过调用当前模块或相关联模块来达到改变系统状态的目的。
基于BIM+GIS的室内外三维一体化系统设计与实现
基于BIM+GIS 的室内外三维一体化系统设计与实现廖菊燕柳州市勘察测绘研究院有限公司 广西柳州 545000摘要: 传统的虚拟场景是基于三维GIS 平台进行建立的,注重对海量地形数据的组织与调用、多分辨率地形的描述以及多源数据的集成,主要从宏观角度对室外地形环境进行表达,缺少室内空间的相关描述。
BIM 和GIS 两者优势互补,两者的结合能够实现室内外空间的一体化三维表达,实现微观和宏观的结合。
基于设计的框架,设计并开发了BIM+GIS 室内外仿真原型系统,以OSGEarth SDK 为基础,通过C++语言的二次开发,将上述方法进行集成,实现了集成可视化交互、信息交互、交互建模以及分析应用四大应用模块的室内外一体化空间的三维可视化场景,并针对具体应用实现了室内外一体化任务推演。
关键词: 三维一体化 BIM GIS 仿真原型系统中图分类号: TP274文献标识码: A文章编号: 1672-3791(2024)01-0018-04Design and Implementation of an Indoor and Outdoor 3DIntegrated System Based on BIM+GISLIAO JuyanLiuzhou Surveying and Mapping Research Institute Co., Ltd., Liuzhou, Guangxi Zhuang Autonomous Region,545000 ChinaAbstract: The traditional virtual scene is built based on a 3D GIS platform, and it focuses on the organization and invocation of massive terrain data, the description of multi-resolution terrain and the integration of multi-source data, mainly expresses the outdoor terrain environment from a macro perspective, but lacks the relevant description of the indoor terrain environment. The advantages of BIM and GIS are complementary, and the combination of the two can achieve the integrated 3D expression of indoor and outdoor space and realize the combination of micro and macro. This paper designs and develops a BIM+GIS indoor and outdoor simulation prototype system. Based on the design framework, on the basis of OSGEarth SDK, through the secondary development of C++, the system inte‐grates the above methods, realizes the 3D visualization scene of indoor and outdoor integrated space that integrates the four application modules of visual interaction, information interaction, interactive modeling and analysis and application, and realizes indoor and outdoor integrated task deduction for specific applications.Key Words: 3D integration; BIM; GIS; Simulation prototype system由于数据源的限制,3D GIS 创建的3D 场景通常使用抽象的几何对象(如点、线、面、体等)来表示真实世界。
暴雨中尺度系统监测与分析平台的设计与实现
尹新怀,陈红专,欧小锋,等.暴雨中尺度系统监测与分析平台的设计与实现[J ].湖北农业科学,2021,60(1):135-140.收稿日期:2020-04-07基金项目:湖南省气象局气象业务内网平台建设项目作者简介:尹新怀(1968-),男,湖南邵阳人,高级工程师,硕士,主要从事气象信息处理与气象业务系统开发研究,(电话)*************(电子信箱)***************;通信作者,陈红专(1972-),男,湖南长沙人,正研级高工,硕士,(电子信箱)****************。
暴雨是各种物理条件相互作用形成的中尺度天气系统影响的结果,其主要特征是生命史短、空间范围小、天气变化剧烈,常带来巨大的经济损失和人员伤亡[1-3]。
因此,对暴雨中尺度系统的研究一直是气象工作关注的重点。
其中,研发能综合处理多种气象资料的应用系统是暴雨中尺度系统研究的一个方向,如国家气象中心为满足强天气监测和潜势预报业务的需求,开发了强天气监测和潜势预报系统(NMICAPS 短时预报版)[4];中国气象科学研究院开发了中尺度灾害天气分析与预报系统综合显示平台[5];中国气象局武汉暴雨研究所针对长江中游强风暴天气特点和现代预报业务需求,研究建成了长江中游临近预报业务系统(MYNOS )[6]。
湖南省因其气候特征、地形地貌特征复杂,成为中国暴雨灾害发生最为频繁的省份之一,暴雨及其次生灾害对农业生产有巨大影响。
因此,长期以来,暴雨中尺度系统监测与分析平台的设计与实现尹新怀1,陈红专2,欧小锋2,高嵩3,钟艳雯1(1.湖南省信息中心,长沙410118;2.湖南省怀化市气象局,湖南怀化418000;3.国家气象中心,北京100081)摘要:介绍了暴雨中尺度系统监测与分析平台的组成、主要功能特征以及应用个例。
该平台融合了多种业务常用资料,通过综合应用计算机技术、地理信息技术、数据库技术和气象专业分析技术等信息处理技术,达到快速、有效地监测、分析和预报暴雨中尺度系统的发生发展。
城镇地籍数据库建库关键技术研究
城镇地籍数据库建库关键技术研究摘要:本文基于笔者多年从事地籍数据库建设的相关工作经验,以地籍数据库建设中需要二次开发提高数据质量的数据检查关键技术为研究对象,探讨了基于VC6.0++和MapGIS SDK6.7开发城镇地籍数据库的属性值检查程序的技术途径,全文是笔者长期工作实践基础上的理论升华,相信对从事相关工作的同行能有所裨益。
关键词:地籍数据库矢量数据属性数据拓扑检查MapGIS ArcGIS城镇地籍数据库的建设任务是在城市建成区和县所在地建制镇建成区范围内,建立包括土地利用、土地权属、基础地理等内容,集影像、图形、属性和文档于一体的数据库及管理系统。
主要内容包括基础地理信息数据、土地权属数据、土地利用数据、栅格数据、元数据、表格、报告文本、扫描文件等。
本文所使用的地籍数据库由MapGIS二次土地调查数据库建库系统(城镇版)(以下简称建库系统)来建设,其数据格式为MapGIS 的.WP(区文件)、.WL(线文件)、.WT(点文件)。
建库的操作流程软件帮助中都有详细说明,本文不再赘述,本文主要探讨建库中需要进行二次开发才能满足需求的关键技术实现思路。
在建库系统中自带了数据检查功能,基本满足属性数据和几何数据的检查,利用该检查模块可作为地籍数据库的初检。
为了提高产品质量,还应进行第二次检查,这就必须要求用另外一种方法来对该地籍数据库进行复检,本文正是在此情况下开发了一套复检的方法。
1 城镇地籍数据库检查内容依据《第二次全国土地调查数据库建设技术规范》中的规定,城镇地籍数据库的检查主要涉及矢量数据检查、属性数据检查、矢量数据与属性数据一致性检查、其它数据检查等4大项,以下又分了共计10个小项。
鉴于以上说提及的后两项检查相对容易,故本文主要讨论的复检方法集中在前2项。
1.1 矢量数据检查主要内容为线段是否自相交、两线相交、悬挂点、伪结点;多边形是否闭合、各多边形间的拓扑关系是否正确(如房屋应包含在宗地内),线点拓扑关系是否正确(如界址点应在界址线上)等。
CGIS手册
第一章系统简介CGIS是一个面向对象的专业化GIS系统,其特点如下:1. 简单直观、易学。
◆具备图形学基础者可在二十分钟内初步掌握系统的使用,两天内熟练掌握。
◆具备Windows基本操作经验者,可在两天内基本掌握,一周内熟练使用。
2. 面向对象的图形系统,精心的设计。
方便使用、方便用户的编辑和修改。
对图形对象可以用鼠标选定后,直接操作结点或双击后以活页夹方式来修改图形的属性和形态。
3. 成图自动化◆图形组合法、最小厚度法可直接生成高质量的柱状类图形。
◆分层平移法,可处理剖面中的任意的断层组合。
◆预定义边界凸包插入算法,可处理平面等直线过断层的问题,可以解决平面断层的任意组合。
4. 专业化的设计专业人员的专业化设计使系统尤其适合于地质、测量、采矿、水文和储量的日常设计制图和计算。
5. 任意的比例尺特设的图素比例尺和多种比例尺标准化点库、线库和图案符号库,使图形可以完全自动地从一种比例尺,平滑地转换为另一种比例尺,同时可根据需要保持局部图片的局部(插图)、不同图类(平面、剖面、柱状)组合图形的相关或独立。
6. 支持图形的局部窗口文件另存;图形文件的插入和图形文件的参考◆窗口另存可使我们从一幅大图中取出一个矩形的局部区域图形,(如从一幅矿图中取出一个局部作为采区图件的底图);图形嵌入可解决如图签、图例这样的可共用的图形文件插入问题,以及图幅的合并和拼接问题;图形参考可解决图形内容共用时的统一性问题,如:有十幅图参考了某一个图形文件,则当图形被修改和保存后,这十幅图可以自动改变,从而维护了不同图形文件中相关内容的一致性。
◆图形的嵌入和参考类似于复合文档中的文件的嵌入和连接。
7. 撤消和恢复功能,使用户可轻松操作,选择操作中的哪一步作为结果保存下来。
8. 动态、自由放缩技术。
9. 结点参数直接鼠标修改技术;支持Windows粘贴技术。
第二章系统安装和一般性操作2.1 系统组成系统组成文件如下:CGIS.Exe ____Windows 32位可执行文件。
在MFC中使用CFileDialog选择多个文件
在MFC中使用CFileDialog选择多个文件●个人总结●运行环境:Microsoft Visual Stadio 2010,基于MFC的多媒体播放器(自制)●运行结果:测试通过●说明:1)选择多个文件要求dlgFile.m_ofn.Flags标志设置为OFN_ALLOWMULTISELECT2)构建CFielDialog对象时指定了OFN_ALLOWMULTISELECT的情况下,需要在对象DoModal()函数返回之前需要指定足够大的内存空间来存放文件名。
如果选择的多个文件名组成的字符串长度大于指定的内存空间是就会导致DoModal()返回IDCANCEL。
3)一下程序是在自己制作的一个多媒体播放器程序中设计的,由于开始遇到了这样的问题,在网上查阅了不少资料,总结出来可以再VS中运行的程序。
4)重点:标志Flags、申请大内存pcbool CMedia::OpenFiles(){CFileDialog dlgFile(TRUE);//打开CFileDialog对象dlgFile.m_ofn.Flags |= OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_HIDEREADONLY;dlgFile.m_ofn.lpstrFilter = _T("Mp3 Files(*.mp3)\0*.mp3\0Wave Audio Files(*.wav)\0*.wav\0MIDI Files(*.mid)\0*.mid\0AVI Files(*.avi)\0*.avi\0All Files(*.*)\0*.*\0\0");const int nMaxFiles = 1000;const int nMaxPathBuffer = (nMaxFiles * (MAX_PATH + 1)) + 1;LPWSTR pc = (LPWSTR)malloc(nMaxPathBuffer * sizeof(WCHAR));int i = 0;if( pc ){dlgFile.GetOFN().lpstrFile = pc;dlgFile.GetOFN().lpstrFile[0] = NULL;dlgFile.m_ofn.nMaxFile = nMaxPathBuffer;if (dlgFile.DoModal() != IDOK){return FALSE;}POSITION pos = dlgFile.GetStartPosition();//获取第一个文件位置while (pos){m_FilePathName[i] = dlgFile.GetNextPathName(pos);CFile myFile(m_FilePathName[i],CFile::modeRead);m_FileName[i] = myFile.GetFileName();i++;}free(pc);}iSelectedFilesNum = i;Stop();Play();return TRUE;}CFileDialog::CFileDialogCFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName =NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter =NULL, CWnd* pParentWnd = NULL );BOOL bOpenFileDialog该参数为指定true是Open,false是Save as 对话框。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第32卷第6期2005年11月浙 江 大 学 学 报(理学版)Journal of Zhejiang U niversity(Science Edition)http :///sciVol.32No.6Nov.2005收稿日期:2004204230.基金项目:国家863资助项目(2001AA61303021).作者简介:郭宪杰(1979—)男,硕士研究生,主要从事地理信息系统的设计与应用、遥感数字图像处理等研究.一种基于MFC 的GIS 多文档多视图技术实现郭宪杰,张 微,章孝灿,黄智才(浙江大学地球科学系空间信息技术研究所,浙江杭州310027)摘 要:针对GIS 中数据分析与管理的多图层需要,在深入研究MFC 类库框架结构、分析Windows 应用程序开发流程的基础上提出了一种基于MFC 的多文档多视图框架结构的解决方案,该方案不仅与MFC 有着良好的继承、扩展和兼容性,可以快速地实现应用程序开发,而且又很好地实现了GIS 中图层管理的多文档多视图特点,满足了多源数据分析与管理的要求,实践表明这是一种可行的技术方案.关 键 词:地理信息系统;多文档多视图;图层中图分类号:TP391.41 文献标识码:A 文章编号:1008-9497(2005)06-711-05GUO Xian 2jie ,ZHAN G Wei ,ZHAN G Xiao 2can ,HUAN G Zhi 2cai (Department of Earth S ciences ,S patial I nf or 2mation Technolog y I nstitute ,Zhej iang Universit y ,H angz hou 310027,China )R elization of Malti 2Doc/Malti 2View in GIS b ased on MFC.Journal of Zhejiang University (Science Edition ),2005,32(6):711~715Abstract :In view of the demand of multi 2layer with data analysis ,processing and management in GIS ,by making a thorough research in MFC classes framework and analysing the routine of windows application ,a solution is put for 2word with Multi 2Doc/Multi 2View structure based on MFC.the practice shows that this solution can not only work with MFC fluently but also solve the problem in GIS.It ’s proved that this is a feasible solution.K ey w ords :GIS ;multi 2doc/multi 2view ;layer0 引 言地理信息系统(Geograp hic Information Sys 2tem ,以下简称GIS )是一种采集、存储、管理、分析和输出空间信息的计算机技术系统[1].据美国著名的GIS 专家J ack Dangermond 研究,世界上有80%以上的信息属于空间信息,全球空间信息资源总价值超过1000亿美元[2].GIS 已经成为信息高速公路的重要组成部分,也是完成数字地球的核心支撑技术之一[3],因此GIS 技术得到世界各国的重视并投入大量人力物力进行研究和开发.为实现GIS 系统的快速开发,必须选用一种高效的开发工具来提高开发效率.在目前流行的图形用户界面Windows 平台上有各种开发工具,由于Visual C ++与Windows 操作系统结合最为紧密,并且因其提供的M FC 类库具有功能强大、开发效率高等优点而被广泛应用.M FC (Microsoft Foun 2dation Class 微软基础类库)是由一组相互关联相互支持的类构建的应用程序模型,它采用面向对象的思想用C ++语言封装了Windows 平台的A PI 函数,使得应用程序开发可以在继承前人工作的基础上开发各自所需的应用需要,提高开发效率,加快开发进度,增加应用程序的可靠性和可维护性[4].M FC 应用程序模型中文档/视图结构的出现,不仅丰富了原有的应用程序对象和主窗口对象的简单模型,而且实现了数据存储和表达的分离,更加适合大型软件的开发[5].虽然M FC 在文档/视图结构中提供了多文档模板可以操作不同类型的文档数据,但是其本质仍然是一种单文档多视图的结构,即一份文档数据虽然可以在应用程序的多个视图中显现,但在一个视图中却只能表达一份文档数据.这种结构应用到GIS中的图层管理就遇到了困难.因为GIS系统本身是把各种类型的空间数据进行分层存储与管理的,在分析应用时则需要把多层数据进行叠置展现在同一视图中,因此图层管理是GIS系统的基本需要,多文档多视图结构是GIS的内在要求.有的作者提出“多文档多视图”同名的概念[6],但他的实现方法仅是在M FC多文档模板的基础上采用窗口分割技术实现多视图的,最后在一个视图中展现的仍然只是一个文档对象,而GIS中的图层管理要求在一个视图中表达多份文档数据,一份文档数据可以从不同的视图中显现.因此文献[6]中的方法与GIS应用中的多文档多视图要求是完全不同的.本文通过对M FC的单文档/多视图结构和GIS 图层管理中的多文档/多视图需求的深入研究,提出了一种通过改进M FC的单文档/多视图结构来实现GIS图层管理多文档/多视图结构的方案,该方案既充分利用了M FC强大的功能,又避免了其自身的缺点.通过笔者的具体实现证明该方法是切实有效的.1 GIS图层管理的多文档多视图结构由于GIS所管理的空间信息量较大,为了更好地组织、管理和使用各种类别地物的空间信息,针对一个工作区,通常是按照地物类别划分为若干图层来存储与管理空间信息的.这样可以采用相同的分析模型对同一图层进行数据分析并获取所需的信息,而进行综合分析时再把各个相关的图层进行叠置融合分析.这样,在数据采集时按不同的地物类别进行分层,每一图层都单独表达地理空间中的某一特征,多个图层则可以从多个方面来表示各种地理特征,更直观的就是把多个图层叠置在一起共同反映该地理空间的总体特性.图层概念的引入为解决海量空间数据的组织和管理提供了一种有效的方法,图层管理已经成为GIS应用开发的关键技术之一.图1为笔者实验所实现的多文档多视图结构的结果示意图.图中表达的是某一地理空间中的3个相关地理要素的图层信息:区划边界图、河流水系图和规划高速公路图.视图Ⅱ内是区划边界图,视图Ⅲ内是河流水系图,视图Ⅳ内是规划高速公路图,视图Ⅰ内则是综合其他3个子视图的地理信息.图1 GIS中多文档多视图结构示意图Fig.1 Multi2doc/multi2view structure in GIS可以从图1中的Ⅱ~Ⅳ视图的单个图层获得相应的地理信息.比如可以根据Ⅱ中的区划边界图计算各个行政区域的面积,了解相互之间的空间邻接关系;根据Ⅲ中的河流水系图可以计算该区域的水网密度;根据Ⅳ中的规划高速公路图可以计算交通路线长度等.但是从任何单个图层都只能获得有限的信息,它受限于原始数据的采集而不能衍生出更多的信息,而在叠加了区划边界、河流水系和规划高速公路的地图中则可以进行数据挖掘分析获得更多的信息,比如可以通过建立分析模型获得每一个行政区域内的交通运营能力,判断在该区域内增设交通路线是否必要且合理,在河流存在的地方架设高速公路是否增加了修建成本等.这样的衍生信息都是需要多个图层叠置综合分析才能获得的.图2 GIS中多文档多视图结构说明图Fig.2 Illuminate for multi2doc/multi2view structer in GIS GIS中的图层管理是基于多文档多视图结构的(以下论述中的文档即是GIS图层,两者为同一概念,不详加区分),多文档的含义是指在同一个视图内可以同时表达多个不同的数据文档,多视图的含义则是指同一个数据文件可以在多个视图内同步表达出来.图2为图1的多文档多视图结构的说明图,多文档模式即为子视图Ⅰ所示,它可以同时表达三个图层数据;多视模式即为图层一的表达模式(图层二、三亦如此),它的文档数据在子视图Ⅰ和子视图Ⅱ中都有表达,数据更新时会在各个相关视图中同步表现出来.217浙江大学学报(理学版) 第32卷 2 基于MFC 的GIS 多文档多视图框架结构设计2.1 MFC 的文档/视图结构M FC 的文档/视图结构是M FC 应用程序框架的核心技术和重要支撑,它的基本思想就是将数据的操作和数据的表达分开处理.文档对象是应用程序数据集的抽象,用于管理应用程序中的数据,所有对数据的定义和操作均在文档对象中实现;视图对象则是数据的用户窗口,它将文档中的数据在用户窗口中表达出来并提供与文档中数据进行交互的用户界面,表达数据并响应用户在视中操作.这种文档/视图结构使得模块划分更加合理,独立性更强,在开发大型软件项目时更加适用[5].基于MFC 文档/视图结构的应用程序主要有两种模式:单文档应用程序(SDI )和多文档应用程序(MDI ),MDI 相比较SDI 来说,它可以同时打开多个文档数据并支持同时在多个子窗口中进行操作,这种应用程序的模式满足GIS 的实际要求,作为本文的主要研究内容.图3 MFC 文档视结构示意图Fig.3 Doc/view structure in MFC图3为MDI 应用程序的MFC 文档/视图结构框架示意图.由图3可知,基于M FC 的应用程序通过文档管理对象的成员m_templateList 来管理打开的多种文档类型,又通过多文档模板对象的成员m_docList 打开同一文档类型的多个文档对象;但是在MFC 的文档视图类对象中,一个文档对象可以对应多个视图对象m_viewList ,也就是说一份文档数据可以在应用程序的多个窗口中表达;而一个视对象只对应于一个文档对象m_pDocument ,文档与视图的对应仅仅是单文档与多个视图的对应.文档至少有一个相关联的视图,视图只能与一个文档相关联[6].这种结构虽然在许多领域发挥了巨大的作用,但是它在面向GIS 的多源数据分析处理和管理中却存在着严重的不足,因为在GIS 中一个视图中必须可以同时表达多个文档数据才可以满足多源数据分析的内在要求.2.2 基于MFC 的多文档多视图结构设计MFC 框架结构设计的本意是让用户只需对最关心的用户交互对象———文档和视图进行操作,窗口的各种操作都被MFC 所封装而无需过细地干预,这样可以使用户从界面的编写中解放出来,而把主要精力放在具体任务的完成上.本文的目的就是通过继承并改造MFC 已有的强大且高效的功能,而达到多文档多视图的目的,并不改变原有MFC 的使用风格,使用户仍只需专注于任务的完成.由于M FC 的多文档模板类CMulti Template 在文档/视图结构中起到联络枢纽的作用,应用程序通过它来打开文档数据、创建窗口和视对象,并进行多文档的管理.因此,本文提出了通过继承并扩展CMulti Template 类来实现GIS 的多文档多视图功能的方案,鉴于视图类和文档类都与模板类之间存在较为紧密的联系,故本文同时扩展相应的文档类和视图类,具体实现是对图3中的虚线框部分进行了继承和扩展,改进后的框架如图4所示.图4 基于MFC 的多文档多视图结构示意图Fig.4 Multi 2doc/multi 2view structurein GIS based on MFC●C GISTemplate 类是完成多文档多视图功能的核心类,它是通过继承多文档模板类CMulti 2Template 并重载其对文档和视对象的操作来实现的.为了实现多文档/多视图的管理,在C GISTem 2plate 类中新定义了视链表成员m_gisViewList ;另外,虽然父类CMulti Template 中已有文档链表成员m_docList ,但它仅用来记录所打开的多个文档对象,不能实现GIS 中文档和视的多重对应操作(因其只能实现单文档/多视图功能),因此本文重317 第6期郭宪杰,等:一种基于MFC 的GIS 多文档多视图技术实现新定义了文档链表成员m_gisDocList用来管理当前模板所打开的文档图层.●C GISView类是通过继承视类CView来实现图层数据的用户表示与交互.为了实现视与多文档的关联功能,本文在其内部新定义了文档链表成员m_docList Self,其用于记录当前视窗口所关联的所有文档对象指针.视图更新显示时只需对该视的文档链表进行遍历即可.每个视对象可以通过文档链表成员添加或删除该视对象所关联的文档图层.●C GISDoc类是通过继承文档类CDocument 来实现图层数据的管理.虽然父类CDocument中已有成员m_viewList用来管理与该文档关联的多视,但因其不能满足多文档多视图的关联操作,故本文重新定义视链表成员m_viewList Self来记录当前文档所关联的所有视对象指针,其目的是增强对视链表的管理功能.每个文档可以通过视链表的增删操作实现该文档对象与哪些视窗口关联.3 G IS多文档多视类框架的封装和使用3.1 多文档多视类框架的封装实现所谓多文档多视图结构,就是一个文档可以与多个视图相关联;一个视图可以与多个文档相关联.基于上面的论述,笔者采用Visual C++ 6.0具体封装实现了GIS多文档多视功能的类框架,该类框架主要包括3类:C GISTemplate,C GISDoc和CGISView.多文档多视图的主要工作内容有打开文档、创建视图、关闭文档、消毁视图,同时在上述操作过程中需要对文档和视相互关联.本文设计的多文档多视图结构的实现过程如下:■打开文档 当应用程序打开一个文档图层时,首先指定其所属的视图对象,然后创建文档对象并在其视链表成员m_viewListSelf中填充指定视图的对象指针,其次模板对象CGIST emplate在文档链表成员m_gisDocList中添加该文档对象指针,最后查找该文档对象视链表中的所有视对象,在每个视对象的文档链表m_docListSeft中添加该文档对象.■创建视图 当创建一个视图对象时,首先指定该视对象要表达的文档图层,然后创建视对象并用指定的文档对象指针填充它的文档链表m_doc2 List Seft,其次在C GISTemplate的视图链表m_gis2 ViewList中添加视图对象指针,最后遍历视图的文档链表m_docList Seft查找各个文档对象,在每个文档对象的视图链表m_viewList Self后添加该视图对象指针.如图5所示,欲创建新视图对象来表达Doc1和Doc3的叠加时,先创建视图对象View3,并用Doc1和Doc3的对象指针填充视图对象的m_doc2 List Seft,然后在模板对象CGIST emplate的m_gis2 ViewList中添加该视图对象指针,最后遍历视图的文档链表m_docListSeft在Doc1和Doc3的视图链表中添加View3.即图5虚线所示.打开文档亦与此相同.图5 多文档多视图结构实现原理示意图Fig.5 Relization for multi2doc/multi2view structure in GIS■关闭文档 当关闭一个文档图层的时候,首先在文档的视图链表中查找其对应的所有视图对象,分别移除视图对象文档链表中的该文档指针,然后再在C GISTemplate中移除文档对象指针.■销毁视图 在销毁视图的时候,首先也要根据视图的文档链表遍历所有关联的文档对象,分别移除文档中的视图链表指针,最后再在CGIST em2 plate的视链表m_gisViewList中删除视图对象指针.如图5所示,若要移除View3对象,首先通过其文档链表成员找到Doc1和Doc3,然后再分别在每个文档的视链表中移除该视图对象指针(如Doc3中的View3),最后在模板对象的视图链表中移除View3本身.通过上述设计,C GISTemplate对象管理所有文档和视图对象,所有的数据操作都在文档图层类C GISDoc中完成,所有的用户响应操作都在C GIS2 View视图中完成.这仍然和M FC原有的文档/视图结构模式相一致,而C GISTemplate类对象仅是一个“后台管理者”协调多文档与多视图的关系,用户也不必关心它的具体实现.用户仍然可以像MFC 中的文档/视图结构一样从多个角度对一个文档数据进行观察,完成多视图的功能;同时还可以对一个视图中的任意图层进行添加删除,让多个图层同时在一个视图中表达完成多文档功能,从而实现了GIS的多文档多视图的功能.417浙江大学学报(理学版) 第32卷 3.2 多文档多视框架封装类的使用当用户要创建一个实现GIS多文档多视图功能的工程时,其文档模板可以直接引用或者继承于CGISTemplate模板类,同时用户的文档类和视图类分别继承于已封装的GIS文档类C GISDoc和GIS视图类CGISView,略做修改即可实现GIS多文档多视图功能,这样用户可以很容易地实现多文档多视图的图层管理.下面采用Visual C++6.0工具,以向导创建M FC的MDI应用工程GISTest为例,实例说明如何使用多文档多视图框架封装的类.其实现的具体步骤如下(黑体显示为需要修改的地方):(1)把已封装的GIS的类文件引入到GISTest 工程中去.(2)在头文件中添加类包含文件.(3)把GIST estDoc和GIST estView的父类都分别指定为CGISDoc和CGISView,并把工具生成的代码相应地用到的父类,继承方法也做相应的改变.(4)在C GISTestApp的Init Instance()中做如下代换:CGIST emplate3pDoc Template;//采用GIS2 Template模板来完成GIS的多文档多视图结构.pDoc Template=new CGIST emplate(//原始代码pDoc Template=new CMultiDoc Template (IDR_GISTEST YPE, RUN TIM E_CLASS(CGISTestDoc), RUN TIM E_CLASS(CChildFrame), RUN TIM E_CLASS(CGISTestView));AddDoc Template(pDoc Template);(5)注意在C GISTestView::OnDraw()中操作时调用GetDocument()为视链表中的一个图层,用户若想同时控制多个图层,亦可调用父类提供的文档链表操作的函数.通过上述操作,笔者实现了多文档多视图的简单示意图,包括行政区划图、河流水系图和规划高速公路图(如图1所示).4 结 论本文在深入分析GIS图层管理需求以及M FC 文档/视图结构优缺点的基础上,提出了一种通过改进MFC文档/视图结构来实现GIS多文档/多视图结构的方案,并且对该方案给予了具体的类的封装实现,实践表明该方案具有以下特点:●能充分利用M FC原有类库的强大功能;●没有过多地改变M FC的原有使用风格;●扩展了M FC对多文档多视图结构的支持;●封装类使用简洁方便,仅需微小改动就可以实现GIS的多文档/多视图结构.参考文献(R eferences):[1] 陈述彭,鲁学军,周成虎.地理信息系统导论[M].北京:科学出版社,2001.CH EN Shu2peng,L U Xue2jun,ZHOU Cheng2hu.I n2 troduction to G eographic Inform ation Systems[M].Bei2 jing:Science Press,2001.[2] DAN GERMOND J.The f uture of GIS Technology[A].Proceedings of the20th Asian Conference on R e2mote Sensing[C].Hong K ong:Asian Conference onRemote Sensing,1999.[3] 吴信才.GIS原理与方法[M].北京:电子工业出版社,2002.WU Xin2cai.Principle and Method in GIS[M].Bei2 jing:Publishing House of Electronics Industry,2002.[4] 候俊杰.深入浅出Windows MFC[M].第2版,武汉:华中理工大学出版社,2001.HOU J un2jie.Dissecting Windows MFC[M].2nd,Wu2 han:Publishing House of Huazhong University of Sci2 ence and Technology,2001.[5] 李泽宇,金刚,熊联欢,等.深入了解MFC中的文挡/视结构[J/D]./~maqianli/vc/Document/D_85.htm,2003210.[6] 梦凡.用VC++开发多视图多文档应用程序[J].电脑编程技巧与维护,2003,11:41-42.M EN G Fan.Multi2doc/multi2viwe programming withVC++[J].Computer Programming Skills and Mainte2 nance,2003,11:41-42.[7] 李久进.MFC深入浅出[M].武汉:华中理工大学出版社,1996.L I Jiu2jin.MFC in Dissecting[M].Wuhan:PublishingHouse of Huazhong University of Science and Tech2 nology,1996.[8] DAV ID J,SCO T W,GEOR GE S.Visu al C++6.0技术内幕[M].第5版,北京:希望电子出版社,2002.DA VID J,SCOT W,GEORGE S.I nsid e V isu al C++6.0[M].5th,Beijing:X iwang Electronics Press,2002.[9] 陈建春.Visulal C++开发GIS系统[M].北京:电子工业出版社,2000.CH EN Jian2chun.Developing GIS with Visu al C++[M].Beijing:Publishing House of Electronics Indus2 try,2000.(责任编辑 寿彩丽)517 第6期郭宪杰,等:一种基于MFC的GIS多文档多视图技术实现。