我目前有一个离线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 ]
- 这是本·诺兰(Ben Nolan)所建议的http://bennolan.com/2011/06/03/offline-mapping.html
- 关于摇杆地图的类似工作:http://developmentseed.org/blog/2010/oct/02/maps-stick-version-2-released/([不推荐使用[2])
- MBtiles http://mapbox.com/developers/mbtiles/
- TileStream https://github.com/mapbox/tilestream
- 路易斯·雷米:http : //louisremi.com/2011/10/07/offline-web-applications-were-not-there-yet/
问题: 关于JavaScript友好数据库的以下选择,集体智慧(和经验)怎么说?
- SqlLite
- 似乎您需要为此创建一个本机应用程序包装,以使其能够与JavaScript通讯
- 例如,将DLL添加到Windows的本机程序中,然后将android / IOS的PhoneGap添加到本机程序中
- WebSQL
- 敬业的
- 但这是一个SQL Lite,我可以轻松地从主机Web服务器生成和分发它
索引数据库
- 存储Blob似乎有效,请参见:https : //hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- 我担心这是否是最初填充数据库的唯一方法
- 这基本上是SQLLite文件吗?我可以发货批量上传数据库吗?
- 我倾向于将其作为解决方案。是我不知道的陷阱吗?
要求:
- 快速初始填充(通过下载)到客户端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