8

ズームの開始直前にベクターレイヤーを表示せず、ズームの終了後に再度表示するように OpenLayers を設定しようとしています。次のように、ズームエンド部分が既に確立されています。

map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}});

function mapEvent(event) {
    if(event.type == "zoomend") {
        hide_vector_layer();
        }
}

しかし、ドキュメンテーションでズームを開始するためのイベントリスナーは見当たりません。移動、パン、ズームをカバーする「movestart」があります。残念ながら、パン中にレイヤーが消えたくないので、「movestart」は使用できません。「ズームエンド」があるので、「ズームスタート」があると思うでしょう。

私がこれをやろうとしている理由は、Google マップをベース レイヤーとして使用しているときにベクター レイヤーが異なる速度でズームする方法が気に入らないためです。ズームが完了した後、正しい場所に着地しても、すべての機能が不正確であるように見えます。

助言がありますか?

4

5 に答える 5

2

この目的のために、OpenLayers.Map の moveTo および moveByPx メソッドをオーバーライドして、ズーム以外のすべてのアクションに対する movestart イベントのトリガーを排除する必要があります。

于 2012-06-25T02:41:30.813 に答える
2

OPと同じ問題があり、drnextgisのソリューションで解決しようとしました。残念ながら、それは完全には機能しませんでした:: zoomChangedOpenLayers.Map.moveTo のプロパティはtrue、ズーム レベルが変更されたときだけでなく、マップのサイズが変更されたときにも評価されます。

私のマップはユーザーのブラウザー ウィンドウの 100% だったので、ユーザーがウィンドウのサイズを変更すると、イベントがトリガーされます。ズーム レベルが実際に変更された場合にのみイベントをトリガーしたかったので、これは望ましくありませんでした。私の解決策は、OpenLayers.Map.moveTo の先頭に挿入した「zoomstart」という新しいイベントを作成することでした。コードは次のとおりです。

var getZoom = this.getZoom();
if ( !!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom )
    this.events.triggerEvent("zoomstart", zoom);

このコードは、新しいズーム レベルを に登録されているイベント リスナーに渡しますzoomstart。私の場合は、マップの RestrictedExtent を決定し、新しいズーム レベルに基づいて他のことを行います。

平安あれ。

于 2013-02-25T23:45:18.297 に答える
1

「movestart」は「zoomstart」を処理します。ズームスタートかどうかを検出するには、次を試してください。

 map.events.register("movestart",map, function(e) {
        if(e.zoomChanged)
        {
        //zoom start code here
        }

    });
于 2014-02-19T04:14:49.737 に答える
0

「Shaunak」​​のソリューションは、私にとって非常にうまく機能しています。ズームを11未満に制限したいので、彼のコードを次のように編集しました

if (zoom > 11) {
    map.zoomToProxy(zoom, xy);
}
于 2013-09-18T07:02:00.870 に答える