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