楊 鵬 蔡紅濤
(黃河勘測規劃設計有限公司測繪信息工程院 河南 鄭州 450000)
目前各測繪單位常用的制圖軟件為CASS, 甲方一般會要求提交CAD 和SHP 兩套數據格式。 因作業員在實際作業過程中的一些失誤, 導致用ArcMap 對轉成后SHP 格式數據拓撲檢查時發現大量的拓撲錯誤, 需要對CAD 和SHP 格式數據進行同步修改,以達到CAD 與SHP 數據的一致性。然而有些作業員對ArcGIS 的操作不夠熟悉,只能夠在CASS 下參照SHP 數據的拓撲錯誤進行數據編輯, 然后再轉為SHP,由于在ArcMap 中沒有一個很好的方法將SHP 數據的拓撲錯誤導出,這給修改造成了很大的難度,對照著修改不僅速度慢,而且容易不徹底, 有時舊的問題沒處理好又造成了新的問題。 哪有沒有方法能把拓撲錯誤導出為CAD 格式,在CASS中參照著修改,問題就迎刃而解了,通過摸索和實踐,我找出了一個實現的方法, 下面將我在唐景CAD 數據建庫項目中利用FME 將SHP 中的拓撲錯誤輸出到CAD 的一點經驗,與大家分享一下。
利用ArcMap 對轉換后的SHP 格式數據根據需要進行點、線、面的拓撲檢查。 建立的拓撲規則如下:
(1) 所有圖層內要素是否相互重疊。 例如:dltb 與 zd(must not overlap with);
(2)線圖層內要素是否自相交。 例如:xzdw(must not intersect);
(3)線圖層內要素是否存在偽節點。 例如:xzdw(must not have pseudos);
(4)線圖層內要素是否存在懸掛線(一條線必須和同層內的其它線端點相接,否則為懸掛線)。 例如:xzdw(must not have dangles);
(5)面圖層內要素是否自相交。 例如:dltb(must not overlap);
(6)面圖層內要素是否有縫隙(宗地層不允許有縫隙,但是房屋層允許) 。 例如:dltb(must not have gaps);
(7)面圖層內要素是否有縫隙;
(8)面要素弧段是否相互重疊、是否自相交、是否有懸掛線、是否存在偽節點(重疊要素包含的頂點相同)。
(9)線層要素不能相交(行政區界線、地類界線、界址線要素不允許相交,但是線狀地物層要素允許要素相交);
(10)面層要素弧段和線層要素是否重疊。 例如宗地邊界和界址線是否重疊;
(11)線層要素節點是否是點層要素;
打開拓撲檢查時生成的唐景.mdb 文件, 里面有很多表,我們只關注其中的 T_1_PointErrors、T_1_LineErrors 和T_1_PolyErrors 三張表,其中T_1_PointErrors 記錄了點拓撲錯誤,T_1_LineErrors 記錄了線拓撲錯誤, T_1_PolyErrors 記錄了面拓撲錯誤。 以T_1_PolyErrors 為例, 打開后如下圖所示(見圖1)

圖1 T_1_PolyErrors 表內容
其中的OriginID 和DestID 對應的是SHP 中的FID,TopoRuleID 字段對應的是添加拓撲規則的順序, 此例為面相交, 從表中可看出:FID 為18 和45 面重疊,24 和134 重疊……知道了是哪些面相重疊,我們就可以按照下面的思路來實現我們需要的東西:
(1)面提取,分別從SHP 中把FID 字段與OriginID、DestID 字段中值相同的面提取出來。

圖2 FME 程序
(2) 利用FME 中的Clipper 函數用一方去切割另一方,CLIPPED_INSIDE 端口輸出的就是我們需要的拓撲錯誤。
(3)將成果輸出到CAD。
因FME 中無法查看到SHP 數據的FID 字段, 首先要打開ArcMap,打開屬性表,新建一個字段,命名為“序號”,利用字段賦值(Field Calculator..),將FID 中的字段值賦給“序號”字段。
打開FME, 加載唐景.shp 和唐景.mdb 文件中的T_1_PolyErrors.dbf 文件,利用FeatureMerger 函數分別提出唐景.shp 中與OriginID、DestID 字段中值相同的面, 然后用Clipper 函數切割,得到公共面輸出CAD(見圖2)。
經過實踐, 利用FME 可以很快捷方便的得到我們想要的拓撲錯誤,有效的解決了ArcMap 中拓撲錯誤不能輸出的到CAD 的問題,當然,本文只是寫出了面重疊的CAD 輸出程序,依據上面的思想可以寫出導出不同拓撲錯誤到CAD 的程序, 希望能對大家起到拋磚引玉的作用。
[1]施朗.如何把ArcGIS 中的拓撲查錯文件找出[Z].全國測繪科技信息網中南分網第二十一次學術信息交流會,2011:623-629.
[2] 毛毛蟲. FeatureMerger 函數使用介紹[OL].http://blog.163.com/antufme@126/blog/static/.