[摘 要] 對屬性的檢查和對拓撲錯誤的檢查是城鎮地籍建庫的重要工作,刪除重復性實體又是常見且刪除起來比較復雜的過程,利用手工刪除重復實體的速度較慢,而利用軟件刪除時,由于各類軟件的數據定義格式不統一,會造成數據丟失等錯誤,本文利用ARCGIS自帶的VBA開發工具,對重復實體進行了批量刪除處理,其有速度快,精度高的優點。
[關鍵詞] 城鎮地籍 VBA 重復實體 批量刪除
一、引言
城鎮地藉作為國家合理管理城鎮土地的重要依據,它包括對土地的位置、類型、數量、用途等狀況的登記。第二次全國土地調查主要的地籍成圖軟件有南方CASS,MAPGIS和ARCGIS,目前它的主要工作已經轉移到內業的修改上,內業的修改主要是對數據的檢查和修改,本文首先探討了數據的檢查方法,其次探討了在刪除重復實體的一些常見方法及它們的不足之處,最后針對這些問題,使用ARCGIS自帶的VBA開發工具批量刪除了重復實體,速度較快。
二、數據的檢查
拓撲學是一門研究點、線、面等圖形,且所研究的圖形經過拓撲變換后其性質保持不變的學科。拓撲關系是一種定義空間結構關系的方法,不管它的圖形形狀如何變化,但圖形關系始終保持不變。
1.城鎮地籍建庫時常見的拓撲檢查錯誤
(1) 面與面不能覆蓋
(2) 線與線不能重疊
(3)點與點不能重疊
上面列舉的三種拓撲錯誤是城鎮地籍建庫地籍成圖時所常見的三種錯誤,造成這些錯誤的原因有多種,比如操作人員的操作失誤,或者是操作人員分工不明確,一幅成圖由兩人或多人來完成,等等。
2.處理拓撲錯誤的方法
(1)手工方式是通過拓樸工具從上往下逐條的進行修改,通常情況下,這種方式適用于拓撲錯誤較少,數據量較小的情況。
(2)第二種方法是采用軟件來進行shp數據的修改,比如南方CASS,在進行拓撲錯誤的修改時,由于在一開始,外業單位使用的軟件不同,就得到了不同的數據格式,通常有CAD、MAPGIS、ARCGIS數據,這樣在數據轉化的過程中,由于各類軟件的數據定義格式不同,將會或多或少的產生數據的丟失情況,最后也不能很好的修改數據。
(3)第三種方式是通過二次開發的方式進行數據的批量修改,本文在實際的工作基礎上,發現通過ARCGIS自帶的VBA開發工具來實現拓撲錯誤的批量修改是比較快捷、方便的。
三、 實現方法
1.VBA的應用
VBA是ARCGIS自帶的一個內部組件,擁有ARCOBJECT組件庫,VBA可對這些組件庫進行直接調用,而不需要安裝其它獨立的開發工具。如果使用其它獨立的開發工具,如ARCENGINE,還需添加組件和類,并且要進行軟件的注冊和配置,對于不熟練的作業單位來說,是比較復雜和繁瑣的,而使用VBA,作業人員將減少了這些流程的操作。其次ARCGIS可直接加載城鎮外業采集的數據,在VBA環境下直接操作已經加載到ARCGIS中的數據。
2.VBA刪除重復實體的實現方法
上面已經提到,數據(這里是幾何體)的拓撲錯誤主要有三類,點重復、線重復和面重復三類重復實體拓撲錯誤,這類拓撲錯誤在實際檢查和分析過程中,可以發現他們分為兩類,一類是完全的重復實體,另一類則可能是部分的重復實體,由于在進行拓撲檢查時,系統提供了緩沖區的值,一般為0.001,那么在進行這類重復實體刪除時,還要考慮到緩沖區內重復實體的分析。通過分析,刪除重復實體的思路也就清晰了。
第一步,加載Database數據,包括拓撲檢查后的圖層,在VBA中讀取當前MxDocument中數據,并指向當前活動的圖層:
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pRoadLayer As IFeatureLayer
Dim pFeatSelection As IFeatureSelection
Dim pQueryFilter As IQueryFilter
Dim pRoadSelSet As ISelectionSet
Dim pRoadCursor As IFeatureCursor
Set pMxDoc = ThisDocument
Set pMap = pMxDoc.FocusMap
Set pRoadLayer = pMap.Layer(0)
第二步,將重復的實體數據先拷貝備份一份,在此我們需要ShapeCopy 屬性,查看ESRI對象模型圖,可以看到ShapeCopy是屬于IFeature接口(如圖3.1),首先我們需要從頭讀取整個幾何形體,再進行幾何形體的拷貝。
圖3.1 IFeature接口中的ShapeCopy
部分程序如下:
Dim pFeatureMark As FeatureMark = pHasTable.Item(n + 1)
If pFeatureMark.Flag = False Then
Dim pFeature As IFeature = pFeatureMark.FeatureEntity()
Dim pTopoOperator As ITopologicalOperator = pFeature.ShapeCopy()
第三步,在備份好重復的數據后,我們就可將重復的數據進行刪除,在刪除的時候我們要考慮到在一定值域內的重復實體,那么這里我們要用到Buffe參數,ESRI對象瀏覽器,可以看到它屬于ITopoOperatorI到TopoOperator4四個接口,這里我們使用ITopoOperatorI(如圖3.2)接口,ITopoOperatorI接口用來判斷獨立的幾何形體之間的空間關系,可進行緩沖區分析、重疊區域分析,合并分析和剪切分析等,由于數據在建立時默認的數值為0.01,那么這里參數也相應的設置為0.01,
圖3.2 ItopoOperatorI接口
部分程序如下:
If m <> n Then '去掉比較同一實體對象
Dim pFeatureMarkTemp As FeatureMark = pHasTable.Item(m + 1)
Dim pFeatureTemp As IFeature = pFeatureMarkTemp.FeatureEntity()
If pFeatureMark.Flag = False Then
If IsOverlapsGeo(pTopoOperator.Buffer(0.01), pFeatureTemp.ShapeCopy()) = True Then
pFeatureMark.Flag = True
pFeatureTemp.Delete()
pHasTable.Item(m + 1) = pFeatureMark
加載以上程序后,創建一個UIButtonControl按鈕,在GIS圖形界面中,單擊Button按鈕,就可一次性直接刪除拓撲錯誤中的重復實體。
四、結論
本文主要探討和研究了城鎮地籍建庫過程中刪除shp數據中重復實體的方法,刪除重復實體是一個相對繁瑣的過程,通過手工方法進行刪除數據效率是比較低下的,本文通過采用Arcgis的VBA開發工具,利用程序自動搜索數據中的重復實體記錄,達到了高效、快捷的刪除記錄的目的,為建庫的實施提供了一定的技術支持。
參考文獻:
ArcObject開發基礎教程 賈慶雷 陳鉆 ESRI中國(北京)培訓中心2006.11