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