オフラインの滑りやすいマップタイルのデータベース


25

現在、オフラインのHTML5マップアプリケーション(LeafletとKendoUIで構築され、カスタムの追加機能を備えています)があります。これは、アプリマニフェストを持ち、複数のプラットフォームで正常に動作します。ただし、この方法でマニフェストを使用して実際のマップタイルを保存することをためらっています(TMSスタイルのタイルキャッシュとして保存されたPNGファイル)。

問題点:

  • 約1,000個のPNGファイルに多数のタイル(10MB-50MB)が存在する可能性があります
  • 最初のダウンロードは非常に遅くなる可能性があります(そしてユーザーに進行状況を表示するのが難しい)
  • アプリマニフェストが機能するか、機能しない場合は、オフラインキャッシュ全体が失敗します([whatwg.org] [1]による)
  • オフラインユーザーは時折再接続し、タイルの更新を取得する必要があります。これらは小さなデルタですが、アプリマニフェストメカニズムはマニフェストの更新時にすべてのjs、css、およびPNGファイルをリロードします

代替案: Webアプリケーションを、滑りやすいマップタイルのストレージとは別にしてください。Webアプリケーションに適したデータベースにタイルを保存します

更新:

[PouchDBは最近、バイナリBLOBのサポートを追加しました。良い初期結果を得ています。参照:https : //stackoverflow.com/questions/16721312/using-pouchdb-as-an-offline-raster-map-cache ]

質問: JavaScriptフレンドリなDBの次の選択について、集合的な知恵(および経験)は何を言っていますか?

  1. SqlLite
    • このためにネイティブアプリラッパーを作成してJavaScriptと通信できるようにする必要があるようです
    • たとえば、Windows用のネイティブプログラムにDLLを追加し、Android / IOS用のPhoneGapを追加します。
  2. WebSQL
    • 奪われた
    • しかし、ホストWebサーバーから簡単に生成および配布できるのはSQL Liteでした
  3. IndexDB

    • blobの保存は次のように動作するようです:https : //hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
    • これが最初にDBにデータを入力する唯一の方法であるかどうか心配です
    • これは基本的にSQLLiteファイルですか?一括DBアップロード用に出荷できますか?
    • 私は解決策としてこれに傾いています。私が知らない彼らの落とし穴はありますか?

    要件:

    • クライアントWeb DBへの高速ダウンロード(ダウンロード経由)
    • 現在のLeaflet TileLayer APIと互換性があります(つまり、カスタムレイヤーを作成するのではなく、必要に応じて...)(MbTilesなど)
    • プラットフォーム:Windowsラップトップ、ただしAndroidおよびIOSタブレットが必要(IndexDBがリリースされるまで待つことができます。すぐにサポートする必要はありません)
    • 私はむしろネイティブアプリ(EXE、IOS、Android)を書きたくはありませんが、それが最良の方法であれば...
    • サーバー側でのWebマップの生成(これは自動化されたプロセスになります)。ユーザーが場所を選択し、マップを選択すると、それらは動的に変換され、滑りやすいタイルキャッシュに変換されます(この作業は既にほぼ完了しています)。
    • 高速一括初期ダウンロード
    • マップ変更デルタの更新(一定の在庫数に基づいてこのロジックを記述し、日付ロジックを更新します)
    • 現在のLeafletおよびKendoUI Webアプリケーションへの影響は最小限

更新:

重要な背景アイデア:Webアプリはかなり安定していますが、滑りやすいマップタイルは、現在地と実行している問題の種類(バックエンドで)に応じてオンザフライで生成されます。そこで、最初の「ビッグバン」を転送してから更新するための2つの方法を考えました。

Zipファイル(おそらく良い考えではありません-サーバーの負荷を追加するため)また、クライアントマシンでの拡張にはユーザーの操作が必要になりますが、滑りやすいタイルでローカルURLを使用できます

HTML5 File API:私はこれを詳細に見ていない。しかし、TMS形式でローカルファイルツリーを作成するほとんどの操作があるようです:http : //www.html5rocks.com/en/tutorials/file/filesystem/テストするのが面白いのはパフォーマンスですディスクとネット全体の帯域幅を最大化するため)。IndexDBはWebワーカーに優しいように広く実装されていません(同期インターフェイス:https ://stackoverflow.com/questions/10698728/indexeddb-in-web-worker-on-firefox

リーフレットでIndexDBを使用することに関する追加情報を見つけました。

https://github.com/calvinmetcalf/leaflet.pouch(オフラインのためにcouchdbとindexdbを同期します)また、indexdb、websql、およびローカルストアの読み取り/書き込み速度のテストもいくつかあります:http ://jsperf.com/indexeddb -vs-localstorage / 15

そして、ここにはJavaScriptからの読み出し/書き込みファイルAPIを使用する方法である:(ともストレージの制限を増やすように依頼する)http://www.html5rocks.com/en/tutorials/file/filesystem/


トムマクライト(別名tmcw)、良いフィードバックをありがとう。バイナリBLOBを取り込むためにカスタムレイヤーを作成する場合、あなたの例は本当に役立ちます。

昨日、IndexedDBでいくつかのテストを行い、いくつかのポリフィルとライブラリを使用して、問題を解決できると思います。さて、これに汗をかく公平を置く時が来たので、報告します。


ところで:クライアント側のデータベースに関する私の研究の私の結果を見たい場合は、以下を参照してください。

/programming/14113278/storing-image-data-for-offline-web-application-client-side-storage-database



重複する特定の理由は?stackoverflow.com/questions/14058489/...
ラデク・

UndersharkではなくUnderdark?;]
ラデック

