付海龍 ,周奎,王光昇,曲超,廉光偉,趙虎川
(天津市測(cè)繪院,天津 300381)
隨著國(guó)家經(jīng)濟(jì)的發(fā)展,城市的基礎(chǔ)建設(shè)工作在迅速進(jìn)行。目前城市的地上基礎(chǔ)設(shè)施規(guī)劃管理較為完善,但是地下管線的相關(guān)管理工作比較薄弱。而且近年來(lái)國(guó)內(nèi)管線事故的逐漸增多,給人民的生命財(cái)產(chǎn)安全帶來(lái)較大損失。因此,國(guó)家對(duì)于管線的管理工作愈發(fā)重視,逐步開(kāi)展了全國(guó)范圍內(nèi)的管線普查工作。這其中最為核心的環(huán)節(jié)就是管線的數(shù)據(jù)采集與入庫(kù)過(guò)程,顯然傳統(tǒng)的CAD 管線錄入與檢查已不能完全滿足建立高精度、高準(zhǔn)確度的管線數(shù)據(jù)庫(kù)需求。
與此同時(shí),國(guó)內(nèi)三維管線制作技術(shù)日益成熟[1~3],為形象化展示二維管線圖提供了極大便利。因此,本文以輔助管線數(shù)據(jù)生產(chǎn)為目的,研究了二三維一體化的管線錄入、瀏覽與檢查系統(tǒng),即用三維模塊來(lái)同步顯示CAD 中的管線數(shù)據(jù)。系統(tǒng)實(shí)現(xiàn)了視圖的同步,數(shù)據(jù)編輯的同步,通過(guò)實(shí)時(shí)顯示三維管線來(lái)發(fā)現(xiàn)數(shù)據(jù)的錄入錯(cuò)誤,并且開(kāi)發(fā)了管線碰撞檢測(cè)模塊,對(duì)數(shù)據(jù)中的邏輯錯(cuò)誤進(jìn)行快速的檢查與顯示。在檢查完成以后,碰撞位置會(huì)以列表的形式輸出,提示錄入人員進(jìn)行相應(yīng)的修改。
整個(gè)系統(tǒng)的核心技術(shù)包括了二維管線繪制與屬性錄入模塊,三維管線的動(dòng)態(tài)建模技術(shù),數(shù)據(jù)交互技術(shù),CAD 與三維顯示模塊的通訊交互技術(shù)以及管線碰撞檢查技術(shù)。這些技術(shù)的結(jié)合,為三維輔助CAD 管線檢查系統(tǒng)的實(shí)現(xiàn)打下了基礎(chǔ)。
該系統(tǒng)的核心工作區(qū)是二維的CAD 空間,它沿用了天津市測(cè)繪院的管線采集軟件[4],并進(jìn)行了三維拓展。因此它能夠充分兼容原有的外業(yè)采集數(shù)據(jù),符合作業(yè)人員的操作習(xí)慣。該軟件使用LISP 語(yǔ)言,依據(jù)《天津市地下管線信息技術(shù)管理技術(shù)規(guī)程》[5]制作而成,針對(duì)管線類別進(jìn)行繪制和屬性入庫(kù)。
錄入的管線類別分為給水、排水、燃?xì)狻㈦娏?、電信、熱力及工業(yè)管道。錄入的數(shù)據(jù)分為圖形與屬性。圖形包含管點(diǎn)與管線,它的繪制方式與經(jīng)典CAD 相同;管線屬性通過(guò)對(duì)話框輸入,并掛接在CAD 圖形的擴(kuò)展屬性內(nèi)[6]。錄入完成后,二維的圖形和屬性檢查在CAD 中完成,這種操作模式簡(jiǎn)單,但無(wú)法展示和發(fā)現(xiàn)空間錯(cuò)誤,因此必須借助三維輔助模式。
三維管線的建模技術(shù)在國(guó)內(nèi)已經(jīng)比較成熟,但大都屬于靜態(tài)建模技術(shù),即通過(guò)管線數(shù)據(jù)庫(kù)文件制作為三維管線模型,存儲(chǔ)在磁盤(pán)上,然后在三維瀏覽軟件中進(jìn)行瀏覽。但這種模式不能適應(yīng)二三維管線動(dòng)態(tài)錄入與瀏覽的要求,因?yàn)槿S視圖必須能夠?qū)崟r(shí)展示CAD的管線,并同步配合CAD 的實(shí)時(shí)編輯,因此基于數(shù)據(jù)庫(kù)的三維管線動(dòng)態(tài)建模技術(shù)成為關(guān)鍵。
管線的動(dòng)態(tài)建模技術(shù)需要一款高效、高擴(kuò)展性的三維平臺(tái),必須同時(shí)支持通過(guò)代碼制作各種復(fù)雜的模型,并同時(shí)具備渲染能力。因此我們采用了OpenScene-Graph(OSG)[7,8]平臺(tái)作為三維管線動(dòng)態(tài)建模與瀏覽的平臺(tái)。它是一款C+ +庫(kù),并將OpenGL 的C 接口封裝成為C+ +接口,定義了豐富的類庫(kù),涵蓋了從相機(jī)渲染、消息與偵聽(tīng)器、三維模型數(shù)據(jù)結(jié)構(gòu)等各種模塊。
在三維中,需要建模的元素主要包括井、井室、附屬物、管線等。
附屬物包括閥門(mén)、消火栓、變電箱等設(shè)施,它們的建模方式是加載預(yù)定義的模型庫(kù),復(fù)制模型并擺放在對(duì)應(yīng)的位置,閥門(mén)可根據(jù)管徑縮放比例。這些模型可以預(yù)先在3ds Max 中制作,并且導(dǎo)出成OSG 支持的IVE 數(shù)據(jù)格式,以便使用時(shí)加載。
而井、井室以及管線需要通過(guò)繪制頂點(diǎn)制作而成。它們的基本特征都是中空?qǐng)A管,因此最為核心的一步就是給定面數(shù),制作一個(gè)標(biāo)準(zhǔn)寬高、位于原點(diǎn)的圓管。在OSG 中,我們需首先制作頂點(diǎn)坐標(biāo)的數(shù)組,然后使用頂點(diǎn)連接數(shù)組將離散的頂點(diǎn)連成模型,最后需要指定紋理坐標(biāo),將紋理貼圖賦予圓管的內(nèi)外壁。紋理貼圖的選取可以依據(jù)管線的種類或材質(zhì)。方形的井和管線可以設(shè)置圓管面數(shù)為4。我們僅需將標(biāo)準(zhǔn)圓管移動(dòng)、旋轉(zhuǎn)并縮放,即可形成井、井室或管線。模型制作完成后需加入OSG 場(chǎng)景根節(jié)點(diǎn)進(jìn)行渲染[9]。
三維管線動(dòng)態(tài)建模的一個(gè)關(guān)鍵因素是內(nèi)存的控制。CAD 中的管線數(shù)據(jù)量往往很大,我們不能選擇一次性將CAD 中的全部管線屬性讀入三維模塊,也不能一次性將所有的管線模型制作并顯示,否則會(huì)給三維模塊造成過(guò)大的資源負(fù)擔(dān)。
因此需要?jiǎng)討B(tài)判斷當(dāng)前三維視點(diǎn)所在的標(biāo)準(zhǔn)圖幅號(hào),并通過(guò)該圖幅的外包矩形在數(shù)據(jù)庫(kù)中動(dòng)態(tài)請(qǐng)求范圍內(nèi)的所有管點(diǎn)、管線數(shù)據(jù),并動(dòng)態(tài)建模。當(dāng)視點(diǎn)發(fā)生移動(dòng)時(shí),在視點(diǎn)范圍之外的模型則會(huì)被刪除,范圍內(nèi)的管線會(huì)動(dòng)態(tài)生成。每一個(gè)圖幅內(nèi)的數(shù)據(jù)請(qǐng)求與動(dòng)態(tài)建模都會(huì)在一個(gè)獨(dú)立的線程內(nèi)執(zhí)行,并在建模完成后釋放,因此不會(huì)影響三維主渲染線程的瀏覽速度。
圖1 動(dòng)態(tài)瀏覽示意圖
在該系統(tǒng)中,二三維模塊是相對(duì)獨(dú)立的進(jìn)程,數(shù)據(jù)的交互是連接兩個(gè)模塊的關(guān)鍵。在三維的動(dòng)態(tài)瀏覽過(guò)程中,需不斷地向CAD 請(qǐng)求管線屬性數(shù)據(jù),這些請(qǐng)求是大量的、并發(fā)的。直接讀取CAD 的DWG 文件會(huì)破壞CAD 的穩(wěn)定性,所以必須使用數(shù)據(jù)庫(kù)作為中間數(shù)據(jù)層。
數(shù)據(jù)層可以選擇各種輕量級(jí)數(shù)據(jù)庫(kù),例如Access或者Sqlite,另外也可使用shp 數(shù)據(jù)進(jìn)行存儲(chǔ)。CAD 中繪制的圖形和屬性應(yīng)同步的更新至數(shù)據(jù)庫(kù)中,并通知三維模塊讀取數(shù)據(jù)庫(kù)。
為了兼容各種數(shù)據(jù)庫(kù),三維中讀取數(shù)據(jù)庫(kù)的子模塊應(yīng)獨(dú)立于三維程序本身,并使用設(shè)計(jì)模式中的接口與插件的模式。在程序最終發(fā)布時(shí),系統(tǒng)支持一種數(shù)據(jù)庫(kù)即可。
圖2 二三維數(shù)據(jù)交互
整個(gè)系統(tǒng)設(shè)計(jì)中最重要的一個(gè)環(huán)節(jié)就是二三維場(chǎng)景的交互過(guò)程,它直接面向用戶。然而二三維作為兩個(gè)獨(dú)立的程序,并不能直接通訊,因此我們使用了.NET庫(kù)中的命名管道完成了進(jìn)程間的通訊。我們將CAD 作為服務(wù)器并創(chuàng)建服務(wù)器端的命名管道,該管道需設(shè)置成監(jiān)聽(tīng)狀態(tài)。將三維模塊作為客戶端并創(chuàng)建客戶端命名管道,該管道需連接服務(wù)器端的命名管道。連接成功后,客戶端可以向服務(wù)端發(fā)送消息或請(qǐng)求,服務(wù)端也可以向客戶端發(fā)送廣播。
在該系統(tǒng)中,我們將所有的操作封裝成為帶有相應(yīng)參數(shù)的消息,因此僅需要一個(gè)發(fā)送與接收消息的接口,并通過(guò)封包或解譯消息,即可完成相互的操控。
圖3 進(jìn)程通訊
該系統(tǒng)支持二三維模塊的同步操作,即拖動(dòng)CAD時(shí)三維場(chǎng)景也跟隨移動(dòng),反之亦然。CAD 中沒(méi)有深度,在CAD 請(qǐng)求三維同步時(shí),需要假設(shè)場(chǎng)景的深度,可使用屏幕對(duì)角線的長(zhǎng)度。當(dāng)三維模塊接收到同步請(qǐng)求后,會(huì)更改場(chǎng)景位置,并且動(dòng)態(tài)生成新范圍內(nèi)的管線。在同步的過(guò)程中,通訊消息的發(fā)送和接收均是異步調(diào)用的,二三維模塊不會(huì)因相互拖拽而卡頓。另外,當(dāng)點(diǎn)擊某根管線或管線模型時(shí),可通過(guò)消息把管線的名稱發(fā)送給另一個(gè)模塊,通過(guò)搜索和縮放實(shí)現(xiàn)圖元的選擇同步。
該系統(tǒng)的重要功能是數(shù)據(jù)編輯的同步。即在CAD 中修改管線數(shù)據(jù)后,修改的信息可以實(shí)時(shí)的添加到數(shù)據(jù)庫(kù)中,并通知三維進(jìn)行實(shí)時(shí)的更新。這種更新包含了模型的更新和視圖的同步,它確保了三維管線模型的實(shí)時(shí)性。因此作業(yè)員繪制完后可立即瀏覽三維管線,通過(guò)將模型與外業(yè)實(shí)測(cè)管線對(duì)比,可迅速發(fā)現(xiàn)錯(cuò)誤。埋深錄入錯(cuò)誤在CAD 中無(wú)法檢測(cè),但在三維中管線的埋深突變可以被迅速發(fā)現(xiàn)。同理管徑的錯(cuò)誤也可因管線的粗細(xì)突變而覺(jué)察。因此這種實(shí)時(shí)性是該系統(tǒng)的主要特色。
管線數(shù)據(jù)質(zhì)量的內(nèi)容一般包括:數(shù)據(jù)完整性、邏輯一致性、位置精度、屬性精度等。
本系統(tǒng)對(duì)二維圖形和屬性的檢查主要是依據(jù)《天津市地下管線信息技術(shù)管理技術(shù)規(guī)程》,通過(guò)LISP 語(yǔ)言在AutoCAD 中進(jìn)行選擇、遍歷、讀取擴(kuò)展屬性,然后進(jìn)行邏輯判斷,并將檢查結(jié)果輸出到定位列表框中,使用戶能夠快速定位、修改錯(cuò)誤。常見(jiàn)的錯(cuò)誤包括物探點(diǎn)號(hào)不唯一、點(diǎn)號(hào)為空、重疊管點(diǎn)管線、特征點(diǎn)與關(guān)聯(lián)管線條數(shù)不一致、管點(diǎn)兩邊屬性矛盾、連續(xù)管線高程突變等錯(cuò)誤。這些錯(cuò)誤通常由于錄入操作失誤所致,檢查算法簡(jiǎn)單,可在CAD 下有效提示,因不是本文重點(diǎn),故不詳細(xì)介紹其實(shí)現(xiàn)過(guò)程。
當(dāng)數(shù)據(jù)量比較大的時(shí)候,在AutoCAD 中頻繁地進(jìn)行選擇、遍歷操作速度非常慢。這時(shí),我們首先將管線數(shù)據(jù)輸出到Spatialite 空間數(shù)據(jù)庫(kù)中,然后對(duì)空間數(shù)據(jù)庫(kù)進(jìn)行查詢分析[10],最后將檢查的結(jié)果在AutoCAD 中顯示輸出。這種方法極大地提高了大數(shù)據(jù)量的檢查效率。
對(duì)于三維空間關(guān)系的檢查本文主要考慮了管線碰撞的檢測(cè)。埋深錯(cuò)誤、管徑錯(cuò)誤也屬于空間關(guān)系錯(cuò)誤,但因沒(méi)有真實(shí)參考標(biāo)準(zhǔn),無(wú)法精確提示,只能通過(guò)瀏覽三維模型,依靠外業(yè)經(jīng)驗(yàn)發(fā)現(xiàn)潛在的可能錯(cuò)誤。
在現(xiàn)實(shí)中管線碰撞一般并不存在,但在管線數(shù)據(jù)庫(kù)中卻很常見(jiàn)。造成管線數(shù)據(jù)碰撞的原因較多,例如實(shí)測(cè)的精度較低,或采集的點(diǎn)間距過(guò)低,造成數(shù)據(jù)上的邏輯錯(cuò)誤。管線的碰撞率是評(píng)價(jià)管線數(shù)據(jù)質(zhì)量的重要指標(biāo),因此管線的碰撞檢測(cè)和三維展示也是該系統(tǒng)的核心功能。該功能的實(shí)現(xiàn)可基于如下算法。
(1)基于平面幾何與高程的檢測(cè)
假設(shè)將管線抽象為寬度為0 的線,那么發(fā)生碰撞的管線一定在正投影面上發(fā)生交叉,這是此種算法的前提。在平面上檢測(cè)出發(fā)現(xiàn)交叉的管線后,可在交叉點(diǎn)處計(jì)算在上管線的管底高和在下管線的管頂高,通過(guò)它們的比較可判斷管線是否發(fā)生碰撞。
圖4 平面與高程檢測(cè)
H 為管中高程,R 為管徑。如果d 為正,則沒(méi)有發(fā)生碰撞,否則管線發(fā)生碰撞。這種算法有一個(gè)明顯的缺陷,即相互平行的管線即使在管徑處發(fā)生碰撞,也無(wú)法有效檢測(cè)。
試驗(yàn)數(shù)據(jù)使用了某區(qū)域內(nèi)58 km的管線,在普通PC 上檢測(cè)用了31″,檢測(cè)速度較快。
(2)基于三維實(shí)體的布爾運(yùn)算
另一種真實(shí)的碰撞檢測(cè)算法,是創(chuàng)建三維實(shí)體進(jìn)行布爾運(yùn)算。這種運(yùn)算的結(jié)果是準(zhǔn)確的,然而由于是模擬算法,速度較慢。OSG 庫(kù)不支持布爾運(yùn)算,因此可使用REALDWG 開(kāi)發(fā)庫(kù)在內(nèi)存中制作管線粗模,并進(jìn)行粗模的布爾運(yùn)算,檢測(cè)完畢后可將碰撞的位置發(fā)送給三維模塊進(jìn)行標(biāo)注顯示。RealDWG 集成了ACIS 三維幾何造型引擎,ACIS 是用C + +寫(xiě)的模型類庫(kù),采用BREP 邊界表示法,支持實(shí)體的布爾運(yùn)算、曲面裁減、曲面過(guò)渡等多種編輯功能。在RealDWG 中的三維建模操作都是通過(guò)ACIS 來(lái)完成的。在RealDWG 中進(jìn)行碰撞檢測(cè)的步驟包括:
第一,根據(jù)管線的平面位置、管頂(或管底)高程、管徑、埋設(shè)方式等信息計(jì)算管線中軸線的空間位置;
第二,利用ACIS,根據(jù)管徑、埋設(shè)方式在中軸線位置建立Solid3d 類型的模型。建立圓柱體模型的方法是根據(jù)起止點(diǎn)和半徑通過(guò)CreateFrustum 方法建立。建立長(zhǎng)方體管線的方法是根據(jù)起止點(diǎn)、長(zhǎng)和寬通過(guò)CreateBox 方法建立。
第三、檢測(cè)碰撞。通過(guò)ACIS 建立了Solid3d 類型的三維管經(jīng)模型之后,用Solid3d 對(duì)象的CheckInterference 方法可以確定兩個(gè)對(duì)象之間是否交疊,即是否存在碰撞。
第四、計(jì)算碰撞位置當(dāng)檢測(cè)到管線存在碰撞時(shí),我們需要獲取碰撞的空間位置。通過(guò)Solid3d 對(duì)象的BooleanOperation 方法對(duì)兩個(gè)對(duì)象進(jìn)行布爾操作,計(jì)算兩個(gè)三維對(duì)象交集,方法如下:
圖5 布爾運(yùn)算
試驗(yàn)數(shù)據(jù)使用了同區(qū)域內(nèi)58 km的管線,在普通PC 上檢測(cè)用了100″,因此速度數(shù)倍慢于平面幾何法,但仍足以滿足實(shí)際應(yīng)用。
該系統(tǒng)的基本界面包括二維CAD 環(huán)境和三維環(huán)境,適合在雙屏幕上進(jìn)行操作。管線的繪制和錄入在CAD 中完成,三維模塊負(fù)責(zé)管線的瀏覽和碰撞檢測(cè)展示。在數(shù)據(jù)制作過(guò)程中,兩個(gè)模塊可以實(shí)現(xiàn)視圖和模型編輯的同步(如圖6所示),便于用戶快速的發(fā)現(xiàn)錯(cuò)誤。
圖6 系統(tǒng)界面與視圖同步
如圖7,在碰撞檢測(cè)完成后,三維模塊中會(huì)生成碰撞位置的列表,同時(shí)配以動(dòng)畫(huà)箭頭指示碰撞的位置。經(jīng)過(guò)檢驗(yàn),基于布爾運(yùn)算的碰撞檢測(cè)算法精度可靠,為數(shù)據(jù)的邏輯錯(cuò)誤檢查提供便捷。
圖7 碰撞檢測(cè)結(jié)果
城市管線日益成為城市建設(shè)的重要組成部分,但經(jīng)典的CAD 管線錄入檢查模式已不能滿足高質(zhì)量管線數(shù)據(jù)的要求。在此背景下,本文實(shí)現(xiàn)了二三維一體化的管線錄入、瀏覽及檢查系統(tǒng)。首先在CAD 中進(jìn)行管線錄入,屬性數(shù)據(jù)會(huì)同步更新到管線數(shù)據(jù)庫(kù);三維模塊接收到更新請(qǐng)求后,會(huì)讀取數(shù)據(jù)庫(kù)并動(dòng)態(tài)生成管線模型。該系統(tǒng)實(shí)現(xiàn)了二三維視圖的同步以及數(shù)據(jù)編輯的同步,方便用戶實(shí)時(shí)瀏覽,并通過(guò)觀察模型發(fā)現(xiàn)埋深、材質(zhì)、管徑等錄入錯(cuò)誤。另外,該系統(tǒng)實(shí)現(xiàn)了基于布爾運(yùn)算的管線碰撞檢測(cè),將碰撞位置的列表輸出,并用箭頭提示碰撞位置,提醒用戶更改數(shù)據(jù)中的邏輯錯(cuò)誤。該系統(tǒng)解決了經(jīng)典CAD 管線圖不直觀、難以發(fā)現(xiàn)錯(cuò)誤的瓶頸,并已經(jīng)運(yùn)用于實(shí)際的管線數(shù)據(jù)生產(chǎn)工作,提高了管線數(shù)據(jù)的生產(chǎn)效率和質(zhì)量。
[1]朱慰明,馮竹平,曹桂海等.淺談城市地下管線三維可視化系統(tǒng)的應(yīng)用[DB/OL].城市建設(shè)理論研究(電子版),2012(15).
[2]馬民濤,任杰,陳克龍等.城市地下管網(wǎng)管理信息系統(tǒng)中管線三維顯示的實(shí)現(xiàn)[J].測(cè)繪工程,2005,14(4):8 ~10.
[3]陳光.地下管線三維CAD 與信息管理軟件開(kāi)發(fā)[D].西安:西安理工大學(xué),2008.
[4]王光昇,周麗珠,劉允等.基于AutoCAD 自定義實(shí)體的初步研究[J].城市勘測(cè),2012(2):134 ~137.
[5]DB/T29 -152 -2010.天津市地下管線信息管理技術(shù)規(guī)程[S].
[6]趙春燕,施建昭,于海乾.基于ObjectARX 的CAD 二次開(kāi)發(fā)技術(shù)實(shí)現(xiàn)管線數(shù)據(jù)的入庫(kù)和編輯[J].現(xiàn)代測(cè)繪,2010,33(5):58 ~60.
[7]王銳,錢(qián)學(xué)雷.OpenSceneGraph 三維渲染引擎設(shè)計(jì)與實(shí)踐[M].北京:清華大學(xué)出版社,2009.
[8]肖鵬,劉更代,徐明亮.OpenSceneGraph 三維渲染引擎編程指南[M].北京:清華大學(xué)出版社,2010.
[9]曲超,義崇政,廉光偉.基于OSG 的三維管線實(shí)時(shí)建模技術(shù)研究[C].魅力天津·學(xué)會(huì)杯.天津:天津科學(xué)技術(shù)出版社,2013:343.
[10]柳華僑,王光昇.輕量數(shù)據(jù)庫(kù)Spatialite 在AutoCAD 中的應(yīng)用[J].城市勘測(cè),2013(5):46 ~49.