当前位置: 首页 > news >正文

浅谈利用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/

                                                                           如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                      

 

相关文章:

  • Vue及双向绑定
  • 跟我一起ggplot2(1)
  • 解析v-model指令,对于刚接触的比较好理解
  • App架构设计经验谈:服务端接口的设计
  • Vue v-for的操作
  • 如何查找UDID
  • v-if 和v-show的相同和区别
  • 字典树(Trie tree)
  • Vue中组件的分类
  • 计算机是怎么跑起来的(1)
  • Android学习笔记(二)
  • vue-生命周期
  • Flex/AS3/flash player支持屏蔽右键菜单,自定义菜单,并设置相应的菜单事件(示例,图解)...
  • vue-cli脚手架 搭建项目
  • 玩转无线电 -- 温哥华天车 RFID 票务系统
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【comparator, comparable】小总结
  • Angular4 模板式表单用法以及验证
  • Apache的基本使用
  • es6--symbol
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java取消线程实例
  • ReactNativeweexDeviceOne对比
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring核心 Bean的高级装配
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 聚类分析——Kmeans
  • 前端路由实现-history
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  •  一套莫尔斯电报听写、翻译系统
  • 用element的upload组件实现多图片上传和压缩
  • 1.Ext JS 建立web开发工程
  • 7行Python代码的人脸识别
  • ionic异常记录
  • 阿里云API、SDK和CLI应用实践方案
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (六)Hibernate的二级缓存
  • (七)c52学习之旅-中断
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (已解决)什么是vue导航守卫
  • (转)视频码率,帧率和分辨率的联系与区别
  • .net core使用ef 6
  • .NET 使用 XPath 来读写 XML 文件
  • .NET多线程执行函数
  • .net下简单快捷的数值高低位切换
  • /bin/bash^M: bad interpreter: No such file or directory
  • @Resource和@Autowired的区别
  • [ 第一章] JavaScript 简史
  • [20180129]bash显示path环境变量.txt
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作