В даний час у мене є офлайн-додаток HTML5 для карт (побудований на Leaflet & KendoUI зі спеціальними доповненнями), який має маніфест програми та прекрасно працює на багатьох платформах. Однак я не вагаюся використовувати маніфест, щоб таким чином зберігати фактичну плитку карти (файли PNG, що зберігаються як кеш-пам'ять у стилі TMS).
Проблеми:
- У близько 1000 файлів PNG може бути багато плиток (10 Мб - 50 МБ)
- Початкове завантаження може бути дуже повільним (і користувачеві важко показати прогрес)
- Маніфести додатків працюють, або вони не стають, якщо не виконати кешування в автономному режимі, не вдасться (погодитися з [whatwg.org] [1])
- Користувач, який перебуває в режимі офлайн, періодично знову підключатиметься та потребує оновлення плитки. Це невеликі дельти, але механізм маніфесту програми перезавантажить всі файли js, css та PNG, як тільки після оновлення маніфесту
Альтернативна ідея: тримайте веб-додаток окремо від зберігання слизьких плиток карт. Зберігайте плитки в базі даних веб-додатків
Оновлення:
[PouchDB нещодавно додав підтримку бінарних крапель. Я отримую хороші початкові результати. Дивіться: /programming/16721312/using-pouchdb-as-an-offline-raster-map-cache ]
- Про це пропонує Бен Нолан http://bennolan.com/2011/06/03/offline-mapping.html
- Аналогічна робота над Карти на паличці: http://developmentseed.org/blog/2010/oct/02/maps-stick-version-2-released/ ([застаріло] [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/
Запитання: Що говорить колективна мудрість (і досвід) про наступні варіанти для дружнього JavaScript:
- SqlLite
- Здається, для цього вам потрібно створити вбудовану обгортку програми, щоб вона змогла спілкуватися з JavaScript
- Наприклад, додайте DLL до рідної програми для Windows та PhoneGap для android / IOS
- WebSQL
- знецінений
- але саме SQL Lite я міг легко генерувати та поширювати з хост-веб-сервера
IndexDB
- Зберігання крапель, здається, працює див. Https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- Мене хвилює, чи це єдиний спосіб спочатку заповнити БД
- Це в основному файл SQLLite? Чи можу я поставити його для масового завантаження БД?
- Я схиляюся до цього як до рішення. Це їхні готчі, про які я не знаю?
Вимоги:
- Швидка початкова сукупність (через завантаження) до клієнтської веб-БД
- Сумісний з поточним API Leaflet TileLayer (тобто я б швидше не писав спеціальний шар, але за потреби ...) (наприклад, MbTiles)
- Платформа: Ноутбуки Windows, але потрібні планшети Android та IOS (я можу зачекати, поки IndexDB вийде, не потрібна негайна підтримка)
- Я б краще не писав нативну програму (EXE, IOS, Android), але це, якщо це найкращий спосіб ...
- Генерація веб-карт на стороні сервера (це буде автоматизований процес). Користувач вибирає місцеположення, вибирає карти, і вони динамічно трансформуються і перетворюються на слизький кешований кеш (ця робота вже значною мірою виконана).
- Швидке масове початкове завантаження
- Оновлення дельти зміни карти (я напишу цю логіку на основі постійної кількості запасів та логіки оновлення дати)
- Мінімальний вплив на поточний веб-додаток Leaflet & KendoUI
Оновлення:
Основна основна ідея: хоча веб-додаток є досить стабільним, ковзаючі плитки карти створюються на ходу для вашого місцезнаходження та того, який тип проблеми ви робите (ззаду). Тож я придумав два інші способи передачі початкового «великого удару», а потім оновлення:
Zip-файл (мабуть, не дуже гарна ідея - оскільки це додає серверне навантаження), також розширення на клієнтській машині потребуватиме взаємодії з користувачем, але це дає можливість ковзаючим плиткам використовувати локальні URL-адреси
API файлу HTML5: Я не дуже детально розглядав це. Але, здається, у більшості операцій зі створення локального дерева файлів у форматі TMS: http://www.html5rocks.com/en/tutorials/file/filesystem/, що буде цікаво перевірити - це ефективність (наприклад, чи можу я використовувати веб-роботи щоб збільшити пропускну здатність до диска та по всій мережі). IndexDB не широко застосовується для зручності роботи з веб-роботою (інтерфейс синхронізації: /programming/10698728/indexeddb-in-web-worker-on-firefox
Я знайшов додаткову інформацію про використання IndexDB з Leaflet:
https://github.com/calvinmetcalf/leaflet.pouch (синхронізує couchdb з indexdb для автономного режиму) Також ось кілька тестів на швидкість читання / запису для indexdb, websql та локального магазину: http://jsperf.com/indexeddb -vs-localstorage / 15
Ось як використовувати API для читання / запису файлів з javascript: (а також просити збільшити ліміти пам’яті) http://www.html5rocks.com/en/tutorials/file/filesystem/
Дякую, Том МакРайт (він же tmcw), за хороший відгук. Ваш приклад справді допоможе, коли я переходжу до створення спеціальних шарів для поглинання бінарних крапок.
Я вчора провів тестування з IndexedDB, і за допомогою деяких поліфілів та бібліотек я думаю, що це вирішить мої проблеми. Зараз настав час внести трохи власного капіталу в це, і я звіту назад.
BTW: якщо ви хочете побачити мої результати мого дослідження на базі даних клієнтів, див:
/programming/14113278/storing-image-data-for-offline-web-application-client-side-storage-database