基于瓦片地图的电子海图生成和应用方法
2019-03-10刘赟,邢朦
刘 赟,邢 朦
(中国船舶重工集团公司第七二四研究所,南京 211153)
0 引 言
随着地理信息数字化、大数据存储与检索技术的发展,地理信息显示技术也迎来了新的发展。从地图信息的制作技术到显示标绘技术,再到地图信息的访问服务方式都发生了翻天覆地的变化。因此,军事上对地图资讯的应用与显示效果也提出了更高的需求。直观、丰富、可交互的地图显示软件越来越受到青睐,而传统矢量地图的应用与更新模式已经满足不了军事上对地图讯息的需求了。[1-4]
离线瓦片地图数据的应用不仅避免了大数据传输带来的弊端,更保证了大数据地图信息在应用过程中的安全性,为本地可视化管理、分析、建模、开发等一站式服务提供有力保证。以金字塔结构分层检索存储的瓦片地图的应用也越来越广泛。瓦片地图不仅满足了军事上对图层显示越来越丰富的需求,而且具有更快的地图刷新速度、更简洁地使用和扩展应用方式。这些都是传统矢量地图难以做到的。[5]
针对瓦片地图的显示开发优势,以瓦片地图为基础,本文介绍如何对瓦片地图进行存储与检索,以及如何通过D3D纹理映射技术来进行瓦片地图的显示。
1 瓦片地图的图层管理与检索技术
1.1 瓦片
瓦片是指将固定范围的某一比例尺下的地图按照指定的尺寸(通常为128 × 128像素或者256×256像素)切成若干行与列的正方形栅格图片,而切图后获得的正方形栅格图片被形象地称为瓦片(也称作Tile)。[1,3-4]图1由20张瓦片拼接而成的一部分世界地图。
图1 由20张瓦片拼成的中国沿海地图
1.2 瓦片地图数据的索引
瓦片地图的存储结构来源于影像金字塔的概念。根据用户需要将地图不同比例尺进行分割、存储与显示,形成比例尺由小到大、数据量由小到大的金字塔形结构,以便于用户对栅格图像能够按照相应的算法进行管理、读取、显示等。[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.3 利用oracle数据库存储瓦片地图的步骤
步骤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及其对应的数据文件进行传输。
2 瓦片数据的读取与绘制
根据以上的瓦片地图存储规则,可以得到如下的换算关系,完成了图片像素坐标和实际地理坐标之间的换算。这些换算公式是地图显示浏览的基础。
2.1 条件和变量假设
(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)。
2.2 根据当前瓦片名称计算当前瓦片范围
2.3 根据坐标和比例尺计算当前图片所在行列号
其中,Math.Floor意为向下取整。
2.4 当前坐标在当前图片上的像素坐标(pX,pY)
有了以上的这些公式就可以把客户端需要显示的地理范围换算成相应的瓦片名称序列,然后把所需要的瓦片加载到客户端,完成地图的显示。
2.5 通过DirectX 3D下LPD3DXSPRITE对象进行绘制
生成LPD3DXSPRITE对象m_pSprite,通过LPD3DXSPRITE下Draw函数绘制,绘制结果如图2、3所示。
图2 行政区域瓦片地图显示效果
图3 卫星瓦片地图显示效果
3 结束语
本文阐述了瓦片地图的索引、存储与显示调用方法,研究如何在Oracle下用金字塔结构建立地图索引的办法。针对瓦片地图的生成原理,本文提供了根据坐标寻找地图文件的算法。下一步的研究工作是考虑瓦片地图的三维球体贴图的拼接方式以及如何提供B/S架构下的访问方式。