文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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中的图层入库也更为相似。

[转]浅谈利用SQLite存储离散瓦片的思路和实现方法的更多相关文章

  1. 浅谈利用SQLite存储离散瓦片的思路和实现方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...

  2. 浅谈python字符串存储形式

    http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...

  3. 浅谈分词算法(5)基于字的分词方法(bi-LSTM)

    目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...

  4. 浅谈分词算法(4)基于字的分词方法(CRF)

    目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 ...

  5. 浅谈分词算法(3)基于字的分词方法(HMM)

    目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...

  6. 浅谈MySql的存储引擎(表类型)

    来源:http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到 ...

  7. MySQL之浅谈MySQL的存储引擎

    什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合.     我们通常说的MySql数据库,sql server数据库等 ...

  8. 浅谈MySql的存储引擎(表类型) (转)

    什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是 ...

  9. 浅谈个人对存储区域网络SAN的理解

    存储区域网络SAN,是一种通过将网络存储设备和服务器连接起来的网络,提供计算机和存储设备间的数据传输.其中,SAN是独立于服务器系统之外的,拥有近乎无限的存储能力,通过利用光纤作为传输媒介,实现了高速 ...

随机推荐

  1. poj 3104 dring 二分

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7684   Accepted: 1967 Descriptio ...

  2. 基于 java 【Web安全】文件上传漏洞及目录遍历攻击

    前言:web安全之文件上传漏洞,顺带讲一下目录遍历攻击.本文基于 java 写了一个示例. 原理 在上网的过程中,我们经常会将一些如图片.压缩包之类的文件上传到远端服务器进行保存.文件上传攻击指的是恶 ...

  3. MySQL并发控制

    并发即指在同一时刻,多个操作并行执行.MySQL对并发的处理主要应用了两种机制——是“锁”和“多版本控制”. 锁 锁分为读锁和写锁两种,也称作共享锁和排他锁.因为多个读操作同时进行是不会破坏数据的,所 ...

  4. TAT

    瞎扯 继\(HNOI,\)学科\(,CTSC, APIO\)连续爆炸之后 曾一度的怀疑人生,没有任何搞学习的欲望 不断的反省自己:我为什么这么菜? 然后回去搞学科,一直处于一个颓废的状态 后来得知\( ...

  5. bitset(01串)优化

    bitset的经典使用: 见代码及注释: #include<bitset> #include<algorithm> using namespace std; //只需调用< ...

  6. 04.CSS动画示例-->烟花

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Angular进阶教程一

    6 AngularJS进阶 6.1数据绑定原理研究 Angular用户都想知道数据绑定是怎么实现的.你可能会看到各种各样的词汇:$watch.$apply.$digest.dirty-checking ...

  8. Spring Data MongoDB 基础查询

    有两种方式查询 BasicQuery 和 Query 一.BasicQuery BasicQuery query = new BasicQuery("{ age : { $lt : 26 } ...

  9. C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序

    C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...

  10. logback配置文件---logback.xml详解

    一.参考文档 1.官方文档 http://logback.qos.ch/documentation.html 2.博客文档 http://www.cnblogs.com/warking/p/57103 ...