0

マップがパンされるたびに、何らかの原因でレイヤー タイルが破棄され、再取得されます。

ではOpenLayers.Layer.Grid.moveTo、現在のタイル境界をチェックし、既存のタイルを再利用するか ( を使用moveGriddedTiles)、最初からすべて取得するか( を使用) を決定しinitGriddedTilesます。タイルの境界が正しくないため (角度で表示されることもあれば、間違った方向に変換されたように見えることもあります - 約 0.0015...)。

どこから探し始めればよいか、何か手がかりを持っている人はいますか?

4

1 に答える 1

0

transform()これは、カスタム getURL 関数で境界を指定し、最初にそれらを忘れたclone()場合の問題であることが判明しました。

this.layer = new OpenLayers.Layer.XYZ(
    'layer description',
    myBaseUrl + '&x=${x}&y=${y}&z=${z}',
    {
        name: 'layer name',
        getURL: getMyTileUrl,
        type: 'jpg',
        minZoomLevel: 15,
        maxZoomLevel: 18,
        isBaseLayer: false,
        transitionEffect: 'resize',
        buffer: 3
    }
);

function getMyTileUrl(bounds) {
    bounds = bounds.transform(this.projection,"EPSG:4326");
    // ...
    return this.url + z + "/" + x + "/" + y + "." + this.type;
}

解決策は、境界を変換する前に単に境界を複製することでした。

function getMyTileUrl(bounds) {
    bounds = bounds.clone().transform(this.projection,"EPSG:4326");
    // ...
    return this.url + z + "/" + x + "/" + y + "." + this.type;
}

境界のクローンを作成するのを忘れていたということは、そのタイルの「公式の」境界オブジェクトを変換していたことを意味します。次にこの境界オブジェクトを使用するときは、現在ロードされているタイルが新しいマップ境界と交差するかどうかを判断し、一部のタイルを移動するか、すべて破棄して新しいタイルをフェッチするかを決定します。それらは別の投影法に変換されたため、OpenLayers は、現在読み込まれているタイルが惑星のまったく別の場所からのものであると考え、それらをすべて破棄して最初からやり直しました。

于 2013-10-11T16:19:14.463 に答える