汪建波,孫亦東
(景德鎮市自然資源勘測規劃院,江西 景德鎮 333300)
AutoCAD作為一款主流的矢量制圖軟件,圖形采集與編輯功能強大,矢量化效率高,并且支持多種二次開發形式,因此該軟件在測繪、建筑、規劃等領域得到了廣泛的應用,但其屬性結構簡單。ArcGIS軟件在空間分析和空間數據管理方面能力突出[1],所以近年來規劃成果矢量數據庫建設都要求采用ArcGIS平臺的Geodatabase文件格式,但規劃成果大量以AutoCAD格式存儲,而且AutoCAD格式作為空間數據存儲的現狀在很長一段時間內不會改變,因此基于AutoCAD格式的規劃成果數據庫建設是急需解決的問題。目前,基于AutoCAD格式數據進行空間數據建庫的幾種常見方法[2~4],包括Arctoolbox、ArcGIS for AutoCAD插件、FME轉換、AE開發等方式,利用Arctoolbox方法將空間數據和屬性人為分開,容易導致圖形和屬性信息出錯,而且不能根據特定的需要做出相應的變化,ArcGIS for AutoCAD插件方法步驟煩瑣,并且依賴插件,FME轉換方法需要購買FME,生產成本大,并且在注記信息轉換方面存在一定問題[5],AE開發方法程序開發量大,功能單一,且存在不確定性,本文提出了利用AutoCAD .NET API開發組件對圖形屬性信息進行自定義擴展,實現在dwg文件中進行圖形和屬性一體化存儲、顯示、編輯,然后利用ArcGIS自帶工具通過圖元句柄作為關鍵字進行圖形和屬性的連接,最后完成空間數據庫建設的方法,并對規劃成果中常見的AutoCAD代理圖形無法轉ArcGIS格式的問題提出了解決方法。
AutoCAD .NET API由不同的DLL文件組成,使用AutoCAD .NET API提供的程序集,我們可以通過編程對AutoCAD和圖形文件進行操作,并且可以使用許多不同的編程語言和開發環境。因AutoCAD中實現.NET API具有方便易用、功能強大、適用更廣、效率高等的幾大優點[6]。
本文采用C#編程語言,利用AutoCAD.NET API二次開發,先將存量的dwg文件按數據標準添加自定義擴展屬性,完成在dwg文件中進行圖形和屬性一體化存儲、顯示、編輯,然后提取自定義擴展屬性導出為Excel表格,再利用Arctoolbox工具轉為ArcGIS圖形數據,最后通過圖元句柄(Handel)作為關鍵字將圖形數據和自定義擴展屬性數據連接,完成Geodatabase數據庫的建立。技術路線如圖1所示。整個過程除了添加和導出自定義擴展屬性進行了程序開發,其他的都是運用了ArcGIS自帶的Arctoolbox工具,節省開發成本,提高建庫效率。

圖1 技術路線
自定義擴展屬性的實現包括數據屬性標準設計和自定義擴展屬性添加,下面以控制性詳細規劃地塊屬性標準設計為例。
(1)控制性詳細規劃地塊屬性標準設計
根據AutoCAD的擴展屬性結構組碼值特點和控制性詳細規劃地塊屬性值添加要求,控制性詳細規劃地塊屬性標準定義如表1所示。

