杜紅濤 何旭海 張華 龐玉良
(洛陽鴻業迪普信息技術有限公司,河南 洛陽 471003)
GIS 平臺在空間規劃數據分析、編制、實施監督預警等工作中作用巨大,能夠快速對數據進行建模、分析、處理。現階段,空間規劃編制成果有很大一部分是DWG 格式的數據。根據自然資源部要求,空間規劃的最終成果要提交GIS 格式的數據,因此,亟須將DWG 格式的數據轉換為GIS 格式。
在Web 中實現DWG 數據向GIS 數據的轉換主要體現在客戶端和服務器??蛻舳瞬捎肳eb Services 技術實現數據上傳,服務器采用Teigha.Net 和ArcGIS Engine 技術將DWG 數據轉換為GIS 數據。
Web Service 是一個平臺獨立、低耦合、自包含、基于可編程的Web 的應用程序。
Teigha.Net SDK 由開放設計聯盟(Open Design Alliance,ODA)提供,是基于.Net 語言開發的軟件開發包[1]。
ArcObjects SDK 由 美 國ESRI(Environmental Systems Research Institute,Inc.美國環境系統研究所公司)推出,是為編程人員開發客戶化應用程序提供的組件包。
DWG 數據是由AutoCAD、中望CAD、浩辰CAD 等CAD 設計軟件生產的數據,主要有DWG、DXF 兩種數據格式[3]。
GIS 數據是由ArcGIS 等GIS 設計軟件生產的數據,常用的GIS 數據類型有柵格數據和矢量數據兩種類型[4]。柵格數據的主要格式有.jpg、.png、.tif 等;矢量數據的格式主要有Shapefile(矢量圖形)、Personal Geodatabase(個人空間數據庫)、File Geodatabase(基于文件格式的數據庫)和ArcSDE Geodatabase(企業級空間數據庫)。本文所說的GIS數據是指矢量數據。
DWG 數據常用的圖元類型有:直線、多段線、圓弧、圓、橢圓弧、橢圓、面域、填充、塊、屬性塊、單行文字、多行文字、組。GIS 數據常用的要素類型有:點、多點、線段、圓弧、橢圓弧、多段線、多邊形、圓、橢圓等。
DWG 數據和GIS 數據是由兩種不同軟件平臺生產的數據,因此需要先確定兩種數據之間圖元的對照關系(如表1 所示),才能夠實現數據轉換。

表1 DWG數據圖元和GIS數據圖元對應關系
本文主要基于.NET 技術和Web Services 技術實現數據上傳。
用戶選擇DWG 數據后,客戶端將DWG 數據轉為二進制數據流,通過POST 的方法傳到服務器,服務器如果正確接收到DWG 數據,則對DWG 數據進行轉換。數據上傳流程如圖1 所示。

圖1 數據上傳流程
DWG 數據向GIS 數據轉換的過程主要包括圖形數據轉換、屬性數據轉換、特性數據轉換。具體步驟如下:
(1)使用Teigha.Net SDK 打開需要轉換的DWG 數據,并獲取DWG 數據中的塊表記錄(BlockTableRecord)[5]。
(2)根據表1 中DWG 數據圖元和GIS 數據圖元對應關系構建DWG 數據和GIS 數據的轉換通道。
(3)循環解析塊表記錄中的DWG 數據并獲取轉換參數,根據轉換參數使用ArcObjects SDK 創建GIS 數據。在圖形轉換過程中,為保證DWG 數據的完整性,需要將DWG 圖元的特性轉為GIS 要素的屬性;如果DWG 圖元存在擴展屬性,則同步將DWG 圖元的擴展屬性轉為GIS 要素的屬性。具體轉換流程如圖2 所示。

圖2 DWG數據和GIS數據轉換流程
使用Teigha.Net 接口打開DWG 數據,獲取DWG 數據中的塊表記錄,遍歷塊表記錄中的DWG 圖元,獲取需要轉換的DWG 數據。
打開DWG 文件:

解析DWG 圖元是為了獲取GIS 數據創建時需要的參數,創建不同類型的GIS 數據所需要的參數不同。下面以多段線和面填充為例說明圖形數據轉換的步驟。
3.2.1 DWG 多段線數據轉換
DWG 多段線由直線或圓弧組合而成,首先,使用Teigha.Net 將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?;其次,逐個解析并轉換直線和圓弧數據;最后,將轉換的直線和圓弧數據組合為GIS 多段線段集合(SegmentCollection)。DWG 多段線圖元轉換為GIS 數據線要素轉換流程如圖3 所示。

