一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法
【專利摘要】本發(fā)明公開了一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,處于時(shí)空中的對(duì)象都有很強(qiáng)的時(shí)空依賴性和動(dòng)態(tài)性,對(duì)時(shí)空變化過(guò)程進(jìn)行可視化有助于人們更好地了解時(shí)空變化的機(jī)理。通過(guò)以x、y、t為坐標(biāo)軸,構(gòu)建時(shí)空點(diǎn)、線、面對(duì)象的時(shí)空立方體模型,在x、y、t構(gòu)成的三維空間中,使用時(shí)間平面求取相交的時(shí)空立方體和時(shí)空立方體切面,通過(guò)顏色控制、顯隱控制和時(shí)間平面的逐級(jí)遞增遞減,直觀而有效地展現(xiàn)時(shí)空對(duì)象變化的整個(gè)過(guò)程,整個(gè)過(guò)程引入可視性計(jì)算和GPU頂點(diǎn)緩存,以提升時(shí)空對(duì)象的瀏覽體驗(yàn)和渲染效率。本方法直觀而動(dòng)態(tài)地描述時(shí)空變化的過(guò)程,幫助人們更好地理解時(shí)空變化的機(jī)理,并保證較好的可視化效率和體驗(yàn),對(duì)于時(shí)空現(xiàn)象的研究和應(yīng)用有著重要的意義。
【專利說(shuō)明】
一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法
技術(shù)領(lǐng)域
[0001 ] 本發(fā)明涉及GIS(Geographic Information System,地理信息系統(tǒng))的時(shí)空數(shù)據(jù)可 視化領(lǐng)域,具體涉及一種時(shí)空變化過(guò)程的動(dòng)態(tài)可視化方法。
【背景技術(shù)】
[0002] 地理時(shí)空對(duì)象總是處于連續(xù)變化之中,具有很強(qiáng)的時(shí)空依賴性和動(dòng)態(tài)性特征。近 年來(lái),由于人們對(duì)時(shí)空資源的需求日益增長(zhǎng),時(shí)空變化愈加頻繁和復(fù)雜。時(shí)空數(shù)據(jù)作為時(shí)空 變化現(xiàn)象的數(shù)字化體現(xiàn),其特征可以概括為兩點(diǎn):1)具有時(shí)空的動(dòng)態(tài)性,2)數(shù)據(jù)日積月累。 這些特征給時(shí)空變化的可視化帶來(lái)一定的挑戰(zhàn),時(shí)空動(dòng)態(tài)性表現(xiàn)力弱,繪制效率不高,用戶 體驗(yàn)差,都會(huì)給時(shí)空變化過(guò)程的可視化帶來(lái)一定困擾。
[0003] 時(shí)空立方體(space-time cube)模型,用幾何立體圖形描述二維空間沿著時(shí)間維 的演變過(guò)程,在該模型中,空間實(shí)體演變歷史對(duì)應(yīng)其中一個(gè)時(shí)空體??梢愿鶕?jù)需要在任何時(shí) 間點(diǎn)上截取一個(gè)界面來(lái)確定空間實(shí)體在改時(shí)間點(diǎn)上的狀態(tài)特征。時(shí)空立方體模型對(duì)地理變 化描述更為形象簡(jiǎn)潔,適合作為時(shí)空變化動(dòng)態(tài)可視化的數(shù)據(jù)模型。
[0004] 四叉樹索引結(jié)構(gòu)簡(jiǎn)單清晰而且算法容易實(shí)現(xiàn),是目前廣泛應(yīng)用的空間索引。通過(guò) 四叉樹空間索引,將數(shù)據(jù)所在的地理空間遞歸等分為四個(gè)子空間,存儲(chǔ)于對(duì)應(yīng)的的樹結(jié)構(gòu) 中,直到樹的深度到達(dá)某一值或滿足某一要求后便停止分割。該四叉樹中的根節(jié)點(diǎn)和中間 節(jié)點(diǎn)不存儲(chǔ)地理實(shí)體對(duì)象,葉子節(jié)點(diǎn)存儲(chǔ)地理對(duì)象或?qū)ο蟮募?。在進(jìn)行時(shí)空變化過(guò)程瀏 覽時(shí),尤其是空間數(shù)據(jù)規(guī)模較大時(shí),可以根據(jù)坐標(biāo)系姿態(tài)解算可見(jiàn)的空間范圍,而根據(jù)需求 調(diào)度相應(yīng)的四叉樹節(jié)點(diǎn),能夠減少不必要的對(duì)象的渲染,提高瀏覽效率。
[0005] 0penGL(0pen Graphics Library)頂點(diǎn)緩存(VB0,Vertex Buffer object)直接在 高性能顯卡(GPU,Graphics Processing Unit)中開辟一個(gè)緩存區(qū)域來(lái)存儲(chǔ)頂點(diǎn)數(shù)據(jù),根據(jù) 用戶輸入的"target"模式和"usage"模式,頂點(diǎn)緩沖區(qū)內(nèi)存管理器將緩沖區(qū)對(duì)象放在儲(chǔ)存 器中最佳的位置。因?yàn)榫彌_區(qū)只會(huì)在初始化和頂點(diǎn)數(shù)據(jù)發(fā)生變化時(shí)才會(huì)進(jìn)行寫操作,所以 使用頂點(diǎn)緩存大大地減少了 CPU-GPU之間的數(shù)據(jù)拷貝開銷,能夠顯著地提升程序運(yùn)行的效 率。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明的目的是克服現(xiàn)有技術(shù)存在的問(wèn)題,提供一種時(shí)空變化動(dòng)態(tài)可視化方法。 以x、y、t為坐標(biāo)軸,構(gòu)建時(shí)空點(diǎn)、線、面對(duì)象的立方體模型,使用時(shí)間平面求取相交的立方體 和立方體切面,通過(guò)顏色控制、顯隱控制和時(shí)間平面的逐級(jí)遞增遞減,直觀而有效地展現(xiàn)時(shí) 空對(duì)象變化的整個(gè)過(guò)程,在時(shí)空對(duì)象的研究和應(yīng)用中具有重要的意義。
[0007] 本發(fā)明的目的是通過(guò)以下技術(shù)方案來(lái)實(shí)現(xiàn)的:一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方 法,包括如下步驟:
[0008] 步驟1:記錄時(shí)空對(duì)象的出生時(shí)間、消亡時(shí)間,建立"線性表+四叉樹"的時(shí)空索引, 以文件形式統(tǒng)一存儲(chǔ)所要描述的時(shí)空對(duì)象信息;
[0009] 步驟2:根據(jù)系統(tǒng)狀態(tài)參數(shù)快速定位時(shí)空對(duì)象數(shù)據(jù)文件,將數(shù)據(jù)讀入內(nèi)存,進(jìn)行平 移和縮放操作以適應(yīng)屏幕坐標(biāo)系;
[0010] 步驟3:構(gòu)建時(shí)間平面,與內(nèi)存中時(shí)空對(duì)象的時(shí)空立方體模型進(jìn)行一一求交,記錄 當(dāng)前相交對(duì)象和歷史相交對(duì)象,將當(dāng)前相交對(duì)象幾何形狀投影到時(shí)間平面;
[0011] 步驟4:針對(duì)時(shí)間平面、歷史相交對(duì)象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì)象投影結(jié)果構(gòu)建 頂點(diǎn)數(shù)組和頂點(diǎn)顏色數(shù)組,調(diào)用OpenGL頂點(diǎn)緩存進(jìn)行場(chǎng)景渲染;
[0012] 步驟5:上升或下降一級(jí)時(shí)間平面,將上一時(shí)間間隔的相交對(duì)象拷貝到歷史相交對(duì) 象,重復(fù)步驟3)和步驟4);
[0013] 步驟6:通過(guò)設(shè)置時(shí)間平面間隔參數(shù),較為連續(xù)地對(duì)整個(gè)時(shí)空中的時(shí)空對(duì)象變化過(guò) 程進(jìn)行可視化展示。
[0014] 進(jìn)一步地,所述的步驟1中所述時(shí)空對(duì)象包括點(diǎn)、線、面三種形態(tài)的對(duì)象。
[0015] 進(jìn)一步地,所述步驟1具體如下:
[0016] (1 ? 1)使用GIS開源庫(kù)shapeLib從shapefile文件中讀取時(shí)空對(duì)象的幾何信息和屬 性信息;所述屬性信息包括出生時(shí)間和消亡時(shí)間;
[0017] (1.2)根據(jù)出生時(shí)間以一定時(shí)間間隔對(duì)時(shí)空對(duì)象進(jìn)行線性劃分,對(duì)時(shí)空對(duì)象在出 生時(shí)刻的空間幾何圖形創(chuàng)建四叉樹索引。
[0018] (1.3)將時(shí)空對(duì)象以文件形式進(jìn)行統(tǒng)一存儲(chǔ),存儲(chǔ)結(jié)構(gòu)如下:每一個(gè)時(shí)空對(duì)象的結(jié) 構(gòu)以一對(duì)能表明該時(shí)空對(duì)象類型的標(biāo)記性語(yǔ)言作為開始和結(jié)束。記錄時(shí)空對(duì)象的標(biāo)識(shí)碼、 出生時(shí)間、消亡時(shí)間,以及時(shí)空對(duì)象在出生時(shí)刻的幾何圖形的邊界約束,邊界約束為邊界點(diǎn) 集合,邊界點(diǎn)的標(biāo)識(shí)碼、坐標(biāo)X和坐標(biāo)Y同樣記錄在該時(shí)空對(duì)象的數(shù)據(jù)內(nèi)容中。
[0019] 進(jìn)一步地,所述步驟2具體如下:
[0020] (2.1)根據(jù)系統(tǒng)狀態(tài)參數(shù)計(jì)算整個(gè)時(shí)空中的可視空間范圍;
[0021] 所述系統(tǒng)狀態(tài)參數(shù)包括當(dāng)前用于求交的時(shí)間平面(iterTime)、世界坐標(biāo)系(world frame)的姿態(tài)、照相機(jī)坐標(biāo)系(camera frame)的姿態(tài)和模型坐標(biāo)系(model frame)的姿態(tài);
[0022] 所述可視空間范圍的計(jì)算如下:相機(jī)坐標(biāo)系與世界坐標(biāo)系一致,將x,y,z方向的取 值均為[_1,1]的世界坐標(biāo)系根據(jù)當(dāng)前的平移和縮放量進(jìn)行平移和縮放的坐標(biāo)逆變換,變換 到模型坐標(biāo)系;將模型坐標(biāo)系根據(jù)初始設(shè)定的平移和縮放量進(jìn)行平移和縮放的坐標(biāo)逆變 換,得到地理空間坐標(biāo)系下的可視空間范圍;
[0023] (2.2)每次進(jìn)行模型平移或縮放變換操作時(shí)計(jì)算可視空間范圍,變化前后的可視 空間范圍相差大于等于四叉樹葉節(jié)點(diǎn)最小空間范圍一半時(shí)重新讀取數(shù)據(jù);
[0024] (2.3)采用線性表的時(shí)間索引方式根據(jù)所分隔的年份命名根節(jié)點(diǎn)文件夾名稱;
[0025] (2.4)采用四叉樹的空間索引方式對(duì)空間進(jìn)行劃分,從劃分空間的左上角象限開 始,順時(shí)針命名并創(chuàng)建文件夾節(jié)點(diǎn),若該節(jié)點(diǎn)為葉子節(jié)點(diǎn)則創(chuàng)建data.txt文件,該文件統(tǒng)一 存儲(chǔ)該劃分空間中的對(duì)象信息。
[0026] (2.5)在讀取數(shù)據(jù)時(shí),根據(jù)時(shí)間平面的值,定位根節(jié)點(diǎn)文件夾;再根據(jù)可視空間范 圍檢索與該范圍相交的四叉樹中的父節(jié)點(diǎn)集合,對(duì)集合中的每個(gè)父節(jié)點(diǎn)進(jìn)行遞歸得到父節(jié) 點(diǎn)的四叉樹檢索路徑列表。結(jié)合根節(jié)點(diǎn)文件夾和四叉樹檢索路徑列表快速定位需要讀入內(nèi) 存的時(shí)空對(duì)象數(shù)據(jù)文件。
[0027]進(jìn)一步地,所述的步驟3包括:
[0028] (3.1)將時(shí)間平面與時(shí)空立方體投影到時(shí)間軸(t軸)上,分別得到點(diǎn)的投影和線段 的投影,將點(diǎn)的投影和線段的投影進(jìn)行相交計(jì)算,得到可視空間范圍的當(dāng)前相交對(duì)象;根據(jù) 不斷更新的當(dāng)前相交對(duì)象得到歷史相交對(duì)象,歷史相交對(duì)象和當(dāng)前相交對(duì)象不重復(fù),且相 對(duì)于當(dāng)前時(shí)間平面處于消亡狀態(tài);
[0029] (3.2)計(jì)算當(dāng)前相交對(duì)象在時(shí)間平面上的投影:首先取時(shí)空對(duì)象的時(shí)空立方體模 型的任意一條時(shí)間線段與時(shí)間平面求交,計(jì)算得出相交點(diǎn)與時(shí)空對(duì)象邊界約束點(diǎn)的時(shí)間距 離td,然后將時(shí)空對(duì)象所有邊界約束點(diǎn)在t軸上平移td,得到投影結(jié)果的邊界約束點(diǎn)集合。 [00 30] 進(jìn)一步地,所述的步驟4中采用glBuf f erData()為頂點(diǎn)緩存對(duì)象申請(qǐng)內(nèi)存空間并 進(jìn)行初始化,glBufferDataO的usage參數(shù)選取GL_DYNAMIC_DRAW。對(duì)時(shí)間平面、歷史相交對(duì) 象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì)象投影結(jié)果使用不同的顏色渲染方式,其中當(dāng)前相交對(duì)象投 影的渲染需要關(guān)閉深度緩存測(cè)試gIDisab 1 e (GL_DEPTH_TEST)。
[0031]進(jìn)一步地,所述的步驟6包括:
[0032] (6.1)根據(jù)時(shí)空數(shù)據(jù)在生存周期上的分布特征選取時(shí)間平面間隔參數(shù);
[0033] (6.2)在x,y,t構(gòu)成的三維空間中,通過(guò)逐級(jí)遞增或遞減時(shí)間平面,觀察時(shí)空變化 在不同階段的特征、某一時(shí)空對(duì)象的變化歷程,以及整個(gè)時(shí)空的演變過(guò)程;
[0034] (6.3)通過(guò)對(duì)點(diǎn)、線、面時(shí)空對(duì)象,以及當(dāng)前時(shí)空對(duì)象、歷史時(shí)空對(duì)象、當(dāng)前對(duì)象投 影結(jié)果進(jìn)行顯隱控制,以更好地觀察整個(gè)時(shí)空變化的過(guò)程。
[0035] 本發(fā)明與現(xiàn)有技術(shù)相比具有有益效果:
[0036] (1)本發(fā)明為GIS時(shí)空數(shù)據(jù)動(dòng)態(tài)可視化提供了一種嶄新的思考方式和實(shí)施方法。采 用時(shí)間切面和時(shí)空立方體的表現(xiàn)形式,相比于現(xiàn)有的可視化方法,更加直觀、簡(jiǎn)潔、形象。
[0037] (2)本發(fā)明采用線性表+四叉樹的時(shí)空索引,結(jié)構(gòu)清晰、算法容易實(shí)現(xiàn),而且能夠滿 足時(shí)空變化動(dòng)態(tài)可視化的需求。所提出的結(jié)合四叉樹的空間范圍可視性計(jì)算,能夠減少不 必要對(duì)象的可視化并且較好地進(jìn)行空間數(shù)據(jù)的調(diào)度,從而提升可視化的用戶體驗(yàn)。
[0038] (3)本發(fā)明使用OpenGL頂點(diǎn)緩存技術(shù)進(jìn)行場(chǎng)景渲染,大大提升了場(chǎng)景渲染的效率, 增強(qiáng)了整個(gè)時(shí)空變化過(guò)程的可操作性。
【附圖說(shuō)明】
[0039] 圖1為本發(fā)明基于可視性計(jì)算的數(shù)據(jù)加載效果,(a)為系統(tǒng)初始狀態(tài)數(shù)據(jù)加載情 況,(b)為系統(tǒng)縮放操作后數(shù)據(jù)加載情況;
[0040] 圖2為本發(fā)明時(shí)空變化不同階段的截圖,(a)為時(shí)間平面處于1991年4月1日的地籍 時(shí)空對(duì)象狀態(tài),(b)為時(shí)間平面處于1994年2月13日的地籍時(shí)空對(duì)象狀態(tài),(c)為時(shí)間平面處 于1998年11月21日的地籍時(shí)空對(duì)象狀態(tài),(d)為時(shí)間平面處于2002年8月18日的地籍時(shí)空對(duì) 象狀態(tài);
[0041]圖3為本發(fā)明時(shí)空變化過(guò)程中不同時(shí)空對(duì)象的顯隱控制,(a)為全部顯示的時(shí)空對(duì) 象情況,(b)為不顯示當(dāng)前相交對(duì)象投影結(jié)果的時(shí)空對(duì)象情況,(c)為不顯示當(dāng)前相交對(duì)象 投影結(jié)果和歷史對(duì)象的時(shí)空對(duì)象情況,(d)為只顯示點(diǎn)對(duì)象的時(shí)空對(duì)象情況,(e)為只顯示 線對(duì)象的時(shí)空對(duì)象情況,(f)為只顯示面對(duì)象時(shí)空對(duì)象情況,(g)為只顯示當(dāng)前相交對(duì)象投 影結(jié)果的時(shí)空對(duì)象情況,(h)為當(dāng)前相交對(duì)象投影結(jié)果的三維瀏覽。
【具體實(shí)施方式】
[0042] 下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。
[0043] 本發(fā)明提供的一種時(shí)空變化過(guò)程的動(dòng)態(tài)可視化方法,包括如下步驟:
[0044] 步驟1:記錄時(shí)空對(duì)象的出生時(shí)間、消亡時(shí)間,建立"線性表+四叉樹"的時(shí)空索引, 以文件形式統(tǒng)一存儲(chǔ)所要描述的時(shí)空對(duì)象信息;
[0045] 步驟2 :根據(jù)系統(tǒng)狀態(tài)參數(shù)快速定位時(shí)空對(duì)象數(shù)據(jù)文件,將數(shù)據(jù)讀入內(nèi)存,進(jìn)行平 移和縮放操作以適應(yīng)屏幕坐標(biāo)系;
[0046] 步驟3:構(gòu)建時(shí)間平面,與內(nèi)存中時(shí)空對(duì)象的時(shí)空立方體模型進(jìn)行一一求交,記錄 當(dāng)前相交對(duì)象111_;[1^6沖1';[111;[1:;[¥68和歷史相交對(duì)象111_18;[1^6沖1';[111;[1:;[¥68,將當(dāng)前相交對(duì)象 m_interPrimitives幾何形狀投影到時(shí)間平面;
[0047] 步驟4:針對(duì)時(shí)間平面、歷史相交對(duì)象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì)象投影結(jié)果構(gòu)建 頂點(diǎn)數(shù)組和頂點(diǎn)顏色數(shù)組,調(diào)用OpenGL頂點(diǎn)緩存進(jìn)行場(chǎng)景渲染;
[0048] 步驟5 :上升或下降一級(jí)時(shí)間平面,將上一時(shí)間間隔的相交對(duì)象!11_ ;[11七6沖1';[111;[1:;[¥68拷貝到歷史相交對(duì)象111_18;[1^6沖1';[111;[1:;[¥68,重復(fù)步驟3)和步驟4);
[0049] 步驟6:通過(guò)設(shè)置時(shí)間平面間隔參數(shù),較為連續(xù)地對(duì)整個(gè)時(shí)空中的時(shí)空對(duì)象變化過(guò) 程進(jìn)行可視化展示。
[0050] 所述的步驟1包括:
[0051 ] (1)所述時(shí)空對(duì)象包括點(diǎn)、線、面三種形態(tài)的對(duì)象。
[0052] (2)基于傳統(tǒng)shapefile的空間數(shù)據(jù)管理模式的應(yīng)用開發(fā),受限于ArcGIS版權(quán)的約 束,無(wú)法進(jìn)行很好的擴(kuò)展,所以采用文件形式進(jìn)行時(shí)空對(duì)象的統(tǒng)一存儲(chǔ)。
[0053] (3)使用GIS開源庫(kù)shapeLib讀取時(shí)空對(duì)象的幾何信息和屬性信息,分別是函數(shù) SHP0pen()和DBF0pen();所述屬性信息包括出生時(shí)間和消亡時(shí)間。其中padfX和padfY為指 向?qū)ο髱缀螆D形端點(diǎn)的指針,通過(guò)padfX++和padfY++可以遍歷所有節(jié)點(diǎn)獲取相應(yīng)坐標(biāo)信 息。而使用函數(shù)DBFGetFieldlndexO可以獲取某一屬性字段的索引號(hào),進(jìn)而使用函數(shù) DBFReadStringAttribute()讀取屬性字段具體值。
[0054] (4)近年來(lái)人們對(duì)于時(shí)空資源的需求日益增長(zhǎng),時(shí)空變化頻繁,時(shí)空數(shù)據(jù)空間范圍 廣且在時(shí)間維度上加速累積。為了提高讀取和渲染的速度,根據(jù)出生時(shí)間以一定時(shí)間間隔 對(duì)數(shù)據(jù)進(jìn)行線性劃分,在此基礎(chǔ)上,對(duì)時(shí)空對(duì)象在出生時(shí)刻的空間幾何圖形創(chuàng)建四叉樹索 引。
[0055] (5)根據(jù)不同對(duì)象類型進(jìn)行分層存儲(chǔ)的傳統(tǒng)形式,在時(shí)空變化動(dòng)態(tài)可視化中沒(méi)有 優(yōu)勢(shì),反而不利于統(tǒng)一的計(jì)算與渲染,和數(shù)據(jù)文件的快速檢索。所述用于動(dòng)態(tài)可視化的時(shí)空 對(duì)象統(tǒng)一存儲(chǔ)結(jié)構(gòu)形式化表達(dá)如下:
[0056] <0b jectType>
[0057] [ObjectID,BeginTime ,EndTime ,Attrl ,Attr2, ??? ] <0bjectConstraints>
[0058] [Point,PointID,X,Y]
[0059] </0b jectType>
[0060] 所述的步驟2包括:
[0061 ] (1)整個(gè)過(guò)程中世界坐標(biāo)系和相機(jī)坐標(biāo)系重合。
[0062] (2)根據(jù)系統(tǒng)狀態(tài)參數(shù)計(jì)算整個(gè)時(shí)空中的可視空間范圍;
[0063]所述系統(tǒng)狀態(tài)參數(shù)包括當(dāng)前用于求交的時(shí)間平面(iterTime),世界坐標(biāo)系(world frame)、照相機(jī)坐標(biāo)系(camera frame)和模型坐標(biāo)系(model frame)的姿態(tài)。
[0064]所述可視空間范圍的計(jì)算如下:空間范圍的計(jì)算只涉及x和y坐標(biāo)信息,將三維坐 標(biāo)變換簡(jiǎn)化為二維坐標(biāo)變換;相機(jī)坐標(biāo)系與世界坐標(biāo)系一致,將x,y,z方向的取值均為[-1, 1 ]的世界坐標(biāo)系根據(jù)當(dāng)前的平移和縮放量進(jìn)行平移和縮放的坐標(biāo)逆變換,變換到模型坐標(biāo) 系;將模型坐標(biāo)系根據(jù)初始設(shè)定的平移和縮放量進(jìn)行平移和縮放的坐標(biāo)逆變換,得到可視 空間范圍。變換公式如下:
[0065] 二維坐標(biāo)變換: /sx 〇 〇\ /I 〇 i:x\
[0066] z, = s r ^ - 〇 .s v 〇 (〇 1 W Vo 0 V Vo 0 1/
[0067] 其中,S為縮放矩陣、T為平移矩陣、X為變換前的坐標(biāo)矩陣、X'為變換后的坐標(biāo)矩 陣。
[0068] 二維坐標(biāo)逆變換: /V% 〇 〇\ /I 〇
[0069] X = S-1 * r-1 = 〇 1/ 〇 0 1 -tyl-X' \ o 〇y J 0 1 J
[0070] 其中,為縮放逆矩陣、r1為平移逆矩陣x為變換前的坐標(biāo)矩陣、x'為變換后的坐 標(biāo)矩陣。
[0071] (3)如果每進(jìn)行一次模型變換(平移、旋轉(zhuǎn)、縮放)都重新進(jìn)行數(shù)據(jù)調(diào)度,會(huì)對(duì)場(chǎng)景 渲染、頂點(diǎn)緩存區(qū)更新造成一定壓力,因此只考慮平移和縮放變換且當(dāng)平移和縮放的累積 量對(duì)應(yīng)到空間范圍的變化到達(dá)一定值時(shí)才重新進(jìn)行數(shù)據(jù)讀寫,該值根據(jù)四叉樹子結(jié)點(diǎn)劃分 的最小空間范圍大小而定。若變化前后空間范圍相差大于四叉樹葉節(jié)點(diǎn)最小空間范圍一半 時(shí),即可重新讀取數(shù)據(jù)。變換累積量計(jì)算依賴于復(fù)合平移變換和復(fù)合縮放變換計(jì)算:
[0072] 復(fù)合平移變換:S(S2x,S2y) ? S(Slx,Sly)=S(S2x ? Slx,S2y ? Sly)
[0073] 復(fù)合縮放變換:T(t2x,t2y) ? T(tlx,tly)=T(t2X+tlx,t2y+tly)
[0074] (4)采用線性表的時(shí)間索引方式根據(jù)所分隔的年份命名根節(jié)點(diǎn)文件夾名稱,例如 1990,1995,2000。
[0075] (5)采用四叉樹的空間索引方式對(duì)空間進(jìn)行劃分,從劃分空間的左上角象限開始, 順時(shí)針命名并創(chuàng)建文件夾節(jié)點(diǎn):〇,1,2,3。若該節(jié)點(diǎn)為葉子節(jié)點(diǎn)則創(chuàng)建data. txt文件,該文 件統(tǒng)一存儲(chǔ)該劃分空間中的對(duì)象信息。
[0076] (6)在讀取數(shù)據(jù)時(shí),根據(jù)時(shí)間平面的值,定位根節(jié)點(diǎn)文件夾;再根據(jù)可視空間范圍 檢索與該范圍相交的四叉樹中的父節(jié)點(diǎn)集合,對(duì)集合中的每個(gè)父節(jié)點(diǎn)進(jìn)行遞歸得到父節(jié)點(diǎn) 的四叉樹檢索路徑列表。對(duì)其中一項(xiàng)進(jìn)行舉例,例如71/2/1/3/",使用strcat()函數(shù)在該 字串前增加根節(jié)點(diǎn)年份字串,即可以快速定位需要讀入內(nèi)存的數(shù)據(jù)文件。
[0077] (7)父節(jié)點(diǎn)遞歸檢索的函數(shù)如下: /VWnter:是否相父 l、huj、A ; searchs:檢索路徑列茨#/ ReadQuad(QuadNocle node, bool &Inter, int i._child; std :: stack < in > &st, vector < std :: stack < hit ? &searchs){ if(i_child!二 0)st. push(Lchild);//跳過(guò)似節(jié)點(diǎn)
[0078] if'(node > childrcn[0] === NULL){lntcr :== turc; return;}//己到葉子節(jié)點(diǎn) for(int i = (); i < 4; i + +){ ReadQuad(node --> chjldren[i],Inter, j + l,st,searchs);//遞[J! if(Inter = true)seardis, push一back(st); if(! st, empty())st p0p(); } inter = false;}
[0079]所述的步驟3包括:
[0080] (1)將時(shí)間平面與時(shí)空立方體投影到時(shí)間軸(t軸)上,分別得到點(diǎn)的投影和線段的 投影,將點(diǎn)的投影和線段的投影進(jìn)行相交計(jì)算,即點(diǎn)的t坐標(biāo)值與線段最小t坐標(biāo)值和最大t 坐標(biāo)值的比較,得到可視空間范圍的當(dāng)前相交對(duì)象。
[0081] (2)根據(jù)不斷更新的當(dāng)前相交對(duì)象得到歷史相交對(duì)象m_lsinterPrimitives,歷史 相交對(duì)象111_18 interPrimitives和當(dāng)前相交對(duì)象111_;[1^6沖1';[111;[1:;[¥68不重復(fù),且相對(duì)于當(dāng)前 時(shí)間平面處于消亡狀態(tài);
[0082] (3)計(jì)算當(dāng)前相交對(duì)象在時(shí)間平面上的投影:首先取時(shí)空對(duì)象的時(shí)空立方體模型 的任意一條時(shí)間線段與時(shí)間平面求交,計(jì)算得出相交點(diǎn)與時(shí)空對(duì)象邊界約束點(diǎn)的時(shí)間距離 td,然后將時(shí)空對(duì)象所有邊界約束點(diǎn)在t軸上平移td,得到投影結(jié)果的邊界約束點(diǎn)集合。 [0083]所述的步驟4包括:
[0084] (1)傳統(tǒng)glVerteX()的方式是每次往GPU傳頂點(diǎn),CPU與GPU的數(shù)據(jù)傳輸消耗大,而 頂點(diǎn)緩存是直接在GPU中開辟一個(gè)緩存區(qū),一次性將一個(gè)場(chǎng)景所需的頂點(diǎn)數(shù)據(jù)傳入GPU,減 少了 CPU與GPU的傳輸消耗,能夠較大提升場(chǎng)景渲染的效率。
[0085] (2)具體實(shí)現(xiàn)主要包含以下頂點(diǎn)緩存函數(shù):
[0086] glGenBuffersO創(chuàng)建頂點(diǎn)緩存對(duì)象;glBindBuffer()將頂點(diǎn)緩存對(duì)象設(shè)置為當(dāng)前 數(shù)組緩存對(duì)象(參數(shù)target取值GL_ARRAY_BUFFER);glBufferData()為頂點(diǎn)緩存對(duì)象申請(qǐng) 內(nèi)存空間并進(jìn)行初始化;g 1 B u f f e r S u b D a t a ()初始化或更新頂點(diǎn)緩存對(duì)象; glDeleteBuffers()銷毀緩存對(duì)象。
[0087] (3)隨著時(shí)間平面的逐級(jí)遞增或遞減,緩存區(qū)會(huì)被周期性更改,因此glBufferData ()的usage參數(shù)選取 GL_DYNAMIC_DRAW。
[0088] (4)對(duì)時(shí)間平面、歷史相交對(duì)象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì)象投影結(jié)果使用不同 的顏色渲染方式:
[0089] 時(shí)間平面頂點(diǎn):透明灰色面,glColor4fm(0.7,0.7,0.7,0.5);
[0090] 歷史相交對(duì)象頂點(diǎn):灰色面,glColor3f (0 ? 9,0 ? 9,0 ? 9);
[0091 ]當(dāng)前相交對(duì)象頂點(diǎn):多色面渲染,針對(duì)類型分色,例如土地用途;
[0092]當(dāng)前相交對(duì)象投影結(jié)果頂點(diǎn):紅色線框,glColorf3f(l .0,0.0,0.0),需要關(guān)閉深 度緩存測(cè)試glDisable(GL_DEPTH_TEST);
[0093] (5)點(diǎn)、線、面時(shí)空立方體模型的繪制模式:
[0094]點(diǎn):GL_P0INTS;線:面(GL_P0LYG0N)+首尾相接線(GL_LINE_L00P)雙面繪制,通過(guò) 控制法線方向?qū)崿F(xiàn);面:面(GL_P0LYG0N)+首尾相接線(GL_LINE_L00P),剔除背面。
[0095]所述的步驟6包括:
[0096] (1)根據(jù)時(shí)空數(shù)據(jù)在生存周期上的分布特征選取時(shí)間平面間隔參數(shù)。
[0097] (2)在x,y,t構(gòu)成的三維空間中,通過(guò)逐級(jí)遞增或遞減時(shí)間平面,觀察時(shí)空變化在 不同階段的特征、某一時(shí)空對(duì)象的變化歷程,以及整個(gè)時(shí)空的演變過(guò)程。
[0098] (3)通過(guò)對(duì)點(diǎn)、線、面時(shí)空對(duì)象,以及現(xiàn)實(shí)時(shí)空對(duì)象、歷史時(shí)空對(duì)象、現(xiàn)實(shí)對(duì)象投影 結(jié)果進(jìn)行顯隱控制,以更好地觀察整個(gè)時(shí)空變化的過(guò)程。
[0099] 實(shí)施例:
[0100] 以地籍時(shí)空數(shù)據(jù)的時(shí)空變化過(guò)程動(dòng)態(tài)可視化為例。
[0101] 第一步是使用shapeLib逐個(gè)讀取現(xiàn)有地籍要素的出生時(shí)間、消亡時(shí)間等信息,讀 取過(guò)程中,根據(jù)要素的出生時(shí)間和空間包圍盒坐標(biāo)范圍,建立"線性表+四叉樹"的時(shí)空索 弓丨,并存儲(chǔ)到相應(yīng)路徑下的data.txt中。
[0102] 第二步是根據(jù)當(dāng)前時(shí)間平面(默認(rèn)19900000)在時(shí)間線性表中檢索,定位父節(jié)點(diǎn)文 件夾"1990";根據(jù)模型坐標(biāo)系姿態(tài)T(2,4)和S(l/10,1/10),通過(guò)坐標(biāo)逆變換計(jì)算模型可視 空間范圍(-30,-50)~(-10,-30 ),根據(jù)初始設(shè)定的地理坐標(biāo)往模型坐標(biāo)轉(zhuǎn)換時(shí)的固定初始 縮放比例(1/100)和平移值(-430236.0,-3261083.0),進(jìn)行坐標(biāo)先縮放和平移的逆變換,計(jì) 算得到所要顯示的地理空間范圍(427236.0,3256083.0)~(429236.0,3258083.0 ),在空間 四叉樹中進(jìn)行遞歸檢索,得到檢索路徑71/3/3"、71/3/4"、74/2/1"和74/2/2",將四個(gè) 路徑下的data. txt數(shù)據(jù)讀入內(nèi)存,如圖1所示;
[0103] 第三步是構(gòu)建時(shí)間平面,通過(guò)線段求交方式與內(nèi)存中時(shí)空對(duì)象的時(shí)空立方體模型 進(jìn)行--求交,記錄當(dāng)前相交對(duì)象m_interPrimitives和歷史相交對(duì)象111_ IsinterPrimitives,計(jì)算當(dāng)前相交對(duì)象在時(shí)間平面上的幾何形狀投影;
[0104] 第四步是針對(duì)時(shí)間平面、歷史相交對(duì)象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì)象投影結(jié)果構(gòu) 建頂點(diǎn)數(shù)組和頂點(diǎn)顏色數(shù)組,調(diào)用OpenGL頂點(diǎn)緩存進(jìn)行場(chǎng)景渲染,如圖2所示;
[0105] 第五步是上升或下降一級(jí)時(shí)間平面(按照間隔5000進(jìn)行加或減),將上一時(shí)間間隔 的相交對(duì)象拷貝到歷史相交對(duì)象m_lsinterPrimitives,重復(fù)步驟3)和步驟4);
[0106] 第六步是在連續(xù)調(diào)整時(shí)間平面的過(guò)程中(如圖2所示),在視窗中操作時(shí)空對(duì)象的 顯隱性,可選擇顯示點(diǎn)、線、面的時(shí)空對(duì)象中的一種或多種,可選擇只顯示或不顯示當(dāng)前相 交對(duì)象在時(shí)間平面的投影結(jié)果,可選擇只顯示或不顯示當(dāng)前時(shí)間狀態(tài)的歷史時(shí)空對(duì)象。如 圖3所示。
【主權(quán)項(xiàng)】
1. 一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,包括如下步驟: 步驟1:記錄時(shí)空對(duì)象的出生時(shí)間、消亡時(shí)間,建立"線性表+四叉樹"的時(shí)空索引,以文 件形式統(tǒng)一存儲(chǔ)所要描述的時(shí)空對(duì)象信息; 步驟2:根據(jù)系統(tǒng)狀態(tài)參數(shù)快速定位時(shí)空對(duì)象數(shù)據(jù)文件,將數(shù)據(jù)讀入內(nèi)存,進(jìn)行平移和 縮放操作以適應(yīng)屏幕坐標(biāo)系; 步驟3:構(gòu)建時(shí)間平面,與內(nèi)存中時(shí)空對(duì)象的時(shí)空立方體模型進(jìn)行--求交,記錄當(dāng)前 相交對(duì)象和歷史相交對(duì)象,將當(dāng)前相交對(duì)象幾何形狀投影到時(shí)間平面; 步驟4:針對(duì)時(shí)間平面、歷史相交對(duì)象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì)象投影結(jié)果構(gòu)建頂點(diǎn) 數(shù)組和頂點(diǎn)顏色數(shù)組,調(diào)用OpenGL頂點(diǎn)緩存進(jìn)行場(chǎng)景渲染; 步驟5:上升或下降一級(jí)時(shí)間平面,將上一時(shí)間間隔的相交對(duì)象拷貝到歷史相交對(duì)象, 重復(fù)步驟3)和步驟4); 步驟6:通過(guò)設(shè)置時(shí)間平面間隔參數(shù),較為連續(xù)地對(duì)整個(gè)時(shí)空中的時(shí)空對(duì)象變化過(guò)程進(jìn) 行可視化展示。2. 根據(jù)權(quán)利要求1所述的一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,所述的步驟 1中所述時(shí)空對(duì)象包括點(diǎn)、線、面三種形態(tài)的對(duì)象。3. 根據(jù)權(quán)利要求1所述的一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,所述步驟1 具體如下: (1.1) 使用GIS開源庫(kù)shapeLib從shapefile文件中讀取時(shí)空對(duì)象的幾何信息和屬性信 息;所述屬性信息包括出生時(shí)間和消亡時(shí)間; (1.2) 根據(jù)出生時(shí)間以一定時(shí)間間隔對(duì)時(shí)空對(duì)象進(jìn)行線性劃分,對(duì)時(shí)空對(duì)象在出生時(shí) 刻的空間幾何圖形創(chuàng)建四叉樹索引。 (1.3) 將時(shí)空對(duì)象以文件形式進(jìn)行統(tǒng)一存儲(chǔ),存儲(chǔ)結(jié)構(gòu)如下:每一個(gè)時(shí)空對(duì)象的結(jié)構(gòu)以 一對(duì)能表明該時(shí)空對(duì)象類型的標(biāo)記性語(yǔ)言作為開始和結(jié)束。記錄時(shí)空對(duì)象的標(biāo)識(shí)碼、出生 時(shí)間、消亡時(shí)間,以及時(shí)空對(duì)象在出生時(shí)刻的幾何圖形的邊界約束,邊界約束為邊界點(diǎn)集 合,邊界點(diǎn)的標(biāo)識(shí)碼、坐標(biāo)X和坐標(biāo)Y同樣記錄在該時(shí)空對(duì)象的數(shù)據(jù)內(nèi)容中。4. 根據(jù)權(quán)利要求1所述的一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,所述步驟2 具體如下: (2.1) 根據(jù)系統(tǒng)狀態(tài)參數(shù)計(jì)算整個(gè)時(shí)空中的可視空間范圍; 所述系統(tǒng)狀態(tài)參數(shù)包括當(dāng)前用于求交的時(shí)間平面(iterTime)、世界坐標(biāo)系(world frame)的姿態(tài)、照相機(jī)坐標(biāo)系(camera frame)的姿態(tài)和模型坐標(biāo)系(model frame)的姿態(tài); 所述可視空間范圍的計(jì)算如下:相機(jī)坐標(biāo)系與世界坐標(biāo)系一致,將x,y,z方向的取值均 為[_1,1]的世界坐標(biāo)系根據(jù)當(dāng)前的平移和縮放量進(jìn)行平移和縮放的坐標(biāo)逆變換,變換到模 型坐標(biāo)系;將模型坐標(biāo)系根據(jù)初始設(shè)定的平移和縮放量進(jìn)行平移和縮放的坐標(biāo)逆變換,得 到地理空間坐標(biāo)系下的可視空間范圍; (2.2) 每次進(jìn)行模型平移或縮放變換操作時(shí)計(jì)算可視空間范圍,變化前后的可視空間 范圍相差大于等于四叉樹葉節(jié)點(diǎn)最小空間范圍一半時(shí)重新讀取數(shù)據(jù); (2.3) 采用線性表的時(shí)間索引方式根據(jù)所分隔的年份命名根節(jié)點(diǎn)文件夾名稱; (2.4) 采用四叉樹的空間索引方式對(duì)空間進(jìn)行劃分,從劃分空間的左上角象限開始,順 時(shí)針命名并創(chuàng)建文件夾節(jié)點(diǎn),若該節(jié)點(diǎn)為葉子節(jié)點(diǎn)則創(chuàng)建data.txt文件,該文件統(tǒng)一存儲(chǔ) 該劃分空間中的對(duì)象信息。 (2.5)在讀取數(shù)據(jù)時(shí),根據(jù)時(shí)間平面的值,定位根節(jié)點(diǎn)文件夾;再根據(jù)可視空間范圍檢 索與該范圍相交的四叉樹中的父節(jié)點(diǎn)集合,對(duì)集合中的每個(gè)父節(jié)點(diǎn)進(jìn)行遞歸得到父節(jié)點(diǎn)的 四叉樹檢索路徑列表。結(jié)合根節(jié)點(diǎn)文件夾和四叉樹檢索路徑列表快速定位需要讀入內(nèi)存的 時(shí)空對(duì)象數(shù)據(jù)文件。5. 根據(jù)權(quán)利要求1所述的一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,所述的步驟 3包括: (3.1) 將時(shí)間平面與時(shí)空立方體投影到時(shí)間軸(t軸)上,分別得到點(diǎn)的投影和線段的投 影,將點(diǎn)的投影和線段的投影進(jìn)行相交計(jì)算,得到可視空間范圍的當(dāng)前相交對(duì)象;根據(jù)不斷 更新的當(dāng)前相交對(duì)象得到歷史相交對(duì)象,歷史相交對(duì)象和當(dāng)前相交對(duì)象不重復(fù),且相對(duì)于 當(dāng)前時(shí)間平面處于消亡狀態(tài); (3.2) 計(jì)算當(dāng)前相交對(duì)象在時(shí)間平面上的投影:首先取時(shí)空對(duì)象的時(shí)空立方體模型的 任意一條時(shí)間線段與時(shí)間平面求交,計(jì)算得出相交點(diǎn)與時(shí)空對(duì)象邊界約束點(diǎn)的時(shí)間距離 td,然后將時(shí)空對(duì)象所有邊界約束點(diǎn)在t軸上平移td,得到投影結(jié)果的邊界約束點(diǎn)集合。6. 根據(jù)權(quán)利要求1所述的一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,所述的步驟 4中采用glBufferDataO為頂點(diǎn)緩存對(duì)象申請(qǐng)內(nèi)存空間并進(jìn)行初始化,glBufferData()的 usage參數(shù)選取GL_DYNAMIC_DRAW。對(duì)時(shí)間平面、歷史相交對(duì)象、當(dāng)前相交對(duì)象、當(dāng)前相交對(duì) 象投影結(jié)果使用不同的顏色渲染方式,其中當(dāng)前相交對(duì)象投影的渲染需要關(guān)閉深度緩存測(cè) 試glDisable(GL_DEPTH_TEST)。7. 根據(jù)權(quán)利要求1所述的一種時(shí)空變化過(guò)程動(dòng)態(tài)可視化方法,其特征在于,所述的步驟 6包括: (6.1) 根據(jù)時(shí)空數(shù)據(jù)在生存周期上的分布特征選取時(shí)間平面間隔參數(shù); (6.2) 在x,y,t構(gòu)成的三維空間中,通過(guò)逐級(jí)遞增或遞減時(shí)間平面,觀察時(shí)空變化在不 同階段的特征、某一時(shí)空對(duì)象的變化歷程,以及整個(gè)時(shí)空的演變過(guò)程; (6.3) 通過(guò)對(duì)點(diǎn)、線、面時(shí)空對(duì)象,以及當(dāng)前時(shí)空對(duì)象、歷史時(shí)空對(duì)象、當(dāng)前對(duì)象投影結(jié) 果進(jìn)行顯隱控制,以更好地觀察整個(gè)時(shí)空變化的過(guò)程。
【文檔編號(hào)】H04N9/31GK105913475SQ201610409366
【公開日】2016年8月31日
【申請(qǐng)日】2016年6月12日
【發(fā)明人】張豐, 杜震洪, 劉仁義, 王巧燕
【申請(qǐng)人】浙江大學(xué)