姚小榮
(漳州市測繪設計研究院,福建 漳州 363000)
作為城市測繪單位,不僅擔負著整個城市地理數據的采集工作,同時還要為城市的規劃部門、建設單位等提供快捷、準確的地理信息數據。面對整個城市如此龐大的地理數據,作為數據管理者不僅要負責采集數據的整合與更新,同時還要負責數據的分發,以供其他生產部門使用。若采用傳統的大圖塊拼接調用圖形的方式,不僅因為數據量大會造成系統運行速度慢,影響工作效率,而且會因為數據版本問題給數據管理者的工作帶來很大煩惱。而對于目前先進的GIS 基礎空間數據管理技術,雖然它可以實現基礎空間數據的快速查詢、統計、分析、數據管理等功能,但是,由于GIS軟件和AutoCAD 軟件對于圖形幾何類型的表達方式不同,使得目前無法將GIS 數據100%正確導出CAD數據。這樣對于以CAD 數據生產為主的測繪單位來說,使用GIS 技術管理數字化地形圖數據也會給工作帶來很大不便。
為此,筆者通過VBA 技術對AutoCAD 進行了二次開發,增加了“圖庫管理”功能。通過AutoCAD 直接對分幅地形圖進行管理,解決了大圖塊拼接調用圖形速度慢、工作效率低的不足。同時,也避免了CAD 數據到GIS 數據之間相互轉化的過程,減少了數據因轉換產生的遺失、變形等。
VBA 的全稱是Visual Basic for Application,是AutoCAD 的一種二次開發工具。VBA 將AutoCAD 和Visual Basic 的功能結合在一起,能夠快速創建出符合用戶要求的程序,大大提高了用戶的工作效率。Auto-CAD VBA 的開發使用的是AutoCAD ActiveX 技術,這種技術使用戶能夠從AutoCAD 的內部或外部以編程的方式來操作AutoCAD。
從外業數據的采集到內業數據的編輯、整飾、分幅、入庫,再到使用“圖庫管理”功能對入庫數據進行管理的整個工作流程如圖1所示。

圖1 工作流程圖
VBA 程序的加載包括設計過程中的自動加載和使用中的自動加載[1]。前者需要通過AutoCAD 原有的菜單項(即【工具/加載應用程序】)配置所需的工程程序,其中所加載的工程文件可以任意命名,后綴名為.dvb。而后者則必須將工程文件命名為acad.dvb并且將其放置在AutoCAD 安裝路徑的Support 文件夾中,當AutoCAD 啟動時會搜索并加載acad.dvb。本程序采用后者進行程序的自動加載。
當啟動了AutoCAD,系統會自動搜索并加載acad.dvb 工程,同時由程序編制的“圖庫管理”菜單也會自動加載到AutoCAD 的菜單欄,加載后的效果如圖2所示:

