侯祥意,盧姍,陶超
(1.廣州南方智能技術(shù)有限公司,廣東 廣州 510663; 2.《規(guī)劃師》雜志社,廣西 南寧 530029)
2000國家大地坐標(biāo)系是國務(wù)院批準(zhǔn)使用的新一代高精度地心坐標(biāo)系。由于各行業(yè)歷史測繪成果主要采用1954北京坐標(biāo)系和1980西安坐標(biāo)系,因此需要建立坐標(biāo)轉(zhuǎn)換模型和編制坐標(biāo)轉(zhuǎn)換軟件,將原始測繪成果轉(zhuǎn)換到2000國家大地坐標(biāo)系。原始測繪成果主要為CAD文件,主要包括DGN、DWG、DXF三種,CAD文件中的圖形對象主要包括空間幾何對象、符號表達要素、擴展屬性信息三大類。在坐標(biāo)轉(zhuǎn)換過程中,嚴(yán)密無損轉(zhuǎn)換不僅要確??臻g幾何對象的坐標(biāo)嚴(yán)密轉(zhuǎn)換、拓?fù)潢P(guān)系完整,還要保證符號表達要素、擴展屬性信息的完整一致性。
在諸多CAD文件坐標(biāo)轉(zhuǎn)換的文章中,對DWG、DXF的轉(zhuǎn)換方法研究較多,如汪燕麟等提出建立大地坐標(biāo)4參數(shù)轉(zhuǎn)換模型與AutoCAD軟件中仿射變換模型的聯(lián)系,研制坐標(biāo)轉(zhuǎn)換軟件實現(xiàn)DWG文件的轉(zhuǎn)換[1];范沖等提出利用FME(Feature Manipulate Engine)轉(zhuǎn)換模板批量轉(zhuǎn)換DWG和DXF文件的方法[2];謝梓威等提出采用FME Object技術(shù)進行軟件開發(fā)實現(xiàn)對DWG數(shù)據(jù)的無損轉(zhuǎn)換[3]。
這些研究中,很少涉及CAD文件重要格式之一的DGN格式以及CAD成果一體化轉(zhuǎn)換且多數(shù)探討了CAD圖形空間坐標(biāo)轉(zhuǎn)換的幾何精度,鮮少關(guān)注符號化表達樣式及擴展屬性信息的完整性。針對此問題,本文嘗試在構(gòu)建嚴(yán)密可逆的多項式坐標(biāo)轉(zhuǎn)換模型的基礎(chǔ)上,實現(xiàn)CAD文件的一體化動態(tài)無損轉(zhuǎn)換,并基于MicroStation平臺開發(fā)轉(zhuǎn)換軟件,高效穩(wěn)定地實現(xiàn)坐標(biāo)基準(zhǔn)統(tǒng)一,促進數(shù)據(jù)共享。
MicroStation平臺是Bentley公司開發(fā)的CAD基礎(chǔ)平臺,其面向建筑、市政、水利、交通、地理信息等各行業(yè)的解決方案均基于該平臺構(gòu)建。平臺歷經(jīng)了95、2004、V8i、CONNECT Edition四個重要的版本階段。具有使用方便、功能強大、二三維一體化等特點,在全球擁有廣大的用戶。
MicroStation平臺提供了豐富的二次開發(fā)選項,基于COM組件的有VBA的二次開發(fā)和基于.NET框架的AddIn的開發(fā)方式以及基于其SDK的Native Code的開發(fā)方式。
DGN文件是MicroStation的主要文件格式,一個DGN文件包含多個模型,每個模型由若干元素組成,如線、面、圓弧、文本等。DGN文件的對象結(jié)構(gòu)如圖1所示[4]:
DGN中的元素主要分為圖形類和非圖形類,圖形類元素內(nèi)容主要包括空間坐標(biāo)、符號化表達要素、擴展屬性信息三部分,需要進行坐標(biāo)轉(zhuǎn)換;非圖形類元素沒有幾何圖形,沒有空間坐標(biāo),因此不需要進行坐標(biāo)轉(zhuǎn)換。
圖1 DGN文件對象結(jié)構(gòu)圖
RealDWG是Autodesk公司提供的軟件庫,它允許程序員通過C++和.NET對DWG和DXF文件本身進行讀寫。具備以下特征:
(1)支持AutoCAD R14及以上版本生成的DWG格式;
(2)在32位系統(tǒng)下,所產(chǎn)生的應(yīng)用程序既可以在32位的Windows系統(tǒng)內(nèi)運行,也可以在64位系統(tǒng)下運行;
(3)所產(chǎn)生的應(yīng)用程序完全可以脫離AutoCAD獨立運行。
基于Bentley公司與Autodesk公司簽署的合作協(xié)議,MicroStation平臺直接使用RealDWG庫對DWG和DXF進行讀寫,操作后的DWG和DXF文件得到Autodesk公司的授權(quán)認(rèn)證,確保了數(shù)據(jù)的完整性,不會發(fā)生精度損失、數(shù)據(jù)丟失等情況。采用最新的MicroStation平臺,可支持從2004到2018版本的DWG文件的互操作[5]。
2000坐標(biāo)轉(zhuǎn)換采用雙二元三次多項式轉(zhuǎn)換模型進行擬合。以北京1954坐標(biāo)系向CGCS2000坐標(biāo)系轉(zhuǎn)換為例:已知同名點1954和2000坐標(biāo)系下坐標(biāo)(X54、Y54),(X2000、Y2000),待求的轉(zhuǎn)換系數(shù)為Aij,Bij,雙二元三次多項式模型表達式為:
以轉(zhuǎn)換后的國家2000坐標(biāo)殘差平方和最小為條件,用上百對重合點進行擬合,采用最小二乘平差計算求取轉(zhuǎn)換參數(shù)[6]。統(tǒng)計分析表明,X、Y方向內(nèi)符合精度均小于 4 mm,滿足精度要求。以北京1954向CGCS2000轉(zhuǎn)換為例,殘差分布如圖2所示:
圖2 北京1954-CGCS2000多項式轉(zhuǎn)換模型殘差分布圖
在求得北京1954至CGCS2000轉(zhuǎn)換的雙二元三次多項式系數(shù)后,CGCS2000至北京1954的轉(zhuǎn)換過程采用原系數(shù)進行迭代計算求得。
以北京1954至CGCS2000轉(zhuǎn)換為例,迭代方法如下所示:
利用北京1954至CGCS2000轉(zhuǎn)換的多項式系數(shù)進行CGCS2000至北京1954轉(zhuǎn)換,逆向迭代過程如下:
采用迭代法,由于只采用了一套參數(shù),可以保證正向轉(zhuǎn)換和逆向轉(zhuǎn)換的嚴(yán)密無損,不會有誤差的積累。經(jīng)過50次正逆向轉(zhuǎn)換測試,△X的平均值為 -0.000 000 000 014 901 2 m,△Y的平均值為0.000 000 000 028 405 3 m。
CAD文件中的圖形元素主要可分為簡單對象和復(fù)合對象,而圖形元素的核心是幾何圖形。幾何圖形的最基本單元是點,因此可以采用點對點的方式進行圖形的坐標(biāo)轉(zhuǎn)換。轉(zhuǎn)換過程為:首先判斷是否為圖形元素,對于圖形元素劃分類型為簡單元素或者復(fù)合元素;其次,對于簡單元素,取出其構(gòu)成坐標(biāo)點,逐點進行轉(zhuǎn)換,對于復(fù)合元素,先取出其構(gòu)成子元素,再取出其子元素構(gòu)成坐標(biāo)點,逐點進行轉(zhuǎn)換;第三步采用轉(zhuǎn)換后的坐標(biāo)點依據(jù)其邏輯關(guān)系進行元素的幾何對象重構(gòu);最后復(fù)制原元素的符號化表達樣式、擴展屬性到新的元素,并將新坐標(biāo)系的元素重繪到文件,舊坐標(biāo)系的元素銷毀[7]。轉(zhuǎn)換流程如圖3所示:
圖3 點對點坐標(biāo)轉(zhuǎn)換流程圖
采用點對點的坐標(biāo)轉(zhuǎn)換方法,可以保證圖形的轉(zhuǎn)換精度以及圖形元素間拓?fù)潢P(guān)系的完整性,對于相鄰圖幅,不會存在縫隙、重疊、懸掛點等接邊問題。
在MicroStation中,并沒有簡單元素的定義,這里的簡單元素主要是為了論述方便,相較于下文中的復(fù)合元素而言,由點直接構(gòu)成,可以單獨定義,沒有子元素。按照其特點,可分為如下幾類:
(1)一點定位元素,這類元素的幾何圖形是一個點,主要包括文本(TextElement)、文本節(jié)點(TextNodeElement,即多行文本),通過原點(Origin)進行空間定位,轉(zhuǎn)換時,計算原點轉(zhuǎn)換前后的坐標(biāo)差值,使用元素的Move方法平移即可。對于標(biāo)簽元素(TagElement),其在圖形上表示為一個箭頭,由于其作用主要是對圖形對象進行整飾、說明,拓?fù)渖系囊笮?,因此也按照一點定位元素的坐標(biāo)轉(zhuǎn)換方法進行轉(zhuǎn)換。一點定位元素示例如圖4(圖中十字絲表示原點位置):
圖4 一點定位元素示例
(2)多點定位元素,這類元素的幾何圖形由多個點構(gòu)成,按照構(gòu)造特征不同,主要可分為以下幾類進行轉(zhuǎn)換:
①點列表類:MicroStation中的點列表元素主要包括線(LineElement)、多邊形(ShapeElement)、曲線(CurveElement)三類,其幾何圖形由一組有序的坐標(biāo)點構(gòu)成,他們都繼承了VertexList對象。轉(zhuǎn)換時,通過GetVertices方法獲取其構(gòu)成坐標(biāo)點,對這些坐標(biāo)點轉(zhuǎn)換后,使用ModifyVertex方法進行修改。在MicroStation中,可繪制的點也是一個長度為0的線元素。
②B樣條曲線(BsplineCurveElement):B樣條曲線在地形圖中很常見,主要用來表示等高線。在MicroStation中,主要通過GetPoles方法獲取樣條曲線的構(gòu)成點,再對點進行坐標(biāo)轉(zhuǎn)換,然后使用SetPoles方法重繪圖形。
③圓弧(ArcElement):圓弧可通過圓弧起點、圓弧中點、圓弧結(jié)點3點確定,因此在轉(zhuǎn)換時,通過獲取圓弧上的3點進行坐標(biāo)轉(zhuǎn)換。
④圓、橢圓(EllipseElement):可通過3點確定一個橢圓,也可通過圓心、長半軸、短半軸確定一個橢圓,為了保持圖形的拓?fù)浣Y(jié)構(gòu)完整,采用3點確定橢圓的方法,轉(zhuǎn)換時獲取橢圓上的3個點進行轉(zhuǎn)換,再進行重繪。
⑤尺寸標(biāo)注(DimensionElement):尺寸標(biāo)注在CAD文件中很常見,主要是對元素幾何圖形的長度、距離、角度等幾何特征進行標(biāo)注,多用于規(guī)劃、設(shè)計類圖紙,在地形圖中使用較少。一個標(biāo)注元素主要由標(biāo)注點、標(biāo)注值、標(biāo)注偏移三部分組成(如圖5所示),坐標(biāo)轉(zhuǎn)換時不但要轉(zhuǎn)換標(biāo)注點的坐標(biāo),還要根據(jù)新坐標(biāo)值改變標(biāo)注值。在MicroStation平臺,首先使用Point屬性獲取標(biāo)注點坐標(biāo),進行坐標(biāo)轉(zhuǎn)換后,使用DeletePoint方法刪除原坐標(biāo),再使用InsertReferencePoint方法更新坐標(biāo)。標(biāo)注值會重新計算并更新。
圖5 尺寸標(biāo)注元素示例
多點定位元素示例如圖6所示:
圖6 多點定位元素示例
相對于簡單元素,復(fù)合元素是由兩個或多個簡單元素構(gòu)成的復(fù)雜元素,作為一個實體存在于CAD文件中。CAD中的復(fù)合元素主要可分為復(fù)雜鏈、復(fù)雜多邊形、單元、共享單元四類。
(1)復(fù)雜鏈(ComplexStringElement):由兩個或多個直線、圓弧、曲線相連接而成的不閉合鏈。轉(zhuǎn)換時通過GetSubElements方法獲取子元素,再對子元素一一進行坐標(biāo)轉(zhuǎn)換,再使用CreateComplexStringElement1方法創(chuàng)建新的復(fù)雜鏈元素,最后復(fù)制原復(fù)雜鏈元素的符號化表達樣式、擴展屬性信息,完成坐標(biāo)轉(zhuǎn)換。復(fù)雜鏈元素示例如圖7所示:
圖7 復(fù)雜鏈元素示例
(2)復(fù)雜多邊形(ComplexShapeElement):由兩個或多個直線、圓弧、曲線相連接而成的閉合多邊形。轉(zhuǎn)換方法類似于復(fù)雜鏈元素的轉(zhuǎn)換方法。復(fù)雜多邊形元素示例如圖8所示:
圖8 復(fù)雜多邊形元素示例
(3)單元(CellElement):單元是一組元素的集合,主要分為圖形化單元和點類型單元兩類。單元中的每一個子元素的圖層、顏色、線型、線寬可以不一樣。轉(zhuǎn)換時通過GetSubElements方法獲取子元素,再對子元素一一進行坐標(biāo)轉(zhuǎn)換,并轉(zhuǎn)換單元的原點,再使用CreateCellElement1方法創(chuàng)建新的單元,最后復(fù)制原單元元素的符號化表達樣式、擴展屬性信息,完成坐標(biāo)轉(zhuǎn)換。單元示例如圖9所示:
圖9 單元示例
(4)共享單元(SharedCellElement):類似于AutoCAD中的塊,和單元相比,不同之處在于共享單元在一個DGN文件中只存儲一次其圖形元素,其余元素類似于存儲其索引位置,對任何一個共享單元圖形的修改都會修改所有同類單元。該類型多為圖形的填充符號。轉(zhuǎn)換方法類似于單元元素的轉(zhuǎn)換方法。
DGN中元素的屬性主要通過XData、DatabaseLink兩種方式存儲,主要存儲內(nèi)容及轉(zhuǎn)換方法分別為:
(1)XData:xData對象可以按照類似于字典的鍵值對的方式存儲屬性,每一個元素可以有多個XData屬性組,每一個屬性組有唯一的“鍵”來標(biāo)識,其屬性值可以存儲文本、數(shù)字、點、圖層等多種類型的值。轉(zhuǎn)換時,可通過HasAnyXData方法判斷元素是否有XData屬性,如果有,則逐項復(fù)制到轉(zhuǎn)換后的元素中[4]。XData對象結(jié)構(gòu)如圖10所示:
圖10 XData結(jié)構(gòu)圖
(2)DatabaseLink:DatabaseLink對象主要用于存儲元素與數(shù)據(jù)庫的鏈接鍵值,一個DatabaseLink主要由MSLink、Entity、LinkType三部分組成。MSLink相當(dāng)于數(shù)據(jù)庫表的編號;Entity相當(dāng)于對象在數(shù)據(jù)庫中的編號;LinkType表示數(shù)據(jù)庫的連接類型,有Oracle、Odbc、OleDb等類型。轉(zhuǎn)換時,可通過HasAnyDatabaseLinks方法判斷元素是否有DatabaseLink屬性,如果有,則逐項復(fù)制到轉(zhuǎn)換后的元素中。
圖形表達樣式主要包括圖層、顏色、線型、線寬、透明度、優(yōu)先級、是否隱藏、是否鎖定、是否高亮以及閉合元素的是否填充、填充樣式、填充顏色等屬性。轉(zhuǎn)換時,需要將這些屬性逐項復(fù)制到轉(zhuǎn)換后的元素中。
通常,由于CAD文件中沒有設(shè)置坐標(biāo)系,為了避免轉(zhuǎn)換混亂,需要對轉(zhuǎn)換情況進行記錄,因此可將轉(zhuǎn)換時間、轉(zhuǎn)換模型記錄到元素的XData屬性中,便于用戶查詢轉(zhuǎn)換情況。在記錄時,對于單元、共享單元等復(fù)合類元素的子元素也添加記錄屬性,則當(dāng)復(fù)合元素打散后亦可查看。
根據(jù)以上CAD幾何圖形點對點轉(zhuǎn)換實現(xiàn)方法,本項目基于MicroStation V8i SS4(SELECTseries 4)平臺,采用基于.NET框架的AddIn的開發(fā)方式,開發(fā)平臺選擇Visual Studio 2015,開發(fā)語言采用C#進行開發(fā)。軟件主要提供按圍柵框選范圍轉(zhuǎn)換和按文件夾批量轉(zhuǎn)換兩種方式。
利用所開發(fā)的轉(zhuǎn)換軟件,共完成了南寧市 6 500 km2各類CAD圖件成果的轉(zhuǎn)換。主要轉(zhuǎn)換圖件如表1所示:
CAD圖件成果轉(zhuǎn)換統(tǒng)計表 表1
對轉(zhuǎn)換的CAD圖件,采用“二級檢查、一級驗收”的方式進行質(zhì)量檢查。結(jié)果表明,本項目轉(zhuǎn)換成果精度無損失,檢查點位精度均在設(shè)計規(guī)定的限差范圍內(nèi);圖形要素不丟失、各要素齊全完整;屬性項無遺漏、屬性值正確;圖形屬性關(guān)聯(lián)準(zhǔn)確;圖形要素間關(guān)拓?fù)潢P(guān)系與源數(shù)據(jù)一致;各圖幅間接邊完全對接,無縫隙、重疊等接邊問題。
本文提出了基于MicroStation平臺,利用其對DWG、DXF文件的互操作支持,在該平臺二次開發(fā)點對點坐標(biāo)轉(zhuǎn)換軟件,實現(xiàn)了對DGN、DWG、DXF三種主要CAD格式文件的各類圖形元素的嚴(yán)密點對點轉(zhuǎn)換,實現(xiàn)了轉(zhuǎn)換前后其空間拓?fù)潢P(guān)系、符號化表達、擴展屬性信息的完整一致性。采用本文的方法與軟件,完成了南寧市 6 500 km2范圍內(nèi)地形圖、地籍圖等各類CAD圖件成果的2000坐標(biāo)轉(zhuǎn)換,共轉(zhuǎn)換各類DWG、DGN、DXF圖件上千幅,成果質(zhì)量優(yōu)等。因此,本文所提出的利用MicroStation平臺實現(xiàn)DGN、DWG、DXF三種格式的CAD圖件的動態(tài)無損坐標(biāo)轉(zhuǎn)換方法具有可行性和穩(wěn)定性,是一種值得推廣的坐標(biāo)轉(zhuǎn)換方法。