異なるクライアント (Web またはデスクトップ ベース) でマップ キャッシュを操作する場合、アプリケーションがタイルに対してどのように機能するか、タイルをローカルに格納するかどうか、キャッシュ オーバーレイにはどのような状況が必要とされるかを検討する必要があります。
アプリケーションによるキャッシュへのアクセスと使用
マップ サービスにタイル スキーマを定義すると、そのサービスは即座にキャッシュを使用します。マップ サービスを表示できる ArcGIS アプリケーションはすべてキャッシュを使用しますが、タイルを取得して使用する方法はアプリケーションによって異なります。
Web アプリケーション
ArcGIS API for JavaScript を使って開発する際、タイル (キャッシュ) マップ サービスへ接続していることを示す特定のクラスを使用します。たとえば、ArcGISTiledMapServiceLayer を使用してキャッシュ サービスに接続します。キャッシュ サービスを使用すると、タイルは REST コールによってキャッシュ ディレクトリからマップ サービスへ取得されます。タイル リクエストの形式は、https://<map service URL>/tile/<level>/<row>/<column> のようになります。
Web アプリケーションでキャッシュ サービスを 1 つ表示しており、タイルが存在しない場所に画面移動した場合、アプリケーションは動的なイメージを表示しないため、何も表示されません。キャッシュされていないエリアに画面移動したときにマップが表示されるようにする方法の 1 つは、オンデマンド キャッシュを有効にすることです。
ヒント:
マップの表示が予想よりも遅い場合、マップ イメージの URL を調べて、アプリケーションがタイルを取得していることを確認してください。これを実行する 1 つの方法として、Mozilla Firefox でアプリケーションを開き、[ツール] > [Web 開発] > [Web コンソール] の順にクリックします。コンソールが表示されたら、[ネットワーク] ボタンをクリックし、マップのズームや移動を行えます。
次のような URL が表示された場合、アプリケーションは REST リクエストからタイルを取得しています。
https://gisserver.domain.com:6443/arcgis/rest/services/myService/MapServer/tile/10/1723/3495.jpg
マップ イメージに別の URL が表示された場合、アプリケーションが効率の悪い方法でタイルを取得しているか、キャッシュが使用されていません。
ArcMap と ArcGIS Pro
[データの追加] ボタンを使用し、他のマップ サービスを追加する同じ方法でキャッシュ マップ サービスを ArcMap および ArcGIS Pro に追加します。キャッシュを表示する方法として次の 2 種類があります。
- マップ サービスを使用したキャッシュへのアクセス - この方法でキャッシュを表示するには、キャッシュの作成に使用された GIS サーバーとマップ サービスを参照します。この方法では、最初に GIS サーバーに接続することで、サービスにキャッシュがあるかどうかが確認されます。次に、ArcMap は、サーバーのファイル システムにあるキャッシュ ディレクトリからタイルを取得します。
- ラスター データセットとしてキャッシュにアクセス - この方法でキャッシュを表示するには、キャッシュ タイルを含むディレクトリを参照して、データセットを追加します。キャッシュには、[データの追加] ボタンを使ってその他すべてのラスターを追加する際に使用するアイコンと同じものが表示されます。ラスターとしてアクセスされるキャッシュは表示専用で、検索することはできません。このタイプのキャッシュを使用する利点は、これがマップ サービスと結び付けられておらず、キャッシュ ディレクトリにアクセス可能であれば、サーバーから切断しているときに表示できる点です。
キャッシュの縮尺レベルと完全に一致する縮尺でタイルがリクエストされた場合、マップ サービスは直接タイルを返します。ほとんどの場合、リクエストがキャッシュ内の縮尺レベルと正確に一致することはありません。この場合は、ArcMap は次に近い縮尺レベルのタイルがリクエストされ、リクエストされた縮尺に合わせてそれをリサンプリングします。このリサンプリングは、タイルを動的に生成するよりもはるかに高速ですが、元のタイルと表示が異なるイメージが作成されてしまいます。ここのリサンプリングにより、キャッシュされているマップ ラベルを特定の縮尺で読み取ることが難しくなる場合があります。最もよい結果を得るために、キャッシュが作成された縮尺か、それに近い縮尺でマップを表示してください。
キャッシュされたマップ サービスの表示パフォーマンスを改善する
クライアントが ArcGIS Server にリクエストを送信してマップ サービスを表示するときに、通常はサーバーからの応答がブラウザーによって一定期間キャッシュされ、再利用されます。この動作によって、ArcGIS Server はマップ サービスの最高の表示パフォーマンスを実現できます。ただし、アプリケーションでのマップ サービスと関連データの使用方法に応じて、ブラウザーがキャッシュ内の応答を使用する期間を調整することを検討してください。これを行うには、cacheControlMaxAge というプロパティをサービスの JSON (JavaScript Object Notation) に追加します。
cacheControlMaxAge プロパティの使用方法
ArcGIS Server マップ サービスの応答には、エンティティ タグ (ETag) ヘッダーとキャッシュ コントロール ヘッダーが含まれています。ETag ヘッダーの値は、応答の一意の識別子です。キャッシュ コントロール ヘッダーには、キャッシュから応答を再利用できる最大期間に関する情報をブラウザーに提供する max-age 値が含まれています。この値は、cacheControlMaxAge プロパティによって制御されます。
リクエストが繰り返された場合、キャッシュの最大期間の期限が切れていなければ、ブラウザーは、サーバーにリクエストを送信しないで、キャッシュされている応答を使用します。キャッシュの最大期間の期限が切れている場合、ブラウザーは、リクエストをサーバーに送信し、キャッシュ内の応答に対応する ETag 値を使用して IF-NONE-MATCH ヘッダーを設定する必要があります。ArcGIS Server は、リクエストを評価し、ETag 値を使用して、応答が変更されているかどうかを判定します。サーバーからの応答がブラウザー上のコピーと異なる場合、サーバーはまったく新しい応答をブラウザーに送信します。応答がブラウザー上のコピーと同一である場合、サーバーは、キャッシュ内の応答を引き続き使用するようにブラウザーに警告します。
cacheControlMaxAge プロパティの値の定義
ブラウザーで、キャッシュされた応答を使用できる期間を指定するには、cacheControlMaxAge プロパティを定義します。このプロパティは、個別のサービス キャッシュに対して設定できます。ArcGIS Server が完全な応答を送信する必要性を軽減することによって、ブラウザーのキャッシュを効率化し、アプリケーションを最適化し、ネットワーク帯域幅を節約することができます。
クライアントがタイルをローカルにキャッシュすることを許可しないキャッシュされたマップ サービスの場合、デフォルトは 0 です。これは、ブラウザーが必ずリクエストを再送し、ArcGIS Server がそのリクエストを処理して、コンテンツが変更されている場合に完全な応答をブラウザーに送信するということを意味します。このデフォルト値は、ほとんどのアプリケーションで有効に機能します。
クライアントがタイルをローカルにキャッシュすることを許可するキャッシュ マップ サービスの場合、デフォルト値は 86,400 秒 (1 日) です。これは、リクエストが 1 日以内に繰り返された場合、ブラウザーがキャッシュ内の応答を使用するということを意味します。
マップやデータが頻繁に変更されないキャッシュされたマップ サービスの場合は、ネットワーク トラフィックを最小限に抑えるために、デフォルト値を 30 日 (259,2000 秒) まで大きくすることをお勧めします。
cacheControlMaxAge プロパティをサービスに追加してデフォルト値を指定するには、以下の手順を実行します。
- Web ブラウザーで ArcGIS Server Administrator Directory を開き、管理者権限を持つユーザーでログインします。URL の形式は https://gisserver.domain.com:6443/arcgis/admin です。
- [services] をクリックして、変更するマップ サービスを [Services] リストから選択します。サービスがリストに表示されない場合は、[Root folder] の下のディレクトリに配置されている可能性があります。
- [Service - <サービス名> (<サービス タイプ>)] ページで下までスクロールし、[edit] をクリックします。
- [Service Properties] ダイアログ ボックスで、サービス JSON のプロパティ セクションを見つけます。
- cacheControlMaxAge プロパティをそのセクションに追加して、そのプロパティの値 (秒単位) を指定します。以下に例を示します。
"properties": { "cacheControlMaxAge": "2592000",
- [Save Edits] をクリックします。
- [Service - <サービス名> (<サービス タイプ>)] ページの [Properties] セクションで、cacheControlMaxAge プロパティと、それに指定した値が表示されていることを確認します。
キャッシュのオーバーレイ
他のマップ キャッシュとオーバーレイされるマップ キャッシュを設計する場合、アプリケーションでは、座標系とタイル サイズを一致させる必要があります。できるだけ多くの縮尺を一致させることもお勧めします。
最も簡単な方法は、両方のキャッシュでタイル スキーマを一致させてから、各キャッシュに適切な縮尺でタイルを作成するだけです。この方法により、座標系とタイル サイズを一致させ、2 つのキャッシュに同じ縮尺があることをソフトウェアに認識させることができます。
動的な描画の強制
リサンプリングが原因でタイルの品質が低いことに気付いた場合や、動的データを特定の縮尺で表示する場合は、キャッシュを無視してマップを動的に描画することをサービスに強制できます。これはマップの特定のレベルに対して実行できます。
たとえば、大縮尺でリアルタイムのデータを表示する場合を想定してみてください。マップがズーム レベル 0 ~ 15 でキャッシュされていますが、レベル 16 ~ 19 で動的に描画する必要があります。解決策は、レベル 16 ~ 19 でダイナミック レイヤーを有効にして、これらのレベルでダイナミック レイヤーを使用することをマップ リクエスト内に指定します。これを行わない場合、サービスは利用可能なタイルから構築されたマップを返しますが、タイルが存在しないエリアは空白になります。