劉 赟,邢 朦
(中國船舶重工集團公司第七二四研究所,南京 211153)
隨著地理信息數字化、大數據存儲與檢索技術的發展,地理信息顯示技術也迎來了新的發展。從地圖信息的制作技術到顯示標繪技術,再到地圖信息的訪問服務方式都發生了翻天覆地的變化。因此,軍事上對地圖資訊的應用與顯示效果也提出了更高的需求。直觀、豐富、可交互的地圖顯示軟件越來越受到青睞,而傳統矢量地圖的應用與更新模式已經滿足不了軍事上對地圖訊息的需求了。[1-4]
離線瓦片地圖數據的應用不僅避免了大數據傳輸帶來的弊端,更保證了大數據地圖信息在應用過程中的安全性,為本地可視化管理、分析、建模、開發等一站式服務提供有力保證。以金字塔結構分層檢索存儲的瓦片地圖的應用也越來越廣泛。瓦片地圖不僅滿足了軍事上對圖層顯示越來越豐富的需求,而且具有更快的地圖刷新速度、更簡潔地使用和擴展應用方式。這些都是傳統矢量地圖難以做到的。[5]
針對瓦片地圖的顯示開發優勢,以瓦片地圖為基礎,本文介紹如何對瓦片地圖進行存儲與檢索,以及如何通過D3D紋理映射技術來進行瓦片地圖的顯示。
瓦片是指將固定范圍的某一比例尺下的地圖按照指定的尺寸(通常為128 × 128像素或者256×256像素)切成若干行與列的正方形柵格圖片,而切圖后獲得的正方形柵格圖片被形象地稱為瓦片(也稱作Tile)。[1,3-4]圖1由20張瓦片拼接而成的一部分世界地圖。

圖1 由20張瓦片拼成的中國沿海地圖
瓦片地圖的存儲結構來源于影像金字塔的概念。根據用戶需要將地圖不同比例尺進行分割、存儲與顯示,形成比例尺由小到大、數據量由小到大的金字塔形結構,以便于用戶對柵格圖像能夠按照相應的算法進行管理、讀取、顯示等。[6]
對瓦片地圖數據的分類索引可按照以下技術方案實施:
(1) 對地圖瓦片按照第1預定規則進行分級,形成b級數據文件,其中,b為正整數,b的取值為1、2、3…;
(2) 根據第i級數據文件中地圖瓦片的數量,按照第2預定規則構建c個文件,構建的每一個所述文件中存放對應的若干地圖瓦片,其中i為整數,i的取值為0、1…(b-1),c為正整數,c的取值為1、2、3…。
具體舉例來說,首先按照預定大小將電子地圖順序分割成a張地圖瓦片,并對所述a張地圖瓦片進行分級,形成b級數據文件,其中第i+1級數據文件中地圖瓦片數量為第i級數據文件中地圖瓦片數量對應的預定倍數。該預定倍數可以為整數倍數,也可以為小數倍數,且每相鄰兩級數據文件中地圖瓦片數量的比值(即對應的預定倍數)可以為固定倍數,也可以為動態倍數。其中i為整數,i的取值為0、1…(b-1),且第i級數據文件中地圖瓦片組成一個m*n瓦片矩陣。其中,m和n均為正整數,m和n可以相等,則形成的瓦片矩陣為正方形瓦片矩陣(比如,Google坐標系統的瓦片地圖);m和n也可以不相等,則形成的瓦片矩陣為長方形瓦片矩陣(比如,非Google坐標系統的瓦片地圖)。
以常用地圖坐標系統的瓦片地圖為例,其瓦片地圖是WebMercator坐標系統。瓦片地圖標示的總范圍是經度-180°~180°,緯度-85°~85°。按照電子地圖表示的坐標規則對電子地圖進行分割,并對分割后的地圖瓦片進行分級。在實例中,第0級使用一張地圖瓦片表示。從第1級開始,每一級的地圖瓦片的橫向和縱向方向上均提升到原來的兩倍,即每一級地圖瓦片數量是上一級地圖瓦片數量的4倍。由于每一級數據文件中地圖瓦片的數量均為上一級數據文件中地圖瓦片數量的四倍,因此到達一定級別后該級別數據文件中地圖瓦片總數量總是能夠被65 536整除。
采用本例提供的地圖瓦片的存儲方法,即使是不同的投影坐標系統,或者是分級數據的地圖分辨率并不是按照兩倍的關系均勻往上增長,導致某一級地圖瓦片總數量個數并不是一個能夠被65 536整除的數,都能夠適用。對于橫向或者縱向超過256的瓦片仍然采用256×256個小瓦片圖片組成的大文件來存儲。橫向或者縱向的文件行列數為橫向或者縱向瓦片最大序號/256的值取整,不妨設為N。那么從0到N-1的行號或者列號的范圍內,大文件的行或者列的存儲值為256,而在最邊緣的行或者列則為總值減去256×(N-1)。設立文件夾的規則則是類似于前述的文件夾取值規則。取文件總行數或者總列數的較大值除以64,若大于1則繼續往下除64直到小于1為止。除了M次,就需要M-1層子文件夾來管理。例如,文件總行列數為65行×63列,文件序號為8、8,則需要1層子文件夾。最終的文件路徑應該是L/0/520.dat(8/64=0,8×64+8=520)。
步驟1:在數據庫中創建表空間TBS_GE,并在該表空間中建立3個相同定義的表格,分別為T_TileMap_EARTH_JD(用于存儲地圖文件中的街道圖片)、T_TileMap_EARTH_XZ(用于存儲Google Earth地圖文件中的行政圖片)和T_TileMap_EARTH_WX(用于存儲Google Earth地圖文件中的衛星圖片)。瓦片地圖信息如表1所示。

