付海龍 ,周奎,王光昇,曲超,廉光偉,趙虎川
(天津市測繪院,天津 300381)
隨著國家經濟的發展,城市的基礎建設工作在迅速進行。目前城市的地上基礎設施規劃管理較為完善,但是地下管線的相關管理工作比較薄弱。而且近年來國內管線事故的逐漸增多,給人民的生命財產安全帶來較大損失。因此,國家對于管線的管理工作愈發重視,逐步開展了全國范圍內的管線普查工作。這其中最為核心的環節就是管線的數據采集與入庫過程,顯然傳統的CAD 管線錄入與檢查已不能完全滿足建立高精度、高準確度的管線數據庫需求。
與此同時,國內三維管線制作技術日益成熟[1~3],為形象化展示二維管線圖提供了極大便利。因此,本文以輔助管線數據生產為目的,研究了二三維一體化的管線錄入、瀏覽與檢查系統,即用三維模塊來同步顯示CAD 中的管線數據。系統實現了視圖的同步,數據編輯的同步,通過實時顯示三維管線來發現數據的錄入錯誤,并且開發了管線碰撞檢測模塊,對數據中的邏輯錯誤進行快速的檢查與顯示。在檢查完成以后,碰撞位置會以列表的形式輸出,提示錄入人員進行相應的修改。
整個系統的核心技術包括了二維管線繪制與屬性錄入模塊,三維管線的動態建模技術,數據交互技術,CAD 與三維顯示模塊的通訊交互技術以及管線碰撞檢查技術。這些技術的結合,為三維輔助CAD 管線檢查系統的實現打下了基礎。
該系統的核心工作區是二維的CAD 空間,它沿用了天津市測繪院的管線采集軟件[4],并進行了三維拓展。因此它能夠充分兼容原有的外業采集數據,符合作業人員的操作習慣。該軟件使用LISP 語言,依據《天津市地下管線信息技術管理技術規程》[5]制作而成,針對管線類別進行繪制和屬性入庫。
錄入的管線類別分為給水、排水、燃氣、電力、電信、熱力及工業管道。錄入的數據分為圖形與屬性。圖形包含管點與管線,它的繪制方式與經典CAD 相同;管線屬性通過對話框輸入,并掛接在CAD 圖形的擴展屬性內[6]。錄入完成后,二維的圖形和屬性檢查在CAD 中完成,這種操作模式簡單,但無法展示和發現空間錯誤,因此必須借助三維輔助模式。
三維管線的建模技術在國內已經比較成熟,但大都屬于靜態建模技術,即通過管線數據庫文件制作為三維管線模型,存儲在磁盤上,然后在三維瀏覽軟件中進行瀏覽。但這種模式不能適應二三維管線動態錄入與瀏覽的要求,因為三維視圖必須能夠實時展示CAD的管線,并同步配合CAD 的實時編輯,因此基于數據庫的三維管線動態建模技術成為關鍵。
管線的動態建模技術需要一款高效、高擴展性的三維平臺,必須同時支持通過代碼制作各種復雜的模型,并同時具備渲染能力。因此我們采用了OpenScene-Graph(OSG)[7,8]平臺作為三維管線動態建模與瀏覽的平臺。它是一款C+ +庫,并將OpenGL 的C 接口封裝成為C+ +接口,定義了豐富的類庫,涵蓋了從相機渲染、消息與偵聽器、三維模型數據結構等各種模塊。
在三維中,需要建模的元素主要包括井、井室、附屬物、管線等。
附屬物包括閥門、消火栓、變電箱等設施,它們的建模方式是加載預定義的模型庫,復制模型并擺放在對應的位置,閥門可根據管徑縮放比例。這些模型可以預先在3ds Max 中制作,并且導出成OSG 支持的IVE 數據格式,以便使用時加載。
而井、井室以及管線需要通過繪制頂點制作而成。它們的基本特征都是中空圓管,因此最為核心的一步就是給定面數,制作一個標準寬高、位于原點的圓管。在OSG 中,我們需首先制作頂點坐標的數組,然后使用頂點連接數組將離散的頂點連成模型,最后需要指定紋理坐標,將紋理貼圖賦予圓管的內外壁。紋理貼圖的選取可以依據管線的種類或材質。方形的井和管線可以設置圓管面數為4。我們僅需將標準圓管移動、旋轉并縮放,即可形成井、井室或管線。模型制作完成后需加入OSG 場景根節點進行渲染[9]。
三維管線動態建模的一個關鍵因素是內存的控制。CAD 中的管線數據量往往很大,我們不能選擇一次性將CAD 中的全部管線屬性讀入三維模塊,也不能一次性將所有的管線模型制作并顯示,否則會給三維模塊造成過大的資源負擔。
因此需要動態判斷當前三維視點所在的標準圖幅號,并通過該圖幅的外包矩形在數據庫中動態請求范圍內的所有管點、管線數據,并動態建模。當視點發生移動時,在視點范圍之外的模型則會被刪除,范圍內的管線會動態生成。每一個圖幅內的數據請求與動態建模都會在一個獨立的線程內執行,并在建模完成后釋放,因此不會影響三維主渲染線程的瀏覽速度。

