找回密码

瀚网软件 | 技术支持

查看: 1250|回复: 0

Android平台下基于SQLite的瓦片地图存储与显示技术

[复制链接]

47

主题

47

帖子

227

积分

超级版主

Rank: 8Rank: 8

积分
227
发表于 2017-6-9 15:22:45 | 显示全部楼层 |阅读模式

1 引言

随着地理信息技术和移动通信技术的发展,移动终端的应用软件将会有很大发展空间,基于移动设备的地图服务作为新的地图应用形式将日趋普遍,而实现瓦片地图的合理存储和高效调度是关键,本文以Android系统为开发平台,旨在在移动设备上实现高效的地图操作。Android为用户提供了免费、自由、开放、开源的操作系统[1],其跨平台性满足了开发人员创建各类应用程序的需求,Android系统分为4个部分:应用层、应用程序框架层、C/C++库文件与系统核心库文件以及操作系统内核层[2]。作为Android自带的轻量级关系型数据库,SQLite存在于系统库函数层,其资源占用非常少,核心引擎无依赖性,数据库中所有信息都包含在一个文件夹内,方便管理和维护,通过独占性和共享锁来实现独立事务处理,多个进程可以在同一时间从同一数据库中读取数据,但只能有一个可以写入数据。SQLite支持二进制大对象(BLOB)存储,因此可用来存储地图瓦片数据。

2瓦片数据的生成与存储

栅格地图数据的自然组织形式是M×N的像素矩阵,为提高海量数据的存储管理,引入了分块处理机制,以瓦片为单位进行存储并建立索引[3],多尺度地图数据即通过瓦片金字塔模型来实现分层分块组织,并通过树状数据结构进行快速检索。严格意义上,金字塔是连续分辨率模型,但实际情况下,不会实现连续的金字塔模型,通常选用具有倍率关系的模型(一般倍数为2),且考虑到瓦片索引、磁盘读取、重组效率等,通常采用等大小分块的原则:瓦片的高宽相等、瓦片的大小相等。设第0层分辨率为R0,则第n层的空间分辨率(1个像素对应相应比例尺实际距离)Rn的表达式为Rn=R0×2-n [4]。

将经过投影转换后的数据根据分辨率分级,按从低分辨率到高分辨率划分成经纬度大小相同的若干区域,每个区域构成四叉树的一个节点,对应某一分辨率地图上一定经纬度范围的瓦片。瓦片通常是256px×256px大小的图像,这些瓦片数据展现在不同级别、不同类别的地图中,0级是一片瓦片,描述整个地图数据,1级是4片瓦片,各对应0级中1/4的范围,随着向下一级不断缩放,细节部分数量翻倍,则给定缩放级别z下的瓦片数量为4z。可见随着级别的变大,瓦片总数呈几何级增长,尽管以文件夹方式存储瓦片易于实现,调用速度快、稳定性强,但是随着文件个数的增加,瓦片读取速度急剧下降,对于FAT32文件系统一个特定文件夹中最多可以保存的子文件夹和文件的数量是65534个,而NTFS虽然没有个数限制但耗费大量存储空间(如15级共有4^15片瓦片约11亿,需要644GB存储空间),文件系统可用性急剧下降。这种情况对于存储空间有限、系统性能较弱的移动设备而言更是灾难性的。

此外,应考虑到随着级数的增加,地图细节的放大,数据冗余也必然产生:如占世界表面积70~80%的海洋,即便分割至1米分辨率,仍不会具有切实的意义,当到达10级以上时放大的某一地区地图数据将会显示单一颜色,如蓝色(海洋或河流)、白色(雪山或南极洲)、绿色(森林或草原)、黄色(沙漠或土壤)等,没必要重复存储这些信息[5]。因此对于这些像素值单一且重复出现的瓦片只需存储一次,通过ID多次引用即可。本文采用自顶向下的方式构建瓦片金字塔:每片瓦片向下细分时,按照左上(AID)、右上(BID)、左下(CID)、右下(DID)的顺序进行标识,子瓦片关联父瓦片的ID,当程序请求调用某类瓦片数据时,从SD卡上读取相应类别的地图文件,根据瓦片信息导入SQLite数据库中,如图1所示。

图1 瓦片信息的导入

3 瓦片数据的调度与显示

瓦片显示的耗时由外存定位、数据读取和数据显示处理组成,提高地图显示速度的关键在于减小地图外存定位时间和人机交互时地图数据读取的时间[6]。因此,可以将瓦片数据的调度分为3个层次:用于显示当前区域的瓦片缓存、预存取瓦片缓存和外部SQLite数据库(如图2所示)。显示缓存的大小和屏幕能够显示的地图瓦片的个数相同,主要取决于设备的屏幕分辨率大小,预存取瓦片缓存的大小比显示缓存容量要大得多,主要用来存储可能会用来显示的地图瓦片,按照数据预读取策略将其它区域的瓦片预先读入内存,其容量主要由设备内存决定。外部数据库用来存放多个独立的地图瓦片数据表,针对不同字段进行排序可以快速搜索到满足条件的瓦片数据,且便于不同应用程序间的数据共享,其容量由设备的外部存储设备的大小决定。

程序初始化时根据用户所选择的地图类别显示第0级瓦片,再提前读取当前显示区域四周的瓦片数据以及缩放后需要读取的瓦片数据(如图3所示)。在进行预存取操作时,与当前显示区域内地图瓦片缩放级别相同且位置相近的瓦片优先级别最高,其余位置的瓦片次之;在提前读取不同缩放级别的瓦片时,优先读取分辨率低的瓦片,因为分辨率低的瓦片占空间少,加载速度快,如果预存取空间未满,可以加载高分辨率瓦片到缓存中,进一步增强地图缩放的流畅度。

图2 多级缓存结构


图3 第i级格网视域范围[7]

本文实验的软件环境为Windows XP操作系统、Qt5.3 Android开发环境,实验数据共8级,由1∶500 万(0~1级)、1:100万(2~3级)、1∶250 万(4~5级)、1∶50(6~7级)万比例尺的中国专题图数据生成,通过Android模拟器部署安装MapViwer地图浏览程序,实现了对多级地图数据的快速浏览和多级缩放,如图4所示。本文通过构建基于四叉树的金字塔模型实现了瓦片数据的快速索引;对具有相同像素值的瓦片数据进行了唯一存储,大大减少了存储空间;利用多级缓存加快了瓦片数据的调度与显示,为实现移动平台下地图服务提供了良好的解决方案。

(a)地图浏览软件MapViewer            (b)程序运行效果图

图4 实验结果


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ| 手机版| 瀚网软件  

Copyright © 2001-2015 Comsenz Inc.   All Rights Reserved.

Powered by Discuz! X3.3( 皖ICP备17007560号 )

快速回复 返回顶部 返回列表