我正在实现一个 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 Debugging Proxy) 时,可以看到虽然本地地图瓦片已被加载(从日志中可以看到),但仍有几个请求发送到地图瓦片提供程序。
有人知道我做错了什么,还需要在我的 StorageTileLayer
中覆盖什么才能阻止对远程的调用吗?真正的问题是,地图也应该在离线模式下工作,但事实并非如此。
感谢您的帮助。
环境中的库:
- Leaflet (0.7.3)
- angularJS (1.2.16)
- Cordova (3.2)