圖2 “圖庫管理”菜單
其中,菜單加載所用到的關鍵代碼如下:
’獲得當前的菜單組
Dim currMenuGroup As AcadMenuGroup
Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
’創建“圖庫管理”新菜單
Dim newMenu As AcadPopupMenu
On Error Resume Next
Set newMenu=currMenuGroup.Menus.Add("圖庫管理")
’添加“圖上指定點”菜單項
Dim macro As String
Dim newMenuItem As AcadPopupMenu
macro=Chr(vbKeyEscape)+Chr(vbKeyEscape)
Set newMenuItem=newMenu.AddSubMenu(newMenu.Count+1,Chr(Asc("&"))& "圖上指定點")
’菜單項“圖上指定點”下面的“1∶ 500”子菜單
Dim submenuitem As AcadPopupMenuItem
Set submenuitem = newMenuItem.AddMenuItem(newMenu.Count+1,Chr(Asc("&"))& "1∶ 500",macro & " -vbarun" +Chr(32)+"ThisDrawing.insertblock" +Chr(32)
不同城市對分幅地形圖的圖幅命名習慣和命名方式有可能不同。但是,要將不同圖幅命名方式的分幅地形圖用AutoCAD 進行統一管理,則必須將AutoCAD下的實地坐標和圖幅建立對應關系。下面以某市1∶ 1 000比例尺圖幅為例說明該功能的實現。

圖3 圖幅號表
如圖3所示,用Access 數據庫組織管理該市1∶ 1 000比例尺分幅圖的圖幅號。其中,坐標分幅號(15.5 -3.0)、標準分幅號(A-A)為該市1∶ 1 000比例尺分幅圖所采用的圖幅命名方式。AutoCAD 運行環境下,當在以路網圖為背景的地形圖上任選一點時,程序可根據該點的X、Y 坐標自動推算出該點所在的坐標分幅號(15.5 -3.0),并通過以下代碼連接Access數據庫,在數據庫中找出該坐標分幅號對應的標準分幅號(A-A)。
Dim daodb1 As DAO.Database ’數據庫對象
Dim daors1 As DAO.Recordset ’記錄集對象
’打開數據庫
Set daodb1 =OpenDatabase(ThisDrawing.Path & " 數據庫.mdb")
’打開記錄集
Set daors1 =daodb1.OpenRecordset("圖幅號對照表",2)
當數據庫中存在該圖幅,程序則通過加載塊的方式將該圖幅準確定位到當前路網圖中,若不存在該圖幅,程序則會跳出提示對話框,提示該圖幅不存在。當用戶調用的圖幅存在多個版本時,程序則把該圖幅所涉及的所有版本羅列出來,用戶可根據自己的需要選擇對應版本的圖幅。
使用“圖上指定點”功能的前提是,用戶必須對測區的大概位置有所了解。當掌握了測區的大概位置后,再在路網圖上調用所需要的圖幅。這種操作方式既方便又快捷。但對于不了解測區位置的用戶來說,這一功能也許就不那么好用。為了滿足不同用戶對象的需求,該程序增加了“調用窗體輸入”功能。
該功能主要適用于不清楚測區的大概位置,但有該測區地形圖某圖幅號或某一點坐標的記錄。用戶可根據自己所掌握資料的情況,在圖4界面里選擇一種合適的調用方式。

圖4 “調用窗體輸入”界面
“輸入標準圖幅號”即輸入以標準分幅號命名的圖幅號(如A-A)。
“輸入坐標圖幅號”即輸入以坐標分幅號命名的圖幅號(如15.5 -3.0)。
“輸入任意坐標”即輸入地形圖上的任意一點坐標,程序通過自動推算、查找,找到所需的圖幅號(坐標分幅號或標準分幅號)。
假設輸入或換算后的圖幅號用變量tufuhao 表示,那么程序通過下面這段代碼將該圖幅準確地定位到道路路網圖上。
Set blockRefObj=ThisDrawing.ModelSpace.insertblock(pnt,
ThisDrawing.Path & "地形圖" & tufuhao & ".dwg",1,1,1,0)
用戶可以對當前打開的分幅圖進行添加、修改、刪除等操作,當操作完成后可使用該功能對當前操作進行任意保存。所保存的數據可以是完整一幅圖,也可以是一幅圖的部分數據,同時也可以是多幅圖合并后的圖形數據。
地形圖數據能否體現城市地形、地貌的真實性、現勢性。取決于地形圖數據是否能夠得到及時的更新和維護。目前數字化地形圖的更新方式有兩種[3]:一種是對同一數據的不同版本進行更新,即基于版本的數據更新;另一種是對變化的地理要素進行更新,即基于基態修正的數據更新。本程序采用二者結合的方式進行更新,即在同一年內,只對變化的地理要素進行更新(圖上最好附上更新范圍線,以標記更新的范圍),圖幅另存時則在圖幅號后備注該年年份。若在同一年內,同一圖幅的同一范圍經過多次更新,那么該圖幅另存時應增附更新的月份。對于下一年度更新的圖幅,圖幅號后則備注下一年的年份,實現數據的版本更新。這樣既保證了數據的現勢性,又保存了歷史數據。
筆者開發的“圖庫管理”功能主要服務于數字化地形圖測繪生產單位,其優越性主要體現在:該功能是基于測繪生產單位熟悉的AutoCAD 平臺進行的二次開發。使用該平臺,不僅開發成本低,而且對于數字化地形圖管理者來說,簡單易學、操作便捷。
“圖庫管理”功能分別在多尺度地形圖的管理和數字化地形圖的更新兩方面加入了筆者的創新。首先,不同的用戶對象通過該功能可以實現多尺度、多版本數字化地形圖數據的編輯,并且可以做簡單的疊加分析;其次,通過版本更新和基態修正更新相結合的方式進行數字化地形圖數據庫的更新,體現地形圖數據的現勢性和歷史性。
該程序經過多年的使用和完善,已在城市數字化地形圖數據管理方面取得了一定的效果,大大提高了數據管理者的工作效率和工作準確率。但是,它僅局限于空間數據的管理,而對屬性數據管理方面的功能還比較薄弱。因此,今后在不斷完善空間數據管理功能的同時,還要不斷改進和提高,完成在AutoCAD 環境下屬性數據的管理。
[1]張帆,鄭立楷,王華杰.AutoCAD VBA 開發精彩實例教程[M].北京:清華大學出版社,2004.
[2]鄭阿奇,曹弋.Visual Basic 實用教程(第2 版)[M].北京:電子工業出版社,2004.
[3]李宗華.城市地理基礎空間數據庫更新方法研究[J].城市勘測,2006(1):6 ~8..
[4]林遠清.基于VB6.0 的地形圖管理信息系統設計與開發[J].城市勘測,2008(3):20 ~22..
[5]黃達藩.地形圖數據庫建設與數據共享有關問題的探討[J].城市勘測,2005(5):14 ~16..
[6]楊永崇,秦寬.地圖管理系統設計與開發[J].城市勘測,2007(1):35 ~37.