Database per riquadri di mappe slippy offline


25

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 ]

Domanda: cosa dicono la saggezza (e l'esperienza) collettiva riguardo alle seguenti scelte per un DB compatibile con JavaScript:

  1. 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
  2. WebSQL
    • depricated
    • ma era un SQL Lite che potevo facilmente generare e distribuire dal server web host
  3. IndexDB

    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



Qualche motivo particolare per i duplicati? stackoverflow.com/questions/14058489/...
Radek

underdark non undershark? ;]
Radek,

Grazie per la tua modifica Anita. Sono un principiante e non conoscevo l'etichetta corretta per chiudere questa nota, ma lasciando indizi ai lettori su ciò che ho scelto per la soluzione.
Dr.YSG,

Risposte:


7

PhoneGap e MBTiles .

WebSQL e IndexDB non saranno sufficienti. I "laptop Windows" non avranno lo stesso codice dei dispositivi mobili.


Informazioni aggiuntive: il cliente ha richiesto solo il supporto per laptop. È un desiderio personale da parte mia vedere se riesco ad estenderlo ai tablet (IOS, Android). La mia sensazione è che PhoneGap aumenterà troppo il tempo di sviluppo e porterà alla frammentazione della base di codice (costi di manutenzione del software). Grazie per l'articolo, è stato fondamentale.
Dr.YSG,

Ho appena ricordato che c'è un ulteriore vincolo qui: se lo implementiamo con PhoneGap, lo sponsor lo chiamerà un'app nativa e quindi dovrà passare circa un anno circa di certificazione. Vogliamo davvero evitare questo.
Dr.YSG il

1
Quello che stai cercando di fare non è possibile senza un componente nativo. È probabilmente il momento di rinegoziare.
tmcw,

Per mia curiosità, qual è il problema con IndexDB o FileAPI?
Dr.YSG il

1
Supporto browser quasi zero e spotty oltre a limiti di dimensioni ridotte. Prova per te stesso.
tmcw,

3

Risultati Cache BLOB offline per mappe slippy PNG

analisi

  • 171 file PNG (per un totale di 3,2 MB)
  • Piattaforme testate: Chrome v24, FireFox 18, IE 10
  • Dovrebbe funzionare anche con Chrome e FF per Android

Recupera dal server Web

  • utilizzando XHR2 (supportato su quasi tutti i browser) per il download di BLOB dal server Web
  • Sono andato con XHR2-Lib di Phil Parsons, che è molto simile a JQUERY .ajax ()

Conservazione

Display

  • Sto usando Leaflet http://leafletjs.com/ per mostrare le tessere della mappa
  • Ho usato il plug-in funzionale layer layer di Ishmael Smyrnow per recuperare il layer tile dal DB
  • Ho confrontato il layer di tessere basato su DB con uno storage puramente locale (localhost: //)
  • Non vi è alcuna differenza evidente nelle prestazioni! tra l'utilizzo di IndexedDB e file locali!

risultati

  • Chrome: Fetch (6.551s), Store (8.247s)
  • FireFox: Fetch (0.422s), Store (34.519s)
  • IE 10: Fetch (0.668s), Store: (0.896s)

2

quindi quasi sicuramente non vuoi usare leaf.pouch, l'ho fatto pensando ai dati vettoriali e non ai riquadri, probabilmente staresti meglio usando PouchDB stretto per archiviare i tuoi riquadri , poiché puoi anche replicare da CouchDB per il caricamento iniziale rapido, la risposta di @tmcw sopra funzionerebbe anche se hai più di un'app per telefono invece di una pagina web mobile.


0

usa il formato standard MBTILES del contenitore SQLite3 con la tabella dei riquadri con il campo BLOB tile_data con PNG o JPG o WebP o GZipped PBF integrato con MBTILES.JS https://github.com/tilemapjp/mbtiles.js/tree/master https: // www.npmjs.com/package/Leaflet.TileLayer.MBTiles

puoi convertire TMS o XYZ in mbtiles con MBUTIL di MapBox. se è necessario generare una cartella di riquadri, utilizzare prima GDAL2TILES_Parallel.py o gdal2tilesp.py le implementazioni in pitone multiprocessore parallelo dell'originale. Entrambi richiedono GDAL.


Ho implementato la lettura diretta di mbtiles (raster, vettoriale e terreno / elevazione) in un volantino per la visualizzazione completamente offline.
GeospatialInformationTech

La mia implementazione ha aggiunto il supporto OGC GeoPackage. Piastrelle Raster, Vector, Elevation e Vector. utilizzando GeoPackage-JS
GeospatialInformationTech

0

MBTILES in Leafletjs inserisci qui la descrizione dell'immagine

leggerà mbtiles locali e remoti. Pacchetto come app mobile con IONIC o React Native. o Desktop con Electron Atom. MBTILES sono la strada da percorrere

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.