盧 鵬,肖 玲,唐榮逸
(貴州省林業(yè)調(diào)查規(guī)劃院,貴陽 550003)
林業(yè)調(diào)查中,一般按照從北到南、從西向東的原則對林地小班編號,使得編制的小班號碼有規(guī)律可循,便于查找。傳統(tǒng)方法主要依靠人們的目視效果判斷小班所處位置,手動(dòng)對小班進(jìn)行編號,往往受編號和計(jì)算機(jī)錄入人員精心程度影響,造成重號、漏號等,同時(shí)小班的增減也會(huì)打亂原有小班編號,這樣就需要重新調(diào)整小班號,將耗費(fèi)大量的人力和時(shí)間。隨著地理信息系統(tǒng)(GIS)技術(shù)[1]的發(fā)展,全國林地“一張圖”于2012年底已構(gòu)建完成,本文以目前常用的Geodatabase[2]格式林地?cái)?shù)據(jù)庫為例,提出基于ACCESS的一種林地小班自動(dòng)編號方法,實(shí)現(xiàn)按照編號原則對林地小班進(jìn)行計(jì)算機(jī)自動(dòng)編號,從而節(jié)省大量時(shí)間和人力,提高工作效率,克服傳統(tǒng)人工編號費(fèi)時(shí)、費(fèi)力、容易出錯(cuò)的弊端。
以小班中心點(diǎn)坐標(biāo)為基礎(chǔ),將小班縱、橫坐標(biāo)分別按降序、升序排序,按此順序?qū)π“嘤尚〉酱筮M(jìn)行編號(增量為1),當(dāng)遇到不同的鄉(xiāng)(鎮(zhèn))、村代碼時(shí),從1開始重新編號,如此循環(huán)實(shí)現(xiàn)對全縣所有小班按由北到南、由西向東的原則編號[3-5]。
(1)ArcMap中加載長順縣公益林?jǐn)?shù)據(jù)庫的公益林小班,增加自動(dòng)小班號和X、Y三個(gè)字段(表1)。
表1 公益林?jǐn)?shù)據(jù)庫中字段類型
(2)在X、Y 字段上分別點(diǎn)擊右鍵,利用Calculate Geometry功能對各小班的中心點(diǎn)坐標(biāo)進(jìn)行計(jì)算。
3.2.1 新建查詢 用Access 2003打開貴州省長順縣公益林?jǐn)?shù)據(jù)庫,新建查詢。具體步驟為:在左側(cè)選擇“查詢”,然后點(diǎn)擊窗口上方的新建,進(jìn)入新建查詢窗口,選擇“設(shè)計(jì)視圖”,出現(xiàn)“顯示表”對話框選擇關(guān)閉。然后在查詢窗口左上角點(diǎn)擊“SQL”,進(jìn)入SQL視圖,將以下代碼粘貼進(jìn)窗口,保存新建的查詢,命名為“查詢小班號”。
SELECT Int([XIANG_DM])AS 鄉(xiāng)鎮(zhèn)代碼,Int([CUN_DM])AS 村代碼,Int([XBH])AS 內(nèi)業(yè)小班,Max(ZZB)AS Y 最大值,Min(HZB)AS X 最小值
FROM 公益林小班面
GROUP BY Int([XIANG _DM]),Int([CUN_DM]),Int([XBH])
ORDER BY Int([XIANG _DM]),Int([CUN_DM]),Int([XBH]),Max(ZZB)DESC;
3.2.2 新建模塊 在左側(cè)選擇“模塊”,然后點(diǎn)擊窗口上方的新建,進(jìn)入新建模塊窗口,清空窗口中的代碼,將以下代碼粘貼至代碼窗口,保存模塊,命名為“公益林小班號自動(dòng)編號”。
Option Compare Database
Option Explicit
Sub updateData()
Dim cnn As ADODB.Connection
Set cnn =CurrentProject.Connection
Dim strSQL As String
Dim intXZ As Long
Dim intOldXZ As Long
intOldXZ=0
Dim intC As Long
Dim intOldC As Long
intOldC =0
Dim intXB As Long
Dim intXB0As Long
intXB0 =0
Dim intNewXB As Long
intNewXB =1
Dim rsDL As ADODB.Recordset
strSQL ="SELECT 鄉(xiāng)鎮(zhèn)代碼,村代碼,內(nèi)業(yè)小班"
strSQL =strSQL +"FROM 查詢小班號"
strSQL =strSQL+"ORDER BY 鄉(xiāng)鎮(zhèn)代碼,村代碼,int(Y最大值/100)DESC,X最小值"
Set rsDL =New ADODB.Recordset
rsDL.Open strSQL,cnn,adOpenForwardOnly,adLockBatchOptimistic
Do While Not rsDL.EOF
If IsNull(rsDL.Fields.Item(0).Value)Or IsNull(rsDL.Fields.Item(1).Value)Or rsDL.Fields.Item(0).Value=0Or rsDL.Fields.Item(1).Value=0Then
MsgBox"鄉(xiāng)鎮(zhèn)代碼或村代碼存在空值,請修改后重新順號!",vbInformation,"出錯(cuò)提示"
rsDL.Close
Set rsDL =Nothing
cnn.Close
Set cnn =Nothing
Exit Sub
End If
intXZ =rsDL.Fields.Item(0).Value
intC =rsDL.Fields.Item(1).Value
If Not IsNull(rsDL.Fields.Item(2).Value)Then
intXB =rsDL.Fields.Item(2).Value
If intXZ <>intOldXZ Then
intOldXZ =intXZ
intOldC =1
intXB0 =0
intNewXB =1
Else
If intC <>intOldC Then
intOldC =intC
intXB0 =0
intNewXB =1
End If
End If
If intXB <>intXB0Then
UpdateXB intXZ,intC,intXB,intNewXB
intNewXB =intNewXB +1
intXB0 =intXB
End If
End If
rsDL.MoveNext
Loop
rsDL.Close
Set rsDL =Nothing
MsgBox"恭喜!您的公益林小班順號完畢!"
End Sub
Sub UpdateXB(xz As Long,c As Long,xb As Long,newxb As Long)
Dim cnnDL As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim strUpdate As String
Dim lngRa As Long
Set cnnDL =CurrentProject.Connection
strUpdate ="UPDATE 公益林小班面SET 自動(dòng)小班號="+LTrim(RTrim(Str(newxb)))+"WHERE int(XIANG_DM)="+LTrim(RTrim(xz))+"AND int(CUN_DM)="+LTrim(RTrim(c))
strUpdate = strUpdate + " AND int(XBH)="+LTrim(RTrim(xb))
With cmd
.CommandText=strUpdate
.CommandType=adCmdUnknown
.ActiveConnection =cnnDL
.Execute lngRa
End With
cnnDL.Close
Set cmd =Nothing
Set cnnDL =Nothing
End Sub
在模塊窗口菜單中雙擊“公益林小班號自動(dòng)編號”模塊,選擇“運(yùn)行”菜單項(xiàng),待出現(xiàn)"恭喜!您的公益林小班順號完畢!"的信息框時(shí),即完成小班號自動(dòng)編號。
與傳統(tǒng)手工編號方法相比,本方法大大節(jié)省了時(shí)間和人力,提高了工作效率和精度,避免了重號漏號的出現(xiàn),同時(shí)解決了因小班增減變化引起的小班號重編所帶來的巨大工作量問題。以貴州省長順縣的公益林?jǐn)?shù)據(jù)庫為例,共44722個(gè)公益林小班,用該方法僅需半個(gè)小時(shí)即可自動(dòng)完成編號。
[1] 胡鵬,黃杏元,華一新.地理信息系統(tǒng)教程[M].武漢:武漢大學(xué)出版社,2002.
[2] 湯國安,楊昕.ArcGIS 地理信息系統(tǒng)空間分析實(shí)驗(yàn)教程[M].北京:科學(xué)出版社,2006.
[3] 王春才,高春艷,李俊民.VisualBasic數(shù)據(jù)庫系統(tǒng)開發(fā)完全手冊[M].北京:人民郵電出版社,2006.
[4] 鄭旭東,黃新峰,孫紅召,等.ArcGIS中森林小班自動(dòng)編號方法探討[J].林業(yè)調(diào)查規(guī)劃,2008(3):9-10.
[5] 崔彥軍,丁守杰,范麗紅.VB與ArcGIS相結(jié)合森林小班自動(dòng)編號方法探討[J].山東林業(yè)科技,2013(2):95-97.