控制性詳細規劃地塊屬性結構 表1
(2)自定義擴展屬性添加
由于AutoCAD實體對象只有幾何信息,如果要表達某些有特殊含義的自定義屬性信息時,如控制性詳細規劃地塊的容積率、綠地率等信息,可以將這些自定義屬性信息加入實體對象的擴展數據中,這樣在dwg文件中完成圖形和自定義屬性一體化存儲。
自定義擴展數據信息添加的方法主要有兩種,分別為XData和數據詞典的擴展方式。根據數據詞典擴展方式具有機制靈活、功能強大、數據容量大等優點[7]和要添加控制性詳細規劃自定義屬性的特點,本文采用第二種數據詞典的擴展方式。
實現過程為首先將控制性詳細規劃地塊屬性信息通過ResultBuffer添加到擴展詞典的擴展記錄Xrecord中,再通過擴展詞典SetAt()方法將索引關鍵字和擴展記錄寫入擴展詞典,最后完成圖形對象自定義擴展屬性信息的添加。
添加自定義擴展屬性的核心代碼如下:
publicstaticvoid AddXRecordToEntity(DataTabledbt,ObjectIdCollectionobjIdCol,stringDataStandardSearchKey)
{
foreach(ObjectIdobjIdinobjIdCol) //遍歷選擇集每一個對象
{
DBObjectobj = objId.GetObject(OpenMode.ForRead);
DBDictionarydict = obj.ExtensionDictionary.GetObject(OpenMode.ForRead) asDBDictionary;
if(!dict.Contains(DataStandardSearchKey))
{ XrecordxRec = newXrecord(); //創建擴展記錄
ResultBufferrb = newResultBuffer(); //創建結果緩沖區
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(); //將擴展字典切換為寫的狀態 dict.SetAt(DataStandardSearchKey,xRec); objId.Database.TransactionManager.AddNewlyCreatedDBObject(xRec,true); dict.DowngradeOpen();// 將擴展字典切換為讀的狀態 } } 控規成果地塊填充有的是非AutoCAD標準填充,如圖2所示,其圖元類型為ACAD_PROXY_ENTITY的代理圖形,是無法直接轉換為ArcGIS格式的,要重新對成果地塊進行填充,人工重復填充效率會很低,本文采用通過二次開發將地塊用地性質文字注記信息轉換為圖形內部自定義擴展屬性并存放對應圖層,再根據用地性質按控制性詳細規劃規范自動填充顏色,處理后的標準填充(圖元類型標準填充Hatch)結果如圖3所示。 圖2 AutoCAD代理圖形(非標準填充) 圖3 處理后的標準填充 規劃成果各類指標屬性信息都是通過圖則(.jpg格式)的方式記錄,在AutoCAD界面選中相應地塊,根據圖則信息,利用自定義擴展屬性添加技術,完成每個地塊的指標屬性的錄入,這樣就把地塊的各類指標屬性隱藏在AutoCAD圖形文件中,完成圖形和自定義屬性一體化存儲。 再用Arctoolbox下轉換工具CADToGeodatabase將AutoCAD圖形轉換為Geodatabase,這個時候的圖形數據沒有擴展屬性,再利用AutoCAD二次開發提取自定義擴展屬性,存儲為Excel格式,最后選擇幾何實體有且全圖內唯一的圖元句柄(Handle),作為連接關鍵字,實現圖形與其對應屬性數據(包括擴展對象數據)的連接,連接設置如圖4所示,完成空間數據庫的建立。 圖4 連接 本文利用AutoCAD .NET API開發組件對圖形屬性信息進行自定義擴展,借助ArcGIS軟件自帶的Arctoolbox工具,成功實現了景德鎮市控制性詳細規劃數據成果從dwg存儲方式到ArcGIS空間數據庫的建設,較好地實現了工作目標。在AutoCAD界面為了方便查看擴展屬性,本文實現了鼠標懸停和表格兩種方式顯示,如圖5、圖6所示。最終控制性詳細規劃數據庫成果展示如圖7所示。 圖5 懸停顯示擴展屬性 圖6 表格顯示擴展屬性 圖7 控制性詳細規劃地塊Geodatabase數據庫 本文以景德鎮控制性詳細規劃地塊入庫為例,利用AutoCAD .NET API添加自定義擴展屬性,實現在AutoCAD環境下圖形實體編輯和屬性信息錄入,完成在dwg文件中進行圖形和屬性一體化存儲、顯示、編輯,從而實現空間數據和屬性數據處理的整體化,高效率;然后利用ArcGIS自帶的工具完成圖形和屬性連接,完成GIS空間數據庫的建設,顯著提高生產效率;并對AutoCAD代理圖形無法轉為ArcGIS格式提出了解決辦法。經實踐,此方法除了在規劃成果數據庫建設中應用,也非常適合對dwg格式的歷史AutoCAD成果進行處理,具有很好的應用價值。3.2 AutoCAD代理圖形無法轉換為ArcGIS的解決辦法


3.3 Geodatabase數據庫建立

4 應用展示



5 結 語