劉宏光,王洪棟,劉海辰
(1.天津市勘察院,天津 300191; 2.中國地震局第一監(jiān)測中心,天津 300180)
基于GDAL的CAD數(shù)據(jù)向Shp數(shù)據(jù)轉(zhuǎn)換
劉宏光1*,王洪棟2,劉海辰1
(1.天津市勘察院,天津 300191; 2.中國地震局第一監(jiān)測中心,天津 300180)
Shp數(shù)據(jù)是地理信息數(shù)據(jù)管理常用的一種數(shù)據(jù)格式,目前國土資源和城市規(guī)劃管理等部門多采用此格式文件作為基礎(chǔ)數(shù)據(jù)交換和傳遞的媒介。在比較常用轉(zhuǎn)換方法的優(yōu)缺點的基礎(chǔ)上介紹了利用GDAL將CAD數(shù)據(jù)轉(zhuǎn)換為Shp數(shù)據(jù)的流程及優(yōu)缺點,實踐操作表明此方法具有可自動化操作、無須依賴于GIS環(huán)境、開發(fā)難度低、運行穩(wěn)定等特點,在日常作業(yè)過程中尤其是在大批量的數(shù)據(jù)轉(zhuǎn)換過程中具有一定的優(yōu)勢。
GDAL;CAD;Shp;數(shù)據(jù)轉(zhuǎn)換
Shp數(shù)據(jù)是地理信息數(shù)據(jù)管理常用的一種數(shù)據(jù)格式,目前國土資源和城市規(guī)劃管理等部門多采用此格式文件作為基礎(chǔ)數(shù)據(jù)交換和傳遞的媒介。而一般測繪生產(chǎn)單位在成圖階段大多采用AutoCAD作為基礎(chǔ)平臺,其成果文件大多為DWG或DXF文件。將CAD文件轉(zhuǎn)換為Shp文件常用的方法主要有以下幾種:用ArcGIS軟件或Autodesk AutoCAD Map 3D軟件手動轉(zhuǎn)換[1];利用ArcGIS提供的接口進行二次開發(fā)讀取圖形實體實現(xiàn)自動轉(zhuǎn)換[2,3];讀取CAD交換格式dxf文件后從底層生成Shp文件[4];基于空間數(shù)據(jù)操作引擎(FME)實現(xiàn)操作[5]。本文在綜合比較各種轉(zhuǎn)換方法的優(yōu)缺點的基礎(chǔ)上利用開源地理空間數(shù)據(jù)抽象庫GDAL成功實現(xiàn)了CAD數(shù)據(jù)轉(zhuǎn)換為Shp數(shù)據(jù)的操作。
(1)用ArcGIS軟件手動轉(zhuǎn)換
這種方法在轉(zhuǎn)換前需進行圖層轉(zhuǎn)換、文件重命名、解密等預(yù)處理工作,然后在ArcGIS軟件上用轉(zhuǎn)換工具將圖形文件直接轉(zhuǎn)換為Shp數(shù)據(jù)文件,并進行手工圖形編輯填寫相關(guān)的字段屬性信息。
(2)用Autodesk AutoCAD Map 3D軟件手動轉(zhuǎn)換
這種方法用Autodesk AutoCAD Map 3D軟件手動轉(zhuǎn)換需在進行圖層轉(zhuǎn)換預(yù)處理后利用Autodesk AutoCAD Map 3D軟件自帶的地圖工具將其輸出為Shp數(shù)據(jù)文件,然后在ArcGIS平臺上進行手工圖形編輯,并填寫相關(guān)的字段屬性信息。
(3)利用ArcGIS提供的接口進行二次開發(fā)讀取圖形實體實現(xiàn)自動轉(zhuǎn)換
這種方法是直接利用ArcGIS提供的二次開發(fā)接口,使用VB、C++、C#等變成語言開發(fā)相關(guān)程序在讀取CAD圖形數(shù)據(jù)后直接將其轉(zhuǎn)換為Shp數(shù)據(jù)。
(4)讀取CAD交換格式dxf文件后從底層生成Shp文件
這種方法通過編制相應(yīng)的程序按照dxf文件的定義規(guī)則讀取數(shù)據(jù),然后再將其按照Shp文件的格式要求寫入從而生成Shp數(shù)據(jù)。
(5)基于FME的數(shù)據(jù)轉(zhuǎn)換操作
空間數(shù)據(jù)操作引擎(Feature Manipulation Engine,F(xiàn)ME)是一個第三方數(shù)據(jù)轉(zhuǎn)換的工具,可實現(xiàn)100多種格式的數(shù)據(jù)間的相互轉(zhuǎn)換。其空間數(shù)據(jù)轉(zhuǎn)換是通過采用語義映射文件來控制整個轉(zhuǎn)換流程的[5]。
用ArcGIS軟件手動轉(zhuǎn)換和利用Autodesk AutoCAD Map 3D軟件手動轉(zhuǎn)換這兩種方法,利用現(xiàn)有軟件進行操作無須進行二次開發(fā),前期工作簡單、形象直觀,但是如果CAD圖形復(fù)雜、屬性龐雜或工作任務(wù)繁重時,圖形編輯及屬性填寫的工作量大、效率低、對作業(yè)人員的身體素質(zhì)和業(yè)務(wù)素質(zhì)要求相當(dāng)高,不適于大規(guī)模、大工程量及批量作業(yè)。
利用ArcGIS提供的接口進行二次開發(fā)讀取圖形實體實現(xiàn)自動轉(zhuǎn)換及讀取CAD交換格式dxf文件后從底層生成Shp文件這兩種方式都能夠通過編程手段實現(xiàn)CAD數(shù)據(jù)的自動化讀取和Shp文件的生成操作且可在生成的過程中對圖面進行檢查并將屬性信息一并寫入Shp文件中,后期的圖形編輯和屬性編輯工作量相對來說很小。但是前者依賴于ArcGIS提供的接口環(huán)境,后者需對dxf格式和Shp文件格式研究的相當(dāng)透徹。
基于FME的實現(xiàn)數(shù)據(jù)轉(zhuǎn)換操作既可以在FME軟件下直接用語義映射文件手工實現(xiàn)操作或?qū)ζ溥M行二次開發(fā)定制插件進行自動化操作,兩者均可實現(xiàn)批量操作以提高作業(yè)效率。但是采用語義映射文件需要用戶對FME軟件及映射文件的規(guī)則相當(dāng)熟悉并能夠根據(jù)數(shù)據(jù)轉(zhuǎn)化需要在研究不同GIS數(shù)據(jù)組成格式、定義方法和FME語義轉(zhuǎn)換引擎執(zhí)行過程的基礎(chǔ)上靈活修改FME語義映射文件,對用戶的素質(zhì)要求較高。而FME的二次開發(fā)需要FME的運行時環(huán)境作為支撐。
GDAL全稱是Geospatial Data Abstraction Library(地理空間數(shù)據(jù)抽象庫)是一個在X/MIT許可協(xié)議下讀寫空間數(shù)據(jù)(包括柵格數(shù)據(jù)和矢量數(shù)據(jù))的開源庫,它利用抽象數(shù)據(jù)模型來表達所支持的各種文件格式,還使用一系列命令行工具來進行數(shù)據(jù)轉(zhuǎn)換和處理。目前幾乎所有的GIS和RS軟件底層都使用GDAL來讀寫空間數(shù)據(jù)。
OGR是GDAL的一個分支,提供對矢量數(shù)據(jù)的讀寫支持,同時它實現(xiàn)了對空間參考信息進行處理的類,用來對空間數(shù)據(jù)的空間信息進行處理。
利用GDAL的OGR動態(tài)鏈接庫進行二次開發(fā),可實現(xiàn)CAD數(shù)據(jù)向Shp數(shù)據(jù)的自動轉(zhuǎn)換,這種方法既擺脫了ArcGIS二次開發(fā)的環(huán)境依賴,又無須對dxf格式和Shp文件格式進行過深的研究,開發(fā)相當(dāng)便捷。
利用這種開發(fā)方式,直接讀取CAD圖形文件后經(jīng)歷OGR驅(qū)動注冊、創(chuàng)建數(shù)據(jù)源、創(chuàng)建圖層、創(chuàng)建圖形要素和屬性要素、將圖形要素和屬性要素進行匹配等階段后即可實現(xiàn)從CAD數(shù)據(jù)向Shp數(shù)據(jù)轉(zhuǎn)換。具體流程如圖1所示。
現(xiàn)有的成圖軟件大多將相關(guān)圖形和屬性信息分圖層或線型等方式進行存儲,在圖面讀取的過程中可按照預(yù)先設(shè)定的成圖規(guī)則進行讀取,并通過數(shù)據(jù)結(jié)構(gòu)將其組織起來。在圖面讀取實體的過程中可對圖形實體按照既定規(guī)則進行檢查,判斷其是否存在諸如面狀圖形非閉合曲線等問題,按照實體目標(biāo)進行自動修改。
在讀取圖形數(shù)據(jù)的過程中可以從數(shù)據(jù)字典中將其屬性信息提取出來也可通過讀取外部配置信息文件將屬性信息與圖形進行匹配,從而在生成Shp數(shù)據(jù)文件的過程中將圖形數(shù)據(jù)與屬性數(shù)據(jù)一并寫入減小后期編輯的工程量。
圖1 利用GDAL生成Shp數(shù)據(jù)流程圖
為了滿足地鐵線路的規(guī)劃數(shù)據(jù)歸檔管理的需要,本文Vsisul Studio平臺采用C#語言利用GDAL動態(tài)鏈接庫進行二次開發(fā)成功實現(xiàn)了CAD數(shù)據(jù)向Shp數(shù)據(jù)的轉(zhuǎn)換。
程序運行的過程中為了存儲圖形數(shù)據(jù)及屬性配置信息,按照圖形要素點、線、面三種類型分別定義其存儲格式,以點為核心,由點組線,由線組面。并定義一組公共變量存儲外部配置文件信息。
TypedValue[]values=new TypedValue[]{
new TypedValue((int)DxfCode.LayerName,strLayer)
};//圖層選擇集,strLayer為圖層名稱
SelectionFilter Filter=new SelectionFilter(values);//選擇器
PromptSelectionResult acSSPrompt=acDoc.Editor.SelectAll(Filter);
if(acSSPrompt.Status==PromptStatus.OK)
{
SelectionSet acSSet=acSSPrompt.Value;
foreach(SelectedObject acSSObj in acSSet)
{
if(acSSObj !=null)
{
LL.Add(acSSObj);//將本圖層上的實體添加到實體集合中
}
}
}
本文利用GDAL生成Shp數(shù)據(jù)的過程是將每個對象化為對應(yīng)的點組,然后在Shp相應(yīng)圖層上組成幾何圖形。上述代碼給出了如何按圖層獲取圖形集合,CAD的所有的圖形對象均可將其看作由點、直線、弧線組成。將圓、弧等復(fù)雜圖形經(jīng)過分解迭代后均可化為線段,線段的端點可通過下列代碼:
Point3d st=plt.StartPoint;//獲取線段的起點plt為線段對象
Point3d ed=plt.EndPoint;//獲取點段的終點
將獲取的CAD圖形數(shù)據(jù)對象與其屬性及外部配置信息進行匹配后便可利用GDAL進行Shp數(shù)據(jù)生成。
創(chuàng)建注冊O(shè)GR驅(qū)動
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING","CP936");//支持中文
string pszDriverName="ESRI Shapefile";
OSGeo.OGR.Ogr.RegisterAll();//注冊O(shè)GR驅(qū)動
調(diào)用對Shape文件讀寫的Driver接口
OSGeo.OGR.Driver poDriver=OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
用Driver創(chuàng)建Shape文件
OSGeo.OGR.DataSource poDS;
poDS=poDriver.CreateDataSource(strFilePath,null);
創(chuàng)建層Layer
OSGeo.OGR.Layer poLayer;poLayer=poDS.CreateLayer(shpFileName,null,OSGeo.OGR.wkbGeometryType.wkbMultiPolygon,null);
創(chuàng)建數(shù)據(jù)表屬性列
OSGeo.OGR.FieldDefn oField0=new OSGeo.OGR.FieldDefn("CLNR",OSGeo.OGR.FieldType.OFTString);//以創(chuàng)建測量內(nèi)容字段為例
oField0.SetWidth(30);//寬度30
poLayer.CreateField(oField0,0);//創(chuàng)建字段
完成準(zhǔn)備工作后便可進行圖形要素添加和屬性綁定工作
OSGeo.OGR.Feature facFeature=new OSGeo.OGR.Feature(poLayer.GetLayerDefn());//定義要素
facFeature.SetField(0,Hou_Configformation.strCLNR);//在測量內(nèi)容字段中填入相應(yīng)的內(nèi)容
string strCr="POLYGON(("+LFaceData[i].Coordinate+"))";//定義生成圖形要素的字段
OSGeo.OGR.Geometry pt=OSGeo.OGR.Geometry.CreateFromWkt(strCr);//創(chuàng)建多邊形
facFeature.SetGeometry(pt);//圖形與屬性進行捆綁
oLayer.CreateFeature(facFeature);//創(chuàng)建圖形要素
在程序編制完成準(zhǔn)備完外置屬性配置文件后,在CAD平臺中加載上述開發(fā)成果的動態(tài)鏈接庫,指定轉(zhuǎn)換路徑后即可一鍵生成Shp數(shù)據(jù)文件,其成果如圖2所示,圖形及屬性一次成型,大大減小了后期的編輯工作。經(jīng)過實際測試,程序運行穩(wěn)定、快捷、準(zhǔn)確,極大提高了生產(chǎn)效率和成果質(zhì)量。
圖2 生成的Shp數(shù)據(jù)
目前Shp數(shù)據(jù)在國土資源和城市規(guī)劃管理等工作中起著十分重要的作用,傳統(tǒng)的數(shù)據(jù)轉(zhuǎn)換方法或多或少存在一些不足?;贕DAL將CAD數(shù)據(jù)轉(zhuǎn)換為Shp數(shù)據(jù)具有可自動化操作、無須依賴于GIS環(huán)境、開發(fā)難度低、運行效率高、運行穩(wěn)定且開發(fā)難度相對較低等特點,具有一定的應(yīng)用價值。本文利用GDAL成功實現(xiàn)了從CAD數(shù)據(jù)向Shp數(shù)據(jù)的轉(zhuǎn)換,對技術(shù)人員具有一定的參考意義。
[1] 曲鋼. 淺談.shp數(shù)據(jù)格式的轉(zhuǎn)換方法[J]. 北京測繪,2012(4):84~86.
[2] 安衛(wèi). 基于VBA的兩證合一SHP數(shù)據(jù)制作自動化的實現(xiàn)[J]. 城市勘測,2011(2) : 141~143.
[3] 劉鋒,張繼賢,李海濤. SHP文件格式的研究與應(yīng)用[J]. 測繪科學(xué),2006,31(6):197~198.
[4] 紀(jì)海源,魯純,何遠(yuǎn)梅. VB實現(xiàn)DXF與SHP文件轉(zhuǎn)換[J]. 遼寧省交通高等專科學(xué)校學(xué)報,2013,15(6):22~26.
[5] 左娟,李勇軍. 基于FME 的GIS 空間數(shù)據(jù)互操作技術(shù)探討[J]. 測繪標(biāo)準(zhǔn)化,2013,29(2):16~17.
[6] 林斌,杜珺. AutoCAD2012完全自學(xué)一本通[M]. 北京:電子工業(yè)出版社,2011.
The Method of Converting the CAD Data to Shp Data Base on GDAL
Liu Hongguang1,Wang Hongdong2,Liu Haicheng1
(1.Tianjin Institute of Geotechnical Investigation & Surveying,TianJin 300191,China; 2.The First Monitoring and Application Center,China Earthquake Administration,TianJin 300180,China)
Shp data is a common data format for geographic information data management. At present,It is widely used in land resources and urban planning management as the basis medium for data exchange and transmission. On the basis of comparing the advantages and disadvantages of the commonly used methods,the paper introduces the process and advantages and disadvantages of the method by using GDAL. The practice shows that the method combines the qualities of automatic operation,no need to rely on the GIS environment,the development of low difficulty,stable operation and so on. In the process of daily work,especially in the large batch of data conversion process the method has certain advantages.
GDAL;.CAD;Shp;data;convert
1672-8262(2017)03-71-04
P208.1
B
2016—10—25
劉宏光(1982—),男,工程師,主要從事工程測量、變形監(jiān)測及測繪成圖等方面研究。
中國地震局第一監(jiān)測中心科技創(chuàng)新主任基金(FMC2016008)