2012-06-24 17 views
8

ズームが始まる直前にベクターレイヤーを表示しないようにして、ズームが終了した後に再び表示させるようにしています。ズームイベントリスナーの前のJavascript OpenLayers

ズームイン部分はすでに確立されていますが、ドキュメントのズーム開始のためのイベントリスナーは表示されません。移動、パン、およびズームをカバーする「movestart」があります。残念ながら、私はパンの間にレイヤーが消えないようにしたいので、 "movestart"を使うことはできません。 「ズームズーム」があるので、「ズームズーム」があると思います。

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

提案がありますか?

答えて

2

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

+0

ありがとうございます。 – renosis

2

私はOPが持っていたのと同じ問題があり、drnextgisの解決策で解決しようとしました。しかし、残念ながらそれは完全には機能しませんでした:OpenLayers.Map.moveToのzoomChangedプロパティは、ズームレベルが変更されたときだけでなく、マップのサイズが変更されたときだけでなく、trueに評価されます。

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

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

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

平和はあなたにあります。

8

ここでは、「BeforeZoom」イベントをOpenLayersに簡単に追加できます。以下のコードを地図オブジェクトを作成した場所に追加してください。この仕組み

map.zoomToProxy = map.zoomTo; 
map.zoomTo = function (zoom,xy){ 
    //Your Before Zoom Actions 

    //If you want zoom to go through call 
    map.zoomToProxy(zoom,xy); 
    //else do nothing and map wont zoom 
}; 

を活動ズームのいずれかの種類については、OpenLayersをAPIは、最終的にzoomToという関数を呼び出します。したがって、関数をオーバーライドする前に、その関数を 'zoomToProxy'という新しい関数にコピーします。これをオーバーライドし、条件付きズームロジックを追加します。ズームが必要な場合は、新しいプロキシ関数を呼び出すだけです。

+0

このアプローチはうまくいきますが、もっと安全であるためには、関数内の行をmap.zoomToProxyに置き換える必要があります。適用する(これ、議論);だから、もし彼らがzoomToに新しい引数を追加すると、それらも渡されます。 – Hoffmann

+0

ああ、実際にズームを実行する前に、OpenLayers APIがzoomToを呼び出していることを忘れてしまったので、最初のコメントの前にコードを使用して、「zoomstart」イベントのように処理します。たとえば、ズームが起こらないようにすることができます。 – Hoffmann

+0

両方のカウントで正しく。おめでとうございます! – Shaunak

0

「Shaunak」​​のソリューションは私にとって非常にうまく機能します。私は11を下回るズーム制限したい はとても「movestart」ハンドル「zoomstart」

if (zoom > 11) { 
    map.zoomToProxy(zoom, xy); 
} 
+2

これは別の答えとしてではなく、Shaunakの答えに*コメント*として投稿する必要があります。 – colllin

1

として彼のコードを編集しました。ズームスタートを検出するには、次のように試してみてください。

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

    }); 
関連する問題