杜紅濤 何旭海 張華 龐玉良
(洛陽鴻業(yè)迪普信息技術(shù)有限公司,河南 洛陽 471003)
GIS 平臺在空間規(guī)劃數(shù)據(jù)分析、編制、實施監(jiān)督預警等工作中作用巨大,能夠快速對數(shù)據(jù)進行建模、分析、處理?,F(xiàn)階段,空間規(guī)劃編制成果有很大一部分是DWG 格式的數(shù)據(jù)。根據(jù)自然資源部要求,空間規(guī)劃的最終成果要提交GIS 格式的數(shù)據(jù),因此,亟須將DWG 格式的數(shù)據(jù)轉(zhuǎn)換為GIS 格式。
在Web 中實現(xiàn)DWG 數(shù)據(jù)向GIS 數(shù)據(jù)的轉(zhuǎn)換主要體現(xiàn)在客戶端和服務(wù)器??蛻舳瞬捎肳eb Services 技術(shù)實現(xiàn)數(shù)據(jù)上傳,服務(wù)器采用Teigha.Net 和ArcGIS Engine 技術(shù)將DWG 數(shù)據(jù)轉(zhuǎn)換為GIS 數(shù)據(jù)。
Web Service 是一個平臺獨立、低耦合、自包含、基于可編程的Web 的應(yīng)用程序。
Teigha.Net SDK 由開放設(shè)計聯(lián)盟(Open Design Alliance,ODA)提供,是基于.Net 語言開發(fā)的軟件開發(fā)包[1]。
ArcObjects SDK 由 美 國ESRI(Environmental Systems Research Institute,Inc.美國環(huán)境系統(tǒng)研究所公司)推出,是為編程人員開發(fā)客戶化應(yīng)用程序提供的組件包。
DWG 數(shù)據(jù)是由AutoCAD、中望CAD、浩辰CAD 等CAD 設(shè)計軟件生產(chǎn)的數(shù)據(jù),主要有DWG、DXF 兩種數(shù)據(jù)格式[3]。
GIS 數(shù)據(jù)是由ArcGIS 等GIS 設(shè)計軟件生產(chǎn)的數(shù)據(jù),常用的GIS 數(shù)據(jù)類型有柵格數(shù)據(jù)和矢量數(shù)據(jù)兩種類型[4]。柵格數(shù)據(jù)的主要格式有.jpg、.png、.tif 等;矢量數(shù)據(jù)的格式主要有Shapefile(矢量圖形)、Personal Geodatabase(個人空間數(shù)據(jù)庫)、File Geodatabase(基于文件格式的數(shù)據(jù)庫)和ArcSDE Geodatabase(企業(yè)級空間數(shù)據(jù)庫)。本文所說的GIS數(shù)據(jù)是指矢量數(shù)據(jù)。
DWG 數(shù)據(jù)常用的圖元類型有:直線、多段線、圓弧、圓、橢圓弧、橢圓、面域、填充、塊、屬性塊、單行文字、多行文字、組。GIS 數(shù)據(jù)常用的要素類型有:點、多點、線段、圓弧、橢圓弧、多段線、多邊形、圓、橢圓等。
DWG 數(shù)據(jù)和GIS 數(shù)據(jù)是由兩種不同軟件平臺生產(chǎn)的數(shù)據(jù),因此需要先確定兩種數(shù)據(jù)之間圖元的對照關(guān)系(如表1 所示),才能夠?qū)崿F(xiàn)數(shù)據(jù)轉(zhuǎn)換。
表1 DWG數(shù)據(jù)圖元和GIS數(shù)據(jù)圖元對應(yīng)關(guān)系
本文主要基于.NET 技術(shù)和Web Services 技術(shù)實現(xiàn)數(shù)據(jù)上傳。
用戶選擇DWG 數(shù)據(jù)后,客戶端將DWG 數(shù)據(jù)轉(zhuǎn)為二進制數(shù)據(jù)流,通過POST 的方法傳到服務(wù)器,服務(wù)器如果正確接收到DWG 數(shù)據(jù),則對DWG 數(shù)據(jù)進行轉(zhuǎn)換。數(shù)據(jù)上傳流程如圖1 所示。
圖1 數(shù)據(jù)上傳流程
DWG 數(shù)據(jù)向GIS 數(shù)據(jù)轉(zhuǎn)換的過程主要包括圖形數(shù)據(jù)轉(zhuǎn)換、屬性數(shù)據(jù)轉(zhuǎn)換、特性數(shù)據(jù)轉(zhuǎn)換。具體步驟如下:
(1)使用Teigha.Net SDK 打開需要轉(zhuǎn)換的DWG 數(shù)據(jù),并獲取DWG 數(shù)據(jù)中的塊表記錄(BlockTableRecord)[5]。
(2)根據(jù)表1 中DWG 數(shù)據(jù)圖元和GIS 數(shù)據(jù)圖元對應(yīng)關(guān)系構(gòu)建DWG 數(shù)據(jù)和GIS 數(shù)據(jù)的轉(zhuǎn)換通道。
(3)循環(huán)解析塊表記錄中的DWG 數(shù)據(jù)并獲取轉(zhuǎn)換參數(shù),根據(jù)轉(zhuǎn)換參數(shù)使用ArcObjects SDK 創(chuàng)建GIS 數(shù)據(jù)。在圖形轉(zhuǎn)換過程中,為保證DWG 數(shù)據(jù)的完整性,需要將DWG 圖元的特性轉(zhuǎn)為GIS 要素的屬性;如果DWG 圖元存在擴展屬性,則同步將DWG 圖元的擴展屬性轉(zhuǎn)為GIS 要素的屬性。具體轉(zhuǎn)換流程如圖2 所示。
圖2 DWG數(shù)據(jù)和GIS數(shù)據(jù)轉(zhuǎn)換流程
使用Teigha.Net 接口打開DWG 數(shù)據(jù),獲取DWG 數(shù)據(jù)中的塊表記錄,遍歷塊表記錄中的DWG 圖元,獲取需要轉(zhuǎn)換的DWG 數(shù)據(jù)。
打開DWG 文件:
解析DWG 圖元是為了獲取GIS 數(shù)據(jù)創(chuàng)建時需要的參數(shù),創(chuàng)建不同類型的GIS 數(shù)據(jù)所需要的參數(shù)不同。下面以多段線和面填充為例說明圖形數(shù)據(jù)轉(zhuǎn)換的步驟。
3.2.1 DWG 多段線數(shù)據(jù)轉(zhuǎn)換
DWG 多段線由直線或圓弧組合而成,首先,使用Teigha.Net 將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?;其次,逐個解析并轉(zhuǎn)換直線和圓弧數(shù)據(jù);最后,將轉(zhuǎn)換的直線和圓弧數(shù)據(jù)組合為GIS 多段線段集合(SegmentCollection)。DWG 多段線圖元轉(zhuǎn)換為GIS 數(shù)據(jù)線要素轉(zhuǎn)換流程如圖3 所示。
圖3 DWG多段線圖元轉(zhuǎn)為GIS數(shù)據(jù)線要素
(1)解析多段線數(shù)據(jù)
使用Teigha.Net 將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?(OdDbEntityPtr)pPolyline)->explode(entitySet);
遍歷多段線,獲取直線的起點坐標和終點坐標,圓弧的起點坐標、終點坐標、圓心角。
(2)直線數(shù)據(jù)轉(zhuǎn)換
GIS 數(shù)據(jù)的直線要素由起點坐標(X、Y、Z)和終點坐標(X、Y、Z)構(gòu)造。
使用Teigha.Net 獲取直線的起點和終點坐標,通過ArcGIS Engine API 實現(xiàn)對GIS 直線要素的重構(gòu)。
構(gòu)建GIS 直線數(shù)據(jù):
iLine->PutCoords(iPointStart,iPointEnd);
(3)圓弧數(shù)據(jù)轉(zhuǎn)換
GIS 數(shù)據(jù)的圓弧要素是由圓弧起點坐標(X、Y、Z)、圓弧終點坐標(X、Y、Z),以及起點到終點的方向是否為逆時針、圓心角構(gòu)造。
具體構(gòu)造方法如下:
使用Teigha.Net 獲取DWG 圓弧的起點坐標(X、Y、Z)、終點坐標(X、Y、Z)、起點角度、終點角度,計算得到圓心角。使用ArcGIS Engine API 實現(xiàn)對GIS 圓弧要素的重構(gòu)。
構(gòu)建GIS 圓弧要素:
pConstCArc->ConstructEndPointsAngle(Point Start,PointEnd,VARIANT_TRUE,ArcAngle);
(4)GIS 數(shù)據(jù)
使用ArcGIS Engine API段集合 (SegmentCollection)的方式構(gòu)造線要素,然后將轉(zhuǎn)換后的直線要素、圓弧要素進行拼接。
構(gòu)造線要素:
ISegmentCollectionPtr ipGonColl(CLSID_Polyline);
GIS 數(shù)據(jù)拼接:
ipGonColl->AddSegment(ipSegment);
3.2.2 DWG 面域填充數(shù)據(jù)轉(zhuǎn)換
DWG 面域填充無法矢量化,第一步:需要將面域填充轉(zhuǎn)換為閉合多段線;第二步:使用Teigha.Net將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?;第三步:逐個解析并轉(zhuǎn)換直線和圓弧數(shù)據(jù);第四步:將轉(zhuǎn)換的直線和圓弧數(shù)據(jù)組合為GIS 面域段集合(SegmentCollection)。DWG 面域填充圖元轉(zhuǎn)換為GIS 數(shù)據(jù)面域要素的流程如圖4 所示。
圖4 DWG面域填充數(shù)據(jù)轉(zhuǎn)為GIS數(shù)據(jù)面域要素
(1)面域填充轉(zhuǎn)為閉合多段線
使用Teigha.Net 遍歷面域填充邊界,將填充邊界組合為閉合多段線。
(2)解析多段線數(shù)據(jù)
使用Teigha.Net 將DWG 多段線分解為圖元集合(集合中包括直線、圓?。?。((OdDbEntityPtr)pPolyline)->explode(entitySet);
遍歷多段線,獲取直線的起點坐標和終點坐標,圓弧的起點坐標、終點坐標、圓心角。
(3)直線數(shù)據(jù)轉(zhuǎn)換
GIS 數(shù)據(jù)的直線要素由起點坐標(X、Y、Z)和終點坐標(X、Y、Z)構(gòu)造。
使用Teigha.Net 獲取直線的起點和終點坐標,通過ArcGIS Engine API 實現(xiàn)對GIS 直線要素的重構(gòu)。
構(gòu)建GIS 直線數(shù)據(jù):
iLine->PutCoords(iPointStart,iPointEnd);
(4)圓弧數(shù)據(jù)轉(zhuǎn)換
GIS 數(shù)據(jù)的圓弧要素由圓弧起點坐標(X、Y、Z),圓弧終點坐標(X、Y、Z),起點到終點的方向是否為逆時針、圓心角構(gòu)造。
使用Teigha.Net 獲取DWG 圓弧的起點坐標(X、Y、Z)、終點坐標(X、Y、Z)、起點角度、終點角度,計算得到圓心角。使用ArcGIS Engine API 實現(xiàn)對GIS 圓弧要素的重構(gòu)。
構(gòu) 建GIS 圓 弧 要 素:pConstCArc->Construct EndPointsAngle(PointStart,PointEnd,VARIANT_TRUE,ArcAngle);
(5)GIS 數(shù)據(jù)
使用ArcGIS Engine API 段集合(SegmentCollection)的方式構(gòu)造面域要素,然后將轉(zhuǎn)換后的直線要素、圓弧要素進行拼接。
構(gòu)造線要素:
ISegmentCollectionPtr ipGonColl(CLSID_Polygon);
GIS 數(shù)據(jù)拼接:
ipGonColl->AddSegment(ipSegment);
為了保證DWG 數(shù)據(jù)的完整性,本文在DWG 數(shù)據(jù)向GIS 數(shù)據(jù)轉(zhuǎn)換過程中,將DWG 數(shù)據(jù)的擴展屬性轉(zhuǎn)換為GIS 要素的屬性信息,同時設(shè)計了DWG 圖元的特性和GIS 圖元的對應(yīng)關(guān)系(如表2 所示)。
表2 DWG圖元特性和GIS要素屬性對應(yīng)關(guān)系
DWG 圖元的特性和擴展屬性都是以鏈表的形式保存在xData 中,需要獲取DWG 圖形的屬性鏈表,然后遍歷解析鏈表信息,根據(jù)DWG 特性的CODE 值和鏈表的類型,最終得到所有屬性信息。
獲取DWG 圖元的XData 得到屬性鏈表:
遍歷屬性鏈表獲取屬性信息:
GIS 數(shù)據(jù)是以空間信息表的形式進行存儲的,圖形數(shù)據(jù)和屬性數(shù)據(jù)作為表記錄存儲在空間信息表中。對GIS 要素的屬性操作,需要先獲取表結(jié)構(gòu)信息,然后將相應(yīng)的屬性值記錄到表中。
獲取GIS 要素屬性表:IFieldsPtr ipFields;
GIS 數(shù)據(jù)有兩種存儲方式,即:本地文件存儲、數(shù)據(jù)庫存儲[7]。本文采用數(shù)據(jù)庫存儲方式來存儲GIS數(shù)據(jù)。具體的輸出步驟為:首先連接GIS 數(shù)據(jù)庫,然后將構(gòu)建的GIS 圖形數(shù)據(jù)、GIS 要素屬性數(shù)據(jù)逐條插入GIS 空間信息表中。數(shù)據(jù)輸出方法如下:
本文通過對DWG 數(shù)據(jù)和GIS 數(shù)據(jù)圖元對應(yīng)關(guān)系的研究,采用Teigha.Net API 技術(shù)對DWG 數(shù)據(jù)進行解析,提出了圖形分解、重組方法,以提高數(shù)據(jù)轉(zhuǎn)換精度。在數(shù)據(jù)轉(zhuǎn)換過程中,采用ArcGIS Engine API 技術(shù)實現(xiàn)DWG 數(shù)據(jù)的完整轉(zhuǎn)換。此外,還基于Web Service技術(shù),利用服務(wù)器強大的計算能力,提高轉(zhuǎn)換效率。