MAPGIS二次开发基础知识
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二次开发复习资料

交换数据格式这是一种较传统的数据共享和互操作方法。
可以一定程度上解决GIS平台差异所造成的数据共享难的问题。
开放式GISOGC(开放地理信息系统协会)为了促进地理信息的共享和GIS互操作,加快地理空间信息标准化建设的步伐,提出了建设开放式地理数据模型的方案,并指出开放式地理数据模型应该包括统一的地理要素定义、空间属性、语义属性和与其他地理要素的关系。
以及地理数据模式等元数据的定义和表示等内容。
数据字典是关于数据信息的集合。
它是数据流图中所有要素严格定义的场所,这些要素包括数据流、数据流的组成、文件、加工小说明及其他应进入字典的一切数据,其中每个要素对应数据字典中的一个条目。
空间元数据空间元数据是指描述空间数据的数据,它描述空间数据集的内容、质量、表示方式、空间参考、管理方式以及数据集的其它特征,是空间数据交换的基础。
也是空间数据标准化与规范化的保证。
在一定程度上为空间数据的质量提供了保障。
地理编码所谓地理编码即是为点、线、面的位置和属性而设置的编码,按实体的属性特征和集合坐标的数据结构记录在计算机的存储设备上。
分布式GIS分布式GIS是通过分布式计算实现异地资源和信息共享、提高系统执行效率的GIS系统。
在分布式GIS中,可以分为基于客户/服务器模式的分布式GIS和全分布式GIS两种。
桌面GIS一般认为,所谓桌面地理信息系统,就是运行于桌面计算机(工作站和微型机)上的地理信息系统。
它一般有相对较弱的空间分析功能,大多数都是以地图查询及地图分析为主要应用目标而建立应用型地理信息系统。
组件式GIS基于组件对象平台,具有GIS功能和某种标准通讯接口、允许跨语言调用,可用以建立地理信息系统的组件称为GIS组件。
使用GIS组件所开发的GIS系统,称为组件式GIS。
内部数据格式内部数据格式面向程序设计,描述系统数据的物理结构和实体之间的拓扑关系、存取方式,在程序设计时确定。
外部数据格式外部数据结构面向用户,描述地图或地理实体之间的逻辑联系,由用户建立应用系统时定义。
mapgis二次开发基础知识

mapgis二次开发基础知识MAPGIS二次开发基础知识一、手动注册组件与注销组件COM以及客户应用程序所需的、用来定位组件及对组件进行实例化的信息存储在Windows的注册表(Registry)里。
因此,在使用组件之前要对组件进行注册,只有成功注册才能引用该组件,其具体步骤为:1.将包容组件的DLL文件放入MAPGIS PROGRAM 目录下,假设物理路径为:D:\mapgis65\program\ MapGisBasCom1.dll2.运行注册表程序注册组件 Windows开始菜单-〉运行:regsvr32 D:\mapgis65\program\MapGisBasCom1.dll 注册成功与否将有对话框弹出。
3.注销该组件方法为:regsvr32 /u D:\mapgis65\program\MapGisBasCom1.dll二、Visual Basic中嵌入对象类型库为了使Visual Basic能够访问MAPGIS对象定义,应该在Visuai Basic项目或模块中嵌入MAPGIS对象类型库。
如果想把一个Visual Basic对象声明为MAPGIS对象类型,要求嵌入MAPGIS对象类型库, 如果想把一个Visual Basic对象声明为一般Object类型,就不必嵌入MAPGIS对象。
为了在项目中嵌入MAPGIS对象类型库,通常执行这些步骤:从Project(工程)菜单, 选择References, References对话框出现, 选中复选框嵌入MapGisBasCom1 Type Library文件。
这要求VisualBasic环境或代码模块编辑器是活动的,正在运行。
三、使用MAPGIS对象可以使用Visual Basic编写使用MAPGIS对象的程序。
在Visual Basic程序中使用MAPGIS 对象所要求的步骤是:1.嵌入MAPGIS对象类型库。
2.建立一个MAPGIS对象。
MAPGIS的基本概念和体系结构