圖1 動態瀏覽示意圖
在該系統中,二三維模塊是相對獨立的進程,數據的交互是連接兩個模塊的關鍵。在三維的動態瀏覽過程中,需不斷地向CAD 請求管線屬性數據,這些請求是大量的、并發的。直接讀取CAD 的DWG 文件會破壞CAD 的穩定性,所以必須使用數據庫作為中間數據層。
數據層可以選擇各種輕量級數據庫,例如Access或者Sqlite,另外也可使用shp 數據進行存儲。CAD 中繪制的圖形和屬性應同步的更新至數據庫中,并通知三維模塊讀取數據庫。
為了兼容各種數據庫,三維中讀取數據庫的子模塊應獨立于三維程序本身,并使用設計模式中的接口與插件的模式。在程序最終發布時,系統支持一種數據庫即可。

圖2 二三維數據交互
整個系統設計中最重要的一個環節就是二三維場景的交互過程,它直接面向用戶。然而二三維作為兩個獨立的程序,并不能直接通訊,因此我們使用了.NET庫中的命名管道完成了進程間的通訊。我們將CAD 作為服務器并創建服務器端的命名管道,該管道需設置成監聽狀態。將三維模塊作為客戶端并創建客戶端命名管道,該管道需連接服務器端的命名管道。連接成功后,客戶端可以向服務端發送消息或請求,服務端也可以向客戶端發送廣播。
在該系統中,我們將所有的操作封裝成為帶有相應參數的消息,因此僅需要一個發送與接收消息的接口,并通過封包或解譯消息,即可完成相互的操控。

圖3 進程通訊
該系統支持二三維模塊的同步操作,即拖動CAD時三維場景也跟隨移動,反之亦然。CAD 中沒有深度,在CAD 請求三維同步時,需要假設場景的深度,可使用屏幕對角線的長度。當三維模塊接收到同步請求后,會更改場景位置,并且動態生成新范圍內的管線。在同步的過程中,通訊消息的發送和接收均是異步調用的,二三維模塊不會因相互拖拽而卡頓。另外,當點擊某根管線或管線模型時,可通過消息把管線的名稱發送給另一個模塊,通過搜索和縮放實現圖元的選擇同步。
該系統的重要功能是數據編輯的同步。即在CAD 中修改管線數據后,修改的信息可以實時的添加到數據庫中,并通知三維進行實時的更新。這種更新包含了模型的更新和視圖的同步,它確保了三維管線模型的實時性。因此作業員繪制完后可立即瀏覽三維管線,通過將模型與外業實測管線對比,可迅速發現錯誤。埋深錄入錯誤在CAD 中無法檢測,但在三維中管線的埋深突變可以被迅速發現。同理管徑的錯誤也可因管線的粗細突變而覺察。因此這種實時性是該系統的主要特色。
管線數據質量的內容一般包括:數據完整性、邏輯一致性、位置精度、屬性精度等。
本系統對二維圖形和屬性的檢查主要是依據《天津市地下管線信息技術管理技術規程》,通過LISP 語言在AutoCAD 中進行選擇、遍歷、讀取擴展屬性,然后進行邏輯判斷,并將檢查結果輸出到定位列表框中,使用戶能夠快速定位、修改錯誤。常見的錯誤包括物探點號不唯一、點號為空、重疊管點管線、特征點與關聯管線條數不一致、管點兩邊屬性矛盾、連續管線高程突變等錯誤。這些錯誤通常由于錄入操作失誤所致,檢查算法簡單,可在CAD 下有效提示,因不是本文重點,故不詳細介紹其實現過程。
當數據量比較大的時候,在AutoCAD 中頻繁地進行選擇、遍歷操作速度非常慢。這時,我們首先將管線數據輸出到Spatialite 空間數據庫中,然后對空間數據庫進行查詢分析[10],最后將檢查的結果在AutoCAD 中顯示輸出。這種方法極大地提高了大數據量的檢查效率。
對于三維空間關系的檢查本文主要考慮了管線碰撞的檢測。埋深錯誤、管徑錯誤也屬于空間關系錯誤,但因沒有真實參考標準,無法精確提示,只能通過瀏覽三維模型,依靠外業經驗發現潛在的可能錯誤。
在現實中管線碰撞一般并不存在,但在管線數據庫中卻很常見。造成管線數據碰撞的原因較多,例如實測的精度較低,或采集的點間距過低,造成數據上的邏輯錯誤。管線的碰撞率是評價管線數據質量的重要指標,因此管線的碰撞檢測和三維展示也是該系統的核心功能。該功能的實現可基于如下算法。
(1)基于平面幾何與高程的檢測
假設將管線抽象為寬度為0 的線,那么發生碰撞的管線一定在正投影面上發生交叉,這是此種算法的前提。在平面上檢測出發現交叉的管線后,可在交叉點處計算在上管線的管底高和在下管線的管頂高,通過它們的比較可判斷管線是否發生碰撞。

圖4 平面與高程檢測

