|
|
摘 要:数据字典保存了有关数据库结构的重要信息,对于数据库系统的开发、维护有重要的意义。ArcView GIS是一款地理信息系统软件,具有对属性数据的操作功能,本文就数据字典在基于ArcView GIS的地理信息系统开发中的应用进行了探讨,通过数据字典技术管理ArcView中的图层,实现程序代码与数据模型的分离,从而提高程序的适应性。
关键词:数据字典 ArcView GIS 图层
数据字典是数据库系统中用来保存非数据信息的数据库,它承担着管理数据资源、数据标准化等功能,以其重要性被称为“数据库的数据库”[1][2]。ArcView GIS是ESRI(环境系统研究所)开发的桌面地理信息系统软件,采用了一种无拓扑关系的矢量数据格式shapefile,同时具有管理、处理属性数据表的能力[3][4]。
在“计算机辅助区域地质调查实习系统”的开发过程中,我们尝试了将数据字典技术应用到GIS图层的管理中。该系统涉及到地质观察点图层、GPS点图层、地质路线图层、地质界线图层、断层线图层、地质体图层等多类图层,而建立各类图层的关键在于建立图层的属性数据表,传统的编程开发都是将数据与代码紧紧绑在一起,这种方法的缺陷在于程序代码严重依赖数据模型,不利于系统的维护、升级,开发过程中一旦图层的属性表的结构发生了更改,开发者将不得不更改大量的代码段。
中国3S吧 3s8.cn
鉴于ArcView GIS中的图层同数据库系统中的数据表存在相似性,在ArcView GIS中可以借鉴数据库系统中的数据字典来管理图层。简单地说,该数据字典主要包括以下几个数据表:
图层编号 图层说明 图层类型 图例文件
001 地质观察点图层 Point Legend1.avl
002 地质路线图层 PolyLine Legend2.avl
003 地质体图层 PolyGon Legend3.avl
…… …… …… ……
专业的3S站 3s8.cn
表1:图层信息表
字段代号 字段名称 字段类型 字段宽度 小数宽度
QDEBGA 地质点编号 CHAR 8 0
QDETYP 地质点类型 CHAR 1 0
PADTHP 地质路线编号 CHAR 6 0
…… …… …… …… ……
专业的3S站 3s8.cn
表2:字段属性表
其中,表1是关于图层信息的数据表,主要保存系统中所存在的各图层的基本信息,其中[图层编号]字段中的值对于各个图层来说是唯一的,此编号由系统开发者编制,而非系统运行过程中随机生成。[图层类型]字段保存了各图层中空间对象的类型,[图例文件]字段中保存了缺省状态下系统为该图层配置的图例文件;表2是字段属性表,描述所有图层的属性表中包含的所有字段的信息,由于不同的图层可能包含同一字段,因此另有专门的数据表在图层与字段间建立链接。表2中各条记录(即各个字段)以”字段代号”相区别;表3表示了图层包含字段的关系。
图层编号 字段代号
001 QDEBGA
001 QDETYP
002 PATHID
…… ……
专业的3S站 3s8.cn
表3:图层与字段间的联系
通过建立数据字典,就可以编写一个公用的程序文件,实现数据模型与代码文件的分离。在实际应用中,还要考虑以下情况:
(1) 建立数据表的索引:给数据表建立索引能较迅速地获取目标记录。这里表1的索引是建立在[图层编号]字段上,表2的索引建立在字段[字段代号]上,表3的索引则建立在[图层编号]字段上。
(2) 数据表的链接:这里在表1和表3间根据[图层代号]字段建立了链接,在表3和表2间根据[字段代号]建立链接。为数据表建立链接可以提高系统的运作效率,具体地说,当表1中选中“图层代号”为“001”的记录时,表3中所有满足“[图层代号]= 001”的记录将自动被选中,同时保存在表2中的、与表3[字段代号]取值一致的记录也被自动选中。
(3) 数据字典的存在形式:数据字典在系统的工作期间应该始终处于打开状态。为了隐匿数据字典,避免用户的认为破坏,可以利用全局变量来表示数据表。
下面所示的代码即通过操作数据字典建立一个空的新图层,并添加到当前的View文档中。其中共涉及到三个代码文件:System.GlobalVariables,View.NewTheme和Program.MakeTheme。第一个文件负责打开数据字典,建立表与表间的链接,定义全局变量,此文件是针对整个系统的,因此应在系统启动时执行;第二个文件进行与用户的通话,获取新图层的路径、名称等,并调用建立新图层的程序文件;文件三──Program.MakeTheme──是一个子程序,根据主调用程序传递的参数,从数据字典中提取相干数据,建立新图层并返回之。
文件System.GlobalVariables:
_dd_theme = Vtab . Make ( "$AVHome\data_dict\dd_theme.dbf".asfilename, false, false )
_dd_fields = Vtab . Make( "$AVHome\data_dict\dd_fields.dbf".asfilename, false, false )
_dd_connect = Vtab . Make( "$AVHome\data_dict\dd_connect.dbf".asfilename, false, false )
‘建立数据表间的链接
fld_thmid1 = _dd_theme . FindField("图层编号")
fld_thmid2 = _dd_connect . FindField("图层编号")
fld_fldid1=_dd_connect . FindField("字段代号")
fld_fldid2=_dd_fields . FindField("字段代号")
_dd_theme . Link( fld_thmid1, _dd_connect, fld_thmid2 )
_dd_connect . Link(fld_fldid1, _dd_fields, fld_fldid2 )
文件View.MakeTheme:
alst={“地质点图层”, “地质路线图层”, “地质体图层”}
blst={“001”, “002”, “003”}
thmid = msgbox.listasstring(alst, “要建的图层为”, “新图层”)
专业的3S站 3s8.cn
if (thmid = nil ) then
return nil
end
thmid = blst.get(alst.findbyvalue(thmid))
thmname = filedialog.put(“NewThm.shp”.asfilename, “*.shp”, “图层保存为”)
if (thmname = nil) then
return nil
end
newthm=av.run(“Program.MakeTheme”, {thmid,thmname})
‘添加新图层到View中
aview=av.getactivedoc
aview.addtheme(newthm)
newthm.setvisible(true)
aview.invalidate
文件Program.MakeTheme:
thm_id = self.get(0)
fl_name = Self . get(1)
querystr1 = "[图层编号]=" + thm_id . Quote
selbit = Bitmap . Make ( _dd_theme . GetNumRecords )
_dd_theme . Query (querystr1, selbit, #VTAB_SELTYPE_NEW)
_dd_theme.setselection(selbit)
for each sel in selbit
thm_type = _dd_theme . ReturnValue ( _dd_theme.FindField("图层类型"), sel )
thm_legend = _dd_theme . ReturnValue ( _dd_theme.FindField("图例文件"), sel ) 专业的3S站 3s8.cn
end
typlst = { "point", "polyline", "polygon" }
classlst = { point, polyline, polygon }
thmclass = classlst.Get( typlst.FindByValue( thm_type.lcase ) )
fldtyplst={"#field_char","#field_decimal","#field_logic"}
fldtyp_lst={"char","decimal","logical"}
'建立新图层,设置新图层的图例
_dd_connect.updateselection
_dd_fields.updateselection
selbit2 = _dd_fields . GetSelection
fld_lst={ }
for each sel in selbit2
fld_name = _dd_fields . returnvalue( _dd_fields.FindField("字段代号"),sel )
fld_type = _dd_fields . returnvalue( _dd_fields.FindField("字段类型"),sel )
fld_type = fldtyplst . get(fldtyp_lst.findbyvalue(fld_type.lcase)).asenum
fld_width = _dd_fields . returnvalue( _dd_fields.FindField("字段宽度"),sel )
fld_decimal = _dd_fields . returnvalue( _dd_fields.FindField("小数宽度"),sel ) 专业的3S站 3s8.cn
fld_lst.add( Field . Make( fld_name,fld_type,fld_width,fld_decimal) )
end
‘ 建立新图层
newFtab = Ftab . MakeNew( fl_name, thmclass)
newFtab . AddFields( fld_lst )
newthm = Ftheme . Make ( newFtab )
newthm.updatelegend
‘ 返回新建的图层
return newthm
通过建立数据字典把具体的图层抽象概括为数据字典中的记录,使得数据结构与程序代码分离,从而通过一个代码文件对数据字典的操作,就可以实现对所有图层的操作,而且更改图层的结构将不影响既有代码的执行效果,不仅可以提高程序代码在系统开发过程中的适应性,而且有助于系统的升级和再应用。
参考资料
1. 《地质矿产术语分类代码在地矿点源信息系统中的应用》.汪新庆,刘刚,袁艳斌,韩志军. 《地球科学》.
2. 《野外数据采集系统数据字典的研制》.韩志军,汪新庆,吴冲龙.《地球科学》.
3. 《Using ArcView》. ESRI. US ESRI. 1990
4. 《Using AVENUE》. ESRI. US ESRI. 1990 |
|