荊倩婧 吳大慶 徐幫樹 李 良 李志強(qiáng)
(1.山東省建筑設(shè)計研究院有限公司, 濟(jì)南 250001;2.中鐵十四局集團(tuán)第五工程有限公司, 兗州 272117; 3.山東大學(xué)齊魯交通學(xué)院,濟(jì)南 250061)
高速公路作為一種狹長的帶狀結(jié)構(gòu),一般由路基、路面、橋梁、涵洞、隧道、交通工程及沿線設(shè)施等構(gòu)成。其中,路基是高速公路的基本組成結(jié)構(gòu),貫穿于高速公路全線,也是支撐路面結(jié)構(gòu)的基礎(chǔ),與沿線的橋涵、隧道等相連接,更是高速公路與地形融合的媒介。路基三維模型的構(gòu)建方法是實現(xiàn)高速公路三維可視化過程中的技術(shù)關(guān)鍵點和難點。目前,國內(nèi)外許多學(xué)者已對路基的三維建模方法開展了相關(guān)研究。
在國外,路基的三維模型主要是利用自主研發(fā)的道路設(shè)計軟件中的相關(guān)模塊來進(jìn)行創(chuàng)建。其中,應(yīng)用較為廣泛的道路設(shè)計軟件主要有:德國漢堡的IB&T軟件公司開發(fā)的CARD/1系統(tǒng)[1]、美國Intergraph公司的InRoads軟件[2-3]、英國Infrasoft公司推出的MXRoad軟件[4]、美國Eagle Point軟件公司開發(fā)的Eagle Point軟件[5-7]、挪威的NovaCAD軟件、加拿大的GWN-ROAD軟件以及比利時的Star Info軟件等等。雖然這些軟件都具有較強(qiáng)的三維建模功能,但是存在設(shè)計規(guī)范與國內(nèi)不相適應(yīng)、價格昂貴等問題,因此很難將上述軟件應(yīng)用于國內(nèi)的路基工程之中。
在國內(nèi),關(guān)于路基的三維建模方面的研究起步稍晚,但是發(fā)展迅速,不少學(xué)者已進(jìn)行了相關(guān)研究。潘兵宏等[8]提出應(yīng)用表面模型來構(gòu)建公路路基三維模型的方法,選用空間四邊形平面來模擬路基模型,根據(jù)公路平、縱橫斷面計算確定四邊形平面每個頂點的三維點坐標(biāo)來建立路基模型,并基于AutoCAD平臺利用VB或VC語言開發(fā)了公路三維建模系統(tǒng),實現(xiàn)了路基模型的自動化建立。曾勇[9]采用非均勻有理B樣條NURBS擬合道路中心線和橫斷面,并利用蒙面法建立了路面的三維模型,但并未涉及路基模型的建立。周明智等[10]提出了一種基于ArcGIS的公路三維建模方法,分別將公路路線樁號、路線高程與ArcGIS中的M值、Z值相關(guān)聯(lián),利用ArcScene中的三維可視化功能建立路基的三維模型,極大地提高了建模速度。張毅等[11]采用Trimble GS200地面三維激光掃描儀采集數(shù)據(jù),然后對點云數(shù)據(jù)進(jìn)行配準(zhǔn)、坐標(biāo)轉(zhuǎn)換及濾波等預(yù)處理,最后利用Realworks Survey軟件的幾何建模功能實現(xiàn)了公路路基三維模型的建立。楊錫鎏等[12]提出了一種結(jié)合ANSYS有限元分析軟件和OpenGL紋理貼圖技術(shù)的高速公路結(jié)構(gòu)物仿真建模技術(shù),實現(xiàn)了高速公路路基的仿真建模。潘榮江等[13]基于高速公路橫斷面設(shè)計圖文件,首先對平面圖進(jìn)行斷面分割,確定了斷面圖的邊界和各個斷面的范圍,然后進(jìn)行坐標(biāo)轉(zhuǎn)換,提取斷面的輪廓線,最后沿著公路中心線將多個橫斷面的輪廓線對齊,進(jìn)行三角片表面重構(gòu),完成了高速公路路基三維模型的構(gòu)建,有效地提高了模型建立的速度和質(zhì)量。孫偉利[14]提出了基于車載LiDAR技術(shù)的公路路基三維建模方法,首先利用車載激光測量系統(tǒng)采集數(shù)據(jù),然后基于掃描線進(jìn)行濾波處理將地面點云數(shù)據(jù)和非地面點云數(shù)據(jù)分開,并對因遮擋而造成缺失的地面點云數(shù)據(jù)進(jìn)行修補(bǔ),有選擇性地對冗余數(shù)據(jù)進(jìn)行抽稀處理,最后基于掃描線進(jìn)行三角剖分構(gòu)建路基三維模型。張波[15]利用CATIA軟件中的建模功能,分別建立了道路中心線和路基橫斷面輪廓,并通過掃掠、鑲嵌命令生成了路基的三維實體模型。
綜上所述,國內(nèi)外路基三維模型的建立主要是依靠專業(yè)的三維建模軟件和道路設(shè)計軟件中的相關(guān)模塊來建立。但是,高速公路綿延數(shù)百里,路基數(shù)量多且尺寸不一樣,運用專業(yè)的三維建模軟件(3DsMax、AutoCAD、Google SketchUp等)構(gòu)建路基模型時需要耗費大量的人力和時間,而現(xiàn)有的道路設(shè)計軟件在路基模型的處理上存在不足,因此研究路基三維模型的快速構(gòu)建方法對高速公路路基三維可視化的實現(xiàn)具有重要意義。
Cesium[16]是一個開源的JavaScript地圖引擎,具有地圖數(shù)據(jù)顯示等一系列相關(guān)操作的功能,只需要瀏覽器支持WebGL功能即可運行,無需安裝任何瀏覽器插件,可以實現(xiàn)跨瀏覽器跨平臺展示。同時,Cesium利用WebGL進(jìn)行圖形渲染,有利于呈現(xiàn)數(shù)據(jù)的動態(tài)變化。此外,Cesium對一些AJAX(Asynchronous Javascript and XML)功能進(jìn)行了重新封裝,可以實現(xiàn)海量地理空間數(shù)據(jù)的異步請求。
鑒于此,本文利用開源的JavaScript地圖引擎Cesium,通過對Cesium API進(jìn)行二次開發(fā),實現(xiàn)路基橫斷面、公路中心線和路基三維模型的快速構(gòu)建; 利用JavaScript語言設(shè)計了路基標(biāo)準(zhǔn)橫斷面參數(shù)設(shè)計界面,實現(xiàn)路基標(biāo)準(zhǔn)橫斷面的參數(shù)化構(gòu)建。研究成果可以為交通規(guī)劃部門輔助決策提供依據(jù)。
Cesium是一個開源的JavaScript地圖引擎,具有地圖數(shù)據(jù)顯示等一系列相關(guān)操作的功能,只需要瀏覽器支持WebGL功能即可運行,無需安裝任何瀏覽器插件,可以實現(xiàn)跨瀏覽器跨平臺展示。同時,Cesium利用WebGL進(jìn)行圖形渲染,有利于呈現(xiàn)數(shù)據(jù)的動態(tài)變化。此外,Cesium對一些AJAX(Asynchronous Javascript and XML)功能進(jìn)行了重新封裝,可以實現(xiàn)海量地理空間數(shù)據(jù)的異步請求。
Cesium給用戶提供了兩種開發(fā)應(yīng)用程序編程的接口(API),一種為“Primitive API”,該接口使用圖形學(xué)術(shù)語,具有很大的靈活性,適用于面向圖形開發(fā)人員的底層編程接口。另一種為“Entity API”,是高級別的數(shù)據(jù)驅(qū)動的編程接口,該接口使用一致性設(shè)計的、高級別的對象來管理一組相關(guān)性的可視化對象,支持多種類型空間數(shù)據(jù)的可視化。
Cesium提供的Polyline函數(shù)可以根據(jù)屬性positions設(shè)置一組三維坐標(biāo)點作為節(jié)點,實現(xiàn)多段線在三維場景內(nèi)的可視化,并通過設(shè)置其它屬性,改變其線寬、顏色與貼圖等顯示效果。PolylineVolume除了可以依據(jù)positions設(shè)置一組三維坐標(biāo)點作為節(jié)點,還可以根據(jù)屬性shape設(shè)置一組由二維坐標(biāo)點形成的二維圖形作為截面,在positions描述的多段線上掃掠而成得到體。
路基是指在天然的地表面上根據(jù)公路路線的位置以及設(shè)計橫斷面的要求修筑而成的帶狀構(gòu)造物[17]。公路路基的三維建模方法與橋梁、隧道不同,因為路基的形態(tài)是和地形密切相關(guān)的,路基的存在使地形發(fā)生了很大的變化,而橋梁、隧道等構(gòu)筑物則無法對地形產(chǎn)生這種效果。
由于高速公路路基線路長及沿線地形起伏變化的影響,即使同一線路其不同路段斷面組成也不盡相同。因此,路基開展三維建模需要考慮如下特點:
(a)填方路基橫斷面設(shè)計圖
(b)挖方路基橫斷面設(shè)計圖圖1 路基橫斷面設(shè)計圖
(1)當(dāng)前路基三維建模的基礎(chǔ)依然是傳統(tǒng)的路基二維橫斷面結(jié)構(gòu)(路面、邊坡、坡腳和各構(gòu)造物等);
(2)路基不同路段應(yīng)考慮填挖特點、不同的橫斷面結(jié)構(gòu)及實際地形地貌;
(3)路基三維模型既要滿足線路全長需要,也要考慮路基全生命周期。
路基的三維模型是路基設(shè)計成果在三維空間中的展示,可以看作是由路基橫斷面沿著公路中心線掃掠而成的實體模型。因此,本文路基三維建模的主要內(nèi)容是確定公路中心線和路基橫斷面的繪制方法,以及如何由路基橫斷面沿著公路中心線掃掠得到路基的三維實體模型。
具體地,根據(jù)路基平面和縱斷面二維設(shè)計,基于統(tǒng)一的大地坐標(biāo)系統(tǒng),計算公路中心線主關(guān)鍵點的大地坐標(biāo)。依據(jù)《鐵路工程制圖標(biāo)準(zhǔn)(TB/T10058-98)》路基線路設(shè)計規(guī)范要求,由公路中心線關(guān)鍵點完成路基中線繪制、里程標(biāo)注、線路分段等工作。再以路基線路里程樁號為準(zhǔn),把路基平面、縱面及橫斷面二維設(shè)計與橫斷面對應(yīng)的地面地形相結(jié)合,按照不同路基線路分段進(jìn)行各標(biāo)準(zhǔn)橫斷面的設(shè)計,并確定各段線路左側(cè)及右側(cè)的路肩邊緣點和路基邊坡與地面線交點的坐標(biāo),即確定路基橫斷面關(guān)鍵點的三維空間坐標(biāo)。最后將路基橫斷面關(guān)鍵點的三維點坐標(biāo)轉(zhuǎn)換為局部坐標(biāo)系下的二維點坐標(biāo),并根據(jù)路基橫斷面的關(guān)鍵點坐標(biāo)完成路基橫斷面的繪制。
Cesium中路基繪制的基本步驟如下:
(1)計算提取出公路中心線關(guān)鍵點的三維坐標(biāo),構(gòu)建公路中心線。
(2)繪制路基橫斷面。路基橫斷面以一組有序二維坐標(biāo)所圍成的平面圖形組成,計算出路基橫斷面各關(guān)鍵點的坐標(biāo),建立路基橫斷面。
為了有利于路基橫斷面的設(shè)計、修改以及批量、快速構(gòu)建,將路基橫斷面輪廓進(jìn)行參數(shù)化設(shè)置,只考慮挖方和填方兩種類型(半填半挖式可以視為把路基分成左右兩部分,一部分為填方,另一部分為挖方,然后將這兩部分組合起來即可),并將橫斷面進(jìn)行適當(dāng)簡化,如圖1所示。其中,圖1(a)為填方路基的橫斷面,圖1(b)為挖方路基的橫斷面,由邊坡、碎落段、排水溝等組成。
圖2 路基橫斷面參數(shù)化設(shè)置界面
路基橫斷面輪廓參數(shù)化繪制的功能使用Canvas+JavaScript實現(xiàn)。Canvas相當(dāng)于是畫板和畫筆,而JavaScript相當(dāng)于是控制畫筆繪畫的畫手。通過使用JavaScript語言編寫對應(yīng)的函數(shù)來得到對應(yīng)的路基橫斷面,要輸入的參數(shù)作為javascript函數(shù)的參數(shù),根據(jù)參數(shù)的變化,函數(shù)的輸出值會發(fā)生變化,從而動態(tài)的生成路基橫斷面。路基橫斷面輪廓的參數(shù)化設(shè)置界面如圖2所示。
其中,根據(jù)參數(shù)變化動態(tài)生成路基橫斷面的代碼實現(xiàn)如下:
1)Html代碼
2)Javascript代碼
function draw(l0,l1,l2,a1,a2,b1,b2){
var canvas=document.getElementById(′canvas′);
if(canvas.getContext){
var ctx=canvas.getContext(′2d′);
//描邊三角形
ctx.beginPath();
ctx.moveTo(10, 10);
ctx.lineTo(20, 20);
ctx.lineTo(20+l2, 20);
ctx.lineTo(20+l2+b2, 20+a2);
ctx.lineTo(20+l2+b2+l1, 20+a2);
ctx.lineTo(20+l2+b2+l1+b1, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+5, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+5, 20+a2+a1+5);
ctx.lineTo(20+l2+b2+l1+b1+5+5, 20+a2+a1+5);
ctx.lineTo(20+l2+b2+l1+b1+10, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+10+l0/2, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+10+l0, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+10+l0, 20+a2+a1+5);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+5, 20+a2+a1+5);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+5, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+10, 20+a2+a1);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+10+b1, 20+a2);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+10+b1+l1, 20+a2);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+10+b1+l1+b2, 20);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+10+b1+l1+b2+l2, 20);
ctx.lineTo(20+l2+b2+l1+b1+10+l0+10+b1+l1+b2+l2+10, 10);
ctx.stroke();
}
}
用戶只需要填寫網(wǎng)頁表格里面的參數(shù),軟件會自動獲取用戶填寫的參數(shù),輸入到繪圖函數(shù)中,頁面就可以根據(jù)用戶輸入的參數(shù)生成路基橫斷面圖,用戶修改參數(shù),路基橫斷面圖也會動態(tài)地修改。例如當(dāng)l0=100 mm,l1=10 mm,l2=10 mm,a1=20 mm,a2=30 mm,b1=20 mm,b2=40 mm時,網(wǎng)頁生成的圖片如圖3所示。
圖3 路基橫斷面圖
(3)設(shè)置繪制屬性。設(shè)置material、cornerType、outline、outlineColor等屬性,改變部件的顯示顏色貼圖、轉(zhuǎn)角形式、輪廓線及輪廓線顏色等。
(4)使用Cesium函數(shù)開始繪制。使用viewer.entities.add函數(shù),依據(jù)設(shè)定參數(shù)繪制路基的三維模型。
使用PolylineVolume參數(shù)化繪制路基的JavaScript主要代碼如下:
var CenterLine=Cesium.Cartesian3.fromDegreesArrayHeights(
[lon1,lat1,hei1,
Lon2,lat2,hei2,
lon3,lat3,hei3]); //構(gòu)建公路中心線
var CrossSection=[new Cesium.Cartesian2(x1,y1),
new Cesium.Cartesian2(x2,y2),
new Cesium.Cartesian2(x3,y3),
new Cesium.Cartesian2(x4,y4)]; //構(gòu)建路基橫斷面
var Road=viewer.entities.add({
id:xxx,
name:xxx,
PolylineVolume:{
positions:CenterLine,
shape:CrossSection,
cornerType:Cesium.CornerType.ROUNDED,
material:Cesium.Color.WHITE.withAlpha(0.5),
outline:true,
outlineColor:Cesium.Color.BLACK
}
}); //構(gòu)建路基三維模型
上述代碼中[lon1,lat1,hei1,lon2,lat2,hei2,lon3,lat3,hei3]表示依次用經(jīng)度、緯度和高程表示一組公路中心線坐標(biāo)點,此處只列舉了3個點,點的個數(shù)由路基中心線采用幾個點擬合而成決定,若由多個點擬合,可依次添加多個點。代碼[new Cesium.Cartesian2(x1,y1),new Cesium.Cartesian2(x2,y2)]表示依次用一組平面直角坐標(biāo)系下的點(x,y)來擬合截面形狀。代碼viewer.entities.add可以存儲id、name以及更多的屬性信息,這些屬性與路基部件綁定。在PolylineVolume對象中,positions屬性指定了軸線坐標(biāo),shape屬性指定了截面形狀,cornerType屬性指定了轉(zhuǎn)角類型,material屬性制定了繪制的顏色或者貼圖文件,outline、outlineColor屬性賦值是否顯示輪廓及輪廓顏色。代碼運行后,即可繪制所設(shè)定的路基部件,并將返回entity對象存儲在變量Road中。采用不同的參數(shù)繪制的路基模型效果如圖4~5所示。
圖4 填方路基三維模型
圖5 挖方路基三維模型
針對傳統(tǒng)建模方法速度慢且無法滿足自動批量建模的需求,本文基于Cesium平臺,研究了路基的參數(shù)化建模方法,具體如下:
(1)利用開源的JavaScript地圖引擎Cesium,基于Cesium API進(jìn)行二次開發(fā),通過PolylineVolume實現(xiàn)了路基橫斷面和公路中心線的快速生成,繼而實現(xiàn)了路基三維模型的快速構(gòu)建;
(2)利用JavaScript編碼設(shè)計了路基標(biāo)準(zhǔn)橫斷面參數(shù)設(shè)計的界面,通過直接輸入?yún)?shù)建立路基標(biāo)準(zhǔn)橫斷面,實現(xiàn)了路基標(biāo)準(zhǔn)橫斷面的參數(shù)化構(gòu)建。