黄毓,李文柱
(韶关市测绘院,广东韶关 512000)
基于AutoCAD VBA二次开发的大比例尺地形图查询系统
黄毓∗,李文柱
(韶关市测绘院,广东韶关 512000)
介绍在AutoCAD环境下,利用VBA二次开发工具实现大比例尺地形图的快速查询,给尚未建立地理信息系统的单位进行地形图的快捷、方便的调用提供了工具。
大比例尺地形图;查询;VBA;AutoCAD
大比例尺地形图是城市规划、城市建设不可缺少的基础资料。我院承担向社会提供各种地形图的服务,由于各种客观原因,在对外供图服务窗口,顾客多数不熟悉测绘知识,很难准确的报出所需地形图相应的图幅号,所以经常需要我们按各种条件,如按坐标或地名查找相应图幅号。早期,对地形图的查找只能靠对地形图非常熟悉的作业人员凭借经验完成,或按照分幅接图表来手工查询,这些查询方法非常不便,且效率很低,影响了售图服务整个流程进展,服务效率有待提高。
我院一直使用AutoCAD软件平台,本文利用AutoCAD自带的VBA(Visual Basic For Application),在AutoCAD中进行二次开发,实现了大比例尺地形图快速查询、定位和显示,极大地提高了工作效率。
2.1 地图查询思路
(1)dwg文件存储方式
我院的大比例尺地形图都是采用dwg文件按图幅命名进行图形的存储,为地图查询提供了有利条件。
(2)图幅号计算
我院大比例尺地形图一直采用正方形 50 cm× 50 cm标准分幅,图幅号计算规律如图1所示。
(3)结合dwg文件的命名方式,分析图幅号的计算规律,得出图幅号计算公式。
(4)地图查询方式
可按输入图幅号及在图上进行范围框选进行查询。利用插入图块的方式将符合要求的图幅插入到当前视图中。
设计方便进行范围查询的底图,如韶关市道路图作为索引图,利用插入图块的方式自动将底图显示于屏幕之中,并且提供删除底图功能。
图1 图幅分幅表
2.2 编程实现
在VBA二次开发环境中,利用模块来定义各种功能函数,主要内容如下:
首先定义1∶500图幅号计算功能函数。
Function strTFH500(ByVal x0 As Double,ByVal y0 As Double)′计算图幅号
Dim xa As String,ya As String,str As String
Dim txt2000 As String,txt1000 As String,txt500 As String
If Fix(x0/1000)Mod 2=0 Then′判断x是偶数
xa=Fix(x0/1000)
Else ′若x是奇数
xa=Fix(x0/1000)-1
End If
If Fix(y0/1000)Mod 2=0 Then
ya=Fix(y0/1000)
Else
ya=Fix(y0/1000)-1
End If
Dim tp1 As Double,tp2 As Double
Dim x1,y1,x2,y2,x3,y3 As Double
tp1=xa∗1000
tp2=ya∗1000
′计算1:2000的图号
x1=x0-tp1
y1=y0-tp2
txt2000=Count(x1,y1)
′计算1:1000的图号
x2=x0-Fix(x0/1000)∗1000
y2=y0-Fix(y0/1000)∗1000
txt1000=Count(x2∗2,y2∗2)
x3=x0-Fix(x0/1000)∗1000
y3=y0-Fix(y0/1000)∗1000
If x3〉500 Then
x3=x3-500
End If
If y3〉500 Then
y3=y3-500
End If
′计算1:500的图号
txt500=Count(x3∗4,y3∗4)
strTFH500=xa&ya&"-"&txt2000&txt1000&txt500
End Function
Function Count(ByVal a1 As Double,ByVal a2 As Double)
If a1〉1000 And a2<1000 Then
Count=1
ElseIf a1〉1000 And a2〉1000 Then
Count=2
ElseIf a1<1000 And a2<1000 Then
Count=3
ElseIf a1<1000 And a2〉1000 Then
Count=4
End If
End Function
再定义进行框选时的左下角x、y坐标
Function leftXY(ByVal n0 As Double)′计算左下角x、y坐标
Dim xa As String,ya As String,str As String
Dim txt2000 As String,txt1000 As String,txt500 As String
xa=Fix(n0/1000)
Dim x1,y1,x2,y2,x3,y3 As Double
y1=xa∗1000
x1=n0-y1
ya=cnt(x1)
If ya=0 Then
leftXY=xa∗1000
Else
leftXY=xa&ya
End If
End Function
Function cnt(ByVal x1 As Double)
If x1〉=0 And x1<250 Then
cnt=0
ElseIf x1〉=250 And x1<500 Then
cnt=250
ElseIf x1〉=500 And x1<750 Then
cnt=500
ElseIf x1〉=750 And x1<1000 Then
cnt=750
End If
End Function
根据实现思路,设计查询界面如图2所示。
图2 查询界面
其中,“索引图上点取范围”,利用GetPoint和Get-Corner方法来获取屏幕框选的两点坐标,并进行计算获得左下角和右上角坐标,再通过自定义算法来计算左下角坐标和右上角坐标范围所包含的图幅号,由于篇幅有限,代码部分省略。
显示地图采用插入图块的方式来实现,主要插入图块代码如下:
Set BlkRefObj=ThisDrawing.ModelSpace.InsertBlock(Instpnt,filename,1#,1#,1#,0#)
程序编好后,就是加载和运用VBA程序了。首先新建一个文本文件,在该文件中用LISP语言定义执行VBA宏的命令,用LSP后缀名保存该文件。在Auto-CAD启动后,在命令行输入“vbaload”或”appload”命令来加载VBA工程文件和LSP文件。为了避免每次启动CAD都要手动加载的麻烦,可在执行appload命令后,在启动组的“内容”按钮中加载。程序加载完成后,就可以进行地形图查询了。
(1)按地名、道路名查询。先调出韶关市道路图作为索引图,然后在索引图上框选查询范围,相应的地形图就能快速查询、显示出来,如图3所示。
(2)根据给定坐标或红线查询,如图4所示。
图3 按地面、道路名查询
图4 按红线查询
本程序实现了大比例尺地形图快速查询、定位和显示,在实际中方便了客户的查询,提高了工作效率。但仅具有查询功能,不具有地形图数据库管理功能,作为个人开发的程序无法与地理信息系统(GIS)为基础,图库管理系统相比拟,只能作为从手工管理地形图到地理信息系统建立的一种过渡。
[1]李凤华.AutoCAD2002/2000 VBA开发指南[M].清华大学出版社,2001
[2]谢玉周,王振中,杜耀刚.在AutoCAD中实现地形图图库管理[J].测绘通报,2006(7):55~57
[3]林远清.基于VB6.0的地形图管理信息系统设计与开发[J].城市勘测,2008(3):20~22
Large-Scale Topographic Map Inquiry System Based on Redevelop AutoCAD VBA
Huang Yu,Li WenZhu
(Shaoguan Institute of Surveying and Mapping,Shaoguan 512000,China)
This article describes on the AutoCAD environment,how to achive quickly search Large-scale Topographic Map used VBA Secondary Development Tools,and offer tools to conveniently export topographic map for some units which geographic information system still unestablished.
Large-scale Topographic Map;Search;VBA;AutoCAD
1672-8262(2010)02-150-03
P209
B
2009—08—30
黄毓(1978—),男,工程师,主要从事城市测绘技术管理工作。