圖3 DWG多段線圖元轉為GIS數據線要素
(1)解析多段線數據
使用Teigha.Net 將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?。((OdDbEntityPtr)pPolyline)->explode(entitySet);
遍歷多段線,獲取直線的起點坐標和終點坐標,圓弧的起點坐標、終點坐標、圓心角。
(2)直線數據轉換
GIS 數據的直線要素由起點坐標(X、Y、Z)和終點坐標(X、Y、Z)構造。
使用Teigha.Net 獲取直線的起點和終點坐標,通過ArcGIS Engine API 實現對GIS 直線要素的重構。
構建GIS 直線數據:
iLine->PutCoords(iPointStart,iPointEnd);
(3)圓弧數據轉換
GIS 數據的圓弧要素是由圓弧起點坐標(X、Y、Z)、圓弧終點坐標(X、Y、Z),以及起點到終點的方向是否為逆時針、圓心角構造。
具體構造方法如下:
使用Teigha.Net 獲取DWG 圓弧的起點坐標(X、Y、Z)、終點坐標(X、Y、Z)、起點角度、終點角度,計算得到圓心角。使用ArcGIS Engine API 實現對GIS 圓弧要素的重構。
構建GIS 圓弧要素:
pConstCArc->ConstructEndPointsAngle(Point Start,PointEnd,VARIANT_TRUE,ArcAngle);
(4)GIS 數據
使用ArcGIS Engine API段集合 (SegmentCollection)的方式構造線要素,然后將轉換后的直線要素、圓弧要素進行拼接。
構造線要素:
ISegmentCollectionPtr ipGonColl(CLSID_Polyline);
GIS 數據拼接:
ipGonColl->AddSegment(ipSegment);
3.2.2 DWG 面域填充數據轉換
DWG 面域填充無法矢量化,第一步:需要將面域填充轉換為閉合多段線;第二步:使用Teigha.Net將DWG 多段線分解為圖元集合(集合中包括直線、圓?。坏谌剑褐饌€解析并轉換直線和圓弧數據;第四步:將轉換的直線和圓弧數據組合為GIS 面域段集合(SegmentCollection)。DWG 面域填充圖元轉換為GIS 數據面域要素的流程如圖4 所示。

圖4 DWG面域填充數據轉為GIS數據面域要素
(1)面域填充轉為閉合多段線
使用Teigha.Net 遍歷面域填充邊界,將填充邊界組合為閉合多段線。
(2)解析多段線數據
使用Teigha.Net 將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?。((OdDbEntityPtr)pPolyline)->explode(entitySet);
遍歷多段線,獲取直線的起點坐標和終點坐標,圓弧的起點坐標、終點坐標、圓心角。
(3)直線數據轉換
GIS 數據的直線要素由起點坐標(X、Y、Z)和終點坐標(X、Y、Z)構造。
使用Teigha.Net 獲取直線的起點和終點坐標,通過ArcGIS Engine API 實現對GIS 直線要素的重構。
構建GIS 直線數據:
iLine->PutCoords(iPointStart,iPointEnd);
(4)圓弧數據轉換
GIS 數據的圓弧要素由圓弧起點坐標(X、Y、Z),圓弧終點坐標(X、Y、Z),起點到終點的方向是否為逆時針、圓心角構造。
使用Teigha.Net 獲取DWG 圓弧的起點坐標(X、Y、Z)、終點坐標(X、Y、Z)、起點角度、終點角度,計算得到圓心角。使用ArcGIS Engine API 實現對GIS 圓弧要素的重構。
構 建GIS 圓 弧 要 素:pConstCArc->Construct EndPointsAngle(PointStart,PointEnd,VARIANT_TRUE,ArcAngle);
(5)GIS 數據
使用ArcGIS Engine API 段集合(SegmentCollection)的方式構造面域要素,然后將轉換后的直線要素、圓弧要素進行拼接。
構造線要素:
ISegmentCollectionPtr ipGonColl(CLSID_Polygon);
GIS 數據拼接:
ipGonColl->AddSegment(ipSegment);
為了保證DWG 數據的完整性,本文在DWG 數據向GIS 數據轉換過程中,將DWG 數據的擴展屬性轉換為GIS 要素的屬性信息,同時設計了DWG 圖元的特性和GIS 圖元的對應關系(如表2 所示)。

表2 DWG圖元特性和GIS要素屬性對應關系
DWG 圖元的特性和擴展屬性都是以鏈表的形式保存在xData 中,需要獲取DWG 圖形的屬性鏈表,然后遍歷解析鏈表信息,根據DWG 特性的CODE 值和鏈表的類型,最終得到所有屬性信息。
獲取DWG 圖元的XData 得到屬性鏈表:

遍歷屬性鏈表獲取屬性信息:

GIS 數據是以空間信息表的形式進行存儲的,圖形數據和屬性數據作為表記錄存儲在空間信息表中。對GIS 要素的屬性操作,需要先獲取表結構信息,然后將相應的屬性值記錄到表中。
獲取GIS 要素屬性表:IFieldsPtr ipFields;


GIS 數據有兩種存儲方式,即:本地文件存儲、數據庫存儲[7]。本文采用數據庫存儲方式來存儲GIS數據。具體的輸出步驟為:首先連接GIS 數據庫,然后將構建的GIS 圖形數據、GIS 要素屬性數據逐條插入GIS 空間信息表中。數據輸出方法如下:

本文通過對DWG 數據和GIS 數據圖元對應關系的研究,采用Teigha.Net API 技術對DWG 數據進行解析,提出了圖形分解、重組方法,以提高數據轉換精度。在數據轉換過程中,采用ArcGIS Engine API 技術實現DWG 數據的完整轉換。此外,還基于Web Service技術,利用服務器強大的計算能力,提高轉換效率。