Al momento ho un'applicazione di mappe HTML5 offline (costruita su Leaflet e KendoUI con aggiunte personalizzate) che ha un manifest di app e funziona bene su più piattaforme. Tuttavia, sono titubante nell'utilizzare manifest per archiviare in questo modo i riquadri della mappa effettiva (file PNG memorizzati come cache Tile in stile TMS).
Problemi:
- Ci potrebbero essere molte tessere (10 MB - 50 MB) in circa 1.000 file PNG
- Il download iniziale potrebbe essere molto lento (e difficile mostrare progressi all'utente)
- I manifesti delle app funzionano o no se non falliscono l'intera memorizzazione nella cache offline (in accordo con [whatwg.org] [1])
- L'utente offline occasionalmente si riconnetterà e avrà bisogno di ottenere aggiornamenti dei riquadri. Questi sono piccoli delta ma il meccanismo manifest dell'app ricaricherebbe tutti i file js, css e PNG non appena si aggiornano i manifest
Idea alternativa: mantenere l'applicazione Web separata dalla memorizzazione delle tessere mappa scivolose. Conservare i riquadri in un database intuitivo dell'applicazione Web
Aggiornare:
[PouchDB ha recentemente aggiunto il supporto per i BLOB binari. Sto ottenendo buoni risultati iniziali. Vedi: /programming/16721312/using-pouchdb-as-an-offline-raster-map-cache ]
- Questo è suggerito da Ben Nolan http://bennolan.com/2011/06/03/offline-mapping.html
- Lavori simili su Maps on a Stick: http://developmentseed.org/blog/2010/oct/02/maps-stick-version-2-released/ ([deprecated] [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/
Domanda: cosa dicono la saggezza (e l'esperienza) collettiva riguardo alle seguenti scelte per un DB compatibile con JavaScript:
- SqlLite
- Sembra che tu debba creare un wrapper di app nativo per questo per consentirgli di parlare con JavaScript
- Ad esempio, aggiungere la DLL a un programma nativo per Windows e PhoneGap per Android / IOS
- WebSQL
- depricated
- ma era un SQL Lite che potevo facilmente generare e distribuire dal server web host
IndexDB
- L'archiviazione dei BLOB sembra funzionare: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- Sono preoccupato se questo è l'unico modo per popolare inizialmente il DB
- Questo è fondamentalmente un file SQLLite? Posso spedirlo per il caricamento in blocco di DB?
- Mi sto proponendo come soluzione. Sono i loro gotcha che non conosco?
Requisiti:
- Popolazione iniziale rapida (tramite download) nel Web DB client
- Compatibile con l'attuale API Leaflet TileLayer (cioè preferirei non scrivere un livello personalizzato, ma se necessario ...) (ad esempio MbTiles)
- Piattaforma: laptop Windows, ma i tablet Android e IOS desiderati (posso aspettare fino al rilascio di IndexDB, non ho bisogno di supporto immediato)
- Preferirei non scrivere un'app nativa (EXE, IOS, Android) ma se è il modo migliore ...
- Generazione di mappe Web lato server (sarà un processo automatizzato). L'utente sceglie una posizione, sceglie le mappe e si trasformano dinamicamente e si trasformano in una cache di tile scivolosa (questo lavoro è già ampiamente svolto).
- Download iniziale in blocco veloce
- Aggiornamenti delta per la modifica della mappa (scriverò questa logica, in base a numeri di borsa costanti e aggiornerò la logica della data)
- Impatto minimo sull'applicazione Web Leaflet e KendoUI corrente
Aggiornare:
Idea di base: mentre l'app Web è abbastanza stabile, i riquadri delle mappe scivolose vengono generati al volo per la tua posizione e il tipo di problema che stai riscontrando (nel back-end). Quindi ho pensato ad altri due modi per trasferire il "big bang" iniziale e quindi gli aggiornamenti:
Il file zip (probabilmente non è una buona idea, poiché aggiunge il carico del server) anche l'espansione sul computer client richiederà l'interazione dell'utente, ma consente ai riquadri slippy di utilizzare gli URL locali
API di file HTML5: non ho esaminato questo in dettaglio. Ma sembra che la maggior parte delle operazioni per creare un albero di file locale in formato TMS: http://www.html5rocks.com/en/tutorials/file/filesystem/ ciò che sarà interessante testare le prestazioni (ad es. Posso usare le opere web per massimizzare la larghezza di banda su disco e attraverso la rete). IndexDB non è ampiamente implementato per essere facile da usare per il web (interfaccia di sincronizzazione: /programming/10698728/indexeddb-in-web-worker-on-firefox
Ho trovato alcune informazioni aggiuntive sull'uso di IndexDB con Leaflet:
https://github.com/calvinmetcalf/leaflet.pouch (sincronizza couchdb con indexdb per offline) Anche qui ci sono alcuni test per le velocità di lettura / scrittura per indexdb, websql e store locale: http://jsperf.com/indexeddb -Vs-localStorage / 15
Ed ecco come utilizzare l'API del file di lettura / scrittura da JavaScript: (e anche per chiedere di aumentare i limiti di archiviazione) http://www.html5rocks.com/en/tutorials/file/filesystem/
Grazie, Tom MacWright (aka tmcw), per un buon feedback. Il tuo esempio sarà davvero d'aiuto quando riuscirò a creare layer personalizzati per ingerire i BLOB binari.
Ieri ho fatto alcuni test con IndexedDB e usando alcuni polyfill e librerie penso che risolverà i miei problemi. Ora è il momento di mettere un po 'di sudore in questo, e riferirò.
A proposito: se vuoi vedere i miei risultati del mio studio sui database lato client vedi:
/programming/14113278/storing-image-data-for-offline-web-application-client-side-storage-database