空间数据管理平台总体设计
随需而变 柔性再造
成都领君科技有限公司
http://www.linjon.cn
2012年11月
目录
1. 引言... 1
1.1. 编写目的... 1
1.2. 背景... 1
1.3. 定义... 1
2. 总体设计... 1
2.1. 系统总体目标... 1
2.2. 系统总体构架... 2
2.3. 数据组织模型... 2
2.4. 系统总体功能设计... 3
2.5. 系统运行环境... 4
2.6. 系统网络结构... 4
2.7. 系统软件开发环境... 5
2.8. 系统开发技术路线... 6
3. 各子模块功能设计... 6
3.1. GIS基本工具... 6
3.1.1. 图形显示... 6
3.1.2. 图形输出... 6
3.2. 数据库管理维护功能... 7
3.2.1. 添加数据库... 7
3.2.2. 添加文件夹... 9
3.2.3. 版本管理... 9
3.2.4. 注册版本... 10
3.2.5. 附加要素集... 10
3.2.6. 附加要素类... 11
3.2.7. 节点重命名... 11
3.2.8. 数据入库管理... 11
3.2.9. 数据建库方案管理:... 13
3.2.10. 数据加载... 15
3.2.11. 添加地图... 17
3.2.12. 地图属性设置... 18
3.2.13. 添加图层... 19
3.2.14. 元数据... 20
3.3. 质量检查模块... 20
3.3.1. 数据检查规则定义... 21
3.3.2. 功能设计... 22
3.4. 空间数据编辑和分析模块... 24
3.4.1. 空间数据编辑功能... 24
3.4.2. 空间数据分析... 24
4. 数据库设计... 25
4.1. DataLogTree 目录结构表... 25
4.2. GEODBCONNECTIONINFO空间数据库连接信息表... 27
4.3. DATASETTABLE数据集信息表... 27
4.4. MapDefine 地图信息表... 27
4.5. LAYERDEFINE图层信息表... 28
4.6. DataCheckRuleLib质量检查规则库... 29
4.7. DataCheckParam 检查参数配置... 29
4.8. DataCheckError检查错误表... 30
5. 数据管理平台扩展开发说明... 30
5.1. 概述... 30
5.2. 功能插件扩展开发... 30
5.3. 管理树右键菜单扩展... 31
5.4. 管理树节点扩展... 33
5.4.1. 目录树上节点进行扩展的方式... 33
5.4.2. 节点扩展方式... 35
5.4.3. 注意问题... 42
本文档描述空间数据管理平台的总体框架、主要功能模块。
本系统适用于空间数据管理平台系统管理人员等。
列出本文件中用到专门术语的定义和外文首字母组词的原词组。
GIS:Geographic Information System,地理信息系统
SDE:Spatial Data Engineer,空间数据引擎
ESRI:Environment System Research Institute, Inc美国环境系统研究所有限公司。
ArcGIS的数据管理平台按照物理结构模式进行数据的管理,该种方式不便于对于地理空间数据的综合管理和维护,为便于用户对空间数据的有效管理和维护,特设计并开发了该空间数据管理平台。
空间数据管理平台采用树状结构方式进行数据的组织和维护,系统主要按空间数据的逻辑关系实现对地理空间数据的有效组织和管理,以满足对数据资源的高度共享及应用的需要。
空间数据管理平台基于JLKEngine平台库进行二次扩展开发,为满足地理空间数据综合管理需要而设计的一个应用系统。
系统总体结构如下:
空间数据库综合管理平台 |
JLKEngige核心库库 |
逻辑数据管理类库 |
JLKEngine插件包 |
逻辑数据库1 |
逻辑数据库2 |
物理空间数据库 |
JLKEngine界面库 |
逻辑数据管理插件包 |
物理空间数据库 |
逻辑数据库3 |
空间数据综合管理平台是通过逻辑空间数据库节点实现对不同类型空间数据库的组织和管理,这里的逻辑空间数据库都关联着一个物理空间数据库连接,不同逻辑空间数据库可以关联同一个物理空间数据库连接。
数据管理平台采用逻辑数据库模型实现对空间数据库的管理和维护,利用管理平台可以将相同类型数据组织到一个逻辑数据库中,如可以将数据划分为基础地理空间数据库、土地利用数据库、规划数据库等等。
每个逻辑数据库都定义了一个关联的空间数据库连接,不同逻辑数据库可以是相同空间数据库连接,也可以是不同的空间数据库连接。
管理平台中数据组织管理模型如下:
在逻辑数据库中可以建立文件夹,对各类型数据存放到不同文件夹下面,逻辑数据库节点中可以关联要素集、单个要素类、栅格数据、数据表各类型数据。
此外,可以在逻辑数据库中创建不同的地图对象,并定义图层数据配置方案,实现数据的快速加载。地图节点还可以定义图件所使用的空间参考系、地图的裁剪区等参数。
管理平台进行数据管理,需要支持逻辑数据库节点类型的扩充需要,允许用户根据实际应用需要,扩充开发定义自己的逻辑数据库节点类型。
根据空间数据综合管理平台的目标,本系统主要实现以下三大功能:
一是地理空间数据的组织管理和维护,以建立逻辑空间数据库,并实现对地理空间数据的组织和管理;同时提供对逻辑空间数据库的扩展开发。
二是地理空间信息数据的检查、转换、入库管理;
三是地理空间数据的编辑、分析处理;
系统主要功能模块按如下系统功能结构图所示:
硬件环境:
使用现有的硬件环境。
软件环境:
数据库软件是Oracle11g(25个客户端的企业版)或SQL Server 2008 企业版,GIS软件:ArcGIS 10.0。
根据系统建设的需求,满足新建设应用系统运行的需求,提供建议性网络设备及硬软件集成方案,包括硬件、系统软件、网络、集成等方面。在满足应用性能和功能的要求下,充分利用甲方现有资源,保护原有投资。必须满足以下原则和要求:
n 实用性原则:能满足系统建设后的需要。
n 可扩展性原则:满足系统日后扩充和升级的需要。
n 经济性原则:系统配置具有较高的性价比,尽可能利用甲方现有资源,保护原有投资。
n 安全性原则:软硬件选型能满足网络安全和系统安全的需要。
n 先进性原则:在软硬件的造型上要具有一定的前瞻性,系统能够满足未来几年内系统发展的需要。
n 保证系统数据、系统文件、系统用户的安全;
n 保证系统软硬件设备的安全与不间断运行;
n 保证系统在发生常见故障时的继续运行;
n 保证系统重要信息的备份和可靠恢复;
n 保证系统在发生不可抵御的故障时能够安全完整地重新运行。
n 电源的安全性、存储介质的安全性、负载均衡/集群策略和备份策略。
在软件平台的选择上采用ArcGIS平台作为基础平台,利用ArcGIS Engine10.0开发平台。开发用机5台,数据库服务器1台。
n 软件环境:
开发用机:WINXP Professional、ArcEngine10.0开发包、C#、MS Access。
数据库服务器:WINDOWS7、Oracle11g服务器端或SQL Server 2008 企业版、ArcSDE 10.0。
n 硬件环境:
开发用机:PⅣ 3.0双内核INTEL CPU,内存≥1G,以太网卡100Mbs,硬盘160G SCSI硬盘,图形显卡(128M显存以上)
数据库服务器:PⅣ 3.0GHz、内存≥1G、硬盘≥160G、以太网卡1000Mbs
空间数据管理平台采用ArcGIS Engine进行扩展开发实现。系统开发方式采用功能插件方式进行应用系统功能的扩充,各种功能插件按类别分别以不同的类库开发实现,功能插件均以dll类库方式提供,采用c#为主要开发语言,每个功能插件的开发方式采用从BaseCommand或BaseTool派生的方式实现,为使插件有较大的应用性,插件内部采用IHookHelper对传入插件的对象进行封装。
采用这种开放模式,使得系统具有较好的扩展性,系统功能的扩展仅需进行相应功能插件的开发后部署到系统运行目录下,即可实现对系统功能的扩充,使得系统具有较好的兼容性和可拓展性。此外对相应功能插件的升级,也仅需要替换相应的插件库即可完成。
通过该模块可以实现图层的缩放、平移、漫游、隐藏/显示控制等基本图层操作,实现鹰眼导航;查看图层属性,修改图层的显示控制范围,控制地图提示,控制图层注记等图层控制操作。
提供专题地图制作和打印输出的功能,能根据出图图纸的尺寸自动调整比例尺和制图范围,提供所见及所得的图面整饰功能和地图成果的打印输出功能。可以实现对地图版面的编辑,如调整方向指示针的位置、控制边框的形状及其位置等。
数据库管理维护功能通过空间数据逻辑节点树上各节点上右键功能实现。
添加数据库功能是在管理平台中添加一个新的逻辑数据库管理,用来组织和管理一组空间数据,其操作界面如下:
输入要创建的逻辑数据库名称,并选择对应数据库类型,配置好逻辑数据库关联的物理空间数据库连接,确定后即可完成逻辑空间数据库的创建。
该窗体中空间数据库类型组合框下的类型,可以允许用户进行扩展,以支持外部用户定义的其他空间数据库类型节点。空间数据库类型节点来源于应用程序目录下的配置文件gdbtype.xml,在gdbtype.xml定义了数据库类型组合框可以支持的空间数据库类型以及该数据库类型所对应的外部程序集名称和类名称。通过这种模式,可以方便用户扩充自己的逻辑数据库节点,增加对特定数据的有效组织和管理,并可针对该逻辑数据库节点,扩充需要的子节点和相应的处理功能插件。以下是一个示例文件:
<?xml version="1.0" encoding="utf-8" ?>
<gbds>
<gdb name="基础地理数据库" type="0"></gdb>
<gdb name="规划数据库" type="1" path="GDBManageLib.dll" classname="JLK.Catalog.GxGHLogDatabase2"></gdb>
<gdb name="土地利用数据库" type="2"></gdb>
<gdb name="农田水利数据库" type="5" path="GDBExtend.dll" classname="GDBExtend.GxLogJTNTDatabase" model="1"></gdb>
</gbds>
每个gdb对应一个逻辑空间数据库类型。gdb项提供5个属性项,其含义如下:
Ø Name-逻辑数据库类型名称
Ø Type-逻辑数据库类别,要求类别不能重复。
Ø Path-扩展数据库类所在dll文件
Ø Classname-扩展数据库类名称
Ø model-指定扩展数据库右键菜单是否使用基类的右键菜单,取值0和1,1表示使用基类右键菜单项目。默认值为1。
以上属性,name和type是必备属性,仅当使用外部扩展的逻辑数据库类是,后面3个属性才需要。
在创建逻辑空间数据库中,需要同时设置关联的物理空间数据库连接信息,逻辑空间数据库对应的物理空间数据库可以和当前管理平台所关联的物理空间数据库一致,也可以配置到新的物理空间数据库连接。设置新的空间数据库连接窗体如下:
添加文件夹用于在逻辑空间数据库节点下创建一个文件夹类型节点,实现对逻辑数据库中各类数据的分类组织管。在文件夹节点下面还可以添加子文件夹,添加文件夹功能界面如下:
用于管理当前逻辑空间数据库关联的物理空间数据库的版本,界面如下:
在逻辑数据库节点下的注册版本功能主要提供一次性将当前逻辑空间数据库节点下面的所有要素类执行注册版本操作。
附加要素集是将当前逻辑数据库关联的物理数据库中已有的要素集附加到当前逻辑数据库中。执行附加要素集,将自动将要素集下面的所有要素类附加到当前逻辑数据库中。界面如下:
已经附加到当前逻辑数据库中要素集不能被重复附加,因此已经在当前逻辑数据库节点上的要素集,将被过滤掉不显示在列表中。
将当前逻辑数据库关联的物理数据库中已有的要素类附加到当前逻辑数据库中。界面如下:
已经附加到当前逻辑数据库中要素集不能被重复附加,因此已经在当前逻辑数据库节点上的要素集,将被过滤掉不显示在列表中。
在目录树上点击节点名称,可以允许用户修改节点的名称。对要素集、要素类等这里修改的名称是修改对应要素类或要素集的逻辑名称,在空间数据库中其实际对应的物理名称不会进行修改。
数据入库管理主要提供数据导入,数据建库方案管理的功能。
(1)导入要素类
将外部数据源中要素类导入到当前逻辑数据库对应的物理数据库中,并在逻辑数据库中创建相应的要素类节点。导入要素类提供单个要素类导入和批量导入2个工具。界面如下:
(2)导入属性表
将外部数据源中属性表导入到当前逻辑数据库对应的物理数据库中,并在逻辑数据库中创建相应的属性表节点。导入属性表提供单个属性表导入和批量导入2个工具。界面如下合导入要素类界面相同。
(3)导入栅格
将栅格数据导入到当前逻辑数据库对应的物理数据库中,并在逻辑数据库中创建相应的栅格数据节点。界面如下:
(4) 导入VCT数据
将VCT格式数据导入到逻辑数据库对应的物理数据库中,并在逻辑数据库中创建相应的要素类节点。界面如下:
提供对逻辑数据库图层结构的管理和维护。建库方案管理界面如下:
在该窗体中,点击添加可以进入新建图层窗体,界面如下
在此定义好图层的相关信息,以及字段名称等信息后,确定即完成一个图层定义。
出手工输入逻辑数据库的建库方案外,在此支持从已有的模板数据库中自动导入相应的要素类及其属性结构形成本逻辑数据库的建库方案,也支持从xml配置文件中导入已有的建库方案。以配置的建库方案可以保存为xml文件。
对每个图层通过点击属性按钮可以查看图层的属性结构定义。界面如下:
在属性结构定义界面中可以对属性字段进行添加、删除和属性编辑处理。可以定义属性字段的域值和字段数据验证格式。界面如下:
数据加载是根据配置的建库方案,从外部数据源中将多个要素类上载到逻辑数据库中,导入操作采用向导方式由用户定义外部数据源和逻辑数据库结构定义之间的映射关系。本系统通过名称相似原则自己建立两者之间的对照关系。界面如下:
加载外部数据源可以是一组shapefile文件,也可以是个人数据库文件。对shapefile文件,只需指定shapefile文件所在目录,对个人数据库,需要指定相应的数据库文件。设置好后,点击下一步,建立外部数据源和逻辑数据库中图层结构配置中的图层之间的对照关系及字段的对照关系。界面如下:
点击该界面上的字段匹配可以设置导入数据源中数据和逻辑数据库中数据的对照关系。其界面如下:
上面2个界面中的check框没有打钩选中的图层或属性字段不会加载到空间数据库中。此外在图层和字段对照表中最右边列中从组合框选择了“<无>”,这些图层和字段的数据也不会加载到空间数据库中。
定义映射关系后,点击下一步,设置导入方式,界面如下:
数据导入采用重新导入或追加导入2种方式。重新导入将清空已导入数据,追加导入就在现有数据基础上导入新的数据。
添加地图是在逻辑数据库中添加一新的地图,其界面如下:
地图属性设置用来定义地图的相应配置参数,并配置地图中所包含的图层信息,其界面如下:
该界面用来配置地图所包含图层,这里采用树结构进行地图图层配置,用户在树节点上可以添加新的图层,可以创建组合图层,通过拖拽方式可以调整图层的显示顺序。
该界面定义了地图的显示方式及地图裁剪方式设置。
该界面设置地图的坐标系统。
在地图节点右键菜单可以添加新的图层到地图中,其界面如下:
选择相应要素类后,点击添加,将把所选择要素类添加当前地图中。在添加操作时,系统自动根据添加要素类几何类型确定数据插入的位置。
元数据功能用来定义节点的元数据信息,其界面如下:
/
质量检查部分以逻辑数据库为基础进行配置和检查。在质量检查模块以逻辑空间数据库的定义的数据库结构为基础,进行质量检查方案的配置和管理。系统的属性结构合理性检查也基于建库方案中配置的数据库体结构和属性字段取值设置。
根据空间数据检查要求分析,目前系统的检查功能主要实现了如下一组检查规则
l 图层结构检查:检查字段结构是否符合建库方案中所定义的结构。主要对逻辑数据库中要素类的逻辑名、要素类别名、要素类字段结构、字段类型、字段长度、字段名称等进行检查。该检查是针对要素类的结构进行的。
l 字段是否为空检查:对要素类中每个要素进行检查,确定每个要素属性字段取值是否为空(对文本类型包含是否长度为0文本),该检查也是根据在建库方案中定义设置字段是否允许为空为检查条件的。
l 字段域值检查:对要素类中每要素进行检查,确定要素属性字段取值是否符号定义的域值范围。该检查也是根据在建库方案中定义设置字段域值进行的,如果字段没有定义域值,则该属性字段不进行该项检查。
l 字段格式检查:该检查是对文本类型字段进行的检查,它对要素类中每要素进行检查,检查文本字段文本值是否符合指定规则要求。本系统对文本字段规则检查是采用正则表达式进行格式验证,该检查也是根据在建库方案中设置的文本字段取值格式对要素属性值进行验证,如文本字段没有定义该取值格式,该字段不进行该项检查。
l 微短线检查:检查线要素对象,判断线长是否小于指定长度。
l 微小面检查:对面要素对象进行检查,确定面的面积是否小于指定面积值。
l 重复对象检查:对点、线、面三种类型要素类进行检查,检查是否有完成重合的对象。
l 线自相交检查:对线要素类进行检查,判断线是否存在自相交情况。
l 线相交检查:对线要素类进行检查,检查同一个线要素类中线对象之间是否存在相交情况,或者是2个线要素类之间,线线之间是否存在相交的情况。
l 线重叠检查:对线要素类进行检查,检查同一个线要素类中线对象之间是否存在重叠情况,或者是2个线要素类之间,线线之间是否存在重叠的情况。
l 线面相交检查:检查线要素和面要素自己是否存在相交的情况。
l 面重叠检查:对面要素类进行检查,检查同一个面要素类中面对象之间是否存在重叠情况,或者是2个面要素类之间,面面之间是否存在重叠的情况。
l 线上重复点检查:对线要素类和面要素类进行检查,检查线要素或面要素边界线上是否存在重复点。
l 悬挂线检查:对线要素类进行检查,检查线要素端点是否存在悬挂情况。
l 伪节点检查:对线要素类进行检查,检查线要素端点是否存在伪节点情况。
该功能用于定义数据库节点的质检方案。配置界面如下:
在检查规则节点点击右键可以添加相应的检查规则,添加规则窗体如下:
质检方案要对每个逻辑数据库节点分别配置保存。
系统对每个数据库独自维护自己的检查参数,配置界面如下:
数据检查时根据前面所定义的检查规则和配置的检查参数,对当前数据库中的要素类进行相应的质量检查。以下是进行检查的执行界面。
检查错误列表用于查看逻辑数据库检查的错误信息,界面如下:
在显示的错误信息如果是要素上的错误,并当该要素所在要素类添加到当前地图视图中了,则可以对该要素执行缩放定位操作,如果数据还没有被加载,则不能执行缩放定位操作。
单图层检查是对当前加载到地图视图中一个图层进行质量检查,不管该图层所在逻辑数据库是否定义配置了质检方案。其操作界面如下:
主要空间数据编辑和空间分析功能。
能够对图形对象增加、删除、复制和修改等操作;能绘制点、线、面等基本图形对象;能够精确地捕捉图形要素几何特征点坐标,实现拓扑编辑、路径编辑等高级编辑功能。
图形编辑提供类CAD数据的编辑操作模式。具体功能参考JLKEngine的相关文档。
提供基本的空间分析功能,包括缓冲区分析、叠加分析、三维分析、路径分析等基础的分析功能。
本处数据库设计主要从方便空间数据组织管理出发,设计定义的一组属性表。
来管理和维护空间数据管理数据的目录层次结构,表结构如下:
字段名称 |
中文名 |
类型 |
长度 |
备注 |
OBJECTID |
对象OID |
整型 |
|
|
Name |
节点名称 |
文本 |
150 |
|
NodeType |
节点类型 |
整型 |
|
见注1 |
ParentID |
父节点OID |
整型 |
|
以目录树根节点为父节点,其值为0 |
Tag |
扩展对象 |
文本 |
150 |
一般可通过另外一个表为对应节点类型提供扩展属性,该字段可记录该节点对应扩展属性表中的一个OID。此外还可采用一个文本串来记录其扩展属性 |
MetaDataOID |
元数据OID |
整型 |
|
|
Description |
节点描述 |
文本 |
254 |
|
GDBType |
数据库类型 |
整型 |
|
该节点对数据库节点有效,其他类型节点不使用 |
注1:系统内部已经定义了如下类型,系统根据节点类型查询其相关对照表获取节点扩展属性。
public enum TreeNodeType
{
/// <summary>
/// 数据库
/// </summary>
Database=0,//数据库
/// <summary>
/// 地图集
/// </summary>
Maps=1,//地图集
/// <summary>
/// 地图
/// </summary>
Map=2,//地图
/// <summary>
/// 图层
/// </summary>
Layer=3,//图层
/// <summary>
/// 渲染信息
/// </summary>
Render=4,//渲染信息
/// <summary>
/// 数据集,包括要素类、对象类、影像等
/// </summary>
Dataset=5,//数据集,包括要素类、对象类、影像等
/// <summary>
/// 文件夹
/// </summary>
Folder=6,//文件夹
/// <summary>
/// 标准文件夹,下面存放一些标准
/// </summary>
StandardFolder=7,
/// <summary>
/// 标准定义
/// </summary>
StandardIndex=8,
/// <summary>
/// 代码节点
/// </summary>
Code=9,
/// <summary>
/// 文档节点
/// </summary>
Documents=10,
/// <summary>
/// 文档文件夹节点
/// </summary>
DoucmentFolder=11
}
定义了逻辑数据库的空间数据库连接信息
字段名称 |
中文名 |
类型 |
长度 |
备注 |
Name |
连接名称 |
文本 |
150 |
|
ConnectionInfo |
连接信息 |
二进制 |
|
|
Description |
节点描述 |
文本 |
254 |
|
GDBType |
数据库类型 |
整型 |
|
该节点对数据库节点有效,其他类型节点不使用 |
定义了树节点上数据集节点所对应的物理数据信息
字段名称 |
中文名 |
类型 |
长度 |
备注 |
Name |
数据集逻辑名称 |
文本 |
150 |
|
DataType |
数据类型 |
短整形 |
|
和esriDatasetType取值相同 |
Description |
节点描述 |
文本 |
254 |
|
GDBID |
逻辑数据库ID |
整型 |
|
|
RealName |
实际数据集名称 |
文本 |
200 |
|
定义了地图的相关属性信息
字段名称 |
中文名 |
类型 |
长度 |
备注 |
Name |
地图名称 |
文本 |
150 |
|
AutoExtentType |
范围类型 |
短整形 |
|
|
AutoExtentScale |
显示比例尺 |
双精度 |
|
|
AutoExtentLeft |
显示范围左边界 |
双精度 |
|
|
AutoExtentRight |
显示范围右边界 |
双精度 |
|
|
AutoExtentTop |
显示范围上边界 |
双精度 |
|
|
AutoExtentBottom |
显示范围下边界 |
双精度 |
|
|
ClipType |
裁剪方式 |
短整形 |
|
|
ClipGridAndGraticules |
是否裁剪网格 |
短整形 |
|
|
SpatialRefrence |
空间坐标系 |
二进制 |
|
|
Border |
边界符号 |
二进制 |
|
|
ClipGeometry |
裁剪几何 |
二进制 |
|
|
定义地图下图层相关属性信息
字段名称 |
中文名 |
类型 |
长度 |
备注 |
LayerName |
图层名称 |
文本 |
150 |
|
DatasetOID |
关联的数据集OID |
整形 |
|
关联 DATASETTABLE表 |
Render |
图层渲染信息 |
二进制 |
|
|
LayerType |
图层类型 |
短整形 |
|
取值见注1 |
MaxScale |
显示的最大比例 |
双精度 |
|
|
MinScale |
显示的最小比例 |
双精度 |
|
|
IsVisible |
是否可见 |
短整形 |
|
|
IsLable |
是否标注 |
短整形 |
|
|
LayerOrder |
图层顺序 |
整形 |
|
|
AnnoInfo |
标注信息 |
二进制 |
|
|
Filter |
图层过滤设置 |
文本 |
200 |
|
LayerInfo |
图层信息 |
二进制 |
|
|
注1:定义的图层类型如下
/// <summary>
/// 图层类型
/// </summary>
public enum LayerType
{
/// <summary>
/// 点图层
/// </summary>
PointLayer=0,
/// <summary>
/// 线
/// </summary>
LineLayer=1,
/// <summary>
/// 面
/// </summary>
PolygonLayer=2,
/// <summary>
/// 注记
/// </summary>
AnnoLayer=3,
/// <summary>
/// 栅格
/// </summary>
RasterLayer=4,
/// <summary>
/// Tin
/// </summary>
TinLayer=5,
/// <summary>
/// 拓扑
/// </summary>
TopoLayer=6,
/// <summary>
/// 组合
///
/// </summary>
GroupLayer=7,
/// <summary>
/// 底图
/// </summary>
BasicMapLayer =8,
UnknownLayer = 20
}
定义了一个逻辑数据库的检查规则,结构如下:
字段名称 |
中文名 |
类型 |
长度 |
备注 |
GDBOID |
逻辑数据库ID |
整型 |
|
|
RuleType |
类型 |
短整型 |
|
|
RuleName |
名称 |
文本 |
150 |
|
DatasetName |
检查的要素类名 |
文本 |
200 |
|
RelateDatasetName |
关联要素类名 |
文本 |
200 |
|
定义了一个逻辑数据库的检查参数,结构如下:
字段名称 |
中文名 |
类型 |
长度 |
备注 |
GDBOID |
逻辑数据库ID |
整型 |
|
|
MinLength |
最短线长 |
双精度 |
|
|
MinArea |
最小面积 |
双精度 |
|
|
MinDistance |
2点最小容差 |
双精度 |
|
|
InvertMinAngle |
最小夹角 |
双精度 |
|
|
定义了一个逻辑数据库的检查结果,结构如下:
字段名称 |
中文名 |
类型 |
长度 |
备注 |
GDBOID |
逻辑数据库ID |
整型 |
|
|
DatasetName |
要素类逻辑名 |
文本 |
200 |
|
Realdatasetname |
要素类物理名 |
文本 |
200 |
|
OID |
对象OID |
整型 |
|
|
RelateDatasetName |
关联要素类逻辑名 |
文本 |
200 |
|
RealRelateDatasetname |
关联要素类物理名 |
文本 |
200 |
|
RelateOID |
关联对象OID |
整型 |
|
|
errortype |
错误类型 |
短整型 |
|
|
ErrorInfo |
错误信息 |
二进制 |
|
|
ModifyFlag |
修改标志 |
短整型 |
|
|
数据管理平台扩展开发有如下几种方式:
(1)功能插件的扩展开发。即根据具体业务需要开发业务处理插件进行系统功能的扩展,其功能插件扩展机制请参考第5部分内容进行。本处不做详细说明。
(2)管理树右键菜单扩展。即把新开发的工具添加到管理树节点的右键菜单中,其实际也就是把新开发的功能插件配置加载到管理树节点的右键菜单,系统通过相应的外部配置来实现该功能。目前管理平台对根节点和数据库节点开放了外部菜单配置支持,其他节点没有开放。
(3)管理树节点扩展。系统可支持多种方式的节点类型扩充机制,以实现管理树中外部节点类型的添加,来实现对系统的扩展。
(4)图层树右键菜单扩展。
详细介绍参考《JLKEngine中间件类库结构及插件开发应用》第4部分内容进行。这里简单说明一下管理平台中对插件创建的机制:在管理平台中创建插件时,通过OnCreate方法传人插件内部的是GxApplicationEx对象,其派生于JLK.Catalog.GxApplication对象,GxApplication派生于 ApplicationBase对象, 并实现了IGxApplication接口。IGxApplication接口定义如下:
public interface IGxApplication : IApplication
{
/// <summary>
/// 获取或设置在数据管理中选择的Gx对象集
/// </summary>
IGxSelection GxSelection
{
set;get;
}
/// <summary>
/// 获取或设置关联的Gx目录树
/// </summary>
IGxCatalog GxCatalog
{
set;get;
}
}
显然在用于目录节点的插件,通过该接口可以获取当前目录树节点上被选中的节点,通过获取选中的节点可以进行插件的相应操作。可以说插件和管理平台树节点交互均通过IGxApplication来进行的。和地图的交互则通过IApplication中的FocusMap来交互。
首先根据第2部分功能插件扩展开发,实现新的功能插件,然后通过配置文件方式加载的对应树节点的右键盘菜单中,目前管理平台对以下节点类型提供了相应的外部配置文件菜单,见下表:
Gx对象 |
类型 |
菜单配置文件名 |
GxLogCatalog |
|
GxLogCatalog.xml |
GxLogDatabase |
0-基础地理数据库
|
GxLogDatabase_0.xml |
1-规划数据库 |
GxLogDatabase_1.xml |
|
2-土地利用 |
GxLogDatabase_2.xml |
菜单配置文件要求放到管理平台运行目录下的menus目录下面。
菜单配置文件结构如下:
(1)一个简单配置文件例子如下
<?xml version="1.0" encoding="utf-8" ?>
<BarItems>
<BarItem name="AddFolderNode" />
<BarItem name="AddMapNode" />
<BarItem name="NewBarSubItem" caption="新建">
<BarItem name="NewFeatureDataset" />
</BarItem>
</BarItems>
如上面配置,其对应BarItem中所有工具都是从主程序的菜单配置加载进来了,所以在这里的配置就仅是给出BarItem所对应工具的名称属性(名称要求是唯一的)。
(2)第2种配置方式
如果BarItem对应工具不在主程序配置文件中定义,而需要在目录节点右键菜单来动态加载,则需要根据完整的dll路径和类名称,类似主程序中BarItem的完整定义。如下的一个BarItem定义:
<?xml version="1.0" encoding="utf-8" ?>
<BarItems>
<BarItem name="AttributeQuery" classname="PlugManage.BaseTools.AttributeQuery" path="PlugManage.BaseTools.dll" BeginGroup="True" />
<BarItem name="AddMapNode" />
<BarItem name="NewBarSubItem" caption="新建">
<BarItem name="NewFeatureDataset" />
</BarItem>
</BarItems>
(3)包含下拉菜单的配置文件
此外,还可以在配置文件中配置成弹出菜单方式。如下例子
<?xml version="1.0" encoding="utf-8" ?>
<BarItems>
<BarItem name="AddExtLogNode" classname="GDBExtend.AddExtLogNode" path="GDBExtend.dll" hooktype="0" />
<BarItem name="ImportBarSubItem" name=”导入”> //定义了一个导入弹出菜单
<BarItem name="ImportSingleFeatureClassCommand"/>
<BarItem name="ImportVCTData"/>
</BarItem>
<BarItem name="BatchConvertToSHP"/>
</BarItems>
(4)注意事项
(1)菜单配置中对应插件名称和节点内部已有的插件名称相同时,配置文件中的插件不会被加载上去。
(2)弹出菜单名和节点内部已有弹出菜单名相同,那么在配置文件中弹出菜单下的菜单项将加载到内部已有的弹出菜单下面。
(3)管理平台的树节点首先创建的是内部菜单项,然后才是配置文件中的菜单项。
本部分内容主要说明如何对数据管理系统中目录树节点进行扩展开发。首先介绍一下数据管理系统中目录书节点层次关系维护表。在数据管理系统中,通过DataLogTree表来管理和维护数据的目录层次结构,表结构如下:
字段名称 |
中文名 |
类型 |
长度 |
备注 |
OBJECTID |
对象OID |
整型 |
|
|
Name |
节点名称 |
文本 |
150 |
|
NodeType |
节点类型 |
整型 |
|
见注1 |
ParentID |
父节点OID |
整型 |
|
以目录树根节点为父节点,其值为0 |
Tag |
扩展对象 |
文本 |
150 |
一般可通过另外一个表为对应节点类型提供扩展属性,该字段可记录该节点对应扩展属性表中的一个OID。此外还可采用一个文本串来记录其扩展属性 |
MetaDataOID |
元数据OID |
整型 |
|
|
Description |
节点描述 |
文本 |
254 |
|
GDBType |
数据库类型 |
整型 |
|
该节点对数据库节点有效,其他类型节点不使用 |
注1:系统内部已经定义了如下类型
public enum TreeNodeType
{
/// <summary>
/// 数据库
/// </summary>
Database=0,//数据库
/// <summary>
/// 地图集
/// </summary>
Maps=1,//地图集
/// <summary>
/// 地图
/// </summary>
Map=2,//地图
/// <summary>
/// 图层
/// </summary>
Layer=3,//图层
/// <summary>
/// 渲染信息
/// </summary>
Render=4,//渲染信息
/// <summary>
/// 数据集,包括要素类、对象类、影像等
/// </summary>
Dataset=5,//数据集,包括要素类、对象类、影像等
/// <summary>
/// 文件夹
/// </summary>
Folder=6,//文件夹
/// <summary>
/// 标准文件夹,下面存放一些标准
/// </summary>
StandardFolder=7,
/// <summary>
/// 标准定义
/// </summary>
StandardIndex=8,
/// <summary>
/// 代码节点
/// </summary>
Code=9,
/// <summary>
/// 文档节点
/// </summary>
Documents=10,
/// <summary>
/// 文档文件夹节点
/// </summary>
DoucmentFolder=11
}
数据库节点时放到目录管理树根节点下面,其扩展有2中实现方式:
(1)简单方式
这种实现方式主要针对用户的数据库节点变化比较小的情况,代码修改量较少是,可以采用该方式。其扩展方式就是从系统中的GxLogDatabase下派生一个新的数据库类型节点,然后对需要变更的函数进行重载,添加用户自己的实现代码。该实现方式可参考GDBExtend工程中的GxLogDatabase2的实现,以及代码中的注释说明。
public class GxLogDatabase2 : GxLogDatabase
{
public GxLogDatabase2()
{
m_name = "其他数据库";
base.m_Catalog = "数据库";
//添加其他环境初始化代码。
//外部扩展的库可能会存在一些运行环境参数的扩充,可以在数据库加载时进行扩充的环境参数的初始化
//如建立和属性表的关联等,读取配置文件中新添加的一些参数等处理过程
}
public override void Init(object popment)
{
if (Model == 1) //该值为1加载基类内置菜单,并加装该节点配置的外部菜单
{
//加载基类的右键菜单,基类菜单函数加载也直接加载了外部扩展菜单配置文件
//如果不需要使用基类,请注释掉下面这一句代码,并添加自己的右键菜单代码
base.Init(popment);// 加装该节点配置的外部菜单处理已经包含在该基类函数//中了
}
else //该情况不采用基类的内部右键菜单
{
JLK.Framework.IPopuMenuWrap m_PopuMenu = popment as JLK.Framework.IPopuMenuWrap;
//
m_PopuMenu.Clear(); //首先清空原有的菜单对象
string filename = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath + "\\menus\\", MenuFileName);
if (System.IO.File.Exists(filename))
{
//创建外部菜单
JLK.Framework.CatalogObjectMenuHelper.StartCreateBar(m_PopuMenu, filename);
}
//添加的一些内置插件,可以根据需要添加
m_PopuMenu.AddItem("DeleteObject", false);//添加删除节点插件
}
}
/// <summary>
/// 重载以加载外部扩展的节点
/// </summary>
/// <param name="pRow">DataLogTree表中记录行对象</param>
/// <param name="type">节点类型</param>
protected override void CreateExtendObject(ESRI.ArcGIS.Geodatabase.IRow pRow, int type)
{
base.CreateExtendObject(pRow, type);
//重载进行外部扩展节点的创建
if (type == 20)
{
GxExtendLogObjEx gx = new GxExtendLogObjEx();
GDBManageLib.ManagerTable.DataLogTreeTable table = new GDBManageLib.ManagerTable.DataLogTreeTable();
int ntindex = pRow.Fields.FindField(table.NameField);
string name = pRow.get_Value(ntindex).ToString();
gx.NodeName = name;
int tagindex = pRow.Fields.FindField(table.TagField);
string tag = pRow.get_Value(tagindex).ToString();
gx.OID = pRow.OID;
if (tag.Length > 0)
{
gx.Tag = tag;
}
gx.MetaDataOID = GetMetaDataOID(pRow);
gx.Attach(this, m_pGxCatalog);
}
}
}
(2)复杂方式
这种方式适用于对代码修改较大的情况下的一种扩展方式。具体实现参考GDBExtend工程中的GxLogJTNTDatabase的实现,以及代码中的注释说明。
/// <summary>
/// 扩充方式一
/// </summary>
/// <remarks>
/// GxLogObjectContainer Gx对象的抽象基类。
/// IGxLogDatabase 数据库节点接口,必须实现
/// IGxObjectUI 节点显示图标,必须实现
/// IGxContextMenuWap 右键菜单,需要提供右键菜单的节点必须实现
/// IGxObjectEdit 节点编辑操作,需要提供对节点的删除、拷贝、重命名、属性编辑等操作的必须实现。
/// </remarks>
public class GxLogJTNTDatabase : GxLogObjectContainer, IGxLogDatabase, IGxObjectUI, IGxContextMenuWap, IGxObjectEdit
(3)扩展后进行部署配置
对数据库节点扩充后,将编译的dll放到本系统运行目录下,此外还需要在系统运行目录下的gdbtype.xml文件添加该新数据库类型节点的信息,这样在根节点进行新建数据库窗体中就可以查看到所扩充的数据库类型。Gdbtype.xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<gbds>
<gdb name="基础地理数据库" type="0"></gdb>
<gdb name="规划数据库" type="1" path="GDBManageLib.dll" classname="JLK.Catalog.GxGHLogDatabase2"></gdb>
<gdb name="土地利用数据库" type="2"></gdb>
<gdb name="农田水利数据库" type="5" path="GDBExtend.dll" classname="GDBExtend.GxLogJTNTDatabase" model="1"></gdb>
</gbds>
每个gdb节对应一个数据库节点类型,其相应属性见下表:
名称 |
说明 |
备注 |
Name |
数据库名称 |
必选 |
type |
数据库类型 |
数字类型,保持名称的唯一性, 必选。0、1、2三个号用户以后的扩展不要使用 |
path |
扩展数据库节点的dll文件名 |
如果数据库节点类型是用户扩充的,该属性就必须要 |
classname |
类名 |
如果数据库节点类型是用户扩充的,该属性就必须要 |
model |
右键菜单加载方式 |
对通过派生于GxLogDatabase类进行数据库类型扩展,GxLogDatabase内部已有菜单可以被派生类继承自动加载,用户也可以不继承加载。在配置文件中定义的该属性用于定义数据库节点是否要加载基类的右键菜单项目,为1是需要加载,为0是不需要加载。该属性默认值为1,及定义中把包含model属性时,系统默认为1。 |
(1)固定节点类型扩展
固定节点类型表示该节点类型是一个固定的节点,它必定存在某个Gx节点下面。可参考GDBExtend工程中的GxExtendLogObj和GxExtendLogObjChild的实现及代码中的注释说明。
GxExtendLogObj是一个容器类固定节点,该节点在GxLogJTNTDatabase中被创建添加到其上面;GxExtendLogObjChild是一个非容器类固定节点,被作为GxExtendLogObj的一个子节点添加到目录树中。其定义分布见下面:
/// <summary>
/// 固定类型节点,该节的类型固定存在于某Gx节点下,不需要保存的数据库节点上。
/// </summary>
/// <remarks>
/// 该接口设计为一个容器类Gx对象,因此可直接派生于GxObjectContainer类,由于该节点为一个固体类型节点,不需要从管理表来获取信息
/// 因此它从GxObjectContainer派生,而不是GxLogObjectContainer(GxLogObjectContainer是对本管理信息系统中需要从管理表中来
/// 获取信息的类的一种方式)。
/// 实现IGxExtendLogObj,可以表示其为一个外部扩展的Gx对象,该接口不是必须要实现,
/// 引入它可以考虑简化代码中一下地方的写法。
/// IGxContextMenuWap是菜单配置接口,节点要提供右键菜单,必须实现该接口
/// IGxObjectEdit是对象编辑接口,主要为节点提供重命名、删除节点的操作,如有节点支持重命名、删除操作中的其中一个就需要
/// 实现该接口。如果都不支持可以,就不需要实现该接口。
/// 本扩展类不提供编辑支持,但实现该接口来说明其代码写法
/// </remarks>
public class GxExtendLogObj : GxObjectContainer, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
/// <summary>
/// 固定类型节点,该节的类型固定存在于某Gx节点下,不需要保存的数据库节点上。
/// </summary>
/// <remarks>
/// 该接口设计为一个非容器类Gx对象,因此可直接派生于GxObject类,由于该节点为一个固体类型节点,不需要从管理表来获取信息
/// 因此它从GxObject派生,而不是GxLogObject。
/// 实现IGxExtendLogObj,可以表示其为一个外部扩展的Gx对象,该接口不是必须要实现,
/// 引入它可以考虑简化代码中一下地方的写法。
/// IGxContextMenuWap是菜单配置接口,节点要提供右键菜单,必须实现该接口
/// IGxObjectEdit是对象编辑接口,主要为节点提供重命名、删除节点的操作,如有节点支持重命名、删除操作中的其中一个就需要
/// 实现该接口。如果都不支持可以,就不需要实现该接口。
/// 本扩展类不提供编辑支持,但实现该接口来说明其代码写法
/// </remarks>
public class GxExtendLogObjChild : GxObject, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
(2)动态类型节点扩展
动态类型节点是将节点记录到DataLogTree,通过从DataLogTree表中来获取加载的一种节点类型。
(1)动态类型节点扩展属性表定义
该实例主要来说明如何进行动态类型节点扩展,这里考虑给该扩充动态节点创建一个扩展属性表,用于记录其扩展的属性信息。为通过ArcGISEngine中ITable来操作该表,这里采用ArcCatalog来定义该数据表。
数据表名:ExtendObject
/
供一个ExtName字段,以进行说明。
(2)动态类型节点扩展类例说明
动态节点扩展的例子可参考GDBExtend工程中的GxExtendLogObjEx和GxExtendLogObjExChild的实现及代码中的注释说明。
GxExtendLogObjEx是一个容器类动态节点,该节点在GxLogJTNTDatabase中被添加到其上面;GxExtendLogObjExChild是一个非容器类动态节点,被作为GxExtendLogObjEx的一个子节点添加到目录树中。其定义分布见下面:
/// <summary>
///动态类型节点,这里定义的动态节点对应节点类型值为20。
/// </summary>
/// <remarks>
/// 该接口设计为一个容器类Gx对象,因此可直接派生于GxObjectContainer类,由于该节点为一个固体类型节点,不需要从管理表来获取信息
/// 因此它从GxObjectContainer派生,而不是GxLogObjectContainer(GxLogObjectContainer是对本管理信息系统中需要从管理表中来
/// 获取信息的类的一种方式)。
/// 实现IGxExtendLogObj,可以表示其为一个外部扩展的Gx对象,该接口不是必须要实现,
/// 引入它可以考虑简化代码中一下地方的写法。
/// IGxContextMenuWap是菜单配置接口,节点要提供右键菜单,必须实现该接口
/// IGxObjectEdit是对象编辑接口,主要为节点提供重命名、删除节点的操作,如有节点支持重命名、删除操作中的其中一个就需要
/// 实现该接口。如果都不支持可以,就不需要实现该接口。
/// 本扩展类不提供编辑支持,但实现该接口来说明其代码写法
/// </remarks>
public class GxExtendLogObjEx : GxLogObjectContainer, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
和固定节点的区别在于,其是从GxLogObjectContainer派生,该抽象类是针对数据管理节点封住的一个容器类,其中封装了从DataLogTree表加载其子节点的实现,对外部扩展的子节点要能加载到树目录中,仅需要重载GxLogObjectContainer中的如下函数:
protected override void CreateExtendObject(ESRI.ArcGIS.Geodatabase.IRow pRow, int type)
可参看GxLogJTNTDatabase和GxExtendLogObjEx相关代码如何创建外部的节点对象。
/// <summary>
///动态子节点类型节点,这里定义的动态节点对应节点类型值为20。
/// </summary>
/// <remarks>
/// 该接口设计为一个非容器类Gx对象,因此可直接派生于GxLogObject类,由于该节点为一个动态类型节点,需要从管理表来获取信息
/// 因此它从GxLogObject派生。
/// 实现IGxExtendLogObj,可以表示其为一个外部扩展的Gx对象,该接口不是必须要实现,
/// 引入它可以考虑简化代码中一下地方的写法。
/// IGxContextMenuWap是菜单配置接口,节点要提供右键菜单,必须实现该接口
/// IGxObjectEdit是对象编辑接口,主要为节点提供重命名、删除节点的操作,如有节点支持重命名、删除操作中的其中一个就需要
/// 实现该接口。如果都不支持可以,就不需要实现该接口。
///
/// </remarks>
public class GxExtendLogObjExChild : GxLogObject, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
(3)动态扩展节点创建插件实现
动态类型节点需要在父节点上通过右键菜单进行节点的创建,因此在GDBExtend工程提供了一个动态节点创建插件的例子来说明如何创建一个动态插件,并保存到目录树中,以及动态节点扩展属性如何保存。以下是插件的例子:
/// <summary>
/// 添加扩展节点工具
/// </summary>
public class AddExtLogNode : ESRI.ArcGIS.ADF.BaseClasses.BaseCommand
{
//这个是应用程序接口,系统创建插件是通过OnCreate方法传人插件。
IApplication m_pApp = null;
public AddExtLogNode()
{
base.m_name = "AddExtLogNode";//插件名称,需要保证唯一
base.m_caption = "添加节点";//标题
}
public override void OnCreate(object hook)
{
m_pApp = hook as IApplication;
}
//右键菜单点击时,将调用该方法完成代码执行
public override void OnClick()
{
frmNewLogNode frm = new frmNewLogNode();
frm.GxOject = (m_pApp as JLK.Catalog.IGxApplication).GxSelection.FirstObject;
if( (m_pApp as JLK.Catalog.IGxApplication).GxSelection.FirstObject is IGxLogDatabase) //如果当前选中一个数据库节点,则设置创建节点类型为20
frm.NodeType = 20; //创建的GxExtendLogObjEx
else
frm.NodeType = 22; //否则创建节的类型为22,创建的是GxExtendLogObjExChild
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//创建完成后刷新父节点。
(m_pApp as JLK.Catalog.IGxApplication).GxSelection.FirstObject.Refresh();
}
}
}
关于如何保存,参见frmNewLogNode.cs中相关代码。
(1)注意在扩展节点时要区分容器类节点和非容器类节点。容器类节点下面可以包含子节点,而非容器类节点下面不能包含子节点,因此它们的派生基类是有区别的。此外创建节点类型对象的插件只能存在容器类节点上。
(2)扩展节点右键菜单实现方式和系统内部节点的机制完全一样。
(3)扩展的动态节点的NodeType不能和系统中已有的相同,以及被其他扩展节点使用的值也不能重复使用。
联系方式:028-65955282,13982071140 黄先生,
在线联系, QQ:26326507, http://www.linjon.cn, 成都领君科技有限公司
对于公司基于ArcGIS开发的JLKEngine中间件平台产品,可以在线下载试用, http://www.ljjlk.com
对于公司基于ASP.NET开发的SuperFlow工作流平台产品,可以在线下载试用, http://www.ljlk.net