1.1 MAPGIS二次开发的基本概念 二次开发的基本概念
MAPGIS 二次开发支持的开发方式
1 API函数 API函数
函数库提供了从最基本数据单元的读取,保存,更新和维护到MAPGIS MAPGIS地图库 函数库提供了从最基本数据单元的读取,保存,更新和维护到MAPGIS地图库 的建立和漫游,以及空间分析,图象处理等一系列功能,MAPGIS应用程序可以 的建立和漫游,以及空间分析,图象处理等一系列功能,MAPGIS应用程序可以 根据需要在任何层次上进行开发. 根据需要在任何层次上进行开发.
4
ActiveX控件 ActiveX控件
MAPGIS的数据管理 1.2 MAPGIS的数据管理 工作区
MAPGIS数据管理的核心就是对工作区的操作. MAPGIS数据管理的核心就是对工作区的操作. 数据管理的核心就是对工作区的操作 工作区是MAPGIS提出的一个概念 工作区是 MAPGIS提出的一个概念 , 简单地 MAPGIS 提出的一个概念, 工作区就是一个数据池, 说, 工作区就是一个数据池 ,存放实体的空间数 拓扑数据,图形数据和属性数据, 据 , 拓扑数据 , 图形数据和属性数据 , 每个工作 区都对应于一个MAPGIS数据文件. MAPGIS数据文件 区都对应于一个 MAPGIS 数据文件 . 深入了解工作 区的逻辑结构和工作区操作函数的使用, 区的逻辑结构和工作区操作函数的使用, 是进行 成功的二次开发的关键. 成功的二次开发的关键.
MAPGIS二次开发的基本概念及其数据管理 MAPGIS 二次开发的基本概念及其数据管理
本 章 内 容
1.1,MAPGIS二次开发的基本概念 1.2,MAPGIS的数据组织 1.3,MAPGIS的工作区操作 1.4,编写你的第一个MAPGIS程序
MAPGIS二次开发常见问题及解答1

二次开发常见问题及解答、问:如何用生成明码文件?答:先利用手册看懂明码格式文件的格式,知道数据的组织方式,利用的文件函数创建一个文本型文件,吧数据库中的数据按照格式输出就是了。
、问:和的区别和联系?答:是以前老版本的东东,换成试试中包含了属性结构的详细信息,具体用法可参见二次开发帮助文档中第三章数据结构中关于属性字段描述结构,属性字段描述头和属性信息头的介绍,里面有该结构的详细内容。
、问:请教关于“不能打开子图库...”的问题,急!答:系统库路径不对,将、、三个文件拷贝到执行目录即可。
这几个语言件放在\\目录中。
或是运行可设置,该运行文件也同样在\\目录中。
、问:如果只知道工作区能不能依次得到工作区中的图元号,该如何得到啊!答:;;;;*;{()取点数(《){(()<)取点,返回值成功失败删除;…对该图元进行操作}}就是图元号、问:的函数,到底应该如何用啊!跟以前的不同了,给个例子吧!答:( * * *);点工作区号* 点位置号比如鼠标的位置图层开关标志,如不为空就只在打开状态的图层中查找是的长度出口返回距离返回值成功返回点号,失败为、问:如何屏蔽掉中的右键功能!!!答:有一个属性,同理也可以直接使用这个属性。
'不显示菜单'全部显示'显示窗口菜单'显示窗口编辑菜单'工具箱、问:如何将一个圆添加到一个工作区中?答:先用函数在工作区画园(或画弧)的时候需要自己生成坐标点,比如说 *,这里的空间需自己申请,其长度为,线的参数是,需要赋值,为区工作区号,为弧段号。
然后调用:();输入弧段。
然后添加区域入口: 区工作区号[] 区域数据块[] (弧段个数)[] ( 为弧段号)区域图形信息,需要赋值然后调用:();、问:急关于( * )函数!答:{ 工作区号图元类型图元号}定义一个数组你把所要闪烁的图元一个一个加进去就行了。
、问:实现查询多边形中图元的,并时期闪烁显示,应如何实现呢?答:用系列函数,然后可通过的闪烁机制完成。
MAPGIS二次开发资料16点

