it-swarm-ja.com

優れた汎用タイル画像ダウンローダーを設計するにはどうすればよいですか?

タイル張りの画像

タイル画像は、小さな正方形のタイルに分割された大きな画像です。いくつかのタイル画像形式があり、タイルファイルを整理するさまざまな方法があります。 Web上のタイル画像は、個々のタイルURLをすべて見つけてダウンロードし、それらをつなぎ合わせることによってのみダウンロードできます。これがタイル画像ダウンローダーの機能です。

zoomable image

タイル画像ダウンローダーの作成

タイル画像のダウンローダーをいくつか維持しています(主に dezoomifydezoomify-rs )。それらの実装は非常に単純です。ソフトウェアアーキテクチャの課題は次のとおりです。

  1. 実際にネットワーク要求を行わなくても、可能な限り多くのソフトウェアをテスト可能にする
  2. コードを複製することなく、さまざまなタイル画像形式をサポートします。

各タイル画像形式に固有のソフトウェアのモジュールをdezoomersと呼びます。目標は、ズーム解除ツールをできるだけ小さくして、ソフトウェアのcoreでほとんどの作業を実行できるようにすることです。

テンプレートのみのタイル画像ダウンロードの実装

現在、 dezoomify-rs では、デズーマーがタイルURLと関連する位置のリストを提供し、コアがタイルを並行してダウンロードしてステッチします。これはほとんどの画像形式で機能しますが、テンプレートのみのダウンロードでは機能しません。

テンプレートのみのダウンロード は、ソフトウェアがhttp://test.com/{x},{y}.jpg形式のURLテンプレートを単一の入力として受け取り、{x}{y}を座標で置き換えて画像を作成できるようにする機能です。ここでの課題は、xとyの境界が事前にわかっておらず、タイルを要求し、サーバーの応答を調べることによってのみ計算できることです。サーバーが404を返すとすぐに、 xの最大値。次の行に処理します。サーバーがx = 0の場合でも404を返すまで、その時点でyの最大値に達したことがわかります。

これは、テンプレートのみのダウンロード用に実装できる状態マシンで作成した簡単なスキーマです。

state machine

問題は、次のような方法でソフトウェアを構築する方法です。

  1. すべてのタイルURLが事前にわかっている場合、テンプレートのみのダウンロードと従来のデズーマーの両方を許可します。
  2. 効率的です(常にできるだけ多くのタイルを並行してダウンロードします)
  3. テスト可能です
  4. コードの重複を回避
8
lovasoa

これはトリックを実行するアルゴリズムのスケッチです-救助のための機能ツール:

  • URLのリストではなく、URLのstream(またはgenerator)の観点からコアダウンローダーを実装します(JavaScriptまたはRust自分だけで、他のいくつかの言語でのみですが、両方の言語がこれらの概念をサポートするという情報がWebで見つかりました)。

  • ダウンローダーは、並列ダウンロードキューを最大N個の要素で満たします。Nは、許可される同時ダウンロードの最大数です。このような実装は、「有限」ストリームと「無限」ストリーム(遅延ジェネレーター関数に基づく)で機能する必要があることに注意してください。 404を取得すると、追加の停止基準として機能します。

  • ダウンロードされた画像は、「スティッチャー」に渡すために、非同期イベント(またはコールバック関数)を介して返される必要があります。このメカニズムは、ダウンロードの失敗について発信者に通知するためにも使用できます。

これで、従来のダウンローダーだけでなく、テンプレートのみのダウンロードでも再利用できます。最初のものは明白であるべきです。 2番目の方法は、上記でスケッチした2ステップの方法で正確に機能しますが、これは、ストリーム用に生成されたURLの順序を表す点が異なります。

  • 最初に、タイルの「無限」ストリーム(1,1)、(2,1)、(3,1)などから始めて、xの制限を見つけ、最初の行をダウンロードします

  • 次に、(1,2)、(2,2)、...、(MaxX、2)、(1,3)、(2,3)、...のURLを「無限ストリーム」として提供します"、ダウンロードが停止するまで。

これが要件1、2、4を満たしていることは明らかです。要件#3は、ここでのアルゴリズムと完全に直交しており、ダウンロード機能を一部の「モック」ダウンロード機能。

これが十分に明確であるといいのですが、そうでない場合でも、遠慮なく質問してください。

2
Doc Brown