离线滑图贴图数据库


25

我目前有一个离线HTML5地图应用程序(基于Leaflet和KendoUI构建,具有自定义添加功能),该应用程序具有应用程序清单,并且可以在多个平台上正常运行。但是,我不愿意使用清单以这种方式存储实际的地图图块(将PNG文件存储为TMS样式图块缓存)。

问题:

  • 大约1,000个PNG文件中可能有很多图块(10MB-50MB)
  • 初始下载可能真的很慢(并且很难向用户显示进度)
  • App Manifests工作正常,否则,整个离线缓存都将失败(根据[whatwg.org] [1])
  • 离线用户偶尔会重新连接并需要刷新Tiles,这些都是很小的增量,但应用程序清单机制会在清单更新后立即重新加载所有js,css和PNG文件

替代方案:将Web应用程序与光滑地图图块的存储区分开。将图块存储在Web应用程序友好数据库中

更新:

[PouchDB最近添加了对二进制Blob的支持。我得到了很好的初步结果。参见:https : //stackoverflow.com/questions/16721312/using-pouchdb-as-an-offline-raster-map-cache ]

问题: 关于JavaScript友好数据库的以下选择,集体智慧(和经验)怎么说?

  1. SqlLite
    • 似乎您需要为此创建一个本机应用程序包装,以使其能够与JavaScript通讯
    • 例如,将DLL添加到Windows的本机程序中,然后将android / IOS的​​PhoneGap添加到本机程序中
  2. WebSQL
    • 敬业的
    • 但这是一个SQL Lite,我可以轻松地从主机Web服务器生成和分发它
  3. 索引数据库

    要求:

    • 快速初始填充(通过下载)到客户端Web DB
    • 与当前的Leaflet TileLayer API兼容(即,我宁愿不编写自定义层,但如果需要的话...)(例如MbTiles)
    • 平台:Windows笔记本电脑,但是需要Android和IOS平板电脑(我可以等到IndexDB发布,不需要立即支持)
    • 我宁愿不编写本机应用程序(EXE,IOS,Android),但是如果那是最好的方法,那...
    • 服务器端生成Web地图(这是一个自动过程)。用户选择一个位置,选择地图,然后对其进行动态转换并变成活泼的图块缓存(这项工作已经完成了)。
    • 快速批量初始下载
    • 地图更改增量刷新(我将基于不变的库存数量编写此逻辑,并更新日期逻辑)
    • 对当前Leaflet和KendoUI Web应用程序的影响最小

更新:

关键的背景思想:虽然Web应用程序相当稳定,但是会根据您的位置以及您正在处理的问题类型(在后端)即时生成滑行的地图图块。因此,我想到了另外两种转移初始“大爆炸”然后进行更新的方式:

Zip文件(可能不是一个好主意-因为它会增加服务器负载),因此在客户端计算机上进行扩展也需要用户进行交互,但它确实允许滑动图块使用本地网址

HTML5 File API:我还没有详细介绍它。但是似乎可以执行大多数操作来以TMS格式创建本地文件树:http : //www.html5rocks.com/zh-CN/tutorials/file/filesystem/要测试的有趣之处在于性能(例如,我可以使用Web Works吗?以最大化磁盘和整个网络的带宽)。IndexDB并未广泛实现为对Web Worker友好(同步界面:https ://stackoverflow.com/questions/10698728/indexeddb-in-web-worker-on-firefox

我发现了有关在Leaflet中使用IndexDB的其他信息:

https://github.com/calvinmetcalf/leaflet.pouch(将cabdb与indexdb同步以脱机)这也是对indexdb,websql和本地存储的读写速度的一些测试:http ://jsperf.com/indexeddb -vs-localstorage / 15

这是如何使用javascript中的读/写文件API :(并且要求增加存储限制)http://www.html5rocks.com/zh-CN/tutorials/file/filesystem/


谢谢汤姆·麦克赖特(Tom MacWright,又名tmcw)的宝贵反馈。当我创建自定义图层以提取二进制Blob时,您的示例确实会有所帮助。

昨天我对IndexedDB进行了一些测试,并使用了一些polyfill和库,我认为它将解决我的问题。现在是时候投入一些汗水了,我会再作报告。


顺便说一句:如果您想在客户端数据库上查看我的研究结果,请参见:

/programming/14113278/storing-image-data-for-offline-web-application-client-side-storage-database




阴暗的不是阴暗的吗?;]
radek 2013年

感谢您的编辑Anita。我是一个新手,我不了解本笔记的适当礼节,但为读者提供了我选择解决方案的线索。
Dr.YSG

Answers:


7

PhoneGap和MBTiles

WebSQL和IndexDB是不够的。“ Windows笔记本电脑”与移动设备的代码不同。


其他背景:客户只要求笔记本电脑支持。我个人希望可以将其扩展到平板电脑(IOS,Android)上。我的感觉是PhoneGap会大大增加开发时间,并导致代码库碎片化(软件维护成本)。但是,感谢本文,这是开创性的。
YSG博士2012年

我只是记得这里还有一个额外的限制:如果我们使用PhoneGap实施它,则赞助商将其称为本机应用程序,然后它必须经过一年左右的认证。我们真的想避免这种情况。
YSG博士2012年

1
如果没有本地组件,您将要做的事情是不可能的。现在可能是重新谈判的时候了。
tmcw 2012年

出于好奇,IndexDB或FileAPI有什么问题?
YSG博士2012年

1
接近零且参差不齐的浏览器支持以及较小的大小限制。自己尝试。
tmcw 2012

3

结果PNG滑动贴图的离线Blob缓存

测试中

  • 171个PNG文件(总计3.2MB)
  • 经过测试的平台:Chrome v24,FireFox 18,IE 10
  • 也应与Android版Chrome&FF一起使用

从网络服务器获取

  • 使用XHR2(几乎所有浏览器都支持)从Web服务器下载Blob
  • 我使用的是Phil Parsons的XHR2-Lib,它非常类似于JQUERY .ajax()

存储

显示

结果

  • Chrome:抓取(6.551s),存储(8.247s)
  • FireFox:提取(0.422s),存储(34.519s)
  • IE 10:提取(0.668s),存储:(0.896s)

2

因此,您几乎绝对不想使用leaf.pouch,我考虑到矢量数据而不是图块,最好使用PouchDB的 strait 来存储图块,因为您也可以从CouchDB复制快速的初始加载,如果您拥有更多的手机应用程序而不是移动网页,那么上述@tmcw的答案也将起作用。


0

使用与瓷砖表中的标准SQLite3的容器MBTILES格式与PNG或JPG或WebP的或GZip压缩PBF tile_data blob字段与MBTILES.JS集成它 https://github.com/tilemapjp/mbtiles.js/tree/master https://开头www.npmjs.com/package/Leaflet.TileLayer.MBTiles

您可以通过MapBox使用MBUTIL将TMS或XYZ Tiles转换为mbtiles。如果您需要生成图块文件夹,请首先使用GDAL2TILES_Parallel.py或gdal2tilesp.py原始的并行多处理python实现。它们都需要GDAL。


我已经实现了小册子中mbtiles(栅格,矢量和terrain / elevation)的直接读取,可以完全离线查看。
GeospatialInformationTech

我的实现添加了OGC GeoPackage支持。栅格,矢量,高程和矢量拼贴。使用GeoPackage-JS
GeospatialInformationTech,

0

Leaflet.js中的MBTILES 在此处输入图片说明

它将读取本地和远程mbtiles。与IONIC或React Native一起打包为移动应用程序。或带有Electron Atom的台式机。MBTILES是必经之路

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.