汪建波,孫亦東
(景德鎮(zhèn)市自然資源勘測(cè)規(guī)劃院,江西 景德鎮(zhèn) 333300)
AutoCAD作為一款主流的矢量制圖軟件,圖形采集與編輯功能強(qiáng)大,矢量化效率高,并且支持多種二次開(kāi)發(fā)形式,因此該軟件在測(cè)繪、建筑、規(guī)劃等領(lǐng)域得到了廣泛的應(yīng)用,但其屬性結(jié)構(gòu)簡(jiǎn)單。ArcGIS軟件在空間分析和空間數(shù)據(jù)管理方面能力突出[1],所以近年來(lái)規(guī)劃成果矢量數(shù)據(jù)庫(kù)建設(shè)都要求采用ArcGIS平臺(tái)的Geodatabase文件格式,但規(guī)劃成果大量以AutoCAD格式存儲(chǔ),而且AutoCAD格式作為空間數(shù)據(jù)存儲(chǔ)的現(xiàn)狀在很長(zhǎng)一段時(shí)間內(nèi)不會(huì)改變,因此基于AutoCAD格式的規(guī)劃成果數(shù)據(jù)庫(kù)建設(shè)是急需解決的問(wèn)題。目前,基于AutoCAD格式數(shù)據(jù)進(jìn)行空間數(shù)據(jù)建庫(kù)的幾種常見(jiàn)方法[2~4],包括Arctoolbox、ArcGIS for AutoCAD插件、FME轉(zhuǎn)換、AE開(kāi)發(fā)等方式,利用Arctoolbox方法將空間數(shù)據(jù)和屬性人為分開(kāi),容易導(dǎo)致圖形和屬性信息出錯(cuò),而且不能根據(jù)特定的需要做出相應(yīng)的變化,ArcGIS for AutoCAD插件方法步驟煩瑣,并且依賴插件,F(xiàn)ME轉(zhuǎn)換方法需要購(gòu)買FME,生產(chǎn)成本大,并且在注記信息轉(zhuǎn)換方面存在一定問(wèn)題[5],AE開(kāi)發(fā)方法程序開(kāi)發(fā)量大,功能單一,且存在不確定性,本文提出了利用AutoCAD .NET API開(kāi)發(fā)組件對(duì)圖形屬性信息進(jìn)行自定義擴(kuò)展,實(shí)現(xiàn)在dwg文件中進(jìn)行圖形和屬性一體化存儲(chǔ)、顯示、編輯,然后利用ArcGIS自帶工具通過(guò)圖元句柄作為關(guān)鍵字進(jìn)行圖形和屬性的連接,最后完成空間數(shù)據(jù)庫(kù)建設(shè)的方法,并對(duì)規(guī)劃成果中常見(jiàn)的AutoCAD代理圖形無(wú)法轉(zhuǎn)ArcGIS格式的問(wèn)題提出了解決方法。
AutoCAD .NET API由不同的DLL文件組成,使用AutoCAD .NET API提供的程序集,我們可以通過(guò)編程對(duì)AutoCAD和圖形文件進(jìn)行操作,并且可以使用許多不同的編程語(yǔ)言和開(kāi)發(fā)環(huán)境。因AutoCAD中實(shí)現(xiàn).NET API具有方便易用、功能強(qiáng)大、適用更廣、效率高等的幾大優(yōu)點(diǎn)[6]。
本文采用C#編程語(yǔ)言,利用AutoCAD.NET API二次開(kāi)發(fā),先將存量的dwg文件按數(shù)據(jù)標(biāo)準(zhǔn)添加自定義擴(kuò)展屬性,完成在dwg文件中進(jìn)行圖形和屬性一體化存儲(chǔ)、顯示、編輯,然后提取自定義擴(kuò)展屬性導(dǎo)出為Excel表格,再利用Arctoolbox工具轉(zhuǎn)為ArcGIS圖形數(shù)據(jù),最后通過(guò)圖元句柄(Handel)作為關(guān)鍵字將圖形數(shù)據(jù)和自定義擴(kuò)展屬性數(shù)據(jù)連接,完成Geodatabase數(shù)據(jù)庫(kù)的建立。技術(shù)路線如圖1所示。整個(gè)過(guò)程除了添加和導(dǎo)出自定義擴(kuò)展屬性進(jìn)行了程序開(kāi)發(fā),其他的都是運(yùn)用了ArcGIS自帶的Arctoolbox工具,節(jié)省開(kāi)發(fā)成本,提高建庫(kù)效率。
圖1 技術(shù)路線
自定義擴(kuò)展屬性的實(shí)現(xiàn)包括數(shù)據(jù)屬性標(biāo)準(zhǔn)設(shè)計(jì)和自定義擴(kuò)展屬性添加,下面以控制性詳細(xì)規(guī)劃地塊屬性標(biāo)準(zhǔn)設(shè)計(jì)為例。
(1)控制性詳細(xì)規(guī)劃地塊屬性標(biāo)準(zhǔn)設(shè)計(jì)
根據(jù)AutoCAD的擴(kuò)展屬性結(jié)構(gòu)組碼值特點(diǎn)和控制性詳細(xì)規(guī)劃地塊屬性值添加要求,控制性詳細(xì)規(guī)劃地塊屬性標(biāo)準(zhǔn)定義如表1所示。
控制性詳細(xì)規(guī)劃地塊屬性結(jié)構(gòu) 表1
(2)自定義擴(kuò)展屬性添加
由于AutoCAD實(shí)體對(duì)象只有幾何信息,如果要表達(dá)某些有特殊含義的自定義屬性信息時(shí),如控制性詳細(xì)規(guī)劃地塊的容積率、綠地率等信息,可以將這些自定義屬性信息加入實(shí)體對(duì)象的擴(kuò)展數(shù)據(jù)中,這樣在dwg文件中完成圖形和自定義屬性一體化存儲(chǔ)。
自定義擴(kuò)展數(shù)據(jù)信息添加的方法主要有兩種,分別為XData和數(shù)據(jù)詞典的擴(kuò)展方式。根據(jù)數(shù)據(jù)詞典擴(kuò)展方式具有機(jī)制靈活、功能強(qiáng)大、數(shù)據(jù)容量大等優(yōu)點(diǎn)[7]和要添加控制性詳細(xì)規(guī)劃自定義屬性的特點(diǎn),本文采用第二種數(shù)據(jù)詞典的擴(kuò)展方式。
實(shí)現(xiàn)過(guò)程為首先將控制性詳細(xì)規(guī)劃地塊屬性信息通過(guò)ResultBuffer添加到擴(kuò)展詞典的擴(kuò)展記錄Xrecord中,再通過(guò)擴(kuò)展詞典SetAt()方法將索引關(guān)鍵字和擴(kuò)展記錄寫入擴(kuò)展詞典,最后完成圖形對(duì)象自定義擴(kuò)展屬性信息的添加。
添加自定義擴(kuò)展屬性的核心代碼如下:
publicstaticvoid AddXRecordToEntity(DataTabledbt,ObjectIdCollectionobjIdCol,stringDataStandardSearchKey)
{
foreach(ObjectIdobjIdinobjIdCol) //遍歷選擇集每一個(gè)對(duì)象
{
DBObjectobj = objId.GetObject(OpenMode.ForRead);
DBDictionarydict = obj.ExtensionDictionary.GetObject(OpenMode.ForRead) asDBDictionary;
if(!dict.Contains(DataStandardSearchKey))
{ XrecordxRec = newXrecord(); //創(chuàng)建擴(kuò)展記錄
ResultBufferrb = newResultBuffer(); //創(chuàng)建結(jié)果緩沖區(qū)
for(int i = 0;i { rb.Add(newTypedValue((1000,bt.Rows[i][1].ToString())); rb.Add(newTypedValue(1000,dbt.Rows[i][0].ToString())); } } xRec.Data = rb; dict.UpgradeOpen(); //將擴(kuò)展字典切換為寫的狀態(tài) dict.SetAt(DataStandardSearchKey,xRec); objId.Database.TransactionManager.AddNewlyCreatedDBObject(xRec,true); dict.DowngradeOpen();// 將擴(kuò)展字典切換為讀的狀態(tài) } } 控規(guī)成果地塊填充有的是非AutoCAD標(biāo)準(zhǔn)填充,如圖2所示,其圖元類型為ACAD_PROXY_ENTITY的代理圖形,是無(wú)法直接轉(zhuǎn)換為ArcGIS格式的,要重新對(duì)成果地塊進(jìn)行填充,人工重復(fù)填充效率會(huì)很低,本文采用通過(guò)二次開(kāi)發(fā)將地塊用地性質(zhì)文字注記信息轉(zhuǎn)換為圖形內(nèi)部自定義擴(kuò)展屬性并存放對(duì)應(yīng)圖層,再根據(jù)用地性質(zhì)按控制性詳細(xì)規(guī)劃規(guī)范自動(dòng)填充顏色,處理后的標(biāo)準(zhǔn)填充(圖元類型標(biāo)準(zhǔn)填充Hatch)結(jié)果如圖3所示。 圖2 AutoCAD代理圖形(非標(biāo)準(zhǔn)填充) 圖3 處理后的標(biāo)準(zhǔn)填充 規(guī)劃成果各類指標(biāo)屬性信息都是通過(guò)圖則(.jpg格式)的方式記錄,在AutoCAD界面選中相應(yīng)地塊,根據(jù)圖則信息,利用自定義擴(kuò)展屬性添加技術(shù),完成每個(gè)地塊的指標(biāo)屬性的錄入,這樣就把地塊的各類指標(biāo)屬性隱藏在AutoCAD圖形文件中,完成圖形和自定義屬性一體化存儲(chǔ)。 再用Arctoolbox下轉(zhuǎn)換工具CADToGeodatabase將AutoCAD圖形轉(zhuǎn)換為Geodatabase,這個(gè)時(shí)候的圖形數(shù)據(jù)沒(méi)有擴(kuò)展屬性,再利用AutoCAD二次開(kāi)發(fā)提取自定義擴(kuò)展屬性,存儲(chǔ)為Excel格式,最后選擇幾何實(shí)體有且全圖內(nèi)唯一的圖元句柄(Handle),作為連接關(guān)鍵字,實(shí)現(xiàn)圖形與其對(duì)應(yīng)屬性數(shù)據(jù)(包括擴(kuò)展對(duì)象數(shù)據(jù))的連接,連接設(shè)置如圖4所示,完成空間數(shù)據(jù)庫(kù)的建立。 圖4 連接 本文利用AutoCAD .NET API開(kāi)發(fā)組件對(duì)圖形屬性信息進(jìn)行自定義擴(kuò)展,借助ArcGIS軟件自帶的Arctoolbox工具,成功實(shí)現(xiàn)了景德鎮(zhèn)市控制性詳細(xì)規(guī)劃數(shù)據(jù)成果從dwg存儲(chǔ)方式到ArcGIS空間數(shù)據(jù)庫(kù)的建設(shè),較好地實(shí)現(xiàn)了工作目標(biāo)。在AutoCAD界面為了方便查看擴(kuò)展屬性,本文實(shí)現(xiàn)了鼠標(biāo)懸停和表格兩種方式顯示,如圖5、圖6所示。最終控制性詳細(xì)規(guī)劃數(shù)據(jù)庫(kù)成果展示如圖7所示。 圖5 懸停顯示擴(kuò)展屬性 圖6 表格顯示擴(kuò)展屬性 圖7 控制性詳細(xì)規(guī)劃地塊Geodatabase數(shù)據(jù)庫(kù) 本文以景德鎮(zhèn)控制性詳細(xì)規(guī)劃地塊入庫(kù)為例,利用AutoCAD .NET API添加自定義擴(kuò)展屬性,實(shí)現(xiàn)在AutoCAD環(huán)境下圖形實(shí)體編輯和屬性信息錄入,完成在dwg文件中進(jìn)行圖形和屬性一體化存儲(chǔ)、顯示、編輯,從而實(shí)現(xiàn)空間數(shù)據(jù)和屬性數(shù)據(jù)處理的整體化,高效率;然后利用ArcGIS自帶的工具完成圖形和屬性連接,完成GIS空間數(shù)據(jù)庫(kù)的建設(shè),顯著提高生產(chǎn)效率;并對(duì)AutoCAD代理圖形無(wú)法轉(zhuǎn)為ArcGIS格式提出了解決辦法。經(jīng)實(shí)踐,此方法除了在規(guī)劃成果數(shù)據(jù)庫(kù)建設(shè)中應(yīng)用,也非常適合對(duì)dwg格式的歷史AutoCAD成果進(jìn)行處理,具有很好的應(yīng)用價(jià)值。3.2 AutoCAD代理圖形無(wú)法轉(zhuǎn)換為ArcGIS的解決辦法
3.3 Geodatabase數(shù)據(jù)庫(kù)建立
4 應(yīng)用展示
5 結(jié) 語(yǔ)