我目前有一个离线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

Lous Remi: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服务器生成和分发



IndexDB



要工作,请参阅:https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/

我担心这是最初填充的唯一方法DB
这基本上是SQLLite文件吗?我可以将其运送用于批量DB上传吗?
我倾向于将其作为解决方案。是我不知道的陷阱吗?

要求:


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

我发现了一些其他功能有关将LeafDB与Leaflet一起使用的信息:

https://github.com/calvinmetcalf/leaflet.pouch(将cabdb与indexdb进行离线同步)
这里还有一些读/写测试indexdb,websql和本地存储的速度:
http://jsperf.com/indexeddb-vs-localstorage/15

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


谢谢汤姆·麦克赖特(又名tmcw ),以获得一些良好的反馈。当我创建自定义图层以吸收二进制Blob时,您的示例确实会有所帮助。认为这将解决我的问题,现在该花点时间BTW:如果您想查看我在客户端数据库上的研究结果,请参见:

https: //stackoverflow.com/questions/14113278/storing-image-data-for-offline-web-application-client-side-storage-database



评论

有重复的特殊原因吗? stackoverflow.com/questions/14058489/…

阴暗的不是阴暗的吗? ;]

感谢您的编辑Anita。我是新手,我不知道应该用哪种礼节来结束本笔记,但会为读者提供一些有关我为解决方案选择的线索。

#1 楼

PhoneGap和MBTiles。

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

评论


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

– YSG博士
2012年12月28日在18:04

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

– YSG博士
2012年12月30日0:40在

如果没有本机组件,您想要做的事情是不可能的。现在可能是重新谈判的时候了。

– tmcw
2012年12月30日下午6:45

出于好奇,IndexDB或FileAPI有什么问题?

– YSG博士
2012-12-30 18:29

接近零且参差不齐的浏览器支持以及较小的大小限制。自己动手。

– tmcw
2012年12月31日15:12

#2 楼

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

测试


171个PNG文件(总计3.2MB)
测试平台:Chrome v24,FireFox 18 ,IE 10
还可以与Android的Chrome&FF一起使用

使用XHR2(几乎所有浏览器都支持)从Web服务器获取


从Web服务器下载blob
我使用了Phil Parsons的XHR2-Lib,它非常类似于JQUERY .ajax()


https://github.com/pmp / xhr2-lib



存储


用于IE和FireFox的IndexedDB
Chrome:Polyfill(blob使用FileSystem存储API,引用保留在IndexedDB中)polyfill
必须阅读有关“浏览器如何存储IndexedDB数据”的文章

http://www.aaron-powell.com/web/indexeddb-storage


注意:FireFox将SQLlite用于NOSQL IndexedDB。这可能是性能下降的原因。 (斑点单独存储)
注意:Microsoft IE使用可扩展的存储引擎:

http://en.wikipedia.org/wiki/Extensible_Storage_Engine


注意:Chrome使用LevelDB http://code.google.com/p/leveldb/


Display



我正在使用Leaflet http://leafletjs.com/显示地图图块
我使用Ishmael Smyrnow的功能图块层插件从数据库获取图块层

https://github.com /ismyrnow/Leaflet.functionaltilelayer

我将基于DB的tile层与纯本地(localhost://)存储进行了比较
在性能上没有明显的区别!在使用IndexedDB和本地文件之间!

结果


Chrome:获取(6.551s),存储(8.247s)
FireFox:获取(0.422 s),存储(34.519s)
IE 10:访存(0.668s),存储:(0.896s)


#3 楼

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

#4 楼

将标准SQLite3容器MBTILES格式与tile表一起使用,并将tile_data blob字段与PNG或JPG或WebP或GZipped PBF结合使用,并将其与MBTILES.JS集成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
18年1月12日在17:39

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

– GeospatialInformationTech
18年1月12日在17:46

#5 楼




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