卢 鹏,肖 玲,唐荣逸
(贵州省林业调查规划院,贵阳 550003)
林业调查中,一般按照从北到南、从西向东的原则对林地小班编号,使得编制的小班号码有规律可循,便于查找。传统方法主要依靠人们的目视效果判断小班所处位置,手动对小班进行编号,往往受编号和计算机录入人员精心程度影响,造成重号、漏号等,同时小班的增减也会打乱原有小班编号,这样就需要重新调整小班号,将耗费大量的人力和时间。随着地理信息系统(GIS)技术[1]的发展,全国林地“一张图”于2012年底已构建完成,本文以目前常用的Geodatabase[2]格式林地数据库为例,提出基于ACCESS的一种林地小班自动编号方法,实现按照编号原则对林地小班进行计算机自动编号,从而节省大量时间和人力,提高工作效率,克服传统人工编号费时、费力、容易出错的弊端。
以小班中心点坐标为基础,将小班纵、横坐标分别按降序、升序排序,按此顺序对小班由小到大进行编号(增量为1),当遇到不同的乡(镇)、村代码时,从1开始重新编号,如此循环实现对全县所有小班按由北到南、由西向东的原则编号[3-5]。
(1)ArcMap中加载长顺县公益林数据库的公益林小班,增加自动小班号和X、Y三个字段(表1)。
表1 公益林数据库中字段类型
(2)在X、Y 字段上分别点击右键,利用Calculate Geometry功能对各小班的中心点坐标进行计算。
3.2.1 新建查询 用Access 2003打开贵州省长顺县公益林数据库,新建查询。具体步骤为:在左侧选择“查询”,然后点击窗口上方的新建,进入新建查询窗口,选择“设计视图”,出现“显示表”对话框选择关闭。然后在查询窗口左上角点击“SQL”,进入SQL视图,将以下代码粘贴进窗口,保存新建的查询,命名为“查询小班号”。
SELECT Int([XIANG_DM])AS 乡镇代码,Int([CUN_DM])AS 村代码,Int([XBH])AS 内业小班,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 新建模块 在左侧选择“模块”,然后点击窗口上方的新建,进入新建模块窗口,清空窗口中的代码,将以下代码粘贴至代码窗口,保存模块,命名为“公益林小班号自动编号”。
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 乡镇代码,村代码,内业小班"
strSQL =strSQL +"FROM 查询小班号"
strSQL =strSQL+"ORDER BY 乡镇代码,村代码,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"乡镇代码或村代码存在空值,请修改后重新顺号!",vbInformation,"出错提示"
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 自动小班号="+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
在模块窗口菜单中双击“公益林小班号自动编号”模块,选择“运行”菜单项,待出现"恭喜!您的公益林小班顺号完毕!"的信息框时,即完成小班号自动编号。
与传统手工编号方法相比,本方法大大节省了时间和人力,提高了工作效率和精度,避免了重号漏号的出现,同时解决了因小班增减变化引起的小班号重编所带来的巨大工作量问题。以贵州省长顺县的公益林数据库为例,共44722个公益林小班,用该方法仅需半个小时即可自动完成编号。
[1] 胡鹏,黄杏元,华一新.地理信息系统教程[M].武汉:武汉大学出版社,2002.
[2] 汤国安,杨昕.ArcGIS 地理信息系统空间分析实验教程[M].北京:科学出版社,2006.
[3] 王春才,高春艳,李俊民.VisualBasic数据库系统开发完全手册[M].北京:人民邮电出版社,2006.
[4] 郑旭东,黄新峰,孙红召,等.ArcGIS中森林小班自动编号方法探讨[J].林业调查规划,2008(3):9-10.
[5] 崔彦军,丁守杰,范丽红.VB与ArcGIS相结合森林小班自动编号方法探讨[J].山东林业科技,2013(2):95-97.