3 函数_LoadAFile( )传参数示例
char fileName[MAX_PATH]; lstrcpy(fileName,"c:\\mapgis6.7\\sample\\line.wl"); _LoadAFile(fileName,li);
4 取工作区文件名函数_GetAreaFileName1( )示例
8 从当前打开文件中提取出只属于该文件的图层名称或序号
可通过函数实现:
技术工兵(jsgb) 3
技术工兵淘宝店为您服务:
Hale Waihona Puke for(short i=0;i<MAX_LAYNUM;i++) {/*判断某一层是否有图元*/ short HaveElement = _IsALayHasElement(ai,i); if(HaveElement) TRACE( "area is %d at layer = %d has element\n", ai, i ); else TRACE( "area is %d at layer = %d has not element\n", ai, i ); }
char fname[MAX_PATH]; short len; fname[0] = 0; _GetAreaFileName1(ai,fname,MAX_PATH*sizeof(char));
5 删除字段函数_DelStruFldOnNumb( )提示示例
如果是用循环来操作此函数,需要从属性结构的尾部进行删除。打个很简单的例子:如 果有四个属性结构, 删除了第二个属性结构后, 则原来第四个属性结构变成了第三个属性结 构。所以 for(i=0;i<Num;i++) {
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设计开发中心的基础内核,并提供底层服务的扩展开发,即通过跨平台的内核服务群向上封装扩展,或采用服务插件方式扩展,同时可结合工作流机制进行功能扩展。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MAPGIS二次开发基础知识一、手动注册组件与注销组件COM以及客户应用程序所需的、用来定位组件及对组件进行实例化的信息存储在Windows的注册表(Registry)里。
因此,在使用组件之前要对组件进行注册,只有成功注册才能引用该组件,其具体步骤为:1.将包容组件的DLL文件放入MAPGIS PROGR AM 目录下,假设物理路径为:D:\mapgis65\program\ MapGisBasCom1.dll2.运行注册表程序注册组件 Windows开始菜单-〉运行:regsvr32 D:\mapgis65\program\MapGisBasCom1.dll 注册成功与否将有对话框弹出。
3.注销该组件方法为:regsvr32 /u D:\mapgis65\program\MapGisBasCom1.dll二、Visual Basic中嵌入对象类型库为了使Visual Basic能够访问MAPGIS对象定义,应该在Visuai Basic项目或模块中嵌入MAPGIS对象类型库。
如果想把一个Visual Basic对象声明为MAPGIS对象类型,要求嵌入MAPGIS对象类型库, 如果想把一个Visual Basic对象声明为一般Object类型,就不必嵌入MAPGIS对象。
为了在项目中嵌入MAPGIS对象类型库,通常执行这些步骤: 从Project(工程)菜单, 选择R eferences, R eferences对话框出现, 选中复选框嵌入MapGisBasCom1 Type Library文件。
这要求VisualBasic环境或代码模块编辑器是活动的,正在运行。
三、使用MAPGIS对象可以使用Visual Basic编写使用MAPGIS对象的程序。
在Visual Basic程序中使用MAPGIS对象所要求的步骤是:1.嵌入MAPGIS对象类型库。
2.建立一个MAPGIS对象。
3.使用MAPGIS对象和包含的其他对象。
4.释放MAPGIS对象。
使用一个句点(.)把对象变量与该对象的属性、方法和集合分开。
四、使用C++和COM函数可以使用C++和COM函数编写使用MAPGIS对象的程序。
在C++程序中使用MAPGIS对象所要求的步骤是:1.嵌入MAPGIS对象和COM头文件,并链接到COM库。
2.初始化C0M库。
3.建立一个MAPGIS对象。
4.使用MAPGIS对象和包含的其他对象。
5.释放MAPGIS对象。
6.解除C0M库的初始化。
使用成员选择运算符(->)把“对象指针”变量与属性、方法和集合函数分开。
嵌入MAPGIS对象对MAPGIS对象编程的第一步是在项目中嵌入合适的类型库或头文件。
完整的MAPGIS对象类型库包含在MapGisBasCom1.h文件中,这个文件的默认路径:D:\mapgis65\include\MapGisBasCom1.h类型库含有关于所有MAPGIS对象、属性和方法的信息。
五、COM的调用MAPGIS对象包括ANSI和Unicode这两个定制接口。
使用ANSI接口时,所有MAPGIS对象字符串都是每个字符一个字节的ANSI字符串。
使用Unicode接口时,所有MAPGIS对象字符串都是每个字符两个字节的Unicode字符串。
所有MAPGIS对象字符串都使用====BSTR字符串数据类型。
默认情况下使用ANSI定制接口和ANSI ====BSTR字符串。
如果想使用Unicode定制接口和Unicode =====BSTR字符串,在嵌入所有头文件之前必须定义UNICODE和_UNICODE。
例如:#define UNICODE#define _UNICODE在字符串值两端使用TEXT(“str”)宏。
默认情况下,这些是ANSI“Str”字符串。
在定义了UNICODE和_UNICODE时,这些是Unicode L“Str”字符串。
在32位0LE中,所有BSTR字符串是Unicode字符串。
为了使C++程序能够访问MAPGIS对象定义,除了嵌入Windows和0LE头文件之外,还必须嵌人MAPGIS==.H和MAPGIS==.H头文件。
默认情况下,MAPGIS头文件位于======\INCLUDE目录中。
Visual C++项目的Include设置或INCLUDE环境变量应指向含有这些文件的目录。
必须嵌入以下头文件:1. MapGisBasCom1_i.c2. MapGisBasCom1.h例如:#include "MapGisBasCom1_i.c"#include "MapGisBasCom1.h"Visual C++项目的Library设置或LIB环境变量应指向含有这些文件的目录。
六、初始化COM库在程序能使用MAPGIS对象之前,必须初始化C0M库。
Visual BasicMAPGIS程序不必初始化COM,Visual Basic自动初始化C0M库。
C++所有MAPGIS COM函数都返回一个HRESULT值,这个值含有关于MAPGIS COM函数的成功或失败的信息。
可以声明单个HRESULT变量并重复利用它。
例如:HRESULT hr;在调用任何MAPGIS或COM函数之前, MAPGIS程序必须使用COM CoInitialize函数初始化COM库。
例如:hr=CoInitialize(Null);必须把NULL传递给CoInitialize。
七、建立MAPGIS对象MAPGIS组件的核心是MAPGIS对象。
Visual Basic在Visual Basic 中有2个方法用于建立MAPGIS对象,这2个方法都涉及使用Dim 语句声明特定类型的对象变量。
特定的MAPGIS对象类型常用的方法(如果使用的Visual Basic 版本支持它)是使用Dim语句声明特定MAPGIS对象对象类型的对象变量,这个方法要求MAPGIS类型库包括在Visual Basic项目中。
为了实际建立一个MAPGIS对象的新实例.可以在Dim语句中使用New关键字(如果使用VisualBasic版本支持它的话)或者使用CreateObject函数。
例如,使用New关键字创建新的MAPGIS对象的语句是:Dim ldot As New L_DOT例如,使用CreateObject函数声明和创建一个新的MapGis对象:Dim ldot As L_DOTSet ldot = CreateObject("MapGisBasCom1.L_DOT")有些版本的Visual Basic 使用虚函数表绑定(vtable-binding),或早期绑定。
直接使用MAPGIS定制接口(不通过COM IDispatch接口),产生最好的性能。
有些版本的Visual Basic使用推迟绑定的形式,叫做分派ID绑定(dispID,binding),它使用COM IDispatch。
IDispatch ::Invoke 函数与在MAPGIS类型库中包括的dispID一起使用。
这种方法使应用的性能没有使用New关键字那样快.但比使用Object类型快。
八、在C++中建立MAPGIS对象在C++中只有一种方法建立MAPGIS对象,声明合适的MAPGIS“对象指针"类型的对象变量,然后使用COM CoCreateInstance函数建立MAPGIS对象的新实例。
把以下参数传递给CoCreateInstance:1. MAPGIS对象的类ID2. NULL3. CLSCTX_INPROC_SERVER4. MAPGIS对象的接口ID5. MAPGIS “对象指针”变量的地址(使用&运算符的地址)。
例如,要建立一个新的ID_Dot MAPGIS对象:IPntArea *ptPAi;hr=CoCreateInstance(CLSID_PntArea,NULL,CLSCTX_INPROC_SERVER,IID_IPntArea,(void**)&ptPAi);注意:一个多线程程序,必须串行化对MAPGIS对象的所有访问,以避免重入.九、函数库名称函数库名称 c,c++说明文件工作区基础函数 Win_area.h矩形图框函数 frmdll32.h投影类库 projdll.h控制点操作 w32_cpnt.h状态栏显示点转换以及工作区投影函数 cordcvt.h图形显示输出 Map_out.hwin_out.h工程对象操作函数以及拼版文件操作函数 Map_prj.h编辑工程文件 Prj_Disp.h图例和工程文件操作函数 Project.h图像显示函数 Mapdisp.h图像编辑函数 Mapedi t.h输入编辑子系统类库 CGisEdit.hCPrjEdit.h拓扑操作函数 Gistopo.h图元以及剪贴板操作函数 clippaste.hUNDO 处理数据及成员函数gistool.h窗口操作函数 CGisView.hGisView对象函数 Win_oper.h空间分析函数 Spc_anly.h各种头文件 MapGis.h十、怎样用vb对mapgis进行二次开发,不知道怎样将二者联系起来Vb开发三种方式:MAPGIS API开发库通过调用应用程序接口直接编程MAPGIS 可视控件(ocx)MAPGIS 组件开发(com)通过控件和组件编程如何创建MAPGIS对象Dim workai As NEW PntAreaDim workai As PntAreaSet workai = CreateObject(“MapGisBasCom1.pntarea”)三种方式可以互为补充。