アニタを編集していただきありがとうございます。私は初心者であり、このメモを閉じるための適切なエチケットを知りませんでしたが、読者が解決策として選んだものへの手がかりを残しました。
Dr.YSG

回答:


7

PhoneGapとMBTiles

WebSQLとIndexDBでは十分ではありません。「Windows Laptops」は、モバイルデバイスと同じコードにはなりません。


追加の背景:顧客はラップトップのサポートのみを求めました。これをタブレット(IOS、Android)に拡張できるかどうかを確認することは、私の個人的な願いです。私の感覚では、PhoneGapは開発時間を大幅に増加させ、コードベースの断片化(ソフトウェアメンテナンスコスト)につながりますが、記事をありがとう、それは重要でした。
Dr.YSG

ここに追加の制約があることを思い出しました。PhoneGapで実装する場合、スポンサーはこれをネイティブアプリと呼び、その後1年程度の認定を受ける必要があります。私たちは本当にこれを避けたいです。
Dr.YSG

1
あなたがしようとしていることは、ネイティブコンポーネントなしでは不可能です。おそらく再交渉の時が来たでしょう。
tmcw

私の好奇心のために、IndexDBまたはFileAPIの問題は何ですか?
Dr.YSG

1
ほぼゼロでむらのあるブラウザのサポートに加えて、サイズ制限が低くなっています。自分で試してみてください。
tmcw

3

結果PNGスリッピーマップのオフラインBLOBキャッシュ

テスト中

  • 171個のPNGファイル(合計3.2MB)
  • テスト済みのプラットフォーム:Chrome v24、FireFox 18、IE 10
  • ChromeとFF for Androidでも動作するはずです

Webサーバーから取得する

  • WebサーバーからのblobダウンロードにXHR2(ほぼすべてのブラウザーでサポート)を使用
  • Phil ParsonsのXHR2-Libを使用しました。これはJQUERY .ajax()によく似ています。

ストレージ

  • IEおよびFireFox用IndexedDB
  • Chrome:ポリフィル(FileSystem APIを使用して保存されたブロブ、IndexedDBに保持される参照)ポリフィル
  • 「ブラウザがIndexedDBデータを保存する方法」に関する記事を読む必要があります
  • 注:FireFoxはNOSQL IndexedDBにSQLliteを使用します。これがパフォーマンスの低下の原因である可能性があります。(ブロブは個別に保存されます)
  • 注:Microsoft IEは拡張可能なストレージエンジンを使用します。
  • 注:ChromeはLevelDB http://code.google.com/p/leveldb/を使用します

表示

  • Leaflet http://leafletjs.com/を使用してマップタイルを表示しています
  • DBからタイルレイヤーを取得するために、Ishmael Smyrnowによる機能的なタイルレイヤープラグインを使用しました
  • DBベースのタイルレイヤーを純粋にローカル(localhost://)ストレージと比較しました
  • パフォーマンスに目立った違いはありません!IndexedDBとローカルファイルの使用の間に!

結果

  • Chrome:フェッチ(6.551秒)、ストア(8.247秒)
  • FireFox:フェッチ(0.422秒)、ストア(34.519秒)
  • IE 10:フェッチ(0.668秒)、ストア:(0.896秒)

2

あなたはほとんど間違いなくleaf.pouchを使用したくない、私はタイルではなくベクトルデータを念頭に置いて、PouchDBまっすぐに使用してタイルを保存することをお勧めします.CouchDBから複製することもできます高速の初期読み込み。上記の@tmcwによる答えは、モバイルWebページではなく、電話アプリをもっと持っている場合にも機能します。


0

PNGまたはJPG、またはMBTILES.JSと統合されたWebPまたはGZipped PBFのtile_data blobフィールドを含むタイルテーブルで、標準のSQLite3コンテナーMBTILES形式を使用し ますhttps://github.com/tilemapjp/mbtiles.js/tree/master https:// www.npmjs.com/package/Leaflet.TileLayer.MBTiles

MapBoxでMBUTILを使用して、TMSまたはXYZタイルをmbtilesに変換できます。タイルのフォルダーを生成する必要がある場合は、最初にGDAL2TILES_Parallel.pyまたはgdal2tilesp.pyを使用して、元の並列マルチプロセッシングPython実装を使用します。どちらもGDALが必要です。


完全にオフラインで表示するために、リーフレットでmbtiles(ラスター、ベクター、地形/標高)の直接読み取りを実装しました。
GeospatialInformationTech

私の実装では、OGC GeoPackageのサポートが追加されました。ラスター、ベクター、標高、ベクタータイル。GeoPackage-JSの使用
GeospatialInformationTech

0

LeafletjsのMBTILES ここに画像の説明を入力してください

ローカルおよびリモートのmbtileを読み取ります。IONICまたはReact Nativeを備えたモバイルアプリとしてパッケージ化します。またはElectron Atomを使用したデスクトップ。MBTILESは行くべき道です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.