2

現在、ユーザー入力に基づいてさまざまなKMZファイルを動的にロードおよびアンロードするGoogleマッププロジェクトを構築しています。およそ8レイヤーのロード/アンロードでは正常に機能しますが、Googleマップは414エラーで機能しなくなります。問題を、APIが各KMLレイヤーを参照するために生成している保存された文字列まで追跡しました。

レイヤーがクリックされたときに実行されるコードは次のとおりです。

function showLayer(layername) {
  if (layers[layername].kml === undefined) {
    layers[layername].kml = loadKML(layers[layername].file, layers[layername].options);
  }
  layers[layername].kml.setMap(map);
  redrawRoutes(layers[layername].kml);
}

そしてloadKML関数:

function loadKML(file, options) {
  var path = kmlDir + file;
  options = options || { preserveViewport: true };
  layer = new google.maps.KmlLayer(path, options);
  return layer;
}

基本的に、私の目標は、各KMLファイルを1回だけロードし、それをオブジェクトに保存し、その後のロード/アンロードでそれを参照することです。ここでの問題は、new google.maps.KmlLayer生成するJavascriptオブジェクトの内部に、大きな長い文字列があることです。

"kml:cj5TNh3iqySpI_DAGiDgbSJESQ-dakZTiMY09US6imjvFNPMTIIYNAg|ks:;dc:cg;ts:44610546|kv:3|api:3"

毎回これをリクエストURIに追加します。これはかなり迅速に加算され、7〜8の追加後、URIが長すぎるため、後続の要求はすべて無視されます。

この長いリクエスト文字列を使用する方法はありますか、カスタム文字列を使用するように強制することはできますか、それとも毎回URIをクリアするだけですか?合計で最大6つのファイルしか処理しないので、できるだけ多くのレイヤーのロード/アンロードを処理できるようにしたいと考えています。

4

1 に答える 1

3

あなたはGoogleがすでに持っているものを最適化しようとしています。GoogleキャッシュのKMLファイルとそれに関連するタイル。レイヤーを破棄して再作成してもペナルティはほとんどありません。KMLレイヤーへのURLが一定である限り、レイヤーを破棄してから再作成する必要があります。

現在マップ上にあるKMLファイルの数に関係なく、Googleはそれらを単一のタイルオーバーレイとしてレンダリングします。setMapを使用してKMLレイヤーを追加/削除するたびに、ユーザーは新しいタイル画像をダウンロードする必要があります。

KMLファイルにアクセスできるのは数時間に1回だけです。おそらく、GoogleはKMLファイルへのリクエストに対して発行されたキャッシュヘッダーを尊重しようとします。ただし、強力なキャッシュヘッダーがない場合に、GoogleがKMLをキャッシュする期間は具体的に定義されていません。

また、Googleは最小キャッシュ時間を課しているため、強力なキャッシュヘッダーを介して、KMLファイルが1分後に期限切れになるように指定した場合でも、Googleは事前設定された(非公開の)時間の間ファイルをキャッシュします。標準の回避策は、以前にキャッシュされていない新しい/一意のアドレスを生成するために、KMLURLにクエリ文字列パラメータを追加することです。

于 2012-05-29T21:00:13.430 に答える