浅谈利用SQLite存储离散瓦片的思路和实现方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
1.背景
在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联网地图的瓦片下载。但是此种方法存在如下几个问题:
a.瓦片均是离散型图片,远程部署非常耗时。
b.瓦片下载中,涉及到将互联网瓦片下载至内存,然后建立对应文件夹,然后保存至本地的过程,效率不高。
除了以上两个问题外,还有存储占用比较多等等缺点。是否有类似于ArcGIS的Bundle型瓦片组织格式来解决存储占用、远程部署等已有问题的解决方案?

2.自定义Bundle格式
2.1利用Sqlite进行存储
2.1.1Sqlite的优点
a. 轻量级
SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。
这样非常便于我们将其作为一个文件来看待。
b. 单一文件
所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。并且这个文件可以copy到其它目录或其它机器上,也同样可以使用。
通过这个单一文件性,我们便可以将本身需要离散存储的文件进行统一管理了。
c. 跨平台/可移植性
除了主流操作系统,SQLite还支持了很多冷门的操作系统,比如Android、Windows Mobile、Symbin、Palm、VxWorks等的支持。
一次存储,多点使用。
d.内存数据库(in-memory database)
目前内存越来越廉价, SQLite的内存数据库特性就越发显得好用。SQLite 的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。所以如果你觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换 为内存方式。切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就可以了。
在存储瓦片时,如果瓦片数据不算多,内存足够用,可以切换为内存方式,进一步提高瓦片读取效率。
2.1.2缺点
a.并发访问的锁机制
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。
b. SQL标准支持不全
在它的官方网站上,具体列举了不支持哪些SQL92标准。
2.2 瓦片以MBTiles规范进行组织
MBTiles 是一种地图瓦片存储的数据规范,可大大提高海量地图瓦片的读取速度,比通过瓦片文件方式的读取要快很多,适用于Android、IPhone等智能手机的离线地图存储。
MBTiles通过视图,可以重复使用冗余瓦片数据,从而减少瓦片占用的空间,而不是一个单一的、文字表。比如:地图覆盖大面积的纯蓝色像海洋或空的土地,造成成千上万的重复、冗余的瓦片数据,例如,4/2/8的瓦片在太平洋中间,可能看起来就是一张蓝色图片虽然它可能是一些处于第3级,但在16级可能存在数以百万计的蓝色图片,他们都完全一样。
MBTiles通用方法是将瓦片表分成两张:一个用来存储原始图像和一个存储瓷砖坐标对应那些图片。具体设计如下:
a.设计map表

对瓦片行列号以及对应的瓦片ID进行存储。
b.设计images表

对瓦片进行存储。
c.设计视图tiles

基于map和images生成。
3.开发瓦片下载和打包存储工具
3.1瓦片下载工具
瓦片下载工具基于瓦片寻址算法开发,针对不同互联网地图,瓦片的行列号算法等稍有不同。尤其是针对百度地图,其瓦片算法会按照百度的瓦片分级偏移规则进行换算。这里不做累述。

3.2基于MBTiles规范进行存储
设计思路为:
a.多线程瓦片下载,内存中开辟容器池。
b.当内存容器池满后,进行整体入库至sqlite。入库时进行上锁,规避Sqlite对多事务支持不理想问题。

4.改造后端进行测试
4.1改造后端
后端按照连接池的思想,支持通过行列号在Sqlite中读取到瓦片。
4.2前端测试

5.方案优点总结
a.提高瓦片下载存储速度。经测试,比本地图片存储方式效率至少提高一倍。主要由于,一是二进制存储,无转换过程。二是减少各层级文件夹建立耗时。
b.减少存储空间。MBTiles规范可以减少冗余瓦片。
c.便于数据转移。所有瓦片存储于一个文件夹中,便于数据转移部署。
d.提高海量地图瓦片的读取速度,比通过瓦片文件方式的读取要快很多。原因为单个文件不再涉及到目录寻址,并且也不需要将瓦片读取为二进制再传出。
6.待测试
由于sqlite本身对多事务支持不是很良好,大并发访问瓦片的情景还需测试。下一步准备使用Jmeter进行测试。
7.扩展使用
目前矢量切图工具,存储的也均是离散型的PBF。使用MBTiles进行存储,也能实现便于部署的目的。并且,一个图层使用一个视图,这种概念与ArcGIS中的图层入库也更为相似。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

浅谈利用SQLite存储离散瓦片的思路和实现方法的更多相关文章
- [转]浅谈利用SQLite存储离散瓦片的思路和实现方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- 浅谈分词算法(5)基于字的分词方法(bi-LSTM)
目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...
- 浅谈分词算法(4)基于字的分词方法(CRF)
目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 ...
- 浅谈分词算法(3)基于字的分词方法(HMM)
目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...
- 浅谈MySql的存储引擎(表类型)
来源:http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到 ...
- MySQL之浅谈MySQL的存储引擎
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等 ...
- 浅谈MySql的存储引擎(表类型) (转)
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是 ...
- 浅谈个人对存储区域网络SAN的理解
存储区域网络SAN,是一种通过将网络存储设备和服务器连接起来的网络,提供计算机和存储设备间的数据传输.其中,SAN是独立于服务器系统之外的,拥有近乎无限的存储能力,通过利用光纤作为传输媒介,实现了高速 ...
随机推荐
- MIP改造常见问题二十问
在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...
- android 使用Tabhost 发生could not create tab content because could not find view with id 错误
使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...
- <译>通过PowerShell工具跨多台服务器执行SQL脚本
有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 .简单的几步搞 ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- 基于jQuery左右滑动切换特效 附源码
分享一款基于脚jQuery左右滑动切换特效.这是一款鼠标点击左右箭头按钮图片滚动切换,鼠标移到图片上显示透明边框特效. 效果图如下: 废话不多说,代码奉上! html代码: <div ...
- μCos-ii学习笔记1_概述
一.μCos-ii _概述 网上关于μCosii的文章多不胜数,本人学习的过程中也参考了很多人的理解和想法,看的是卢有亮老师的<嵌入式实时操作系统-μC/OS原理与实践>(第2版),同时也 ...
- LeetCode - Two Sum
Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...
- 用Taurus.MVC 做个企业站(下)
前言: 上一篇完成了首页,这一篇就把剩下的几个功能给作了吧. 包括文章列表.文章详情和产品展示. 1:文章列表: 原来的ArticleList.aspx 1:现在的articlelist.html 除 ...
- MemoryMappedFile 在 Mono in Linux 的开发笔记
前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...
- node应用线上部署时锁定包的依赖版本
npm shrinkwrap 我们使用node开发时,经常需要依赖一些模块来完成功能需求,而我们所依赖的模块也必然会依赖其他模块,就这样一级一级的依赖,而且这些依赖模块并不为我们所控制.一个产品或项目 ...