金波
摘要:Bentley公司基于MicroStation平臺的系列軟件能進(jìn)行多專業(yè)、多行業(yè)三維建模,但其模型不能直接的導(dǎo)出到ArcGIS平臺中使用。SceneLayer Package(SLPK)是ArcGIS支持的基于OGC I3S規(guī)范的國際三維標(biāo)準(zhǔn)格式,通過研究SLPK格式和MicroStation三維模型,基于MicroStation進(jìn)行MDL二次開發(fā),實(shí)現(xiàn)了在MicroStation中三維模型直接導(dǎo)出成SLPK格式,以便在GIS平臺中更好的應(yīng)用和展示BIM模型。
關(guān)鍵詞:MicroStation;SLPK;ArcGIS Pro;MDL二次開發(fā);BIM+GIS
1 引言
MicroStation是一款工程領(lǐng)域常用的二維、三維一體化計算機(jī)輔助設(shè)計軟件,Bentley公司基于MicroStation研發(fā)了一系列軟件用于土木、工廠、建筑和地理信息行業(yè),可用于創(chuàng)建各個專業(yè)和行業(yè)的三維模型,并附加屬性信息,提供了一套廣泛應(yīng)用的BIM解決方案。另外MicroStation提供了SDK,用于用戶二次開發(fā)以實(shí)現(xiàn)更多的功能。
為了更好地將BIM三維模型與GIS結(jié)合起來,ESRI公司發(fā)起了I3S規(guī)范;該規(guī)范被開放地理空間聯(lián)盟(OGC)采納為新的國際三維標(biāo)準(zhǔn)。基于I3S規(guī)范ESRI提出了三維數(shù)據(jù)格式SLPK(場景圖層包)。SLPK格式能夠在ESRI公司的ArcGIS Pro以及ArcGIS online中使用,發(fā)布為服務(wù)后可用ArcGIS API for JavaScript調(diào)用應(yīng)用于Web。
MicroStation三維模型目前不支持直接導(dǎo)出SLPK格式供ArcGIS使用,通過研究SLPK格式和MicroStation模型,基于MicroStation MDL二次開發(fā),實(shí)現(xiàn)了在 MicroStation中將模型直接導(dǎo)出為SLPK格式;同時為了更方便地在GIS系統(tǒng)中使用SLPK,在導(dǎo)出時添加了坐標(biāo)系轉(zhuǎn)換的功能,可以將模型導(dǎo)出為經(jīng)緯度坐標(biāo)或者Web墨卡托坐標(biāo)等。其轉(zhuǎn)換流程如圖1所示。
2 MicroStation三維模型簡介
在MicroStation中,元素種類很多,主要分為線、面和體幾類。三維模型通常屬于體,極少數(shù)屬于網(wǎng)格面。三維模型常見的元素種類見表1。
針對不同類型的三維模型,需要進(jìn)行不同類型的處理。在程序中,首先需要判斷三維模型的類型,主要用到的函數(shù)包括mdlElement_getType()、mdlTFElmdscr_ getApplicationType()和mdlKISolid_isSolidElement()等。
mdlElement_getType()可用于判斷三維模型是否是網(wǎng)格或?qū)嶓w。
mdlKISolid_isSolidElement()可用于判斷三維模型是否是實(shí)體或智能實(shí)體。
mdlTFElmdscr_getApplicationType()可用于判斷三維模型是否屬于建筑模型單元或者復(fù)合單元。
3 模型面三角形化
三維模型幾何信息由若干個面組成,MicroStation中三維模型可能包含曲面、含圓弧的面或者多邊形面,但是在SLPK格式中,三維模型目前只支持三角形面,因此需要將MicroStation中三維模型進(jìn)行三角形化,這樣就能滿足SLPK的要求。針對不同類型的三維模型需要進(jìn)行不同的處理。
(1)網(wǎng)格三角形化:網(wǎng)格可能全部由三角形面組成,也可能包含四邊形面或多邊形面,可以使用mdlMesh_ copyTriangulated()函數(shù)將網(wǎng)格復(fù)制并三角形化,得到的新網(wǎng)格中只包含三角形面。接著使用mdlMesh_ getPolyfaceArrays()函數(shù)即可獲得網(wǎng)格各個三角形面的頂點(diǎn)坐標(biāo)。圖2中左邊為原始網(wǎng)格,右邊為三角形化的網(wǎng)格。
(2)單元、實(shí)體和智能實(shí)體三角形化:單元、實(shí)體和智能實(shí)體都只包含單個的體,首先使用mdlKISolid_ elementToBody2()函數(shù)將元素轉(zhuǎn)換成內(nèi)部KISolid,再使用mdlKISolid_facetBody()函數(shù)進(jìn)行三角形化。將含曲線和圓弧的面轉(zhuǎn)換成三角形面會有精度丟失,主要依據(jù)弦公差和角度公差兩個參數(shù)來保證精度。圖3中展示的是轉(zhuǎn)換前后的變化。
(3)復(fù)合單元:復(fù)合單元由多個單元或智能實(shí)體組成,應(yīng)使用mdlKISolid_elementToBodyList()來將元素轉(zhuǎn)換成多個KISolid,對于每個KISolid使用單元、實(shí)體和智能實(shí)體的方法來進(jìn)行三角形化,最后把三角形化的面合并起來存儲即可。圖4中左邊的窗戶包含6個部分,右邊是三角形化之后的效果。
在完成三角形化的同時,也獲得了模型在當(dāng)前坐標(biāo)系的頂點(diǎn)坐標(biāo)。
4 坐標(biāo)轉(zhuǎn)換、法線計算
SLPK的主要使用場合是Web,WebGIS系統(tǒng)常用的坐標(biāo)系是網(wǎng)絡(luò)墨卡托坐標(biāo)系(EPSG:3 857)和WGS84經(jīng)緯度坐標(biāo)系(EPSG:4 326),而MicroStation建模結(jié)合地形模型總裝后的坐標(biāo)系通常為Beijing54、Xian80或CGCS2000的三度分帶投影坐標(biāo)系,因此在模型輸出成SLPK格式時提供坐標(biāo)系轉(zhuǎn)換功能很有必要。
基于GDAL和Proj.4開源庫,根據(jù)源坐標(biāo)系和目標(biāo)坐標(biāo)系的EPSG代碼,實(shí)現(xiàn)對坐標(biāo)進(jìn)行批量轉(zhuǎn)換。
當(dāng)不涉及到網(wǎng)絡(luò)墨卡托坐標(biāo)系時,主要代碼如下:bool coordTranform(int count,int srcEpsg,int destEpsg,double* px,double* py)
當(dāng)輸入坐標(biāo)系和輸出坐標(biāo)系橢球不一樣時,通常坐標(biāo)轉(zhuǎn)換需要七參數(shù)或四參數(shù)等才能精確轉(zhuǎn)換,否則轉(zhuǎn)換結(jié)果平面誤差可達(dá)數(shù)十米甚至上百米。但在實(shí)際試驗(yàn)中發(fā)現(xiàn),proj.4和GDAL中已內(nèi)置了相關(guān)轉(zhuǎn)換參數(shù),不同橢球的坐標(biāo)轉(zhuǎn)換后的結(jié)果精度較高,與網(wǎng)絡(luò)地圖套和較好,故可直接使用。假如出現(xiàn)了偏差較大的情況,只需對模型進(jìn)行相應(yīng)的移動即可。
除了頂點(diǎn)坐標(biāo)外,三維模型的顯示和渲染還需要每個面的法線向量,法線的計算方式為向量叉乘。如一個三角形面三個頂點(diǎn)依次分別為P1、P2和P3,則這個面的法線為,一般還需要進(jìn)行歸一化使法線向量的模為1。在計算法線時需要注意,經(jīng)緯度坐標(biāo)不能直接拿來進(jìn)行法線的計算,如果輸出坐標(biāo)系是WGS84經(jīng)緯度,則應(yīng)先計算法線,再進(jìn)行坐標(biāo)轉(zhuǎn)換。
5 模型屬性提取
BIM模型除了幾何信息之外屬性信息也非常重要,基于MicroStation的建筑建模相關(guān)軟件的SDK中提供了一些提取屬性信息的方法。
首先設(shè)計了相應(yīng)數(shù)據(jù)結(jié)構(gòu)來存儲屬性,如下:
(1)面積:模型的表面積,類型為雙精度浮點(diǎn)數(shù),直接使用mdlMeasure_AreaProperties()函數(shù)獲得。
(2)體積:模型的體積,類型為雙精度浮點(diǎn)數(shù),直接使用mdlMeasure_volumeProperties()函數(shù)獲得。
(3)位置:模型的中心坐標(biāo),因?yàn)橛腥齻€浮點(diǎn)數(shù)(X,Y,Z),簡化使用字符串來存儲,從MicroStation元素的元素頭中range變量中能獲取模型坐標(biāo)值的最大值和最小值,取其平均數(shù)即為近似的模型中心坐標(biāo)。
(4)圖層:模型所在的圖層名稱,使用mdlElement_ getProperties()函數(shù)可獲得圖層ID,再使用mdlLevel_ getName()函數(shù)即可獲得圖層名稱,類型為字符串。
(5)顏色:模型頂點(diǎn)顏色,類型為字符串,在MicroStation中一個元素只能有一種顏色,使用mdlElement_getSymbology()函數(shù)獲取顏色索引號,如果獲得的索引號是“按層”,則需要根據(jù)圖層ID獲得顏色索引號,即使用mdlLevel_getElementColor()函數(shù)。得到顏色索引號后,通過調(diào)色板來查詢索引號對應(yīng)的顏色RGB值,用到的函數(shù)是mdlColorPal_getColorDescr()和mdlColorDescr_ getRgb(),最后將RGB值轉(zhuǎn)成字符串。
(6)類別和樣式:類別和樣式是MicroStation建筑模型最重要的屬性之一,類型為字符串,涵蓋模型材料、圖樣、工程量、渲染特性、切圖和結(jié)構(gòu)分析等一系列屬性的定義,知道了樣式名稱,即可在庫中查詢到該樣式的這些屬性,如磚外墻的類別為“Wall_Ext”,樣式為“Brick wall”。使用mdlTFPartRef_getPart()函數(shù)獲得樣式,再使用mdlTFPartRef_getPartName()函數(shù)和mdlTFPartRef_ getPartFamilyName()函數(shù)即可分別獲得樣式和類別。
(7)材質(zhì):建筑模型的材質(zhì)定義了模型的紋理和貼圖信息,從樣式定義中能獲取到材質(zhì)信息的定義,如“Concrete_3”表示貼圖為混凝土。
除了這些屬性,還能夠根據(jù)不同專業(yè)和行業(yè)來獲取所需的屬性,但是具體需要配置各專業(yè)的工作環(huán)境和約定相應(yīng)的標(biāo)準(zhǔn),目前還未深入研究。
6 輸出SLPK
完成了上述處理后,即可開始創(chuàng)建SLPK格式的場景圖層包了。
(1)格式簡介:SLPK文件是由一系列JSON文件和二進(jìn)制文件按照嚴(yán)格的文件組織再打包成ZIP格式的壓縮包,其主要文件夾結(jié)構(gòu)如圖5所示。
根目錄下有metaData.json、3DSceneLayer.json兩個文件和nodes文件夾;nodes文件夾中存儲有各個節(jié)點(diǎn)文件夾;root文件夾下存儲的是根節(jié)點(diǎn)信息,只有一個文件3dNodeIndexDocument.json;其他每個節(jié)點(diǎn)文件夾下可存儲模型的一個部分,每部分的屬性可以不同,包括3dNodeIndexDocument.json文件和若干個子文件夾(attributes,features,geometries和shared文件夾);attirbutes文件夾下存儲的是各個屬性的值;features文件夾下有0.json文件;geometries文件夾下存儲的是0.bin文件,以二進(jìn)制格式存儲頂點(diǎn)坐標(biāo)、法線坐標(biāo)、紋理坐標(biāo)和頂點(diǎn)顏色值;shared文件夾中存儲的是sharedResource.json,主要存儲紋理貼圖信息;如果存在紋理貼圖,還會有textures文件夾,里面存儲的是dds或者jpeg格式的紋理圖片。每個節(jié)點(diǎn)的3dNodeIndexDocument.json文件中會存有父節(jié)點(diǎn)的信息和子節(jié)點(diǎn)的信息,所有節(jié)點(diǎn)之間的關(guān)系是一種樹狀關(guān)系,這對于大數(shù)據(jù)量的模型有利于實(shí)現(xiàn)LOD。
(2)創(chuàng)建JSON文件:JSON文件是JavaScript Object Notation的縮寫,是一種用來存儲和表示數(shù)據(jù)的文本格式,使用cJson庫能夠很方便地進(jìn)行JSON文件的讀寫。對于SLPK包內(nèi)的所有json格式的文件,都可以用cJson庫進(jìn)行創(chuàng)建,各個文件具體內(nèi)容參見OGC SLPK官方文檔。metaData.json文件的創(chuàng)建代碼如下:
在0.bin中依次存儲的是頂點(diǎn)數(shù)組、法線數(shù)組、紋理坐標(biāo)數(shù)據(jù)和顏色數(shù)組,寫入文件可使用ofstream,ofstream::write()函數(shù)能夠快速批量將數(shù)組寫入到文件中。
屬性值也可存儲在名為0.bin的二進(jìn)制文件中,對于不同屬性類型的屬性值,寫入方法有所差別,其代碼如下:
要注意將字符串轉(zhuǎn)成UTF-8編碼,否則漢字顯示為亂碼。
(4)文件壓縮:完成創(chuàng)建所有文件后,需要將除了metaData.json外的所有文件先壓縮成gz格式,在程序中使用ShellExecute()函數(shù)調(diào)用開源的壓縮軟件7z.exe,給定參數(shù)“a <文件名>.gz <文件名>”即可完成壓縮,壓縮的同時刪除掉原文件;接著使用ShellExecute()調(diào)用7z.exe,給定參數(shù)“a <模型文件夾><模型名>.zip -ir!<模型文件夾>*.* -mx0”,即可將所有文件打包成zip格式;最后將zip文件名稱中后綴名“.zip”修改成“.slpk”即完成的場景圖層包的創(chuàng)建。
7 運(yùn)行結(jié)果
在MicroStation中運(yùn)行MDL程序,界面如圖6所示。
選中要導(dǎo)出的一個或者多個模型(多個模型時,每個模型會導(dǎo)出成場景圖層包的一個節(jié)點(diǎn)),設(shè)置相應(yīng)路徑、名稱和坐標(biāo)系等參數(shù),在視圖中單擊左鍵即開始導(dǎo)出。導(dǎo)出完成后,在ArcGIS online中,直接即可將SLPK文件上傳并發(fā)布成Scene Layer。圖7、圖8分別是大壩原始三維模型和在網(wǎng)頁中展示的效果。圖9、圖10是房屋原始三維模型和在網(wǎng)頁中展示的效果。
圖11為在網(wǎng)頁中可以查詢模型每一個部分的屬性。
使用ArcGIS API for JS調(diào)用SLPK場景圖層的示例代碼如下:
8 結(jié)語
通過研發(fā)和實(shí)踐,解決了MicroStation三維建筑模型直接導(dǎo)出成SLPK場景圖層包的問題,為BIM模型和GIS系統(tǒng)的應(yīng)用結(jié)合打下了一些基礎(chǔ)。
參考文獻(xiàn):
[1]OGC Indexd 3d Scene Layer(I3S) and Scene Layer Package Format Specification.
[2]彭殿軍.從MicroStation三維模型到二維圖紙的生成流程[J].有色冶金設(shè)計與研究,2016(05):106-107,110.
[3]張燕,唐相楨.MicroStation圖形數(shù)據(jù)到ArcGIS數(shù)據(jù)轉(zhuǎn)換方法的研究[J].城市勘測,2015(1):26-29.
[4]喬新,王海銀,胡振彪.MicroStation調(diào)用WebGIS地圖服務(wù)的開發(fā)與應(yīng)用[J].現(xiàn)代測繪,2011(2):29-31.