mapgis二次开发培训教程
MapGIS常见问题之二次开发相关问题
MapGIS常见问题中地数码集团平台二次开发支持部本期常见问题主要由MapGIS开发平台C/S开发问题组成,涉及部分B/S开发问题。
1、基于MapGIS开发平台,如何通过代码实现修改线的图形参数操作,包括可变颜色、可变笔宽、线型等参数?答:可按照如下步骤实现:(1)在MapGIS软件中若需查看线、区等要素的图形参数,需开启还原显示功能,可通过编写代码手动开启还原显示功能。
(2)在还原显示模式下,线是通过MapGIS符号库的线型来显示的,而线型符号则由几部分构成,而每一部分若采取固定颜色或者固定笔宽的模式,则无法看到修改后的线型参数。
只有在某一部分采取可变颜色或者可变笔宽的情况下,对图形信息中的相关项的修改才会有效果,因此可以通过修改符号库的相关线型的颜色模式或笔宽模式来达到效果。
(3)一个线型可以通过线型号+辅助线型号来唯一确定,以COM组件式开发C#语言为例的线属性如下:mcLinInfo. libID:辅助线型号mcLinInfo. linstyID:线型号(4)基于COM组件式开发C#语言的还原显示实现代码如下:mcLinInfolineInfo = new mcLinInfo();//线信息mcGeoVarLinevarLine = new mcGeoVarLine();//折线对象//点对象mcDot dot1 = new mcDot();mcDot dot2 = new mcDot();//点对象赋值dot1.x = 50;dot1.y = 50;dot2.x = 200;dot2.y = 200;//添加到折线对象varLine.Append2D(dot1);varLine.Append2D(dot2);//设置线参数lineInfo.linstyID = 21;lineInfo.libID = 4;lineInfo.xscale = 20;lineInfo.yscale = 20;//绘图IXDisplay display = this.axMapXView1.Display;//绘图对象display.DispLine(ptGeom as IGeoLine, lineInfo as mcLinInfo, 6);//根据线参数显示对应的线display.DisplayOption.SymbolShow = true;//开启还原显示功能display.DispLine(varLine, lineInfo as mcLinInfo, 0);//重绘制线2、在查看地图的过程中,常要通过不同比率显示地图,如何通过代码实现按照一定的显示比率显示地图的功能?答:步骤如下:(1)用户常常将显示比率与比例尺相混淆,比例尺一般应用于地图数据打印输出时,表示图上距离与实际距离的比值。
GIS二次开发第1课
Hale Waihona Puke ArcGIS 开发工具包,包括ArcGIS开发帮助、组件帮助、对象模型图和示例
ESRI Developer Network: /提供有关ArcGIS开发的最新信
息,包括更新的示例和技术文档
第一课 GIS二次开发基础
ArcGIS 产品体系
ArcObjects的类之间存在四种关系
依赖关系 关联关系
组合关系
类型继承
对象模型示例
WorkspaceFactory
Map
*
Workspace Layer
MapControl
Curve
Map Segment Path PolyCurve
什么是组件对象模型
软件重用和开发效率始终是软件开发的核心问题。
在早期(面向过程语言),人们为了重用,将一些基本的数学计算 函数和界面设计函数设计成函数库,让其他软件开发人员调用。它
为应用开发者提供了方便,但是重用的粒度太小。
面向对象语言的出现,提高编程的粒度。面向对象语言的基本单位 是类,它封装了数据成员和函数成员 ,将最小组件的粒度提高了一
个等级。但是,一个类提供很多种方法和属性,使用和管理很不方
ArcGIS Engine—通过多种应用程序接口建立自定义应用程序的嵌 入式GIS组件库。
ArcGIS Server—为企业和Web计算框架建立服务器端GIS应用程 序的一个平台,可用于建立Web服务和Web应用程序。
ArcIMS—通过开放Internet协议发布地图、数据和元数据的GIS
Web服务器。
COM知识要点
COM的缺陷
利用VB和MAPGIS基本控件做二次开发
安装MAPGIS SDK软件到MAPGIS安装路径下。
添加声明模块vbW60_Area.bas,该模块包含MAPGIS基本参数及结构定义、消息与版本定义等。添加的方法是:在VB程序中点取"Project"菜单下的"Add Module",添加vbW60_Area.bas文件,该文件在MAPGIS安装程序的Basic子目录下。
主界面上还要放置图形编辑和显示控件:EditView.ocx。首先要将该控件添加到控件面板中,方法是:在VB程序中点取"Project"菜单下的“Components”,将EditView ActiveX Control Module控件打钩,如下图所示。
然后按照VB的常规编程设计方法使用该控件,在FORM窗体上划出该控件的大小和位置。设置各个控件和菜单的属性等参数。
设置可执行文件输出目录。生成的可执行文件必须放在与MAPGIS安装目录的动态库和控件相同的目录中才能执行。设置的方法是:点取"File"菜单下的"Make *.exe..",选择MAPGIS动态连接库所在的目录,如PROGRAM。
第二步:设计功能界面。
本文中演示的基本设计功能描述如下。程序分为四个主要的菜单:文件、编辑、窗口和帮助,每个菜单有分别有相应的功能。
End Sub
'弧段转线
Private Sub ArcToLne_Click()
ev1.ArcToLine
End Sub
'清除窗口并及时更新显示
Private Sub Clear_Click()
ev1.CleanWindow
ev1.RestoreWindow
GIS二次开发使用PPT教案
Class flyBird inherit from Bird{ String Name; Publice fly { … }
}
第15页/共45页
在OOP中,继承的概念很好的支持了代码的重用 性(reusability),也就是说,我们可以向一 个已经存在的类中添加新的特性,而不必改变 这个类。这可以通过从这个已存在的类派生一 个新类来实现。这个新的类将具有原来那个类 的特性,以及新的特性。而继承机制的魅力和 强大就在于它允许程序员利用已经存在的类 (接近需要,而不是完全符合需要的类),并 且可以以某种方式修改这个类,而不会影响其 它的东西。
第23页/共45页
第24页/共45页
DCOM
基于分布式环境下的COM被称作 DCOM(Distribute COM,分布式组件对象模 型)。
DCOM是ActiveX的基础,它实现了COM对象 与远程计算机上的另一个对象之间直接进 行交互。
第25页/共45页
ActiveX与ActiveX控件
第26页/共45页
ActiveX的内容
ActiveX控件(ActiveX Control):
用于向WEB页面、Microsoft Word等支持 ActiveX 技术的容器(Container)中插入 COM对象;
ActiveX文档(ActiveX Document):
用于在Web Browser或者其它支持ActiveX的 容器中浏览复合文档(非HTML文档),例如 Microsoft Word文档、Microsoft Excel文 档或者用户自定义的文档等
第27页/共45页
ActiveX的内容
ActiveX脚本-(ActiveX Scripting)
GIS二次开发第二章AO基本理论
属性页
事件
“伙伴”控件
GIS二次开发
2.4 Arcobjects的常用控件
2.4.2 主要控件简要
在ArcGIS 中,Arcobjects包含的控件最多、最全。
主要包括:
地图控件(MapControl) 布局控件(PagelayoutControl) 工具条控件(ToolbarControl) 图层控件 (TOCControl) 三维显示控件(SceneControl) 全球显示控件(GlobeControl) 地图浏览控件(ReaderControl)
表示符号:
实例化(Instantiation)指定一个类的对象具有
能够创建另外一个类对象的方法。
GIS二次开发
2.3 使用对象模型图(OMD)
2.3.3 类与类之间的关系
聚合关系
表示符号: 聚合(Aggregation)是一种不对称的关联方式, 在这种方式下一个类的对象被认为是一个“整 体”,而另一个类的对象被认为是“部件”。
GIS二次开发
2.1 COM基础
2.1.2 什么是COM
COM(Component Object Modal的简写),即组 件对象模型,是组件类、组件接口和组件间相互说明的 集合。
COM不是一种面向对象的编程语言,而是微软公司推 出一种协议或者标准。 COM不仅仅是一种技术,更是一种软件开发的方法 (论)。
GIS二次开发
第2章 Arcobjects的基本知识
图2-1 控件、组建库、类和接口之间的关系
GIS二次开发
第2章 Arcobjects的基本知识
2.3 使用对象模型图(OMD)
用C 实现混合使用MAPGIS的多种二次开发方式
图3 然后选择GisEdit Contrl控件并插入,如图4、图5所示。
图4
图5 调整对话框大小及GisEdit控件大小,添加几个功能按钮,如图6所示。 白色部分为GisEdit控件。
图6 用C++实现混合使用MAPGIS的多种二次开发方式(二) 为了操作GisEdit控件,在ClassWizard中,将GisEdit控件添加为成员变 量。变量名为m_MapGIS。如图7所示
图1 注册成功后,出现图2所示对话框:
图2 如果没成功的话,看看是否和MAPGIS的DLL文件放在同一目录下,因为 它还要依赖MAPGIS的DLL库。 然后用VC中的MFC AppWizard生成一个对话框架的应用程序。打开 所生成的对话框资源,在对话框资源上右击,并选择Insert ActiveX Control…菜单。如图3所示。
} 为了在视窗改变大小时,m_MapGIS控件也改变大小,为视类添加一个 WM_SIZE消息,在其生成的OnSize函数中添加如下代码。 void CMapView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here m_MapGIS.MoveWindows(cx,cy);// GisEdit控件中新增的改变窗口大小 函数 } 在菜单资源中,修改“打开文件”项,改成“打开工程文件”;并将其(资 源ID号:ID_FILE_OPEN) 在视窗类中(本例为CMapView)建立消息 映射。在映射函数中加入如下代码: void CMapView::OnFileOpen() { // TODO: Add your command handler code here m_MapGIS.LoadProject(); } 编译整个工程并运行,打开一个MAPGIS工程文件,运行结果如图11, 所示
03.MapGIS VirtualEarth二次开发技术篇
MAPGIS VirtualEarth 二次开发技术篇目录目录..............................................................................................................................................- 2 -1 概述..............................................................................................................................- 3 -2 开发环境介绍..............................................................................................................-3 -2.1开发环境................................................................................................................- 3 -2.2开发软件---Eclipse................................................................................................- 4 -3 MAPGIS VirtualEarth二次开发技术........................................................................- 14 -3.1 JavaScript脚本语言.............................................................................................- 14 -3.2 Java语言...............................................................................................................- 16 -3.3 HTML语言..........................................................................................................- 18 -3.4 JSP技术................................................................................................................- 19 -3.5 数据库(SQL Server/Oracle)..........................................................................- 20 -3.6 XML语言.............................................................................................................- 21 -1 概述MAPGIS VirtualEarth是中地数码拥有自主产权的一套显示三维地球的软件,它依托MapGIS平台为基础,基于Java applet技术和JOGL技术开发。
MAPGIS二次开发讲义
MAPGIS二次开发讲义成熟实用的地理信息系统(GIS)的重要标志就是它提供给用户的二次开发能力。
MAPGIS提供完整的二次开发函数库。
用户完全可以在MAPGIS平台上开发面向各自领域的应用系统。
操作系统、MAPGIS开发库及MAPGIS应用程序的相互关系如下图所示:MAPGISMAPGIS应用程序空间分析窗口操作…图库操作图形、图象I/O开发库工作区管理MAPGIS二次开发函数库包括下表所列部分,这些库函数都支持Window3.某,Window95和NT操作系统。
MAPGIS二次开发函数库支持的语言包括Borlandc++,Viualc++,Viualbaic等高级语言程序设计环境。
函数库名称动态库文件32位函数库(支持Window95,NT)c,c++连接文件工作区基础函数图形显示输出工作区管理函数图形窗口操作空间分析函数地图库读取显示图形编辑函数ba32.dllMapdp32.dllw32_area.dllW32_oper.dllW32_anly.dllD32_view. dllMaped32.dllBa32.libMapdp32.libW32_area.libW32_oper.libW32_anl y.libD32_view.libMaped32.lib表1MAPGIS函数库c,c++说明文件Win_area.hMap_out.hWin_area.hWin_oper.hSpc_anly.hDb_view.hMapedi t.hvb说明文件W32_area.baMapdp32.baW32_area.baW32_oper.baW32_anly.baMaped32.ba Window3.某、Window95、WindowNT基于MAPGIS平台的应用程序MAPGIS二次开发函数采用匈牙利命名法,即动宾结构命名法,并且所有函数都以下横线开始,以便和Window函数以及其他语言函数明显区别开来,如_GetLin表示取线实体;在ViualBaic环境下,由于ViualBaic语言不能识别以下横线开始的函数名,所以库函数都以字母b开始,如bGetLin表示取线实体。
MapGIS开发平台二次开发
Jar包
功能
备注说明
dcs-cls-1.0.0
集群管理服务
提供对DCServer集群的管理能力
dcs-cms-1.0.0
控制管理服务
提供对数据中心服务器的管理能力
dcs-dws-1.0.0
数据仓库服务
目录服务、地图服务、要素/栅格服务、三维数据服务、空间参考系服务等
dcs-fws-1.0.0
IDesigner:为MapGIS IGSS设计开发中心的应用层,基于DataCenter服务之上的Web服务体系,IDesigner以服务插件方式提供Web服务扩展,实现GIS功能与其他业务功能的扩展。
AppCenter:“空间信息软件应用中心”支持多类型的客户端——桌面端、Web端、移动端的应用,可便捷地获得GIS服务。通过SCenter的不断积累,AppCenter可提供的服务不断增多,能最大限度地满足用户的需求。
COM组件二次开发接口
组件级别的二次开发接口,提供二次开发需要的各种功能函数的支持,亦能同C++接口一样无差别的完成二次开发功能。
1.
模块
库文件
备注说明
TDE框架
TDEMain7.dll、TDEPluginBase7.dll、TDE3DCommon7.dll、FeatureNodeLayerLib.rpk、TDECommon7.dll、……
DesignCenter:“设计开发中心”提供了一个“零编程、巧组合、易搭建”的可视化搭建开发环境。不需要技术高超的程序员,不需要大量的编码,只需简单的搭建配置流程,结合个别满足特定需求的插件,即可实现复杂的应用。
SDesigner:为MapGIS IGSS设计开发中心的基础内核,并提供底层服务的扩展开发,即通过跨平台的内核服务群向上封装扩展,或采用服务插件方式扩展,同时可结合工作流机制进行功能扩展。
MapGISK9培训(数据处理)
大比例尺的标准图框
• 1:2000标准图框如图:
20
大比例尺的非标准图框
• 以1:2000为例,其他大比例尺的非标准框生成方法类 似;
• 第一步:单击“工具”—“生成矩形图框”—“生成任 意矩形框”
21
大比例尺的非标准图框
第二步:设置图框参数
• 矩形分幅方法为: 任意 矩形分幅;
• 设置起始公里值、 结束 公里值、公里值间隔
42
手动误差校正
• 第三步:选择采集实际控制点命令 ,在当前编辑的图 层中点击选择已知控制点,弹出“是否选择该 点”的对 话框,点击“是”,弹出“输入控制点理 论值”对话框 ,如图所示。同样的采集方法,依次输入多个控制点的 信息,另存控制点文件;
43
THANKS!!
28
成批投影或转换
• 第三步:选择“投影变换”,弹出对话框,设置目的 空间参照系,点击“执行”按钮,转换完毕。
误差校正
——在图形的扫描输入或是数字化过程中, 由于操作的误差、数字化设备的精度以及图纸 的变形等因素,使得输入的图形存在局部或整 体的变形。为了减少输入图形的变形提高图形 精度,要经过误差校正。
35
全自动误差校正
• 第二步:点击“设置控制点采集参数”命令,弹出如 下设置对话框,根据数据情况,进行参数设置;
36
误差校正
• 第三步:将“方里格网.wl”设为当前编辑状态,点击 “自动采集控制点”命令,如下图
37
误差校正
• 第四步:将“标准.wl”设为当前编辑状态,点击“自动 采集理论控制点”命令,弹出理论值与匹配值对话框; 单击确定
38
全自动误差校正
• 第五步:点击“另存控制点文件”按钮就完成保存控 制点文件(*.pnt)。
Mapgis二次开发(入门)
Mapgis二次开发(入门)——MFC下的基本步骤作者:刘明瓒成都理工大学QQ:34194203欢迎大家转载此文,但请在转载时保证文章的完整性开发平台:VC++6.0&&Mapgis6.75内容:mapgis二次开发的一些基本概念和基本步骤要求:阅读此文需要一定C++编程基础和一点MFC的知识以及一点mapgis知识。
1概述1.1Mapgis二次开发的作用扩展mapgis产品功能,以达到自己的目的。
简单讲有:简化操作(将mapgis产品提供的功能包装,以前要点几下的现在点一下就可以了),功能扩展(mapgis产品没有的功能,可以通过二次开发自己实现),功能应用(自己开发的某个系统如果想使用mapgis里面的一些功能,可以通过二次开发直接拿到自己的系统中),……等等。
1.2基本概念有一点需要说明,mapgis二次开发所有API函数都是以“_”开头的,如_OpenPntArea、_GetPnt、_GetLin等等。
其他概念在要碰到时在谈。
1.3所需工具1、Microsoft Studio VC++6.02、Mapgis6.75产品及二次开发包以上工具网上均有免费下载, 进行一下步骤时请先下载并安装好。
2Mfc向导与工程设置2.1新建工程(1)打开VC++6.0 【File】->【New】选择【Projects】选项卡、【MFC AppWizard(exe)】、填入工程名称Mapgis_1,点击【OK】如下图:(2)选择Dialog based (为简单起见)点击【Finish】新建工程完毕2.2工程设置(1)点击菜单栏【Project】->【Setting】选择【C/C++】选项卡 Category:中选择【Code Generation】Struct member alignment选择【1 Byte】点击【OK】说明:此步设置是将C++结构体成员的内存对齐方式设置为1字节,因为mapgis6.X的开发就是采用的此对齐方式。
MapGis二次开发
Dim ldot As New L_DOT
例如,使用CreateObject函数声明和创建一个新的MapGis对象:
Dim ldot As L_DOT
Set ldot = CreateObject("MapGisBasCom1.L_DOT")
有些版本的Visual Basic 使用虚函数表绑定(vtable-binding),或早期绑定。直接使用
4.释放MAPGIS对象。
使用一个句点(.)把对象变量与该对象的属性、方法和集合分开。
四、使用C++和COM函数
可以使用C++和COM函数编写使用MAPGIS对象的程序。在C++程序中使用
MAPGIS对象所要求的步骤是:
1.嵌入MAPGIS对象和COM头文件,并链接到COM库。
hr=CoCreateInstance(CLSID_PntArea,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPntArea,
(void**)&ptPAi);
注意:一个多线程程序,必须串行化对MAPGIS对象的所有访问,以避免重入.
[Directoris].[Library files]中加入“e:\mapgis62\lib”;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
二次开发基础知识
一、手动注册组件与注销组件
COM以及客户应用程序所需的、用来定位组件及对组件进行实例化的信息存储在
控制点操作 w32_cpnt.h
MAGIS二次开发培训教程
MAGIS二次开发培训教程前言MAPGIS是武汉中地信息工程有限公司研制的具有自主版权的大型基础地理信息系统平台它是一个集当代最先进的图形图像地质地理遥感测绘人工智能计算机科学于一体的大型智能软件系统是集数字制图数据库管理及空间分析为一体的空间信息系统是进行现代化管理和决策的先进工具MAPGIS连续四年在全国GIS测评中名列第一并成为唯一连续四年获得国家科技部向社会推荐的国产GIS软件平台中地软件丛书之MAPGIS二次开发培训教程是根据最新推出的MAPGIS软件平台编写而成主要介绍进行MAPGIS二次开发必须具备的基础知识主流开发工具以及MAPGIS系统的基本概念结构体系和操作方法该教程分为三个部分共十一讲其中第一部分即第一讲的内容介绍Windows编程的概念包括类与数据封装继承重载虚拟函数与多态性以及内存管理该部分为可视化编程的基础有可视化编程经验的读者可以略过此讲直接进入下一部分的学习第二部分即第二讲的内容编程工具VC对于在VC这样一个编程环境中开发应用程序所应熟悉的概念术语和最基本的框架构件实现过程等知识做了一个简明扼要的介绍已掌握一定VC编程基础知识的读者可以略过该部分第三部分即第三讲至第十一讲的内容详细讲述了地理信息系统的基本概念包括GIS原理概述空间数据类型空间数据库空间数据结构与数据管理等内容MAPGIS的基本概念和体系结构简要描述了MAPGIS二次开发的基本概念术语工作区空间实体及其数据C类组织和开发环境介绍的内容MAPGIS空间数据存取和属性编辑包括工作区空间实体和属性的操作及其网络介绍图形显示输出及窗口操作图形编辑类库和控件开发矢量空间分析和属性查询投影变换图框生成和工程管理图库管理和查询系统包括基于图库的应用程序开发MAPGIS图库介绍开发的一般步骤以及结合图库显示说明图库主要函数的功能等方面的内容以及图象分析与处理这一部分为本教程的主要部分能使大家从了解到熟练掌握这个部分的内容也是我们编制本书的主要目的同时它还可被作为MAPGIS二次开发过程中的参考来使用参加本书编写的人员主要是本系统的软件开发人员以及长期从事MAPCAD和MAPGIS培训的教师由于时间仓促书中难免存在错误和不当之处敬请广大用户及读者提出宝贵意见和建议以利改进中地软件丛书编委会2001年10月目录第一讲基于WINDOWS编程的基础知识 111引言 112类与数据封装 113继承 214重载 415虚拟函数与多态性 5第二讲编程工具VC 821熟悉VC开发环境822消息与命令 823文档视结构 1024图形设备接口1125对话框和控件1226编程规范13第三讲地理信息系统基本概念1531 GIS原理概述1532 GIS空间数据类型1733 GIS数据管理1834空间分析2035地理信息系统发展20第四讲 MAPGIS的基本概念和体系结构 2241 MAPGIS二次开发的基本概念2242 MAPGIS基本术语2343 MAPGIS的数据管理工作区2544 MAPGIS的空间实体及其数据组织2745 MAPGIS的C类组织 2946 MAPGIS的VC开发环境介绍 30第五讲 MAPGIS空间数据存取和属性编辑32 51工作区操作 3252空间实体操作3453属性属性结构操作3754网络介绍44第六讲图形显示输出及窗口处理4561图形显示输出4562窗口处理4963类库开发中的图形显示和窗口处理51第七讲图形编辑类库和控件开发5371图形编辑开发概要5372图形编辑API函数开发5373 MAPGIS类库开发5474 MAPGIS控件开发60第八讲矢量空间分析和属性查询6681矢量空间分析6682属性查询检索71第九讲投影变换和图框生成7391投影变换 projdllhcordcvth 7392图框生成 frmdll32h 83第十讲图库管理和工程管理91101 MAPGIS图库简介91102基于图库的应用程序的开发92103结合图库的显示说明图库中主要函数的功能92 104工程管理 prj_disph和map_prjh 96第十一讲 MAPGIS图象处理和分析101111遥感图象处理的基本知识101112处理方法101113主要API 介绍 99114组件介绍107115在VC中的开发过程结合示例程序讲解108116示例程序说明109附录 MAPGIS 二次开发问题集锦1101属性和属性结构1102空间实体操作问题1233显示编辑问题1244空间分析问题1315数字高程模型1316安装问题1347工程问题1358输出问题1369其它 138第一讲基于WINDOWS编程的基础知识11引言111 过程化 procedural programming程序被认为是在一个数据集合上进行的一系列操作112 结构化 structured programming主要思想是功能分解并逐步求精113 面向对象的程序设计 object_oriented programming实质是把数据和处理这些数据的过程合并为一个单独的对象――一个具有确定特性的自完备的实体114 面向对象程序设计的特征1 封装2 继承3 多态12类与数据封装121 什么是类简单的说类就是一种用户定义的数据类型跟结构类似并且类具有自己的成员变量和成员函数方法通过它们可以对类自身进行操作如汽车可以看作是发动机车轮座椅等诸如此类的集合也可以从功能的角度来研究譬如能移动加速减速刹车等例如class CMyClass1protectedCMyClass1publicvirtual CMyClass1122 封装encapsulation定义指能够把一个实体的信息功能响应都装入一个单独的对象中的特性封装的优点如下1 封装允许类的客户不必关心类的工作机理就可以使用它就象驾驶员不必了解发动机的工作原理就可以驾驶汽车一样类的客户在使用一个类时也不必了解它是如何工作的而只需了解它的功能即可2 所有对数据的访问和操作都必须通过特定的方法否则便无法使用从而达到数据隐藏的目的123 对象对象就是类的实例类与对象的关系就如类型和变量的关系所有对类的操作都必须通过对象来实现当一个类定义了多个对象时每个对象拥有各自的成员数据124 类的三种成员类型1 私有成员 private 缺省情况下一个类中的所有成员都是私有的私有成员只能被类本身的成员函数访问并且不具有继承性2 公有成员 public 公有成员可以被类成员函数和外部函数使用3 保护成员 protected 类的保护成员能被类及其派生类的成员函数和友员函数使用具有继承性125 构造函数与析构函数1构造函数a 是特殊的成员函数在创建对象时首先由系统自动调用它的作用是为新创建的对象分配空间或为该对象的成员变量赋值等b 构造函数名必须与其类名称完全相同并且不允许有返回值2析构函数a 析构函数是构造函数的逆操作b 析构函数在类名之前加来命名它不允许有返回值也不允许带参数并且一个类只能有一个析构函数13继承131 传统程序设计的缺点增加功能对程序所作的修改工作量非常大132 继承的优点继承的方法允许在不改动原程序的基础上对其进行扩充这样使得原功能得以保存而新功能也得以扩展这有利于减少重复编码提高软件的开发效率133 基类与派生类1一个类可以继承其它类的成员被继承的类叫基类或父类继承类叫派生类或子类2派生类不但拥有自己的成员变量和成员函数还拥有父类的成员变量和成员函数134 类的保护成员 protected前面介绍了类的私有成员只能被类的成员函数和友员函数使用类的保护成员能被类及其派生类的成员函数和友员函数使用也就是说类的保护成员具有继承性而类的私有成员不具有继承性135 公用基类和私有基类1公用基类中的所有public成员在派生类中仍是public成员所有protected成员在派生类中仍是protected成员2私有基类中的public成员和protected成员在派生类中均变成private 成员136 多重继承1多重继承的定义方法例子class Apublicint ivoid func1class Bpublicint ivoid func1class C public ABvoid Show缺省情况下基类被定义为 private因此基类B为私有基类2继承的不确定性例子class Cpublic ABvoid Showj iifunc1由于基类A和B中同时拥有数据成员i和成员函数func1类C引用基类的成员时系统无法分辨是调用哪一基类的成员而发生错误3解决多重继承的不确定性使用域操作符指明要调用的基类即可解决不确定性问题class Cpublic ABint jvoid Showj AiBiAfunc1137 多层继承定义所谓多层继承指的是从一个类派生出另一个类然后以派生类作为基类派生出另一个类直到最后生成的派生类满足需要为止见MSDN中的Hierarchy Chart138 派生类的构造函数与析构函数在继承关系下派生类的构造函数负责调用基类的构造函数来设置基类数据成员值例class base基类publicint ibase int j构造函数i jclass derivedpublic base派生类publicdouble fderived int doublederivedderived int k double l base k派生类构造函数f l139 构造函数的调用顺序1 在定义派生类对象时系统首先调用基类的构造函数然后调用派生类的构造函数在上例中derived类首先调用base类的构造函数然后调用自身的构造函数2 析构函数的调用顺序与构造函数的调用顺序相反14重载141函数重载1如果函数有相同的名称和返回值而有不同的参数个数或参数类型则这些函数就是重载函数2派生类继承了基类的某一函数并且又自定义了一个同名函数有相同的返回值不同的参数类型或参数个数这种情况不属于重载因为它们属于不同的域3例class basevoid func int ivoid func double fvoid func double f long q142 操作符重载重载操作符的定义返回值类型 operator op 参数表其中op为重载操作符它必须是VC中所定义的运算符然后像定义函数一样定义重载操作符函数例子class personint agevoid operatorvoid personoperatorage15虚拟函数与多态性多态性是面向对象程序设计的精髓之所在也是C中最难理解和掌握的部分在C中多态性是建立在虚拟函数基础上的虚拟函数的使用使类的成员函数表现出多态性151虚拟函数1函数的定义在定义类时在其成员函数前加上关键字virtual2如果基类中成员函数定义为虚函数则派生类中与其定义完全相同的成员函数编译器自动将其视为虚函数3只有类的成员函数才能定义为虚函数4虚拟成员函数的存取要看首次定义它的类中该函数是public还是private 例class Insectvirtual bool CanFlybool Insect CanFlyreturn FALSEclass Butterflypublic Insectbool CanFlybool Butterfly CanFlyreturn TRUE152 虚函数的调用根据对象的不同而去调用不同类的虚拟函数可以使用基类对象调用派生类对象即将派生类对象或指针赋值给基类对象或指针反方向的赋值将基类的对象或指针赋给派生类的对象或指针是危险的例bool rtnInsect inc1pIncButterfly btflypInc inc1 pInc指针指向Insect对象rtn pInc- CanFly 返回FALSEpInc btfly pInc指针指向Butterfly对象rtn pInc- CanFly 返回TRUE153 虚拟函数与重载函数的区别1形式上重载函数要求有相同的返回值类型和函数名并有不同的参数序列而虚拟函数要求三者完全相同2重载函数可以是成员函数或非成员函数而虚拟函数必须是成员函数3调用方法上重载函数根据所传递的参数序列的差别作为调用的依据而虚拟函数则根据调用对象的不同而去调用不同类的函数4虚拟函数在运行时表现出多态功能而重载函数不具有这一功能154纯虚函数定义virtual type funcname parameter 0C中有时设计基类就是为了被继承而基类中的虚拟函数不做任何工作这种情况下可以将基类中的虚拟函数定义为纯虚函数包含纯需函数的类叫抽象类抽象类不能定义对象但可以定义指向它的指针习题11什么是类12理解封装继承和多态第二讲编程工具VC21熟悉VC开发环境211 VC向导提供的帮助以前Windows编程需要程序员编写大量的框架代码这对初学者来说简直就是一个噩梦并且这些框架代码基本相同因此Microsoft提供了向导AppWizard 帮助生成框架代码这极大的方便了我们编写程序212 VC向导可以生成的工程类型ATL COM AppWizardCustom AppWizardDatabase ProjectISAPI Extension WizardMakefileMFC ActiveX ControWizardMFC AppWizard DLLMFC Database WizardWin32 ApplicationWin32 Console ApplicationWin32 DLLWin32 Static Library213 建立第一个应用程序使用向导AppWizard生成典型的应用程序基于多文档的可执行程序214 如何获取帮助Microsoft的MSDN提供了编程所需的绝大部分信息使用F1键可以打开MSDN帮助22消息与命令221 消息消息是Windows编程不同于其它编程方式的地方如DOS环境下编程消息就是操作系统通知应用程序某事已发生的一种方式如用户已输入已单击或移动鼠标打印机已空暇等222 消息传递1 尽管操作系统用整数来引用消息但所有消息都通过它们的名字来引用一个巨大的define语句将消息名同数值联系起来不同消息由操作系统或应用程序的不同部分处理如当用户在窗口上移动鼠标时窗口得到一个WM_MOUSEMOVE消息它几乎全部传送给操作系统去处理2MFC允许程序员忽略底层消息并使得在单独类级别上声明每个类处理哪些消息更容易223 消息循环1任何windows 程序的核心是消息循环这通常包含在WinMain 例程中2MFC 通过消息映射来保持消息处理函数与消息处理信息的一致224 消息映射消息映射是进行windows 编程的一部分MFC 方法用来代替编写向用户的WinProc 发送消息的WinMain 函数及编写检查消息类型的WinProc 函数用户只需编写处理消息的函数并且在用户的类中增加一个消息映射即可其它一切由MFC 处理225 消息映射宏在类声明的结尾部分使用宏 DECLARE_MESSAGE_MAP来声明在类定义部分需要消息映射在CPP文件中使用宏 BEGIN_MESSAGE_MAP和END_MESSAGE_MAP来声明消息映射在两个宏之间声明消息的映射函数226 常用消息映射宏ON_COMMAND 用于将特定命令的处理委派给类的一个成员函数ON_MESSAGE 用于将用户自定义消息的处理委派给类的一个成员函数227 使用ClassWizard帮助用户捕获消息1带标签的ClassWizard对话框通过选择ViewClasswizard或按CtrlW可以显示主Classwizard对话框在对话框的顶部有两个下拉列表框一个用于提示正在处理的工程文件本例是另外一个用于提示哪一个类拥有正在进行编辑的消息映射在这两个组合框下面是一个列表框左边的框列出了类本身和用户局面可以产生的所有命令右边的框列出了这个类可以捕获的所有Windows消息也列出了许多捕获常用消息的虚函数在这些框的右边是一些按钮它们的作用分别是向工程文件增加新类向类中增加一函数以捕获被高亮显示的消息删除正在捕获消息的函数以及为捕获高亮显示消息的函数打开源代码口通常用户选中一个类选中一个消息并单击Add Function来捕获消息下面就是Add Function按钮所做的事情将一个骨架函数添加到应用程序源文件的末尾在源文件的消息映射中增加一个入口在包含文件中的消息映射中增加一个入口更新对话框中的消息和成员函数列表2添加Windows消息处理函数对话框还有另外一种捕获消息的方法用户可以右击ClassView中的类名然后从出现的快捷菜单中选择Add Windows Message Handler这时将出现如下图所示的对话框228 命令命令是一种特殊的消息类型用户在任何时候选择一个菜单项单击一个按钮或告诉系统做什么windows 都将产生一个命令 ClassWizard可帮助用户捕获命令运行界面与消息捕获类似命令消息都通过被选择的菜单或被单击的按钮的资源ID与相应的处理函数进行关联只有从CWnd派生的对象可以接收消息每个资源ID仅关联两个消息COMMAND和UPDATE_COMMAND_UI第一个消息允许增加处理用户选中菜单选项或单击按钮的函数一一也就是说捕获命令第二个使用户可增加一个设置菜单项按钮或者其他控件的状态的函数就像操作系统即将显示它们一样一一也就是说更新命令单击Add Function来增加一个捕获或更新包含额外步骤的命令23文档视结构231 简介MFC的文档视图结构把应用程序的数据从用户实际浏览和操纵数据的方法中分离开来简单的说文档对象负责存储加载和保存数据而视图对象允许用户在屏幕上查看数据并用适合于应用程序的方法编辑数据232 了解文档CDocument类一个文档代表了一个数据集合典型情况下一个文档由用户通过File Open 命令打开并通过 File Save命令保存用户通过与文档关联的CView对象操作文档一个文档可以有多个视图关联233 了解视图视图是显示存储在文档对象中的数据并允许用户修改这些数据视图对象保持了一个文档对象的指针为了显示和修改数据视图对象可用这个指针访问文档的成员变量一个视图对象只能与一个文档对象关联调用OnUpdate 函数可以更新一个视图所有的屏幕显示操作可在从CView继承的派生类的OnDraw成员函数中完成CView类的派生类CCtrlView 实现常用控件的视图CEditView 提供基本的文本编辑功能CRichEditView 提供复杂的文本编辑功能CFormView 通过使用对话框资源实现窗体式窗口CRecordView 提供了显示数据库记录的功能CDaoRecordView 一般与DAO数据库类一起使用其余与CRecordView相同CScrollView 提供滚动功能CListView 在窗口中显示CListView控件CTreeView 在窗口中显示CTreeView控件24图形设备接口241 理解设备环境1户能够显示任何形式的数据因为窗口中显示的所有东西不论是文字表格位图或是其它任何类型的数据都是以图形方式显示的2MFC通过将windows的GDI函数和对象封装到其设备环境DC类中来帮助用户显示数据3一个设备环境DC就是一个数据结构它对窗口的绘制表面的属性保持跟踪这些属性包括当前选择的画笔画刷和用来在屏幕上绘制的字体一个DC一次只能有一种画笔一种画刷和一种字体设备环境对象封装了画线写文本等API函数所有的画图操作都通过DC对象进行4DC帮助Windows实现了设备无关性DC能用来输出到屏幕打印机和元文件什么是元文件 metafile 元文件就是由一系列可变长度结构组成的数组图片以设备无关的格式存储在结构中当元文件的记录被转换成设备命令并被合适的设备处理时元文件被显示5CDC类CDC就是设备环境对象类CDC对象提供了操作DC的成员函数可以通过CDC对象类的成员函数来进行所有的绘图操作6CPaintDC类a CPaintDC 类继承CDC 类b CPaintDC 类的构造函数自动调用OnPaint 函数接着就可以在DC 中绘图类的析构函数自动调用EndPaint 函数c BeginPaint 函数准备绘图的窗口EndPaint 函数表明结束窗口的绘图d在视图类的OnDraw 函数中CPaintDC已经由系统准备好可以直接在OnDraw 中绘图并且CPaintDC由系统自动释放7CClientDC类CClientDC对象封装了所有对Windows客户区DC的操作CClientDC通过调用GetDC函数得到通过ReleaseDC函数释放8CWindowDC类CWindowDC对象封装了对整个window窗口包括框架的操作9CMetaFileDC类CMetaFileDC对象封装了对一个Windows 元文件的绘图操作但是必须自己调用OnPrepareDC函数来准备设备环境242 图形对象 Graphic ObjectWindows 提供了多种在DC 中使用的图形对象类这些类与Windows GDI的句柄类型相对应图形对象类 Windows 句柄类型CPen HPENCBrush HBRUSHCFont HFONTCBitmap HBITMAPCPalette HPALETTECRgn HRGN使用图形对象的一般步骤1定义图形对象使用图形对象类的Create函数如CreatePen创建对应的对象2将创建的图形对象选进当前设备环境DC中并保存旧的图形对象3完成使用当前图形对象后将原图形对象选回DC中4保证分配的图形对象在结束使用后被删除注意如果要反复的使用一个图形对象可以只申请一次然后在需要的时候将其选入DC中但是必须确保在不再需要使用图形对象的时候删除它25对话框和控件251 对话框Windows应用程序可能有多个对话框对于每一个对话框必须开发两个实体对话框资源和对话框类对话框资源用于定义在屏幕上显示的对话框和它的控件的大小和位置等信息对话框类是对话框和它的控件的对应代码用户可以用资源编辑器建立对话框资源向其中增加控件和对它们进行调整对话框及在对话框上的控件都必须有一个用于标识的IDClassWizard帮助用户建立一个对话框类通常由MFC类CDialog派生而来并将资源和类相连通常对话框上的每一个控件对应类中的一个成员变量要显示对话框可调用类的成员函数可以在显示对话框前为控件设置缺省值或使用控件对应的成员变量设定控件值使用ClassWizard中的Member Variables可以为对话框上的控件本身或控件值建立对应的类成员变量单击上图中的Add Variable按钮将弹出如下图所示的Add Member Variable 对话框在这个对话框的Category和Variable type下拉式组合框中可以选择控件对应成员变量的类型Value或Control类型以及它们确切对应的类型然后在程序中就可以使用定义的变量来操纵控件了252 控件1基本控件Windows常用控件MFC对应的类按钮控件CButton 编辑框控件Cedit 复选框控件CCheck 列表框控件CListBox 进度条控件 Progress bar CProgressCtrl 滑块控件CSliderCtrl 上下控件 CSpinButtonCtrl 图象列表 image list CImageList 列表视图控件 list view CListCtrl 树形控件 tree view CTreeCtrl Rich Edit控件CrichEditCtrl2添加自定义控件在应用程序中可以添加一些自己生成的或由他人提供的控件方法如下首先选择菜单projectAdd To ProjectComponents And Controls弹出对话框Components And Control Galley对话框选择Registered ActiveX Controls 然后选择准备插入的控件如GisAttEdit Contro按Insert按钮会在程序中生成控件对应的类接着就可以像使用标准控件一样使用插入的控件了26编程规范261 书写风格大括号的对齐锯齿状对齐缩进使用空白空字符空行以增加可读性262 命名规范匈牙利记法变量具有一个描述性的名字如ClassName名字用大写字母开始如果变量是一多词名则每个单词词头需大写然后在描述性名称前加上表示变量类型的字母如nCount为一整型变量bFlag为一Boolean型变量前缀变量注释 a Array b Boolean d Double h Handle I Integer index into l Long lp Long pointer to lpfn Long pointer to function m Member variable n Integer number of p Pointer to s String sz Zero terminated string u Unsigned integer C Class263 注释规则1函数注释函数开头必须注明函数功能参数返回值2变量注释应说明变量的作用3其它注释每个功能模块应加注释如一个循环体一个判断等都需要加注释习题21建立一个基于多文档的应用程序添加自己的菜单项使用ClassVizard进行消息映射22在上题基础上使用图形设备接口在窗口上绘图要求每按下一次鼠标左键就以鼠标所点坐标为中心画一个圆23建立一个基于对话框的应用程序使用几个基本控件如编辑框按钮组合框等并生成对应的变量然后通过这些变量控制控件的值第三讲地理信息系统基本概念31 GIS原理概述311 GIS概念地理信息系统GIS是在计算机软硬件支持下以采集存贮管理检索分析和描述空间物体的地理分布数据及与之相关的属性并回答用户问题等为主要任务的技术系统312 GIS发展1起始发展阶段 60年代1963年由加拿大测量学家RFTomlinson提出并建立的世界上第一个地理信息系统是加拿大地理信息系统 CGIS1963年美国哈佛大学城市建筑和规划师Howard TFisher设计和建立了SYMAP系统软件1966年美国成立了城市和区域信息系统协会 URISA 1968年国际地理联合会IGU 设立了地理数据收集委员会 CGDSP1969年又建立起州信息系统国协会 NASIS2发展巩固阶段 70年代70年代GIS朝实用方向发展各国对GIS的研究均投入了大量人力物力财力不同规模不同专题的信息系统得到很大发展从1970年到1976年美国地质调查局发展了50多个地理信息系统GIS受到政府商业和学校的普遍重视3推广应用阶段 80年代80年代GIS在全世界范围内全面推广应用应用领域不断扩大开始用于全球性的问题开展GIS工作的国家更为广泛国际合作日益加强GIS软件开发具有突破性的进展仅1989年市场上有报价的软件达70多个代表性的有ARCINFO美国GENAMAP澳大利亚SPANS拿加大MAPINFO美国MGE美国System9瑞士美国ERDAS 美国。
MAPGIS7二次开发入门篇C++
中地软件系列丛书MAPGIS70二次开发教程―入门篇(C++版)中地数码科技有限公司2006年4月武汉内容提要《MAPGIS70二次开发教程-入门篇( C++版)》是根据最新推出的MAPGIS70软件平台编写而成,主要介绍在VC环境下进行MAPGIS70二次开发必须具备的基础知识,通过实例程序一步步的带领大家了解和理解MAPGIS70二次开发的开发模式和开发技巧。
本书作为MAPGIS70地理信息系统系列产品配套使用手册,供使用MAPGIS70地理信息系统进行二次开发的入门用户参考。
版权所有武汉中地数码科技有限公司警告:未经武汉中地数码科技有限公司书面许可,任何单位和个人均不得以任何形式或手段复制或传播本书的任何部分。
在国家“十五”863项目的支持下,历经5年的科技攻关,由中地数码科技有限公司开发的具有完全自主版权的第一套“分布式超大型GIS平台软件MAPGIS70”已经研制成功。
MAPGIS70是属于最新的“第四代GIS”软件产品,具备“纵向多层,横向网格”的分布式体系结构,采用“面向服务”的最新设计思想,支持局域和广域网络环境下空间信息网格(SIG)的分布式计算,实现了面向空间实体及其关系的数据组织、高效海量空间数据的存储与索引、大尺度多维动态空间信息数据库、三维实体建模和分析,具有TB级空间数据处理能力、支持分布式空间信息分发与共享、网络化空间信息服务,支持Unix/Linux大型服务器,支持海量、分布式的国家空间基础设施建设。
《《MAPGIS70二次开发教程-入门篇( C++版)》是根据最新推出的MAPGIS70软件平台编写而成,主要介绍在VC环境下进行MAPGIS70二次开发必须具备的基础知识,通过实例程序一步步的带领大家了解和理解MAPGIS70二次开发的开发模式和开发技巧。
本书共分为两部分:第一部分是基于插件的应用框架开发,通过实例带领大家完成工具,视图插件制作的过程。
第二部分是基于MFC类库的应用框架开发,通过实例带领大家完成地图文档的显示编辑,空间分析功能模块的开发过程。
GIS二次开发第3课.
ShowMapTips:确定是否显示地图的Map Tips TipDelay:设置Map Tips的延迟时间 TipStyle:设置Map Tips的显示样式 SuppressResizeDrawing ():在控件尺寸发生变化过程中,
阻止数据实时重绘
与IMapControl3相比,IMapControl4多了以下两个可 读写属性:
ITOCBuddy
GetActiveView Returns the underlying object implementing basic map and ActiveView. This is used to populate the TOC.
GetScale Returns the scale of the supplied BasicMap, this allows for objects that do not support IMap.
说明符 返回值的格式
N
32 位: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
D
由连字符分隔的 32 位数字: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
B
括在大括号中、由连字符分隔的 32 位数字: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
esriKeyInterceptTab
4
Intercepts the Tab key, normally handled
by the container to change control focus.
esriKeyInterceptEnter
8
Intercepts the Enter key, normally
GIS二次开发第5课
Map对象
Map类的主要接口有:
1. 2.
3.
4. 5.
6.
7.
IMap IActiveView IViewManager IActiveViewEvents IGraphicsContainer IMapBookmark ITableCollection
IMap与IActiveView接口
通过MxDocument获得Map对象
m_application = hook as IApplication; IDocument document = m_application.Document; IMxDocument mapDocument = document as IMxDocument; IMap map = mapDocument .FocusMap;
Map对象有双重身份,一方面是数据的管理容器,可以加 载地理数据和图形元素,扮演了数据管理器的角色,另一 方面它又可以让用户看到这些数据,即扮演了数据显示的 角色。当加载数据到Map对象的时候,Map对象是数据的 管理者;当改变视图范围、刷新地图的时候它是数据的显 示者。 地图对象中的所有图层共享相同的空间参考。第一个载入 的图层的空间参考被自动地设置为地图对象的空间参考 。 新载入的图层,如果它们的空间参考与地图的空间参考不 同,会被投影到地图的空间参考。 ArcMap中的Map是由文档对象(MxDocument)控制的。
IMap.FeatureSelection属性返回ISelection类型的对象,但可通过接口查询访问 IEnumFeature接口,且通常也是这么做的。 但是,如果通过IActiveView.Selection 属性获得选择集,这个选择集不是元素选择集就是要素选择集,这取决于哪个处于活 动状态。使用 IMap.FeatureSelection属性可以确保获得对要素选择集的引用。
MAPGIS平台培训教程幻灯片PPT
误差校正〔2〕交互式误差校 正
d. 选择采集文件:通过该功能告诉系统采集哪个 文件的控制点
e. 添加校正控制点 :采集图形中控制点的实际值, 同时输入理论值
f. 修改控制点:该功能用来修改参数有误的控制 点
g. 文件校正:在数据校正菜单下选择对应类型的 文件校正转换
h. 注:校正结果文件是一些自动命名的临时文件, 一定要另外换名保存一下 !
▪ 2、设置经纬网参数
▪ 3、设置经纬网的辅助参数
▪ 注意:绘制出的图框名为NONAME.W*, 该文件名是一个临时文件名,系统不会 长久保存。
3度分带表
▪ 投影区代号 中央经度 ▪ 36 108 106.5 -> 109.5 ▪ 37 111 109.5 -> 112.5 ▪ 38 114 112.5 -> 115.5 ▪ 39 117 115.5 -> 118.5 ▪ 40 120 118.5 -> 121.5 ▪ 41 123 121.5 -> 124.5 ▪ 42 126 124.5 -> 127.5
▪ 功能:单个文件的投影变换、成 批文件的投影变换及用户文件投 影变换
投影变换〔3〕单个文件投影 变换
▪ 步骤:
▪ 翻开文件选择投影变换文件
▪ 设置文件TIC点 〔直接拷贝标 准图框的TIC点或输入TIC点 〕
▪ 设置投影变换参数
▪ 进展投影转换
▪ 查看转换后的结果文件 (注意保 存)
投影变换〔3〕成批文件投 影变换
▪ 成批文件的投影转换与单个文件的投 影转换类似
▪ 注意:
▪ 进展转换前,用户需先翻开文件设置 好各自的投影参数
▪ 成批投影是直接覆盖投影,故投影前 一定要先将数据备份好
MAPGIS地理信息系统的二次开发
16 测绘信息与工程 2000 N o .1M A PG IS 地理信息系统的二次开发郭际元 曾 文摘 要 介绍了M A PG IS 地理信息系统的二次开发的环境,工作区概念,空间实体及其数据组织,应用程序类型以及编写应用程序的方法。
关键词 地理信息系统 二次开发 工作区 空间实体 M A PG IS 地理信息系统是中国地质大学(武汉)信息工程学院,在十几年数字制图软件开发的基础上,开展G IS 应用系统研究工作而开发出来的。
该软件于1995年10月通过鉴定,经过这几年的不断完善和扩充,于1998年推出了5.32版本。
M A PG IS 是运行在PC 486以上微机平台的工具型软件,它为用户提供了两种使用方法:其一是利用软件自身的各种功能,建立用户的空间和专业属性数据库,并实现用户所需的各种专业检索和分析;其二是借助软件所提供的完整的二次开发函数库,在M A PG IS 平台上开发面向各自领域的应用系统。
目前,利用该平台已研制开发出通信管网及配线、国土详查、地籍管理、供水管网、煤气管道、城市综合管网、电力配网、城市规划、辅助作战指挥、GPS 导航与监控、环境保护与监测等一系列应用软件系统。
1 M A PG IS 的二次开发环境操作系统,M A PG IS 开发函数库以及M A PG IS 应用程序的相互关系,如图1。
目前,M A PG IS 二次开发库主要是以A P I 函数的方式提供的,这些函数的实现被封装在12个动态链接库(DLL )中,因此,是独立于开发工具的。
用户在所使用的高级语言中,如何调用W indow s 的A P I 函数,可依此调用M A PG IS 的二次开发函数。
M A PG IS 二次开发函数库,有工作区基础函数、图形显示输出、工作区管理函数、图形窗口操作、空间分析函数、地图库读取显示、图形编辑函数、图像输入输出、图像显示函数、彩色变换函数、图像处理函数以及进程控制函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言MAPGIS 是武汉中地信息工程有限公司研制的具有自主版权的大型基础地理信息系统平台。
它是一个集当代最先进的图形、图像、地质、地理、遥感、测绘、人工智能、计算机科学于一体的大型智能软件系统,是集数字制图、数据库管理及空间分析为一体的空间信息系统,是进行现代化管理和决策的先进工具。
MAPGIS 连续四年在全国GIS 测评中名列第一,并成为唯一连续四年获得国家科技部向社会推荐的国产GIS 软件平台。
中地软件丛书之MAPGIS 二次开发培训教程是根据最新推出的MAPGIS 软件平台编写而成,主要介绍进行MAPGIS 二次开发必须具备的基础知识、主流开发工具以及MAPGIS 系统的基本概念、结构体系和操作方法。
该教程分为三个部分,共十一讲。
其中:第一部分(即第一讲的内容):介绍Windows 编程的概念。
包括类与数据封装、继承、重载、虚拟函数与多态性以及内存管理。
该部分为可视化编程的基础,有可视化编程经验的读者可以略过此讲,直接进入下一部分的学习。
第二部分(即第二讲的内容):编程工具VC 。
对于在VC 这样一个编程环境中开发应用程序所应熟悉的概念,术语和最基本的框架、构件实现过程等知识做了一个简明扼要的介绍。
已掌握一定VC 编程基础知识的读者可以略过该部分。
第三部分(即第三讲至第十一讲的内容):详细讲述了地理信息系统的基本概念(包括GIS 原理概述、空间数据类型、空间数据库、空间数据结构与数据管理等内容);MAPGIS的基本概念和体系结构(简要描述了MAPGIS 二次开发的基本概念、术语、工作区、空间实体及其数据、C++类组织和开发环境介绍的内容);MAPGIS 空间数据存取和属性编辑(包括工作区、空间实体和属性的操作及其网络介绍);图形显示输出及窗口操作、图形编辑、类库和控件开发;矢量空间分析和属性查询;投影变换、图框生成和工程管理;图库管理和查询系统(包括基于图库的应用程序开发、MAPGIS 图库介绍、开发的一般步骤以及结合图库显示说明图库主要函数的功能等方面的内容)以及图象分析与处理。
这一部分为本教程的主要部分,能使大家从了解到熟练掌握这个部分的内容也是我们编制本书的主要目的,同时它还可被作为MAPGIS 二次开发过程中的参考来使用。
参加本书编写的人员主要是本系统的软件开发人员以及长期从事MAPCAD 和MAPGIS培训的教师。
由于时间仓促,书中难免存在错误和不当之处,敬请广大用户及读者提出宝贵意见和建议,以利改进。
中地软件丛书编委会2001年10月M A P G I S 二次开发培教程目录第一讲基于WINDOWS编程的基础知识11.1引言11.2类与数据封装11.3继承21.4重载41.5虚拟函数与多态性5第二讲编程工具VC72.1熟悉VC开发环境72.2消息与命令72.3文档、视结构102.4图形设备接口112.5对话框和控件122.6编程规范13第三讲地理信息系统基本概念143.1 GIS原理概述143.2 GIS空间数据类型173.3 GIS数据管理183.4空间分析203.5地理信息系统发展20第四讲 MAPGIS的基本概念和体系结构214.1 MAPGIS二次开发的基本概念214.2 MAPGIS基本术语234.3 MAPGIS的数据管理(工作区)254.4 MAPGIS的空间实体及其数据组织274.5 MAPGIS的C++类组织294.6 MAPGIS的VC++开发环境介绍30第五讲 MAPGIS空间数据存取和属性编辑315.1工作区操作315.2空间实体操作345.3属性(属性结构)操作375.4网络介绍44第六讲图形显示输出及窗口处理456.1图形显示输出456.2窗口处理496.3类库开发中的图形显示和窗口处理51第七讲图形编辑、类库和控件开发537.1图形编辑开发概要537.2图形编辑API函数开发537.3 MAPGIS类库开发547.4 MAPGIS控件开发60第八讲矢量空间分析和属性查询658.1矢量空间分析658.2属性查询检索70第九讲投影变换和图框生成739.1投影变换(projdll.h、cordcvt.h)739.2图框生成(frmdll32.h)83第十讲图库管理和工程管理9110.1 MAPGIS图库简介9110.2基于图库的应用程序的开发9210.3结合图库的显示说明图库中主要函数的功能9210.4工程管理(prj_disp.h和map_prj.h)96第十一讲 MAPGIS图象处理和分析10011.1遥感图象处理的基本知识10011.2处理方法10111.3主要API 介绍9911.4组件介绍10711.5在VC中的开发过程(结合示例程序讲解)10811.6示例程序说明109附录 MAPGIS 二次开发问题集锦1101.属性和属性结构1102.空间实体操作问题1233.显示、编辑问题1244.空间分析问题1315.数字高程模型1316.安装问题1347.工程问题1358.输出问题1369.其它138第一讲基于WINDOWS编程的基础知识1.1引言1.1.1 过程化(procedural programming):程序被认为是在一个数据集合上进行的一系列操作。
1.1.2 结构化(structured programming):主要思想是:功能分解并逐步求精。
1.1.3 面向对象的程序设计(object_oriented programming):实质是把数据和处理这些数据的过程合并为一个单独的“对象”――一个具有确定特性的自完备的实体。
1.1.4 面向对象程序设计的特征:1)封装2)继承3)多态1.2类与数据封装1.2.1 什么是类?简单的说,类就是一种用户定义的数据类型,跟结构类似;并且,类具有自己的成员变量和成员函数(方法),通过它们可以对类自身进行操作。
如:汽车可以看作是发动机、车轮、座椅等诸如此类的集合。
也可以从功能的角度来研究,譬如,能移动,加速,减速,刹车等。
例如:class CMyClass1{protected:CMyClass1();public:virtual ~ CMyClass1();}1.2.2封装(encapsulation)定义:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
封装的优点如下:1) 封装允许类的客户不必关心类的工作机理就可以使用它。
就象驾驶员不必了解发动机的工作原理就可以驾驶汽车一样,类的客户在使用一个类时也不必了解它是如何工作的,而只需了解它的功能即可。
2) 所有对数据的访问和操作都必须通过特定的方法,否则便无法使用,从而达到数据隐藏的目的。
1.2.3对象对象就是类的实例。
类与对象的关系就如类型和变量的关系,所有对类的操作都必须通过对象来实现。
当一个类定义了多个对象时,每个对象拥有各自的成员数据。
1.2.4 类的三种成员类型1) 私有成员(private):缺省情况下,一个类中的所有成员都是私有的。
私有成员只能被类本身的成员函数访问。
并且不具有继承性。
2) 公有成员(public):公有成员可以被类成员函数和外部函数使用。
3) 保护成员(protected):类的保护成员能被类及其派生类的成员函数和友员函数使用,具有继承性。
1.2.5 构造函数与析构函数1)构造函数a. 是特殊的成员函数;在创建对象时首先由系统自动调用。
它的作用是为新创建的对象分配空间,或为该对象的成员变量赋值等;b. 构造函数名必须与其类名称完全相同,并且不允许有返回值。
2)析构函数a. 析构函数是构造函数的逆操作;b. 析构函数在类名之前加~来命名,它不允许有返回值,也不允许带参数,并且一个类只能有一个析构函数。
1.3继承1.3.1 传统程序设计的缺点:增加功能对程序所作的修改工作量非常大。
1.3.2 继承的优点:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。
这有利于减少重复编码,提高软件的开发效率。
1.3.3 基类与派生类1)一个类可以继承其它类的成员,被继承的类叫基类或父类;继承类叫派生类或子类2)派生类不但拥有自己的成员变量和成员函数,还拥有父类的成员变量和成员函数。
1.3.4 类的保护成员(protected)前面介绍了类的私有成员只能被类的成员函数和友员函数使用;类的保护成员能被类及其派生类的成员函数和友员函数使用。
也就是说,类的保护成员具有继承性,而类的私有成员不具有继承性。
1.3.5 公用基类和私有基类1)公用基类中的所有public成员在派生类中仍是public成员,所有protected成员在派生类中仍是protected成员。
2)私有基类中的public成员和protected成员在派生类中均变成private成员。
1.3.6 多重继承1)多重继承的定义方法例子:class A{…public:int i;void func1();…};class B{…public:int i;void func1();…};class C:public A,B{…void Show()…};缺省情况下基类被定义为 private;因此基类B为私有基类。
2)继承的不确定性例子:class C:public A,B{…void Show(){j = i*i;func1();}…};由于基类A和B中同时拥有数据成员i和成员函数func1,类C引用基类的成员时,系统无法分辨是调用哪一基类的成员而发生错误;3)解决多重继承的不确定性:使用域操作符指明要调用的基类,即可解决不确定性问题。
class C:public A,B{…int j;void Show(){j = A::i*B::i;A::func1();}…};1.3.7多层继承定义:所谓多层继承指的是从一个类派生出另一个类,然后以派生类作为基类,派生出另一个类,直到最后生成的派生类满足需要为止(见MSDN中的Hierarchy Chart)。
1.3.8派生类的构造函数与析构函数在继承关系下,派生类的构造函数负责调用基类的构造函数来设置基类数据成员值。
例:class base{//基类…public:int i;base(int j){//构造函数i = j;}…};class derived:public base{//派生类…public:double f;derived(int, double);…};derived::derived(int k, double l):base(k){//派生类构造函数…f = l;…}1.3.9 构造函数的调用顺序1) 在定义派生类对象时,系统首先调用基类的构造函数,然后调用派生类的构造函数;在上例中,derived类首先调用base类的构造函数,然后调用自身的构造函数。