劉 赟,邢 朦
(中國船舶重工集團公司第七二四研究所,南京 211153)
隨著地理信息數(shù)字化、大數(shù)據(jù)存儲與檢索技術(shù)的發(fā)展,地理信息顯示技術(shù)也迎來了新的發(fā)展。從地圖信息的制作技術(shù)到顯示標(biāo)繪技術(shù),再到地圖信息的訪問服務(wù)方式都發(fā)生了翻天覆地的變化。因此,軍事上對地圖資訊的應(yīng)用與顯示效果也提出了更高的需求。直觀、豐富、可交互的地圖顯示軟件越來越受到青睞,而傳統(tǒng)矢量地圖的應(yīng)用與更新模式已經(jīng)滿足不了軍事上對地圖訊息的需求了。[1-4]
離線瓦片地圖數(shù)據(jù)的應(yīng)用不僅避免了大數(shù)據(jù)傳輸帶來的弊端,更保證了大數(shù)據(jù)地圖信息在應(yīng)用過程中的安全性,為本地可視化管理、分析、建模、開發(fā)等一站式服務(wù)提供有力保證。以金字塔結(jié)構(gòu)分層檢索存儲的瓦片地圖的應(yīng)用也越來越廣泛。瓦片地圖不僅滿足了軍事上對圖層顯示越來越豐富的需求,而且具有更快的地圖刷新速度、更簡潔地使用和擴展應(yīng)用方式。這些都是傳統(tǒng)矢量地圖難以做到的。[5]
針對瓦片地圖的顯示開發(fā)優(yōu)勢,以瓦片地圖為基礎(chǔ),本文介紹如何對瓦片地圖進(jìn)行存儲與檢索,以及如何通過D3D紋理映射技術(shù)來進(jìn)行瓦片地圖的顯示。
瓦片是指將固定范圍的某一比例尺下的地圖按照指定的尺寸(通常為128 × 128像素或者256×256像素)切成若干行與列的正方形柵格圖片,而切圖后獲得的正方形柵格圖片被形象地稱為瓦片(也稱作Tile)。[1,3-4]圖1由20張瓦片拼接而成的一部分世界地圖。
圖1 由20張瓦片拼成的中國沿海地圖
瓦片地圖的存儲結(jié)構(gòu)來源于影像金字塔的概念。根據(jù)用戶需要將地圖不同比例尺進(jìn)行分割、存儲與顯示,形成比例尺由小到大、數(shù)據(jù)量由小到大的金字塔形結(jié)構(gòu),以便于用戶對柵格圖像能夠按照相應(yīng)的算法進(jìn)行管理、讀取、顯示等。[6]
對瓦片地圖數(shù)據(jù)的分類索引可按照以下技術(shù)方案實施:
(1) 對地圖瓦片按照第1預(yù)定規(guī)則進(jìn)行分級,形成b級數(shù)據(jù)文件,其中,b為正整數(shù),b的取值為1、2、3…;
(2) 根據(jù)第i級數(shù)據(jù)文件中地圖瓦片的數(shù)量,按照第2預(yù)定規(guī)則構(gòu)建c個文件,構(gòu)建的每一個所述文件中存放對應(yīng)的若干地圖瓦片,其中i為整數(shù),i的取值為0、1…(b-1),c為正整數(shù),c的取值為1、2、3…。
具體舉例來說,首先按照預(yù)定大小將電子地圖順序分割成a張地圖瓦片,并對所述a張地圖瓦片進(jìn)行分級,形成b級數(shù)據(jù)文件,其中第i+1級數(shù)據(jù)文件中地圖瓦片數(shù)量為第i級數(shù)據(jù)文件中地圖瓦片數(shù)量對應(yīng)的預(yù)定倍數(shù)。該預(yù)定倍數(shù)可以為整數(shù)倍數(shù),也可以為小數(shù)倍數(shù),且每相鄰兩級數(shù)據(jù)文件中地圖瓦片數(shù)量的比值(即對應(yīng)的預(yù)定倍數(shù))可以為固定倍數(shù),也可以為動態(tài)倍數(shù)。其中i為整數(shù),i的取值為0、1…(b-1),且第i級數(shù)據(jù)文件中地圖瓦片組成一個m*n瓦片矩陣。其中,m和n均為正整數(shù),m和n可以相等,則形成的瓦片矩陣為正方形瓦片矩陣(比如,Google坐標(biāo)系統(tǒng)的瓦片地圖);m和n也可以不相等,則形成的瓦片矩陣為長方形瓦片矩陣(比如,非Google坐標(biāo)系統(tǒng)的瓦片地圖)。
以常用地圖坐標(biāo)系統(tǒng)的瓦片地圖為例,其瓦片地圖是WebMercator坐標(biāo)系統(tǒng)。瓦片地圖標(biāo)示的總范圍是經(jīng)度-180°~180°,緯度-85°~85°。按照電子地圖表示的坐標(biāo)規(guī)則對電子地圖進(jìn)行分割,并對分割后的地圖瓦片進(jìn)行分級。在實例中,第0級使用一張地圖瓦片表示。從第1級開始,每一級的地圖瓦片的橫向和縱向方向上均提升到原來的兩倍,即每一級地圖瓦片數(shù)量是上一級地圖瓦片數(shù)量的4倍。由于每一級數(shù)據(jù)文件中地圖瓦片的數(shù)量均為上一級數(shù)據(jù)文件中地圖瓦片數(shù)量的四倍,因此到達(dá)一定級別后該級別數(shù)據(jù)文件中地圖瓦片總數(shù)量總是能夠被65 536整除。
采用本例提供的地圖瓦片的存儲方法,即使是不同的投影坐標(biāo)系統(tǒng),或者是分級數(shù)據(jù)的地圖分辨率并不是按照兩倍的關(guān)系均勻往上增長,導(dǎo)致某一級地圖瓦片總數(shù)量個數(shù)并不是一個能夠被65 536整除的數(shù),都能夠適用。對于橫向或者縱向超過256的瓦片仍然采用256×256個小瓦片圖片組成的大文件來存儲。橫向或者縱向的文件行列數(shù)為橫向或者縱向瓦片最大序號/256的值取整,不妨設(shè)為N。那么從0到N-1的行號或者列號的范圍內(nèi),大文件的行或者列的存儲值為256,而在最邊緣的行或者列則為總值減去256×(N-1)。設(shè)立文件夾的規(guī)則則是類似于前述的文件夾取值規(guī)則。取文件總行數(shù)或者總列數(shù)的較大值除以64,若大于1則繼續(xù)往下除64直到小于1為止。除了M次,就需要M-1層子文件夾來管理。例如,文件總行列數(shù)為65行×63列,文件序號為8、8,則需要1層子文件夾。最終的文件路徑應(yīng)該是L/0/520.dat(8/64=0,8×64+8=520)。
步驟1:在數(shù)據(jù)庫中創(chuàng)建表空間TBS_GE,并在該表空間中建立3個相同定義的表格,分別為T_TileMap_EARTH_JD(用于存儲地圖文件中的街道圖片)、T_TileMap_EARTH_XZ(用于存儲Google Earth地圖文件中的行政圖片)和T_TileMap_EARTH_WX(用于存儲Google Earth地圖文件中的衛(wèi)星圖片)。瓦片地圖信息如表1所示。
表1 瓦片地圖信息表
步驟2:將地圖文件按照圖片類型存入對應(yīng)的表格中。例如,一張層號12、存儲在5號文件夾下的名為1 246.png的衛(wèi)星圖片在表T_TileMap_EARTH_WX中對應(yīng)的記錄見表2。
表2 瓦片地圖檢索示例表
步驟3:分別在表格T_TileMap_EARTH_JD、T_TileMap_EARTH_XZ和T_TileMap_EARTH_WX中建立位圖索引idx_bmp_jd,idx_bmp_xz和idx_bmp_wx,以提高圖片查詢的速度。
存儲在oracle數(shù)據(jù)庫中的地圖文件的移植方法:
方法1:利用數(shù)據(jù)泵工具expdp將表格T_TileMap_EARTH_JD、T_TileMap_EARTH_XZ和T_TileMap_EARTH_WX分別導(dǎo)出生成DMP文件,在其他數(shù)據(jù)庫中利用數(shù)據(jù)泵工具impdp對DMP文件進(jìn)行導(dǎo)入操作。
方法2:在網(wǎng)絡(luò)聯(lián)通的不同oracle數(shù)據(jù)庫中將表空間TBS_GE及其對應(yīng)的數(shù)據(jù)文件進(jìn)行傳輸。
根據(jù)以上的瓦片地圖存儲規(guī)則,可以得到如下的換算關(guān)系,完成了圖片像素坐標(biāo)和實際地理坐標(biāo)之間的換算。這些換算公式是地圖顯示瀏覽的基礎(chǔ)。
(1) 已知待切地圖范圍:左上角坐標(biāo)(Xmin,Ymax);右下角坐標(biāo)(Xmax,Ymin)。
(2) 已知切圖后圖片高寬:width。
(3) 地圖跨度:ΔX=Xmax-Xmin;ΔY=Ymax-Ymin。
(4) 當(dāng)前坐標(biāo):X,Y。
(5) 當(dāng)前瓦片名稱“bbrrrrrcccccc.jpg”;當(dāng)前所在行row=rrrrrr;當(dāng)前所在列col=cccccc;當(dāng)前比例尺級別lev=bb。
(6) 當(dāng)前瓦片范圍:左上角坐標(biāo)(tileXmin,tileYmax);右下角坐標(biāo)(tileXmax,tileYmax)。
其中,Math.Floor意為向下取整。
有了以上的這些公式就可以把客戶端需要顯示的地理范圍換算成相應(yīng)的瓦片名稱序列,然后把所需要的瓦片加載到客戶端,完成地圖的顯示。
生成LPD3DXSPRITE對象m_pSprite,通過LPD3DXSPRITE下Draw函數(shù)繪制,繪制結(jié)果如圖2、3所示。
圖2 行政區(qū)域瓦片地圖顯示效果
圖3 衛(wèi)星瓦片地圖顯示效果
本文闡述了瓦片地圖的索引、存儲與顯示調(diào)用方法,研究如何在Oracle下用金字塔結(jié)構(gòu)建立地圖索引的辦法。針對瓦片地圖的生成原理,本文提供了根據(jù)坐標(biāo)尋找地圖文件的算法。下一步的研究工作是考慮瓦片地圖的三維球體貼圖的拼接方式以及如何提供B/S架構(gòu)下的訪問方式。