База даних для офлайн-плиткових плиток карти


25

В даний час у мене є офлайн-додаток 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 ]

Запитання: Що говорить колективна мудрість (і досвід) про наступні варіанти для дружнього JavaScript:

  1. SqlLite
    • Здається, для цього вам потрібно створити вбудовану обгортку програми, щоб вона змогла спілкуватися з JavaScript
    • Наприклад, додайте DLL до рідної програми для Windows та PhoneGap для android / IOS
  2. WebSQL
    • знецінений
    • але саме SQL Lite я міг легко генерувати та поширювати з хост-веб-сервера
  3. 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



Якась конкретна причина для дублікату? stackoverflow.com/questions/14058489/…
radek

підкреслити не підкреслити? ;]
radek

Дякую за вашу редакцію Аніта. Я новачок і не знав належного етикету для закриття цієї замітки, але залишав для читачів підказки до того, що я обрав для рішення.
Dr.YSG

Відповіді:


7

PhoneGap та MBTiles .

WebSQL та IndexDB буде недостатньо. "Ноутбуки Windows" не будуть тим самим кодом, що й мобільні пристрої.


Додаткова інформація: Клієнт попросив лише підтримку ноутбука. З мого боку це особисте бажання побачити, чи можу я розтягнути це на планшети (IOS, Android). Моє відчуття полягає в тому, що PhoneGap занадто сильно збільшить час розробки та призведе до фрагментації бази коду (витрати на обслуговування програмного забезпечення) Але спасибі за статтю, це було натщесерце.
Dr.YSG

Я просто пам’ятав, що тут є додаткове обмеження: якщо ми реалізуємо це разом із PhoneGap, спонсор назвать це нативним додатком, і тоді йому доведеться пройти сертифікацію через рік. Ми дуже хочемо цього уникнути.
Dr.YSG

1
Те, що ви хочете зробити, неможливо без нативного компонента. Напевно, час переговорів.
tmcw

З моєї цікавості, в чому проблема з IndexDB або FileAPI?
Dr.YSG

1
Підтримка майже нуля та плямистості браузера плюс низькі обмеження розміру. Спробуйте самі.
tmcw

3

Результати офлайн кеш-пам'яті для PNG слизьких карт

Тестування

  • 171 файл PNG (всього 3,2 МБ)
  • Тестовані платформи: Chrome v24, FireFox 18, IE 10
  • Також слід працювати з Chrome & FF для Android

Витягнути з веб-сервера

  • за допомогою XHR2 (підтримується майже у всіх браузерах) для завантаження блобу з веб-сервера
  • Я пішов з XHR2-Lib від Філа Парсонса, що дуже схоже на JQUERY .ajax ()

Зберігання

  • IndexedDB для IE та FireFox
  • Chrome: Polyfill (блок зберігається за допомогою API FileSystem, посилання зберігається в IndexedDB) polyfill
  • Обов’язково прочитати статтю на тему "Як браузери зберігають дані IndexedDB"
  • Примітка: FireFox використовує SQLlite для NOSQL IndexedDB. Це може бути причиною повільної роботи. (краплі зберігаються окремо)
  • Примітка: Microsoft IE використовує розширюваний механізм зберігання даних:
  • Примітка: Chrome використовує http://code.google.com/p/leveldb/ LevelDB/

Дисплей

  • Я використовую листівку http://leafletjs.com/, щоб показати плитки карти
  • Я використовував плагін функціонального шару плитки від Ізмаїла Смирнова для отримання шару плитки з БД
  • Я порівняв шар плитки на основі БД із суто локальним сховищем (localhost: //)
  • Немає помітної різниці в продуктивності! між використанням IndexedDB та локальними файлами!

Результати

  • Chrome: Вибір (6.551s), Магазин (8.247s)
  • FireFox: Fetch (0.422s), Store (34.519s)
  • IE 10: Вибір (0,668), Магазин: (0,896)

2

Таким чином, ви майже точно не хочете використовувати leaf.pouch, я зробив це, маючи на увазі векторні дані, а не плитки, вам, мабуть, краще буде використовувати простір PouchDB для зберігання ваших плиток, оскільки ви також можете копіювати з CouchDB для швидке початкове завантаження. Відповідь від @tmcw вище також спрацює, якщо у вас є більше програми для телефону, а не мобільної веб-сторінки.


0

використовуйте стандартний формат MBTILES-контейнера SQLite3 з таблицею плиток із полем блоку tile_data з PNG або JPG або WebP або GZipped PBF, інтегруючи його в MBTILES.JS https://github.com/tilemapjp/mbtiles.js/tree/master https: // www.npmjs.com/package/Leaflet.TileLayer.MBTiles

ви можете конвертувати TMS або XYZ плитки в mbtiles за допомогою MBUTIL від MapBox. якщо вам потрібно генерувати папку плиток, спочатку скористайтеся GDAL2TILES_Parallel.py або gdal2tilesp.py паралельними багатопроцесорними реалізаціями python з оригіналу. Їм обом потрібен GDAL.


Я реалізував пряме зчитування mbtiles (растрові, векторні та рельєфні / підняття) в листівці для перегляду в режимі офлайн.
GeospatialInformationTech

Моя реалізація додала підтримку OGC GeoPackage. Растрові, векторні, висотні та векторні плитки. використовуючи GeoPackage-JS
GeospatialInformationTech

0

MBTILES в Leafletjs введіть тут опис зображення

він буде читати локальні та віддалені mbtiles. Пакет як мобільний додаток з IONIC або React Native. або Робочий стіл з Електронним Атомом. MBTILES - це шлях

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.