基于gpu的地圖矢量線要素拐角合理性繪制方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明設(shè)及GIS領(lǐng)域和電子地圖領(lǐng)域的一種符號化擅染技術(shù),給出了一種基于GPU (Gra地ics Processing化it)可編程流水線及化ader語言的地圖線要素拐角合理性繪制 方法。
【背景技術(shù)】
[0002] 地理空間實(shí)體的符號化方法是地理信息領(lǐng)域和地圖制圖領(lǐng)域的重要研究內(nèi)容。相 比于常用的點(diǎn)符號和面符號,線符號由于其需要沿著線狀要素的走向來填充繪制的特點(diǎn), 往往更加困難和耗時。除了常用的實(shí)線和虛線之外,地圖表達(dá)中需要用的線型符號更為復(fù) 雜。如城市主干道的線型符號是帶有邊框的雙線圖元;鐵路符號是帶有邊框的黑白相間的 圖元;單邊邊界線符號是齒狀的圖元。運(yùn)些線型符號利用不同幾何形狀組合而成一個帶有 語義信息的圖元。傳統(tǒng)的繪制方式是通過符號相關(guān)的特定函數(shù),為每一個線型符號設(shè)計相 應(yīng)的繪制函數(shù),運(yùn)種方式應(yīng)用場景固定,可擴(kuò)展性不強(qiáng)。另一種常用的方式是利用組合繪制 的方式來將地圖符號分解,再根據(jù)分解出來的圖元多次繪制矢量線;運(yùn)種方式需要對原始 的矢量線繪制多次,影響了其繪制效率。論文《面向GIS的矢量線狀符號填充算法研究》(張 海泉,潘懸,吳煥萍,等.《地理與地理信息科學(xué)》,2004,20(04) :11-14.)介紹了運(yùn)些基本方 法。
[0003] 由于地圖符號的復(fù)雜性,也導(dǎo)致了在矢量線要素拐角處的繪制容易出現(xiàn)重繪、漏 繪的問題,也就是拐角的不合理填充問題。運(yùn)種不合理填充主要出現(xiàn)在用符號結(jié)構(gòu)中不連 續(xù)的部分繪制拐角,形成不一致的繪制;也出現(xiàn)在用符號結(jié)構(gòu)中空白色來填充拐角,形成拐 角的歧義,也就是說在拐角處既可W認(rèn)為是連續(xù)的線,也可W認(rèn)為是兩條線。論文《基于GDI +的復(fù)雜線狀符號優(yōu)化算法》(秦佐,周曉光,劉軍生,等.《測繪科學(xué)》,2011,04期(04) :183-185.)在對線狀符號的復(fù)雜性進(jìn)行分析的基礎(chǔ)上,總結(jié)了線狀符號的基本組成結(jié)構(gòu)W及在 拐角處的繪制的轉(zhuǎn)角問題。雖然該論文的方法提出了一種基于最小符號單元定位點(diǎn)的方案 來解決拐角處的繪制問題,但其方法仍然是純軟件繪制的方法,對于線型符號的繪制需要 多次重復(fù)的繪制才能表達(dá)符號的復(fù)雜結(jié)構(gòu);采用變換間隔距離的方式能夠一定程度上避免 在拐角處出現(xiàn)不合理的填充,但運(yùn)種方式依賴于對矢量線要素的長度預(yù)先計算,且需不斷 調(diào)整間隔。在當(dāng)前數(shù)據(jù)更新頻率加快、數(shù)據(jù)獲取精度不斷提高、大數(shù)據(jù)的背景下,其繪制效 率受到了極大的制約,也難W適應(yīng)硬件加速繪制和GP聽十算的技術(shù)趨勢。名稱為"基于GPU的 地圖線形符號繪制方法及系統(tǒng)",申請?zhí)?01310125110.6的中國專利,在分析地圖線形符號 繪制的難點(diǎn)的基礎(chǔ)上,公開了一種在化ader程序里面定制線型地圖符號的繪制方法。但運(yùn) 種方法嚴(yán)格依賴于化ader編程,不同的線型符號需要在化ader里面大量的編程才能實(shí)現(xiàn)繪 審IJ;對于如何將各種各樣的復(fù)雜線型地圖符號映射到GPU像素計算的方面并沒有給出方法, 對于如何處理拐角處的不合理繪制亦沒有設(shè)及。
[0004] 因而,如何對矢量線要素的拐角進(jìn)行合理性繪制是計算機(jī)地圖繪制中的一個亟待 解決的問題。運(yùn)種拐角合理性繪制需要適應(yīng)于多種線型地圖符號,而且不能改變原始矢量 線數(shù)據(jù)。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明的目的是在GPU可編程流水線和著色器技術(shù)的基礎(chǔ)上,針對矢量線要素在 拐角處容易發(fā)生不合理繪制的問題,突破傳統(tǒng)用多種不同的間隔模式來避免拐角處重繪漏 繪的方式,實(shí)現(xiàn)基于符號結(jié)構(gòu)的矢量線要素逐像素繪制,并在繪制過程中就進(jìn)行拐角合理 性處理。
[0006] 本發(fā)明的技術(shù)方案是:
[0007] 基于GPU的地圖矢量線要素拐角合理性繪制方法,包括下列步驟:
[0008] 步驟1確定需要沿線重復(fù)填充的符號單元的顏色結(jié)構(gòu)表:將需要填充的符號單元 按照縱向-橫向的結(jié)構(gòu)進(jìn)行分解,用列優(yōu)先的二維數(shù)組和相應(yīng)的符號單元屬性來結(jié)構(gòu)化映 射一個符號單元,對顏色結(jié)構(gòu)表中的每一列指定其是否為背景列;
[0009] 步驟2初始化需要繪制的線狀要素的點(diǎn)集序列,根據(jù)線寬生成需要繪制的S角形 幾何=角網(wǎng):確定需要繪制線要素的線寬參數(shù),遍歷線狀要素中的每一個頂點(diǎn),按照半個最 大線寬向兩邊擴(kuò)展,同時生成相應(yīng)的=角形集合,并為每個=角形的每個頂點(diǎn)賦予沿線走 向的長度值U值和垂直于線走向的長度值V值,即U-V值,將拐角處頂點(diǎn)的U值轉(zhuǎn)換到符號結(jié) 構(gòu)中,判斷其是否為背景列,如果是背景列,則調(diào)整U值到最接近的非背景列;
[0010] 步驟3在著色器中根據(jù)顏色漸變函數(shù)對線狀要素進(jìn)行逐像素繪制:在著色器中基 于傳遞到著色器里面的頂點(diǎn)U-V值,動態(tài)確定每個像素的U-V值,即像素在水平方向上到線 起點(diǎn)的距離U'值和像素在垂直方向上到線的上邊界的距離V'值,由此確定每一個像素在符 號顏色結(jié)構(gòu)表中屬于哪一個顏色單元,利用顏色單元的顏色來填充當(dāng)前像素。
[0011] 所述步驟1中:A.符號單元的顏色結(jié)構(gòu)表:將符號單元按照其結(jié)構(gòu)分解為幾個列, 每一列都包含其相應(yīng)的行,每一行都包含其相應(yīng)的四個角的顏色值,由此形成一系列的顏 色單元來映射特定的符號;B.顏色結(jié)構(gòu)表的單元屬性:對于一個符號單元的顏色結(jié)構(gòu)表,其 每一列都包含相應(yīng)的寬度屬性和所包含的行數(shù)屬性,每一行都包含相應(yīng)的高度屬性,每一 列都包含一個布爾值來指明該列是否為背景列,整個顏色結(jié)構(gòu)表包含總列數(shù)、總寬度和總 高度屬性。
[0012] 所述步驟2中拐角處U-V值的調(diào)整:在線串的拐角處,拐角內(nèi)外存在沿線走向上的 長度不一致,分別用拐角外的長度對拐角外頂點(diǎn)的U賦值,將拐角外頂點(diǎn)的U值賦給內(nèi)拐角 對應(yīng)的頂點(diǎn);對拐角頂點(diǎn)的U值,利用公式U(p)=u'-SL*[uV化]計算其在符號顏色結(jié)構(gòu)表 中的U(P)值,其中U'為原始計算得到的U值,化表達(dá)整個符號的寬度,[u'/SL]表示對U VSL 的結(jié)果進(jìn)行取整得到小于U'值的化的整數(shù)倍;根據(jù)U(P)值遍歷符號顏色結(jié)構(gòu)表中的各列, 判斷其處于具體哪一列,得到所在列的索引值,利用運(yùn)個列的索引值獲取該列是否為背景 列;如果該列是背景列,則判斷U(P)值占據(jù)運(yùn)一列的左半部分還是右半部分,如果是左半部 分,則調(diào)整U'值到該列索引值-1運(yùn)一列,反之在右半部分,調(diào)整U'值到該列索引值+1運(yùn)一 列。
[0013] 本發(fā)明的方法可W利用GPU可編程流水線和著色器中像素著色器能夠遍歷每一個 像素的特點(diǎn),按照符號自身的結(jié)構(gòu)信息,將符號的映射為二維的顏色結(jié)構(gòu)表;根據(jù)確定的符 號結(jié)構(gòu)中不能被填充在拐角處的信息,動態(tài)調(diào)整拐角處頂點(diǎn)的U值;在著色器中用依據(jù)調(diào)整 過后的U值和V值進(jìn)行顏色表取值,最終實(shí)現(xiàn)矢量線要素在拐角處的合理繪制。相比現(xiàn)有傳 統(tǒng)的繪制方法,本發(fā)明可W對矢量線要素拐角進(jìn)行合理繪制,能夠避免拐角處重繪漏繪,并 平滑地表達(dá)矢量線的拐角,增強(qiáng)地圖的繪制效果和可讀性。
【附圖說明】
[0014] 圖1是本發(fā)明方法的流程示意圖;
[0015] 圖2是符號顏色結(jié)構(gòu)表信息組織;
[0016] 圖3是矢量線要素在拐角處的=角化方法說明;
[0017] 圖4是(a)黑白間斷線型符號在拐角處的合理性繪制方法說明,(b)將黑色延伸到 拐角處,白色往右側(cè)歸并,(C)將黑色從拐角處開始,白色往左側(cè)歸并;
[0018] 圖5是邊界線符號在拐角處的合理性繪制方法說明;
[0019] 圖6是利用本發(fā)明的方法繪制拐角的結(jié)果與其他現(xiàn)有方法的對比圖,(a)采用GDI+ 方法,(b)采用AGG方法,(C)采用化iro方法,(d)本發(fā)明方法處理的斜接拐角,(e)本發(fā)明方 法處理的圓形拐角,(f)本發(fā)明方法處理的平截拐角,(g)本發(fā)明方法處理的不連接拐角。
【具體實(shí)施方式】
[0020] 下面結(jié)合附圖和實(shí)施例做進(jìn)一步說明。
[0021] 圖1為本發(fā)明方法的流程圖。該方法包括W下步驟:首先根據(jù)需要填充的地圖符號 單元生成相應(yīng)的顏色結(jié)構(gòu)表,并在顏色結(jié)構(gòu)表中制定特定的列作為背景列。接著根據(jù)線寬 構(gòu)造=角化后的線=角網(wǎng),將沿線走向的U參數(shù)和垂直于線走向的V參數(shù)傳遞給=角網(wǎng)中的 每個頂點(diǎn),在對頂點(diǎn)賦U值時,如果拐角處的填充是背景列,則調(diào)整U值。最后將此結(jié)構(gòu)顏色 表和U-V參數(shù)傳遞到著色器程序中,利用化ader語言,根據(jù)每個頂點(diǎn)上的U-V值,基于顏色結(jié) 構(gòu)表進(jìn)行線要素的逐像素繪制。
[0022] 一個符號的顏色結(jié)構(gòu)表信息如圖2所示,按照整個符號的寬度SymbolLength,整個 符號有多少列Co IumnCount,每一列有多少行Co IumnRowCountArray,每一列的寬度 Co IumnWi 化 Mrr ay,每一行的高度RowHei 曲tAr ray 和每一個 Cell 的顏色 Cel IColorTable 來 組織?;谶\(yùn)個符號顏色結(jié)構(gòu)表,可W在化ader中根據(jù)每一個像素的U-V值,從顏色表中取 值來進(jìn)行矢量線要素的填充。
[0023] 對拐角處的S角化需要根據(jù)不同的拐角類型來處理,如圖3所示,幾種不同類型的 拐角分別S角化。對拐角的每個頂點(diǎn)跟其他頂點(diǎn)一樣,也需要賦予U-V值。其U值基于拐角處 在線上對應(yīng)的點(diǎn)到起始點(diǎn)的距離,而運(yùn)個U值存在很大的可能性會導(dǎo)致在拐角處填充不合 理的顏色值。如圖4所示的黑白間斷線,拐角處不應(yīng)該填充白色,W免引起地圖讀者認(rèn)為是 兩條線;如圖5所示的邊界線,拐角處不應(yīng)該填充間斷邊線,W免引起拐角處的歧義繪制。所 W運(yùn)個原始U值需要映射到一個符號中,并判斷其是否屬于符號顏色結(jié)構(gòu)表中的背景列。如 果是背景列,則往兩側(cè)作動態(tài)調(diào)整。如圖4和圖5所示。
[0024] 本發(fā)明技術(shù)方案的具體說明如下:
[0025] A.首先遍歷線要素中的每一個頂點(diǎn),按照半個最大線寬向兩邊擴(kuò)展,由此可W將 一個線段擴(kuò)展成一個矩形;利用矩形的四個頂點(diǎn),組合生成相應(yīng)的兩個=角形;由一系列連 續(xù)的線段可W生成連續(xù)的=角形集合。對于沿著線走向,往左邊擴(kuò)展出來的頂點(diǎn),設(shè)定其V 值為0;而往右邊擴(kuò)展出來的頂點(diǎn),設(shè)定其V值為1。左右兩邊的擴(kuò)展頂點(diǎn)的U值計算,是根據(jù) 擴(kuò)展頂點(diǎn)對應(yīng)的線上的點(diǎn)與線的起始點(diǎn)計算長度,用長度除W最大線寬得到左右擴(kuò)展頂點(diǎn) 的U值。
[0026] B.對于需要沿線重復(fù)填充的符號單元,該符號首先從橫向上被分為寬度一致的幾 列,對每一列再分為顏色一致的幾行。不同列的寬度可W不同,但每一列中的每一行寬度相 同;列中的不同行的顏色可W不同,但一行只能有一個顏色。由運(yùn)些列-行(Colu皿-Row)構(gòu) 成了一系列的單元(Cell)。每個Column被賦予寬度屬性和行數(shù)屬性,每個Row被賦予高度屬 性,每個Cell被賦予顏色值,整個符號顏色結(jié)構(gòu)表被賦予總列數(shù)、總寬度和總高度屬性。
[0027] C.通過GPU可編程流水線,將構(gòu)造好的線S角網(wǎng)Mesh、需要繪制的符號顏色結(jié)構(gòu)信 息傳遞到化ader程序中。
[0028] D.對拐角處的頂點(diǎn),調(diào)整其U值。利用公式U(p)=u'-化*[u'/SL]計算拐角處頂點(diǎn) 在符號