# Leaflet.TileLayer.PouchDBCached
**Repository Path**: opengis-leaflet/Leaflet.TileLayer.PouchDBCached
## Basic Information
- **Project Name**: Leaflet.TileLayer.PouchDBCached
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-30
- **Last Updated**: 2021-06-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Allows all Leaflet TileLayers to cache into PouchDB for offline use, in a transparent fashion.
There is a [demo](http://mazemap.github.io/Leaflet.TileLayer.PouchDBCached/demo.html) available, which shows cache hits/misses/seeds in the browser's developer console.
# Dependencies
Tested with Leaflet 1.4.0 and PouchDB 7.0.0.
You probably want to load Leaflet, PouchDB and Leaflet.TileLayer.PouchDB like so:
```html
```
If you are still using Leaflet 0.7.x, the latest compatible release is [v0.1.0](https://github.com/MazeMap/Leaflet.TileLayer.PouchDBCached/releases/tag/v0.1.0).
# Usage
The plugin modifies the core `L.TileLayer` class, so it should be possible to cache any tile layer.
To use, add the option `useCache` with a value of `true` when instantiating your layer. You probably want to use Leaflet's `crossOrigin` option, like so:
```javascript
var layer = L.tileLayer('https://whatever/{z}/{x}/{y}.png', {
maxZoom: 18,
useCache: true,
crossOrigin: true
});
```
Options available are as follows:
* `useCache`: set to true in order to enable the cache. This option must be set at initialization time.
* `saveToCache`: Whether to save new tiles to the cache or not. Defaults to true.
* `useOnlyCache`: Whether to fetch tiles from the network or not. Defaults to false.
* `cacheMaxAge`: Time, in milliseconds, for any given tile to be considered 'fresh'. Tiles older than this value will be re-requested from the network. Defaults to 24 hours.
New functions available are as follows:
* `seed`: Starts seeding the cache for a given bounding box (a `L.LatLngBounds`), and between the two given zoom levels.
New events available are as follows:
* `tilecachehit`: Fired when a tile has been found in the tile cache. The event includes data as per http://leafletjs.com/reference.html#tile-event
* `tilecachemiss`: Like `tilecachehit`, but is fired when the tile has *not* been found in the cache.
* `tilecacheerror`: Fired when there was an error trying to save a tile in the cache. The event data includes:
* `tile`: A reference to the failed tile
* `error`: The error message, probably related to CORS.
* `seedstart`: Fired when a layer cache has started seeding. The event data includes:
* `bbox`: bounding box for the seed operation, as per the `L.TileLayer.seed()` function call.
* `minZoom` and `maxZoom`: zoom levels the seed operation, as per the `L.TileLayer.seed()` function call.
* `queueLength`: (integer) Total number of tiles to be loaded during the seed operation.
* `seedend`: Fired when a layer cache has finished seeding.
* `seedprogress`: Fired every time a tile is cached during a seed operation
* `remainingLength`: (integer) How many tiles are left in the seed queue. Starts with a value of `queueLength` and drops down to zero.
# Cross-Origin Resource Sharing
Due to the tile images being parsed and stored by the browser (technically, extracting data from a canvas in which a external image has been loaded into), the tiles must come from a tile server which allows CORS (Cross-Origin Resource Sharing) on the tiles. So tiles must have a CORS header allowing them to be loaded in the document where you're using this caching layer.
In other words: if chrome shows a grey map, and displays CORS-related messages in the console, make sure that your tileserver adds this header to all tiles:
`Access-Control-Allow-Origin: *`
# Underlying cache structure
This plugin uses an instance of PouchDB, named `offline-tiles`. PouchDB is a key-value store, so the key is the URL of a tile, and the value is a plain object containing a timestamp and the base64-encoded image.
# License and stuff
Under MIT license.
Heavily inspired by https://github.com/tbicr/OfflineMap