李文林李東峰胡啟亮
(江蘇省地質勘查技術院,江蘇 南京210008)
權籍調查中,宗地四至是對宗地相對位置關系的描述,只有保證宗地四至的準確性才能確保四至調查的準確性。若依靠手工完成宗地屬性錄入,工作效率低下,且錯誤率高[1]。用軟件自動提取四至可以彌補人工的不足,但費用較高,因此自主開發的錄入軟件成為大家的追求目標。
自主開發不僅可以節省軟件采購成本,而且符合自己的操作習慣,更能隨時進行修改以適應不同需求。
在一些公開資料中不乏四至提取的實現方法,但大多是基于ArcGIS等GIS軟件的,對非專業的編程人員來說,難度較大。AutoCAD作為繪圖平臺,使用者眾多,基于此的開發卻不多見。采用易于學習的二次開發工具VBA,可以實現南方CASS所成圖形的宗地四至自動提取。
南方CASS成圖軟件是在AutoCAD平臺上開發的應用軟件,在測繪行業數字化測圖中使用廣泛。AutoCAD的二次開發工具,如 VBA、LISP、Object ARX等,同樣可以在CASS下使用。
VBA(Visual Basic for Application)是一種完全面向對象體系結構的編程語言,嵌入在應用程序中。它基于ActiveX Automation技術,可以同任何Automation技術的應用程序共同工作,如Microsoft Excel軟件。VBA集成開發環境非常友好,具有強大的界面設計,簡單易學,適合初學者使用。
選擇VBA作為開發工具,不僅是因為它具有與AutoCAD共享內存空間、運行速度快等特點,更為重要得是,VBA程序不受AutoCAD版本影響,適用性較好,具有開發Microsoft Office套件的功能,交換數據方便[2]。
需要說明,AutoCAD從2010版本以后,安裝包里不再集成VBA環境,使用者需要另外安裝。
AutoCAD的DWG圖形數據庫允許用戶在任何一個圖元的數據記錄中再加入一部分自定義信息,這就是擴展屬性XDATA。XDATA數據可以是字符串、實數、整數和實體句柄等,大小不超過16 K[3]。南方CASS將地物代碼等屬性存儲在XDATA中,通過擴展屬性拓展了繪圖功能。界址線擴展屬性如下:
*Registered Application Name:south
*Code 1000,ASCII string:300000
*Code 1000,ASCII string:2150100026
*Code 1000,ASCII string:周志強
*Code 1000,ASCII string:251
第一行為注冊的應用名“south”;第二行為CASS地物編碼,這里300000是界址線的代碼;第三行為宗地號“2150100026”;第四行為權利人“周志強”;第五行為地類號“251”;Code 1000表示DXF組碼。
這些擴展屬性中,宗地號和權利人是形成四至的重要信息。掌握了CASS擴展屬性的存儲格式,就可以通過編程存取感興趣的屬性值。
VBA提供了Set XData和Get XData的函數設置和返回擴展數據。通常擴展數據需要提供一個已經注冊的應用程序名稱作為不同程序之間的數據區分,如上文的“south”。
Get Xdata、Set Xdata函數如下:
object. Get XData App Name,XData Type,XData Value
object.Set XData XData Type,XData Value
函數當中,App Name為注冊的應用名,XData-Type和XData Value是兩個變體數組,用來存放DXF組碼和屬性信息。
VBA與Office交互需要先在VBA環境中引用相應對象庫,即在VBAIDE中打開菜單,在彈出的引用對話框的列表中查詢要引用的應用程序對象庫,如選擇Microsoft Excel 12.0 Object Library,引用Excel2007。
再聲明并新建一個EXCEL.Application對象:
Dim xl App As Excel.Application
創建或獲取這個對象:
Set xl App=Get Object(,“Excel.Application”)
If Err Then
MsgBox“Excel應用程序沒有運行。請啟動Excel并重新運行程序?!?/p>
Exit Sub
End If
聲明Excel工作簿并獲取當前活動工作表:
Dim xlSheet As Worksheet
Set xlSheet=xl App.ActiveSheet
以后就可以通過程序操作工作表了,如存取單元格數據。
南方CASS成圖軟件將四至存儲在界址線的擴展屬性中,但沒有提供自動提取并賦值的功能。四至信息需要通過編輯宗地,手工輸入。
要實現四至的自動提取,就需要能搜索與本宗相鄰的宗地。資料介紹的方法基本是利用GIS軟件進行緩沖區分析判斷是否有宗地與之相鄰的,再通過計算兩個宗地重心連線方位角判斷鄰宗方位。這就需要將原始圖件轉換成GIS圖件。這不僅增加了作業環節,還提高了電腦的軟硬件配置和對作業員技術水平的要求,相當于增加了項目成本。
AutoCAD只是一個圖形編輯平臺,空間分析能力不強,這是少有開發的原因之一。既然可以通過界址線的擴展屬性獲得宗地號和權利人信息,而相鄰宗地一般會有一段界址線重合,那么通過重合的界址線和界址線的方位角,就可以發現鄰宗并得出鄰宗方位。也就是說,不用空間分析也可獲取宗地位置關系。
編程思路如下:遍歷圖上所有宗地,對每一宗地遍歷每段界址線,如界址線位置還存在另一條界址線,則說明這里存在鄰宗,獲取鄰宗宗地號和權利人信息,同時計算該段界址線的方位角,根據方位角判斷鄰宗方位,最后將鄰宗信息輸出(圖1)。
圖1 四至輸出流程
獲取鄰宗問題的關鍵是找出重合的界址線。已知AutoCAD有多種方式選擇對象:點取方式、窗口方式、交叉選擇等。點取一次只能選擇一個對象,窗口選擇的是所畫矩形窗口內部的所有對象,而交叉選擇能將與所畫矩形框相交及包含的所有對象選中。
以一段界址線的中點為中心,構建一個微型矩形框,采用交叉選擇方式選擇該位置的所有線條。地物編碼為界址線編碼的對象個數如果大于1,說明存在重合的界址線。排除本宗界址線,剩下的則是鄰宗的。
交叉選擇函數如下:
object.Select acSelectionSetCrossing,Point1,Point2,Filter Type,Filter Data
Point1、Point2為構成矩形的對角點坐標點列,Filter Type和Filter Data是兩個變體數組,用于存放使用的過濾器類型的DXF組碼和過濾器的值。
遍歷宗地的方法是先建立過濾器,將所有宗地加入選擇集,然后遍歷選擇對象。遍歷界址線是計算宗地邊線相鄰節點坐標的中點。
南方CASS中,繪制宗地時要求按順時針方向連接界址點,形成界址線。界址線為封閉多段線,構成宗地。VBA可以獲取界址線的點列坐標,在每段界址線中點位置查找重合界址線,發現重合則計算該線段前進方向左側垂線方向的方位角,該方向即為指向鄰宗的方位角。界址線某頂點坐標為object.Coordinate(index),其中index為頂點陣列中需要查詢的頂點索引。
如下所示(圖2),方位角介于45°—135°之間判定為東至,135°—225°之間為南至,225°—315°之間為西至,315°—360°以及0°—45°之間為北至。
圖2 方位判定
依據上述思想編制的應用程序,在多個農村土地承包經營權項目中得到較好應用,將承包地塊四至等公示信息成功輸出到Excel電子表格當中,但相關程序尚存在完善之處。
(1)鄰宗信息在界址線重合的條件下,能夠正確輸出。四至為路、溝等情況的,因無重合界址線而輸出為空。這類四至變化并不頻繁,手工補充難度不大。
(2)隔路、埂、溝等無重合情況的鄰宗可以通過調整交叉選擇的微型矩形邊長處理。因為這種情況較少,本文未進行實驗。
(3)程序處理的是每段界址線,在界址線轉折多的情況下,局部方位與整體方位不一致,需要手工處理。
(4)界址線未按順時針繪制的四至方位會造成顛倒現象,需要通過加強圖形或檢查原始調查記錄予以消除。
生產工作中,經常需要通過二次開發拓展軟件功能,提高工作效率。VBA開發工具內嵌于很多軟件中,很好繼承了Basic和Visual Basic易學、易用的特點,通用性強,開發周期短,現階段仍具有生命力。在AutoCAD繪圖平臺下用VBA開發,實現權籍調查宗地四至的自動提取,繪圖同時即可完成四至輸出,不需額外增加軟硬件成本,能夠極大提高工作效率和信息準確性,取得較好結果。