H 為管中高程,R 為管徑。如果d 為正,則沒有發生碰撞,否則管線發生碰撞。這種算法有一個明顯的缺陷,即相互平行的管線即使在管徑處發生碰撞,也無法有效檢測。
試驗數據使用了某區域內58 km的管線,在普通PC 上檢測用了31″,檢測速度較快。
(2)基于三維實體的布爾運算
另一種真實的碰撞檢測算法,是創建三維實體進行布爾運算。這種運算的結果是準確的,然而由于是模擬算法,速度較慢。OSG 庫不支持布爾運算,因此可使用REALDWG 開發庫在內存中制作管線粗模,并進行粗模的布爾運算,檢測完畢后可將碰撞的位置發送給三維模塊進行標注顯示。RealDWG 集成了ACIS 三維幾何造型引擎,ACIS 是用C + +寫的模型類庫,采用BREP 邊界表示法,支持實體的布爾運算、曲面裁減、曲面過渡等多種編輯功能。在RealDWG 中的三維建模操作都是通過ACIS 來完成的。在RealDWG 中進行碰撞檢測的步驟包括:
第一,根據管線的平面位置、管頂(或管底)高程、管徑、埋設方式等信息計算管線中軸線的空間位置;
第二,利用ACIS,根據管徑、埋設方式在中軸線位置建立Solid3d 類型的模型。建立圓柱體模型的方法是根據起止點和半徑通過CreateFrustum 方法建立。建立長方體管線的方法是根據起止點、長和寬通過CreateBox 方法建立。
第三、檢測碰撞。通過ACIS 建立了Solid3d 類型的三維管經模型之后,用Solid3d 對象的CheckInterference 方法可以確定兩個對象之間是否交疊,即是否存在碰撞。
第四、計算碰撞位置當檢測到管線存在碰撞時,我們需要獲取碰撞的空間位置。通過Solid3d 對象的BooleanOperation 方法對兩個對象進行布爾操作,計算兩個三維對象交集,方法如下:

圖5 布爾運算
試驗數據使用了同區域內58 km的管線,在普通PC 上檢測用了100″,因此速度數倍慢于平面幾何法,但仍足以滿足實際應用。
該系統的基本界面包括二維CAD 環境和三維環境,適合在雙屏幕上進行操作。管線的繪制和錄入在CAD 中完成,三維模塊負責管線的瀏覽和碰撞檢測展示。在數據制作過程中,兩個模塊可以實現視圖和模型編輯的同步(如圖6所示),便于用戶快速的發現錯誤。

圖6 系統界面與視圖同步
如圖7,在碰撞檢測完成后,三維模塊中會生成碰撞位置的列表,同時配以動畫箭頭指示碰撞的位置。經過檢驗,基于布爾運算的碰撞檢測算法精度可靠,為數據的邏輯錯誤檢查提供便捷。

圖7 碰撞檢測結果
城市管線日益成為城市建設的重要組成部分,但經典的CAD 管線錄入檢查模式已不能滿足高質量管線數據的要求。在此背景下,本文實現了二三維一體化的管線錄入、瀏覽及檢查系統。首先在CAD 中進行管線錄入,屬性數據會同步更新到管線數據庫;三維模塊接收到更新請求后,會讀取數據庫并動態生成管線模型。該系統實現了二三維視圖的同步以及數據編輯的同步,方便用戶實時瀏覽,并通過觀察模型發現埋深、材質、管徑等錄入錯誤。另外,該系統實現了基于布爾運算的管線碰撞檢測,將碰撞位置的列表輸出,并用箭頭提示碰撞位置,提醒用戶更改數據中的邏輯錯誤。該系統解決了經典CAD 管線圖不直觀、難以發現錯誤的瓶頸,并已經運用于實際的管線數據生產工作,提高了管線數據的生產效率和質量。
[1]朱慰明,馮竹平,曹桂海等.淺談城市地下管線三維可視化系統的應用[DB/OL].城市建設理論研究(電子版),2012(15).
[2]馬民濤,任杰,陳克龍等.城市地下管網管理信息系統中管線三維顯示的實現[J].測繪工程,2005,14(4):8 ~10.
[3]陳光.地下管線三維CAD 與信息管理軟件開發[D].西安:西安理工大學,2008.
[4]王光昇,周麗珠,劉允等.基于AutoCAD 自定義實體的初步研究[J].城市勘測,2012(2):134 ~137.
[5]DB/T29 -152 -2010.天津市地下管線信息管理技術規程[S].
[6]趙春燕,施建昭,于海乾.基于ObjectARX 的CAD 二次開發技術實現管線數據的入庫和編輯[J].現代測繪,2010,33(5):58 ~60.
[7]王銳,錢學雷.OpenSceneGraph 三維渲染引擎設計與實踐[M].北京:清華大學出版社,2009.
[8]肖鵬,劉更代,徐明亮.OpenSceneGraph 三維渲染引擎編程指南[M].北京:清華大學出版社,2010.
[9]曲超,義崇政,廉光偉.基于OSG 的三維管線實時建模技術研究[C].魅力天津·學會杯.天津:天津科學技術出版社,2013:343.
[10]柳華僑,王光昇.輕量數據庫Spatialite 在AutoCAD 中的應用[J].城市勘測,2013(5):46 ~49.