Giter Site home page Giter Site logo

helgasoft / leaflet.dexie Goto Github PK

View Code? Open in Web Editor NEW
8.0 1.0 3.0 731 KB

A Leaflet plugin for local persistent storage using library Dexie.js, demo:

Home Page: https://helgasoft.github.io/leaflet.dexie/index.html

License: GNU General Public License v2.0

JavaScript 100.00%
leaflet leaflet-plugins dexie offline-storage offline-maps indexeddb

leaflet.dexie's Introduction

Leaflet.dexie.js

A Leaflet plugin for offline maps storage using library Dexie.js.

The source code is based on leaflet.offline with the following differences:

  • instead of idb, we use dexie.js which is efficient, stable and well supported indexedDB library.
  • instead of having all maps in a single table(store), each map is saved in its own table and can add other user-defined attributes like size, center, bounds, etc.

Dependencies

Demo

The Demo implements creation and deletion of offline maps and can simulate offline map display.

Usage

Main usage is for offline maps, but could be also used to store other information. API documentation is available.

Manual installation

Add a <script> tag to your HTML page after leaflet and dexie. You can web-load the script, or download file leaflet.dexie.min.js and load it locally. See code below.

Minimal code sample

<!doctype html>
<html>
 <head>
	<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
	<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>   
	<script src="https://unpkg.com/dexie@latest/dist/dexie.js"></script>

	<script src="https://cdn.jsdelivr.net/gh/helgasoft/leaflet.dexie/dist/leaflet.dexie.min.js"></script>
	<!--   or local copy:
	<script src="js/leaflet.dexie.min.js"></script>  -->
 </head>
 <body>
	<div id="map" style="height: 75vh"></div>
<p>
	<input type='button' value='Save map' onclick='savem()' />
	<input type='button' value='Delete map' onclick='delm()' />
</p>
	press F12 to watch IndexedDB/leaflet-maps in tab <i>Application</i>(Chrome), <i>Storage</i>(FF) or <i>Debugger</i>(Edge)
  <script>
	let map = L.map('map');
	map.setView(L.latLng(47.2572, 3.6842), 18);
	let baseLayer = L.tileLayer.offline('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { subdomains: 'abc', maxZoom: 18});
	baseLayer.addTo(map);
	let control = L.control.savetiles(baseLayer, {
	    'confirmSave': function(status, saveCallback) {
			var newTname = prompt("Please enter map name ("+status._tilesforSave.length+" tiles):", "");
			if (newTname == null || newTname == "") return;  // user cancelled the prompt
			saveCallback(newTname);
	    }
	});
	control.addTo(map);
	control.openDB();

	savem = function() {
		control.setBounds(map.getBounds());
		control.saveMap();
	}
	delm = function() {
		control.deleteTable(control.dtable.name);
	}
	baseLayer.on('loadend', function(e) {	// all tiles just saved
		control.putItem('mapSize', e.mapSize);
		control.getItem('mapSize').then( (msize) => {
			alert("size of map '"+ control.dtable.name +"' is "+ msize +' bytes');
		});
	});
  </script>
 </body>
</html>

IndexedDB

indexedDB is the standard database in the browser. Press F12 to open inspection sidebar, hit tab Application(Chrome), Storage(FF) or Debugger(Edge) and watch IndexedDB. The database name is leaflet-maps. Watch also tab Console for errors.

indexedDB table

leaflet.dexie's People

Contributors

dependabot[bot] avatar helgasoft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

leaflet.dexie's Issues

wms?

Does this work with wms?
What would have to be changed?

Not sure if I a up to the challenge: But I may tackle this if you point me out the necessary changes.

Throws exceptions in Edge due to nulls.

_setDataUrl: function (tile, url) {

I resolved with... hope it helps

        _setDataUrl: function (tile, url) {
            var self = this;
            return new Promise(function (resolve, reject) {
                if (self.dtable === null || !self.dtable) {
                    reject();
                }
                else {
                    self.dtable.get(self._getStorageKey(url)).then(function (data) {
                        if (data && typeof data === 'object') {
                            resolve(URL.createObjectURL(data));
                        } else {
                            reject();
                        }
                    }).catch((e) => { reject(e); });   //console.log(e); 
                }
            }); //dont catch here, handled upstream
        },

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.