欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏ArcGIS应用与开发ArcGIS桌面 → 正文
数据字典在ArcView GIS中的实现与应用
07-12-17 00:00:00 作者:3s8.cn 出处:3s8.cn
摘  要:数据字典保存了有关数据库结构的重要信息,对于数据库系统的开发、维护有重要的意义。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

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  
    无相关新闻

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号