>[0051]如其他許多算法,其熱點(diǎn)圖生成步驟中,熱點(diǎn)的影響半徑都限制于屏幕像素空間, 因此在實(shí)際應(yīng)用中,該些算法應(yīng)用場(chǎng)景有限,對(duì)許多場(chǎng)景無(wú)法使用,甚至?xí)a(chǎn)生錯(cuò)誤的結(jié) 果;本發(fā)明中,熱點(diǎn)影響半徑是基于實(shí)際經(jīng)紳度空間,因此,不管是實(shí)時(shí)還是離線算法,本文 算法都可W產(chǎn)生正確的熱點(diǎn)圖結(jié)果。
【附圖說(shuō)明】
[0化2] 圖1是實(shí)施例中基于并行加速的熱點(diǎn)圖生成方法的步驟流程圖。
[0化3] 圖2、圖3是災(zāi)害點(diǎn)數(shù)為5000,分辨率為4000*3000時(shí)效果對(duì)比圖;其中圖2是經(jīng) 典算法的效果圖,圖3是本發(fā)明算法的效果圖。
【具體實(shí)施方式】
[0054] 為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面通過(guò)具體實(shí)施例和 附圖,對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
[0055] 本實(shí)施例提供的基于并行加速的熱點(diǎn)圖生成方法,其步驟流程如圖1所示,包括 空間-圖像坐標(biāo)轉(zhuǎn)換部分1,距離矩陣生成部分2,GPU灰度圖生成部分3,GPU彩色圖生成 部分4,和GIS圖層顯示部分5,整個(gè)過(guò)程均在GPU中完成,最終輸出一張彩色熱點(diǎn)圖,并在 GIS二維地圖中展示。其中:
[0056] 空間-圖像坐標(biāo)轉(zhuǎn)換部分1,負(fù)責(zé)將輸入的災(zāi)害點(diǎn)的空間經(jīng)紳度坐標(biāo) (long;Uude,latitude)轉(zhuǎn)換為輸出熱點(diǎn)圖圖像空間的二維圖像坐標(biāo)(x,y);
[0化7] 距離矩陣生成部分2,負(fù)責(zé)根據(jù)用戶輸入的災(zāi)害點(diǎn)的影響半徑R,計(jì)算災(zāi)害點(diǎn)的影 響因子距離矩陣Matrix;
[005引 GPU灰度圖生成部分3,負(fù)責(zé)計(jì)算所有災(zāi)害點(diǎn)影響范圍的疊加灰度圖信息;
[0059] GPU彩色圖生成部分4,負(fù)責(zé)根據(jù)灰度圖計(jì)算映射后的彩色圖信息;
[0060] GIS圖層顯示部分5,負(fù)責(zé)將輸出的彩色熱點(diǎn)圖繪制到GIS地圖中,展示給用戶。
[0061] 下面分別針對(duì)每一個(gè)步驟,詳細(xì)闡述技術(shù)方案及實(shí)現(xiàn)方法。
[0062] 假定輸入災(zāi)害點(diǎn)個(gè)數(shù)為N,災(zāi)害點(diǎn)數(shù)據(jù)集合為PSet(腳。每個(gè)災(zāi)害點(diǎn)的影響半徑為 R,輸出熱點(diǎn)圖圖像大小寬高為wi化h和hei曲t,待映射的色帶為ColorRamp[(Colorl,offs etl), (Color2,offset2),......,(ColorM,offsetM)],其中顏色數(shù)為M種,Colorl-ColorM為 色帶的M種顏色,offsetl-offsetM為每種顏色在色帶中對(duì)應(yīng)的偏移量。
[0063] (一)空間-圖像坐標(biāo)轉(zhuǎn)換部分1
[0064]對(duì)于給定災(zāi)害點(diǎn)P空間坐標(biāo)經(jīng)紳度值Space(X,y,Z),需要轉(zhuǎn)換為輸出的圖像坐標(biāo) PImage(x,y),該里,使用化化技術(shù),在GPU中完成坐標(biāo)轉(zhuǎn)換。
[00化]首先,創(chuàng)建一張浮點(diǎn)紋理TextureP,其大小為N*3,對(duì)應(yīng)的紋理格式為GL_RGB,GL_ 化OAT。該浮點(diǎn)紋理為一維紋理,里面保存了每個(gè)空間坐標(biāo)點(diǎn)經(jīng)紳度值Space(x,y,z)。不 過(guò),該里需要說(shuō)明一下,對(duì)于不同的顯卡,一維紋理大小的限制也不同,如果輸入災(zāi)害點(diǎn)個(gè) 數(shù)N太多,一張一維紋理無(wú)法保存該些信息,可W通過(guò)申請(qǐng)多張一維紋理,或者直接申請(qǐng)二 維紋理的方式來(lái)解決該問(wèn)題;
[0066] 其次,創(chuàng)建一張浮點(diǎn)紋理TexturePImage,其大小為N*l,對(duì)應(yīng)紋理格式為GL_ RGB,GL_FLOAT,該紋理用來(lái)輸出每個(gè)點(diǎn)轉(zhuǎn)換后的圖像坐標(biāo);
[0067] 第S,包I建一個(gè)帖緩沖對(duì)象FBO,名為FBO_CoordinateTransform,作為此次擅染 的擅染緩沖,將TexturePImage綁定到FBO_CoordinateTransform的 0 號(hào)buffer中,作為 輸出紋理;
[0068] 第四,包I建一個(gè)著色器對(duì)象Program_CoordinateTransfo;rm,綁定一個(gè)頂點(diǎn)著色器 和一個(gè)片元著色器對(duì)象,另外傳入幾個(gè)化iform值;
[0069]uniformvec4map_extent;待輸出點(diǎn)的經(jīng)紳度范圍(minX,minY,ma;sX,ma;sY)
[0070]uniformvec2imagesize;待輸出圖像寬高(wi化h,hei曲t)
[0071]uniformsampler2Dtex1:ureP;坐標(biāo)點(diǎn)的經(jīng)紳度信息紋理;
[0072] 第五,在片元著色器中,首先從textureP中獲取當(dāng)前災(zāi)害點(diǎn)的經(jīng)紳度坐標(biāo) P(X,y,Z),其次計(jì)算其對(duì)應(yīng)的圖像坐標(biāo),計(jì)算公式如下,其中P.x、P.y分別表示災(zāi)害點(diǎn)的經(jīng) 度和紳度:
[0073]PImage.X= ((P.x-minX) / (ma;sX-minX))*width
[0074] PImage.y=hei曲t-(化y-min''〇 / (max;Y-min''〇) *hei曲t(圖像坐標(biāo)與經(jīng)紳度坐 標(biāo)系在Y軸方向是反的);
[0075] 第六,最終在繪制的時(shí)候,綁定輸出FB0為FBO_CoordinateTransform,著色器為 Program_CoordinateTransfo;rm。繪制一個(gè)大小為N*1的矩形,綁定輸入紋理TextureP。待 繪制完成后,通過(guò)readPixel命令將輸出結(jié)果從顯存拷貝到內(nèi)存中,存放在數(shù)組PImage中。
[0076](二)距離矩陣生成部分2
[0077] 對(duì)于每個(gè)災(zāi)害點(diǎn)P和影響半徑R,需要計(jì)算一個(gè)距離矩陣Matrix,里面保存距離災(zāi) 害點(diǎn)不同距離的影響因子,其范圍為[0,1]。該里我們?cè)贕PU里完成計(jì)算,輸出距離保存在 紋理TextureMatrix中。
[0078] 首先,創(chuàng)建一張浮點(diǎn)紋理TexturePMatrix,其寬高均為Distance=R*2-l(用戶可 W自定義范圍,該里是我們實(shí)驗(yàn)參數(shù),其中R越大,計(jì)算范圍越大),其目的是在用戶輸入的 影響半徑基礎(chǔ)上,再外擴(kuò)一定范圍,W保證最終的熱點(diǎn)圖效果和準(zhǔn)確性。該紋理對(duì)應(yīng)紋理格 式為GL_LUMINANCE,GL_FL0AT,該紋理用來(lái)輸出每個(gè)點(diǎn)轉(zhuǎn)換后的圖像坐標(biāo);
[0079] 其次,創(chuàng)建一個(gè)帖緩沖對(duì)象FB0,名為FBO_Matrix,作為此次擅染的擅染緩沖,將 Tex1:urePMat;rix綁定到FBO_Matrix的0號(hào)buffer中,作為輸出紋理;
[0080] 第S,包I建一個(gè)著色器對(duì)象Program_Mat;rix,綁定一個(gè)頂點(diǎn)著色器和一個(gè)片元著 色器對(duì)象,另外傳入一個(gè)化iform值;
[0081]uniformfloatdistance;距離矩陣的寬和高
[008引第四,在片元著色器中,首先計(jì)算當(dāng)前片元對(duì)應(yīng)于矩陣Matrix中的行列序號(hào)i和j,之后計(jì)算當(dāng)前片元的影響因子,計(jì)算公式如下(用戶可W選擇其他方式計(jì)算,可W達(dá)到 不同的效果(如顏色過(guò)渡速度有所不同),本發(fā)明使用的是平方根和指數(shù)計(jì)算(顏色過(guò)渡更 平滑更自然一些),用戶可W選擇Log或者其他函數(shù)來(lái)計(jì)算):
[008引Math.Max((distance- (Math.Sqrt(Math.Pow(i-distance+l, 2) +Math. 化w(j-distance+l, 2)))), 0);其中,Math表示計(jì)算類名,Max表示計(jì)算最大值函數(shù)名,distance為距離矩陣的寬和高,Sqrt表示計(jì)算平方根的函數(shù)名,Pow表示計(jì)算X的y次方 的函數(shù)名,1表示底數(shù)的閥值,2表示指數(shù)。
[0084] 最后,距離矩陣就保存在輸出紋理TexturePMatrix中。
[0085] (S)GPU灰度圖生成部分3
[0086] 該步驟中,我們針對(duì)每個(gè)災(zāi)害點(diǎn),通過(guò)化engl繪制一個(gè)正方形,給正方形貼上距 離矩陣的紋理,之后利用化engl本身的紋理混合texenv和片元混合blend技術(shù),實(shí)現(xiàn)影響 因子的自動(dòng)疊加,最終輸出熱點(diǎn)圖灰度圖紋理。
[0087] 首先,包I建一張浮點(diǎn)紋理TexturePGray,其寬高分別為wi化h和hei曲t,作為 此次擅染的結(jié)果,保存所有災(zāi)害點(diǎn)影響因子的疊加結(jié)果。該紋理對(duì)應(yīng)紋理格式為GL_ LUMINANCE,GL_FLOAT;
[00能]其次,創(chuàng)建一個(gè)帖緩沖對(duì)象FBO,名為FBO_Gray,作為此次擅染的擅染緩沖,將TexturePGray綁定到FB0_Gray的0號(hào)buffer中,作為輸出紋理;
[0089] 第S,創(chuàng)建一個(gè)著色器對(duì)象Program_Gray,綁定一個(gè)頂點(diǎn)著色器和一個(gè)片元著色 器對(duì)象,另外傳入幾個(gè)化iform值;
[0090]uniformsamplertexUireMatrix;距離矩陣紋理
[0091] 第四,繪制時(shí),我們對(duì)每個(gè)災(zāi)害點(diǎn),繪制一個(gè)正方形,其半徑為Distance。該些正方 形都貼上距離矩陣紋理TexturePMatrix。該樣就可W模擬每個(gè)災(zāi)害點(diǎn)的影響范圍W及其中 的影響因子。在繪制該些正方形時(shí),我們開(kāi)啟片元混合操作GL_BLEND,并且將片元混合函 數(shù)設(shè)置為加和(ONE,ONE),該樣就可W對(duì)各個(gè)災(zāi)害點(diǎn)影響范圍內(nèi)的影響因子進(jìn)行累積,并 且利用GPU硬件來(lái)實(shí)現(xiàn)裁剪、累積,最終輸出熱點(diǎn)圖的灰度圖紋理TexturePGray。
[009引(四)GPU彩色圖生成部分4
[0093] 該步驟中,針對(duì)熱點(diǎn)圖灰度圖的每個(gè)像素和輸入色帶,計(jì)算其映射后的顏色,并輸 出到熱點(diǎn)圖彩色紋理中。
[0094] 該步驟中,我們針對(duì)輸入的熱點(diǎn)圖灰度圖紋理TexturePGray,首先要計(jì)算其中的 最大值和最小值,分別代表整個(gè)地圖中災(zāi)害影響最大值maxGray和最小值minGray。之 后,我們將其每個(gè)像素的灰度值由虹inGray,maxGray]先映射到[0,1],然后再映射到 給定色帶ColorRamp中,得到該像素對(duì)應(yīng)的彩色值Color,最終,輸出熱點(diǎn)圖彩色圖紋理 TexturePColor。
[0095] 首先,我們要計(jì)算輸入灰度圖紋理TexturePGray中的最大值maxGray與最小值 minGray。傳統(tǒng)的方法,是首先將TexturePGray由顯卡通過(guò)glReadPixel回讀到內(nèi)存中,然 后循環(huán)遍歷,計(jì)算其最大最小值,因此時(shí)間復(fù)雜度為〇(width*hei曲t)。我們?cè)摾锸褂玫姆?法,是利用GPUpin甜ong技術(shù),通過(guò)多次FB0繪制,每次8*8降采樣,最終輸出1*1大小的 紋理TexturePMinMax,里面