马利娟,徐永龙,李 斌,李晓亮,杨秀琼,李 丽
(1.陕西天润科技股份有限公司,陕西 西安 710054;2.长安大学 地质工程与测绘学院,陕西 西安 710054)
随着“数字地球”、“数字中国”等概念的兴起,国家林业局于2001年提出了“数字林业”这一概念,并将其明确为“系统地获取、融合、分析和应用数字信息来支持可持续森林经营管理的科学、技术和艺术”[1]。小班是进行森林资源组织、经营和管理的最小单位,也是林业调查设计的基本单位,因此,小班数据既是林业野外调查工作的成果数据,也是数字林业工作的基础数据。作为小班数据必不可少的组成部分,与其空间位置和几何形状相比,其属性信息在更大程度上体现了小班数据的价值,它将与小班相关的诸如地类、林种、林地所有权、土地类型等调查因子作为属性字段,形成二维表进行存储,即小班属性表。根据林业调查类型的不同,小班属性表的字段从几十个到上百个不等,为了便于小班数据的采集和管理,许多字段的取值都用相应的编码来表示。目前,随着各省数字林业工作的开展,林业主管部门积累的小班数据越来越多[2],但小班属性编码体系存在各省编码(即地方编码)和国家标准编码两套标准(前者供小班数据采集以及基于小班数据的数字林业产品制作等生产活动所使用,后者供小班数据成果汇总提交以及数据共享等所使用),导致小班数据的管理和使用存在不便。因此,将海量小班数据的属性信息从某一编码体系向另一编码系统进行便捷、高效的转换,从而实现对已有成果的无损利用和标准化管理,是当前数字林业工作中亟待解决的问题之一[3]。本文从分析不同编码体系下小班属性表的特点入手,明确小班编码转换工作的需求,对基于关系数据库的小班数据属性编码转换的关键技术进行探讨。
表1是地类、树种这两个调查因子(在小班属性表中体现为字段)的编码(部分)分别在某省地方编码体系和国家标准编码体系下取值对照情况;表2是按照地方编码体系对某林区编号为1—3的小班进行调查后所得的小班属性表(部分字段);表3是与表2对应的编号为1—3的小班在国家标准编码体系下的属性表(部分字段)。
表1 某省林业调查因子地方编码与国家编码对照
表2 参照地方编码体系的小班属性信息
表3 参照国家标准编码体系的小班属性信息
表2和表3仅仅列出了地类和树种这两个需要进行编码转换的字段(以下称编码字段),且属性数据表中仅有3条小班记录,但在数字林业小班数据管理的实际工作中,编码字段多达几十甚至上百个;在小班数据量上,即使以县为单位,调查统计的小班记录也达上万条。因此,将具有海量记录的小班成果数据的属性表从某一编码体系安全可靠、高效率地转换到另一编码体系下(即表2与表3之间的转换),是数字林业小班数据处理工作中的现实需求。基于以上对编码转换的需求分析,本文探讨基于数据库技术,利用计算机编程的方式,在确保数据安全的前提下,实现大数据量小班数据在不同编码体系下属性编码的高效率转换。
实现大数据量小班数据属性编码转换的思想和技术流程为:首先,建立国家标准编码体系与地方编码体系之间的对应关系,作为小班数据编码转换的参考基准;其次,针对成果小班数据大数据量的特点,采用数据库分页查询技术,对小班数据属性编码进行小分量、多批次转换。同时,在编码转换中采用数据库事务技术,以保证小班数据的安全性。以下主要对编码对应关系的建立、分页查询技术、编码批量转换和数据库事务(Transaction)4个主要技术环节进行介绍。
编码对应关系是指地方编码体系和国家标准编码体系中表示相同意义的编码之间的对应关系。为了保证小班属性编码转换的正确性,必须在同一调查因子的国家标准编码和地方编码之间建立严格的一一对应关系,这种逻辑对应关系在数据库物理结构中体现为一张二维关系表(称之为对应关系表)。该对应关系表应当简单扼要,同时,为了方便对其进行更新和维护,应考虑对每个调查因子的编码进行说明性的描述。因此,在对应关系表结构中设计4个字段,分别为code_name(表示调查因子名称)、country_code(表示国家标准体系中的编码)、local_code(表示地方编码体系中的编码)和code_desc(表示对该编码的描述);以code_name和country_code作为主键(primary key)、以code_name和local_code作为唯一键(unique key),以保证同一调查因子在不同编码体系下编码值之间的一一对应,同时也保证对应关系表中没有冗余记录。该对应关系表结构设计见表4。
表4 国家标准编码与地方编码对应关系表结构设计
按照上述设计,将国家标准编码体系和地方编码体系下的各个调查因子的编码建立成对应关系表。以表1中的调查因子及编码为例,建立的编码对应关系表如表5(前4行)所示。将该表命名为Code_Ref_Table,存放于小班属性数据所在数据库,以备后用。对于某些调查因子有地方编码但无对应的国家标准编码(如某省的稀有树种暂缺乏国家标准编码)的情况,一种可行的解决办法是:为该地方编码建立与之对应的自定义国家编码(如表5第5行所示),编码转换完成之后,再根据数据的实际应用需求,利用数据编辑软件对小班数据该字段的自定义编码作统一处理。
表5 小班数据属性编码对应关系
分页查询就是根据需要,每次查询只返回所需要的数据,而不用每次都从数据库中把表格里的全部记录提取出来,这样可以降低程序与数据库之间的数据传送量,并且还可以提高程序的性能[4]。如前所述,小班数据的数据量一般较大,以县(区)为单位进行处理通常有上万条记录,为此,在进行其属性编码转换时必须采用分页查询,实现小分量、多批次转换,以保证编码转换工作的效率和稳定性。
文中对数据库的操作均采用SQL(Structured Query Language,即结构化查询语言)命令来实现,关系数据库以Oracle为例。在分页查询中,决定返回查询结果集的参数有两个,即当前要查询的页数page-Index(即第几页)和每页的记录条数pageSize。本文采用“顶层排除法”对小班属性数据表进行分页查询,即从前1至N页记录中排除小班编号(xiaoban_ID)在前1至N-1页中存在的记录,其中xiaoban_ID是小班属性数据表的主键(Primary Key)。此处进行分页查询的SQL命令为“Select top pageSize*from xiaoban where xiaoban_ID not in(select top(pageIndex-1)*pageSize xiaoban_ID from xiaoban)”,其中xiaoban为小班属性数据表名。
值得注意的是,在数据库分页查询中,分页的具体方法有很多,在性能上也各有差异,本文不作详述。在选用分页算法的时候应充分考虑其在处理大数据量时的性能,同时,每页的记录数pageSize不宜偏小或过大。本文采用的“顶层排除法”,每页记录数pageSize设计为1万,经测试,该方法在对数据量较大的表格进行分页时,可以有效地保证分页的效率。
编码批量转换是指把某一编码体系下的小班属性数据表中所有需要进行编码转换的字段(即调查因子)的取值更改为另一编码体系下与其对应的编码值,它是整个编码转换工作的核心内容。该过程本质上是对数据库中的表进行关联查询,具体而言,就是利用对小班属性编码对应关系表Code_Ref_Table的查询结果更新(即Update操作)小班属性数据表中字段的取值。因此,首先利用分页查询技术实现对单一字段的代码分页转换,在此基础上再遍历所需转换的字段集合,从而实现所有字段的编码批量分页转换。其技术流程如图1所示。
图1 批量分页编码转换流程
从图1可以看出,单一字段分页编码转换是实现编码批量转换的关键步骤。为直观起见,以表2、表6分别作为小班属性数据表和小班属性编码对应关系表,重点对该步骤进行阐述。首先进行单一字段单页面编码转换。假设分页查询中每页为2条记录(即分页查询中的pageSize),将表2中第一页(即前2条记录)的地类字段取值转换为国家编码体系中地类字段取值的转换过程可用SQL命令表示为:“Update表2set地类=(select country_code from表6where表6.code_name=’地类’and表6.local_code=表2.地类)where小班编号in(select top 2小班编号from表2where小班编号not in(select top 0小班编号from表2))”。其中,“select country_code from表6where表6.code_name=’地类’and表6.local_code=表2.地类”表示从表6中查询与表2中地类字段的地方编码对应的国家代码,“where小班编号in(select top 2小班编号from表2where小班编号not in(select top 0小班编号from表2))”是分页查询条件子句,表示只对第一页记录中的地类字段编码进行转换。然后再按分页的页码数进行遍历,可把表2中每一行地类字段的取值转换为表4中地类的取值,即实现单一字段的分页编码转换。
数据库事务是DBMS(即数据库管理系统)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。只有在这些操作序列都执行成功的情况下,DBMS才会提交事务操作对数据库的更新,一旦某个操作不成功,数据库将会回退,以保持更新前的状态。可见,数据库事务能够有效地保证数据的一致性。
小班属性数据的编码转换需要直接在数据库中对小班数据进行更新,为确保小班数据的一致性,本文将编码转换操作作为数据库事务进行处理。若转换过程顺利进行,则提交事务,完成编码转换;若编码转换过程中某一环节出现错误,则回退事务,此时小班数据可以回退到编码转换前的原始状态。以CJHJ语言操作Oracle数据库为例,在数据库事务中进行编码转换的主要代码示例如下:
public void ConvertCodeInTransaction(){
OracleConnection conn=new OracleConnection
("数据库连接字符串");
conn.Open();//打开数据库连接
OracleTransaction convertProcess =conn.BeginTransaction();//开始事务
try{
ConvertCode();//执行编码转换
convertProcess.Commit();//成功,提交事务
}
catch(){
convertProcess.Rollback();//若失败,回滚事务
}
finally{
conn.Close();//断开数据库连接
}
}
在对上述关键技术进行研究的基础上,笔者采用CJHJ编程语言,运用组件式开发技术对基于Oracle数据库的小班数据属性编码转换进行编程实现。其中,利用.NET开发平台中的OracleClient组件实现对Oracle数据库的操作。利用某省3个县的小班数据对程序的效率进行测试,结果如表6所示。从测试结果可以看出,该程序对含有30个编码字段的1万条小班数据进行编码转换的平均耗时为2s,因此,在运行效率方面可以很好地满足应用需求。目前,小班数据属性编码转换功能已经成功集成并应用于某省级数字林业数据管理系统中,有效地提升了数字林业小班数据处理的工作效率。
表6 小班数据属性编码转换程序效率测试结果
随着数字林业工作的深入推进,林业部门的小班数据不断增多,为适应不同用途而制定的小班属性编码体系给小班成果数据的无损利用和标准化管理工作带来不便。本文从分析林业小班数据属性编码转换的现实需求入手,对小班属性数据在不同编码系统之间无损、高效转换的实现技术进行了深入研究,在此基础上,利用计算机编程对其进行了实现,并通过实验证实了编码转换程序在效率上的可行性。该研究在数字林业数据管理系统中的成功应用,实现了小班数据属性编码的高效率、批量自动转换,为数字林业小班数据管理工作提供了有效的技术支撑。
[1]宋丽华,沈明霞,何瑞银,等.基于ArcGIS的林业GIS空间数据库建设的研究[J].计算机工程与设计,2008,29(19):5117-5122.
[2]何政伟,黄润秋,陈兵,等.林业信息系统体系构建分析[J].成都理工大学学报:自然科学版,2004,31(1):81-86.
[3]陈圣东.浅谈黑龙江省数字林业建设[J].林业科技情报,2008,40(1):25-26.
[4]夏明伟,林云,胡铁.用ORACLE的SQL语句实现多栏分页输出[J].计算机系统应用,2004(9):63-65.
[5]王红明,尹康银,彭思勇.CJHJ语言与Oracle数据库的接口[J].信息通信,2009(3):36-39.
[6]杨海明.基于ArcGIS Engine的仁寿县森林资源信息管理系统的研究与实现[D].重庆:西南大学,2007.
[7]吴文静,王霓虹.三维可视化技术在数字林业中的应用研究[J].智能计算机与应用,2011,1(3):31-34.