閆煒亮 陳俊任
(江西核工業(yè)二六八測繪院 江西玉山 334700)
在測繪地理信息項目生產中,數(shù)據(jù)的前端采集和數(shù)據(jù)編輯都采用了數(shù)據(jù)格式為Dwg 的AutoCAD和南方Cass 軟件,但這兩種軟件建庫及分析能力欠佳,而建庫及分析能力較強的主流GIS 軟件一般通用支持格式為Shape 文件格式,且Shape 格式是地理信息系統(tǒng)界公認的標準格式[1],故探索Dwg 向Shape 格式的優(yōu)化轉換方法對提高生產效率有重要意義。本文以農村不動產調查房地數(shù)據(jù)為例,設計了AutoCAD VBA 結合ArcGIS 模型構建器的Dwg 文件轉Shape 文件方法,提高了生產效率。
AutoCAD 軟件是由美國歐特克有限公司(Autodesk)開發(fā)的一款在自動制圖領域廣泛使用的自動計算機輔助設計軟件。因其強大的數(shù)據(jù)編輯功能,良好的人機交互設計以及完善的二次開發(fā)和用戶定制接口,在測繪地理信息行業(yè)得到廣泛應用。AutoCAD 平臺提供了針對多種開發(fā)方式的擴展接口,可通過VBA、Lisp、C++等多種語言進行擴展開發(fā),為數(shù)據(jù)處理提供了更多的可能性。南方Cass 軟件是廣東南方數(shù)碼科技股份有限公司在AutoCAD平臺開發(fā)進行二次開發(fā)出品的一套軟件,該軟件在地形、地籍、工程應用、土石方量算等領域應用廣泛。南方Cass 與AutoCAD 常用數(shù)據(jù)格式均為Dwg 格式。AutoCAD VBA 開發(fā)環(huán)境如圖1 所示。
圖1 AutoCAD VBA 開發(fā)環(huán)境
ArcGIS 模型構建器英文名為ArcGIS Model builder,其本質是一種可視化的編程語言,可根據(jù)生產需求構建用于自動化執(zhí)行數(shù)據(jù)管理和空間分析流程的地理處理工作流。使用ArcGIS 模型構建器可創(chuàng)建并修改模型構建器中的地理處理模型,并通過添加地理處理工具、地圖圖層、數(shù)據(jù)集以及其他數(shù)據(jù)類型并將其連接到流程來構建模型,同時,使用Python語言可以輕易的對模型構建器功能進行拓展。其優(yōu)點有:1.處理大量重復操作。程序化的本質使其可以自動重復處理各種文件。2.可視化編程。既可以以代碼構建補充功能,又可用易于理解的圖表顯示工作流順序。3.調試方便??煞植秸{試,查看結果,提高開發(fā)效率。4.移植性強。模型只需簡單處理,即移植到其他PC 或用于另一Python 腳本。ArcGIS 模型構建器如圖2 所示。
圖2 ArcGIS 模型構建器
Dwg 文件為AutoCAD 軟件的常用數(shù)據(jù)格式,其本質是一個集成了點、線、面的二進制格式[2]的圖形數(shù)據(jù)庫。一個Dwg 文件由圖紙信息和各種圖元對象組成,分為無圖形表示類和有圖形表示類,其中無圖形表示類包括圖層、線型;有圖形表示類包括以塊表方式存放的對象。
Dwg 文件根據(jù)內容可以分為四個部分:
(1)索引部:索引部存儲了AutoCAD 的版本信息及各部的首地址、各分表的首地址、長度及個數(shù)信息。
(2)環(huán)境部:環(huán)境部存儲了系統(tǒng)變量、屬性設置及當前狀態(tài)等信息。
(3)實體部:實體部存儲了所有圖形實體的描述,一個Dwg 文件的大部分圖形信息存儲在實體部。圖形實體又分為簡單圖形實體和復雜圖形實體。簡單圖形實體是點、直線等基本圖形,如Point 實體、Line 實體等;復雜圖形實指由多段線、圖塊等基本圖形實體組成的圖形,如PolyLine 實體、Block 實體。
(4)名表部:名表部存儲了所有實體的描述,如圖層名稱、字體類型、線型名稱等。
Dwg 文件的屬性存儲能力較弱,可通過擴展屬性(XData)存儲一定的屬性。使用AutoCAD VBA 語言,可以對擴展屬性進行存儲和導出,從而有了Dwg向Shape 文件格式帶屬性轉換的基礎。
Shape 文件格式屬于一種矢量圖形格式,它能夠保存幾何圖形的位置及相關屬性,它在20 世紀九十年代初的ArcView GIS 的第二個版本被首次應用。目前,主流GIS 軟件都可以讀取Shapefile。
Shape 實質上由多個文件組成的。這其中“.shp”,“.shx”與“.dbf”三個文件是必須的,表示同一個Shape 文件的文件名必須相同,另外還有八個可以增強空間數(shù)據(jù)的表達能力的可選文件。文件格式說明如下:
(1)*.shp:Shape 文件的主要圖形格式,保存了要素的幾何實體。
(2)*.shx:Shape 文件的圖形索引格式。記錄了每個實體在shp 文件中的位置,通過它可實現(xiàn)對實體的快速搜索。
(3)*.dbf:Shape 文件的屬性數(shù)據(jù)格式,以Dbase數(shù)據(jù)表格式存儲了實體的屬性數(shù)據(jù)。
Shape 文件的三個必須文件決定了Shape 文件的圖形和屬性是一體的,轉換時要同時考慮圖形和屬性的對應關系。
對于Dwg 文件,一個文件中包含了點線面各種圖形數(shù)據(jù),各圖形數(shù)據(jù)分布在各圖層,對應的擴展屬性可以存儲一定的屬性數(shù)據(jù);而Shape 文件一個文件只對應一種數(shù)據(jù)類型,如點的Shape 文件只存儲點數(shù)據(jù)格式,不能接受其他數(shù)據(jù)格式,屬性隨圖形一并存儲。Dwg 文件要轉換為Shape 文件,須按數(shù)據(jù)類型對原始文件進行分層處理,使之與對應的轉換后的數(shù)據(jù)類型對應,同時轉換后圖形和屬性的對應關系應正確,以此為關鍵點進行轉換方法設計。
轉換步驟:
(1)為了使轉換后數(shù)據(jù)類型對應,先對待轉換數(shù)據(jù)進行預處理,按數(shù)據(jù)類型和圖層分別存儲,對Dwg文件的圖層進行標準化規(guī)范,使其內部圖層名稱符合要求,使用VB 語言,在AutoCAD VBA 環(huán)境下進行開發(fā)。編寫CAD 數(shù)據(jù)分層和實體擴展屬性的導出程序,完成圖形的預處理和屬性的導出。
(2)在ArcGIS 模型構建器中,編寫Dwg 文件轉換為Shape 文件的工作流模型,實現(xiàn)各圖層、各類型數(shù)據(jù)轉線,轉面,轉點等操作,其中,轉點操作主要是將AutoCAD 中的Annotation 注記轉換為點文件,實現(xiàn)將其注記內容轉換為其屬性的功能。然后通過空間連接,關聯(lián)各類型文件之間的關鍵字段,實現(xiàn)各文件之間的關系關聯(lián)。
(3)在ArcGIS 模型構建器中,對轉換后的各類型文件,通過屬性連接(Join)方法,關聯(lián)圖形和第一步導出的擴展屬性,如果需要加入其它屬性,也可以通過Excel 表格或Dbf 表格進行屬性連接。關聯(lián)可以使用AutoCAD 的Handle 字段作為關鍵字段,也可使用第二步已連接的關鍵字段。屬性連接完成后將文件通過過程庫過濾,過濾掉無用字段,然后導出即可。
(4)將編寫好的模型保存為ArcGIS ToolBox 工具箱,實現(xiàn)轉換功能的封裝,便于移植到其它PC 機使用。轉換設計流程圖如圖3 所示。
圖3 轉換流程設計
農村不動產調查房地數(shù)據(jù)主要為宗地面及其屬性,自然幢面及其屬性,分層分幢圖及其屬性。以宗地面和自然幢面的Dwg 數(shù)據(jù)為例,詳述轉換方法的實現(xiàn)。
4.2.1 CAD/CASS 圖層處理
CAD/CASS 圖層處理主要是對Dwg 文件中的點線面要素分層處理和保存,在規(guī)范了圖層命名(標準化)后,可以較容易的基于AutoCAD VBA 開發(fā)出相應功能。此功能的設計思路是:拷貝一份Dwg 數(shù)據(jù)并將文件名稱命名為需要的圖層名,讀取這份拷貝后文件名稱,刪除這份文件中除了文件名圖層外的所有內容,只保留與文件名相同的圖層,其他圖層以此類推,實現(xiàn)Dwg 圖層的分離。處理后,每個Dwg 文件中只有一個圖層,與Shape 文件在形式上已經對應。
Dwg 文件的打開方法為:
ThisDrawing.Application.Documents.OpenshlFolder.Items.Item.path&""&Dwg_Name
Dwg 文件的另存方法為:
ThisDrawing.SaveAs shlFolder.Items.Item.path &"" & Dwg_Name
圖層實體的刪除方法為:
Del_Entity.Delete
4.2.2 CAD/CAS 擴展屬性導出
自定義擴展AutoCAD 圖形屬性信息的方法有兩種[3],一是通過ObjectARX 以添加XData 屬性的方式擴展,擴展數(shù)據(jù)是以結果緩存的形式附加在圖形實體上;二是通過ObjectARX 以添加數(shù)據(jù)庫詞典(DBDictionary)的方式進行屬性擴展。
以XData 屬性導出為例,基于AutoCAD VBA 進行代碼編寫,獲取擴展屬性代碼如下:
Ent.GetXData "SOUTH", XOutDataType,XOutData
4.2.3 ArcGIS 模型構建器開發(fā)
ArcGIS 模型構建器主要實現(xiàn)圖形轉換、空間連接和屬性掛接功能,這些功能ArcGIS 內置函數(shù)已提供,可直接調用,如需拓展功能,使用Python 語言也可很快進行開發(fā)。模型構建圖如圖4 所示。
圖4 模型構建圖
(1)圖形轉換
圖形轉換功能主要使用 ArcGIS 的FeatureToPolygon 函數(shù)和FeatureToPoint 函數(shù)。
FeatureToPolygon 函數(shù)允許將輸入的線或面要素所封閉的區(qū)域生成的面的要素類,同時其ATTRIBUTES 參數(shù)可以在輸出要素類中保留標注要素的屬性。以宗地面和其宗地號為例,將宗地面Dwg轉換為宗地面Shape,并將宗地號賦值給宗地面的Python 語句為:arcpy.FeatureToPolygon_management("''", ZD_Polygon, "", "ATTRIBUTES", 宗 地 號_DWG_Annotation)。
FeatureToPoint 函數(shù)允許輸入要素的代表位置生成的點的要素類,可以將點、面轉換為點要素,同時附帶有相應屬性。如面轉換為點后可以方便的通過空間連接將屬性賦給另一面要素。宗地面轉為點的Python 語句為:arcpy.FeatureToPoint_management(ZD_shp, ZD_Point, "INSIDE")。
(2)空間連接
空間連接主要使用ArcGIS 的SpatialJoin_analysis函數(shù)。其可以根據(jù)空間關系將一個要素類的屬性連接到另一個要素類的屬性,目標要素和來自連接要素的被連接屬性寫入到輸出要素類。
以自然幢面為例,一個宗地有多個自然幢,將宗地號賦值給自然幢面的思路為先將宗地面轉換為點,再通過點對自然幢面賦值。Python 實現(xiàn)語句如下 :arcpy.SpatialJoin_analysis (ZRZ, ZD_Point,ZRZ_Polygon, "JOIN_ONE_TO_ONE", "KEEP_ALL","ORIG_FID "ORIG_FID" true true false 0 Long 0 0,First,#,C:\ 農房\Shape\z1.shp,ORIG_FID,-1,-1", "INTERSECT", "", "")。
(3)屬性連接
屬性連接主要使用ArcGIS的AddJoin_management函數(shù)和CalculateField_management函數(shù),前者根據(jù)相同字段建立圖與圖、或圖與表的連接,后者對屬性表中的字段進行各種計算。建立基于宗地代碼的連接的Python 語句為:arcpy.AddJoin_management (宗地面, "ZDDM", 連接工作薄_表或mdb_, "ZDNUM", "KEEP_ALL"),計算字段的Python 語句為:arcpy.CalculateField_management (連接-中間數(shù)據(jù), "ZD.OWNER", "[zdinfo.QUANLI]", "VB", "")。
4.2.4 數(shù)據(jù)導出
處理后的要素數(shù)據(jù)包含有很多過程字段,最終結果并不需要,需建立過濾數(shù)據(jù)庫,將過程數(shù)據(jù)導入進行過濾處理,然后導出為Shape 格式文件,即可得到最終數(shù)據(jù)。過濾數(shù)據(jù)庫本質是一個模板數(shù)據(jù)集,規(guī)范化設計了每個字段的格式,長度,是否允許空值等數(shù)據(jù)庫條件。
圖5 是農村不動產調查的宗地面,其上有宗地代碼注記,數(shù)據(jù)格式為DWG 格式;圖6 是經過本文設計方法轉換后得到的宗地面,宗地代碼已賦值進其屬性里,其他擴展屬性已連接,數(shù)據(jù)格式為Shape格式。測試數(shù)據(jù)量150 宗,轉換過程耗時15 秒,效率較高。
圖5 宗地Dwg(部分)
圖6 宗地Shape(部分)
本文研究了Dwg 和Shape 格式數(shù)據(jù),并對其進行細致分析,基于AutoCAD VBA 和ArcGIS 模型構建器,設計了Dwg 轉換為Shape 格式的方法,該方法開發(fā)速度快,運行效率高,在以農村不動產調查為首的測繪地理信息項目中發(fā)揮了較大作用,接下來將進一步優(yōu)化方法,提高轉換效率。