表1 瓦片地圖信息表
步驟2:將地圖文件按照圖片類型存入對應的表格中。例如,一張層號12、存儲在5號文件夾下的名為1 246.png的衛星圖片在表T_TileMap_EARTH_WX中對應的記錄見表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數據庫中的地圖文件的移植方法:
方法1:利用數據泵工具expdp將表格T_TileMap_EARTH_JD、T_TileMap_EARTH_XZ和T_TileMap_EARTH_WX分別導出生成DMP文件,在其他數據庫中利用數據泵工具impdp對DMP文件進行導入操作。
方法2:在網絡聯通的不同oracle數據庫中將表空間TBS_GE及其對應的數據文件進行傳輸。
根據以上的瓦片地圖存儲規則,可以得到如下的換算關系,完成了圖片像素坐標和實際地理坐標之間的換算。這些換算公式是地圖顯示瀏覽的基礎。
(1) 已知待切地圖范圍:左上角坐標(Xmin,Ymax);右下角坐標(Xmax,Ymin)。
(2) 已知切圖后圖片高寬:width。
(3) 地圖跨度:ΔX=Xmax-Xmin;ΔY=Ymax-Ymin。
(4) 當前坐標:X,Y。
(5) 當前瓦片名稱“bbrrrrrcccccc.jpg”;當前所在行row=rrrrrr;當前所在列col=cccccc;當前比例尺級別lev=bb。
(6) 當前瓦片范圍:左上角坐標(tileXmin,tileYmax);右下角坐標(tileXmax,tileYmax)。
其中,Math.Floor意為向下取整。
有了以上的這些公式就可以把客戶端需要顯示的地理范圍換算成相應的瓦片名稱序列,然后把所需要的瓦片加載到客戶端,完成地圖的顯示。
生成LPD3DXSPRITE對象m_pSprite,通過LPD3DXSPRITE下Draw函數繪制,繪制結果如圖2、3所示。

圖2 行政區域瓦片地圖顯示效果

圖3 衛星瓦片地圖顯示效果
本文闡述了瓦片地圖的索引、存儲與顯示調用方法,研究如何在Oracle下用金字塔結構建立地圖索引的辦法。針對瓦片地圖的生成原理,本文提供了根據坐標尋找地圖文件的算法。下一步的研究工作是考慮瓦片地圖的三維球體貼圖的拼接方式以及如何提供B/S架構下的訪問方式。