基于Access和Geodatabase的林地小班自动编号方法——以贵州省长顺县公益林数据库为例

2013-12-23 05:25唐荣逸
陕西林业科技 2013年6期
关键词:长顺县公益林新建

卢 鹏,肖 玲,唐荣逸

(贵州省林业调查规划院,贵阳 550003)

1 前言

林业调查中,一般按照从北到南、从西向东的原则对林地小班编号,使得编制的小班号码有规律可循,便于查找。传统方法主要依靠人们的目视效果判断小班所处位置,手动对小班进行编号,往往受编号和计算机录入人员精心程度影响,造成重号、漏号等,同时小班的增减也会打乱原有小班编号,这样就需要重新调整小班号,将耗费大量的人力和时间。随着地理信息系统(GIS)技术[1]的发展,全国林地“一张图”于2012年底已构建完成,本文以目前常用的Geodatabase[2]格式林地数据库为例,提出基于ACCESS的一种林地小班自动编号方法,实现按照编号原则对林地小班进行计算机自动编号,从而节省大量时间和人力,提高工作效率,克服传统人工编号费时、费力、容易出错的弊端。

2 实现思路

以小班中心点坐标为基础,将小班纵、横坐标分别按降序、升序排序,按此顺序对小班由小到大进行编号(增量为1),当遇到不同的乡(镇)、村代码时,从1开始重新编号,如此循环实现对全县所有小班按由北到南、由西向东的原则编号[3-5]。

3 实现过程

3.1 小班中心点坐标计算

(1)ArcMap中加载长顺县公益林数据库的公益林小班,增加自动小班号和X、Y三个字段(表1)。

表1 公益林数据库中字段类型

(2)在X、Y 字段上分别点击右键,利用Calculate Geometry功能对各小班的中心点坐标进行计算。

3.2 在Access中进行编码

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

3.3 运行模块,完成小班自动编号

在模块窗口菜单中双击“公益林小班号自动编号”模块,选择“运行”菜单项,待出现"恭喜!您的公益林小班顺号完毕!"的信息框时,即完成小班号自动编号。

4 结论

与传统手工编号方法相比,本方法大大节省了时间和人力,提高了工作效率和精度,避免了重号漏号的出现,同时解决了因小班增减变化引起的小班号重编所带来的巨大工作量问题。以贵州省长顺县的公益林数据库为例,共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.

猜你喜欢
长顺县公益林新建
Spin transport properties in ferromagnet/superconductor junctions on topological insulator
重庆三年新建农村公路6.26×10~4 km
贵州省黔南州长顺县小学生课余体育锻炼的研究
ArcGis在辽宁省国家公益林调整中的应用
龙泉七成公益林实现信息化管理
万紫蝶、梁新建作品
国家级重点公益林管理现状与发展对策研究
生态公益林可持续经营的探讨
曹曙东、温新建作品
贵州省长顺县板丛水库灌区跨沟建筑物方案比选