馬利娟,徐永龍,李 斌,李曉亮,楊秀瓊,李 麗
(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.