5

Google Mapsv3APIを使用しています。私は現在、人がビューポートを変更するたびに(マップをズームまたはシフトすることによって)新しいデータをフェッチするように要求しており、古いデータを破棄しています。これはうまく機能しますが、ビューポートが変更されるたびにデータをフェッチする必要がないように、データをキャッシュしたいと思います。Google Maps APIは、緯度と経度で構成される北東と南西の座標によってビューポートを定義します。それらはLatLngBoundsと呼ばれるオブジェクトに保存されます。

私はこれを行うことができる2つの方法を考え出しました:

  1. ユーザーがアクセスする新しいビューポートの境界を保存し、新しいビューポートが古いビューポートにあるかどうかを確認し、古いビューポート内にない新しいビューポートの部分の新しいデータのみをフェッチします。基本的に、
  2. 新しいビューポートをそれぞれ、データとフェッチする必要のあるデータの長方形のセクションに分割します。各長方形セクションの境界を格納します。

誰かがこれを行うためのより良い方法を考えることができるなら、新しいアプローチを自由に提案してください。

私の質問は、パフォーマンス/メモリ使用量と全体的な速度の点でどちらが優れているかということです。それらは両方とも類似したアルゴリズムなので、それは本当に重要ですか?

また、現在、両方のアルゴリズムは、古いビューポートに基づいて新しいビューポートを分割することに依存しています。新しいビューポートを分割するアルゴリズムはどのようになりますか?(2番目のアルゴリズムを実装したと仮定します)

var prevBounds = [ /* Array of previously seen bounds */ ];
var newViewport = map.getBounds(); // New Viewport to divide up
var sw = newViewport.getSouthWest();
var swlat = sw.lat();
var swlng = sw.lng();
var ne = newViewport.getNorthEast();
var nelat = ne.lat();
var nelng = ne.lng();
// newViewport.intersects(bounds) 
// Returns true if this bounds shares any points with this bounds.
4

1 に答える 1

1

これは、Googleがマップタイルを提供する方法とほぼ同じように行うことを検討するかもしれません。ビューポート全体のデータを一度に読み込むのではなく、マップ全体を正方形の領域(おそらくGoogleの256x256タイルよりも大きい領域)に分割して、どの領域を決定するかを決定します。現在のビューポートにあり、それらの領域のデータをロードします。ユーザーがマップをパンおよびズームするときに、ビューポートの境界をチェックして、新しい領域がフレームに入ったかどうかを確認し、必要に応じてそれらをロードします。大まかな擬似コード:

var cache = {}

function onViewportChange() {
    // get new bounds
    var bounds = map.getBounds();
    // identify all the areas in the bounds
    var areas = getAreas(bounds);
    areas.forEach(function(area) {
        if (area.key in cache) {
            // do nothing, or load items from cache
        } else {
            // load new data, storing the key (and maybe the data) 
            // to the cache
        }
    })
}

function getAreas(bounds) {
    /* given a set of bounds, return an array of objects like:
    [
        {
           x: 1,
           y: 2,
           zoom: 4,
           key: "4-1,2",
           bounds: b // lat/lon bounds of this area
        },
        ...
    ]
    */
}

(実装方法のアイデアについては、マップ座標のGoogleの説明この例getAreasを参照してください。)

これの魅力は、取得する領域がはるかに単純であり、特定の領域のデータがすでにロードされているかどうかを非常に簡単に確認できることです。各領域には、単純な一意のキー、おそらくから作成された文字列を含めることができます。 x / y /ズーム座標。新しい領域が読み込まれるたびに、キー(またはキーとデータ-マップから古いデータを削除するか、そのままにしておくかによって異なります)をキャッシュに保存します。物体。次に、ビューポートが新しい領域に移動するときに行う必要があるのは、キャッシュ内にそのキーが存在するかどうかを確認することだけです。

欠点は、現在のビューポートの外部にデータをロードすることが多く、提案した実装よりも多くのリクエストをサーバーに送信する可能性があることです。この方法は、さまざまなズームレベルでさまざまなデータを提供している場合に最適に機能する可能性があります。そうでない場合は、さまざまなズームで適切に機能する単一サイズのキャッシュ領域を選択しようとして立ち往生する可能性があります。

于 2011-05-13T21:47:10.237 に答える