【发布时间】:2014-06-18 07:33:07
【问题描述】:
我正在实现一个 Cordova 应用程序 (3.2),我想在其中使用 LeafletJS 和地图切片提供程序以及切片的本地文件系统缓存。
我的概述方法如下:
- 扩展 Leaflet TileLayer
- 覆盖
_loadTile方法以从本地文件系统或远程检索磁贴
我的代码:
var StorageTileLayer = L.TileLayer.extend({
log: function (text) {
if (this.options.log)
this.options.log(text);
else
console.log("[StorageTileLayer]: " + text);
},
_setUpTile: function (tile, key, value, cache) {
try {
tile._layer = this;
tile.onload = this._tileOnLoad;
tile.onerror = this._tileOnError;
this._adjustTilePoint(tile);
tile.src = value;
this.fire('tileloadstart', {
tile: tile,
url: tile.src
});
this.log("Setting url to " + tile.src);
}
catch (e) {
this.log("ERROR in setUpTile: " + e.message);
}
},
_loadTile: function (tile, tilePoint) {
this._adjustTilePoint(tilePoint);
var key = tilePoint.z + ',' + tilePoint.y + ',' + tilePoint.x;
var self = this;
var tileUrl = self.getTileUrl(tilePoint);
console.log(tileUrl);
console.log(typeof tileUrl);
if (this.options.storage) {
this.log("Load Tile with storage");
this.options.storage.get(key, tileUrl).then(function (value) {
self.log("Tile URL to load: " + value.url);
self._setUpTile(tile, key, value.url, true);
});
} else {
this.log("Load Tile without storage");
self._setUpTile(tile, key, tileUrl, false);
}
}
});
options.storage 是一个存储,它具有 get(key, remoteUrl) 方法并从本地文件存储返回缓存的切片(此实现实际工作正常,所以这不是问题)或远程 url 但在后台下载切片,以便下次调用时可以从本地文件存储中使用它。
不幸的是,当我使用 Charles(Web 调试代理)时,我可以在我的设备上看到,虽然本地地图图块已加载(我可以从日志中看到),但仍然有几个对地图图块提供者的请求。
有谁知道我做错了什么以及我必须在我的StorageTileLayer 中覆盖什么以防止对远程的调用?真正的问题是,地图也应该在离线模式下工作,但事实并非如此。
感谢您的帮助。
环境中的库:
- 传单 (0.7.3)
- angularJS (1.2.16)
- 科尔多瓦 (3.2)
【问题讨论】:
-
嗨,我正在处理一个 Chrome 应用程序上的一个非常类似的问题,该应用程序不允许远程图像调用。我需要停止远程调用,检查它是否已经下载到本地文件系统,如果没有,则执行 XhrHttpRrequest 来获取磁贴。你有什么运气可以让你的版本正常工作吗?
标签: android html cordova leaflet html5-filesystem