1

そのため、マップ上に 2 つのポリゴン レイヤーがあります。これらのポリゴンは、ズーム レベルに依存します。

ズームインすると、最初のレベルのポリゴンを非表示にする (またはリスナーを削除して透明にする) 必要があり、ズームアウトすると、レベル 2 のポリゴンを非表示にして最初のレベルのポリゴンを表示する必要があります。

私の現在の戦略は、最初はポリゴンを透明にし、必要に応じてリスナーが不透明にすることです。ポリゴンの切り替えを実現するには、ズームが変更されたときにリスナーを追加および削除します。

したがって、レベル1ポリゴンの配列とレベル2ポリゴンの配列がありますが、それらを切り替えることができないようです。

これがうまくいかないのはなぜですか?addListener は removeListener と正反対のことをすべきではありませんか?

function zoomedout(map) {

$.each(level2Listeners, function(k,v) {
   google.maps.event.removeListener(v);
});



$.each(level1Listeners, function(k,v) {
   google.maps.event.addListener(v);
});

}

トグルを達成するための他のより合理的な戦略はありますか?

4

2 に答える 2

1

あなたは別の合理的なアプローチを求めました.私は数ヶ月前に同様のタスクを行い(ズームに応じて約5000のオーバーレイを切り替えます)、別の解決策に出会いました.

Polygon はMVCObjectです。MVCObject のプロパティを別の MVCObject のプロパティにバインドできます。

Map-Instance (MVCObject でもあります) の新しいプロパティを作成し、zoom_changed-event でこれらのプロパティを更新しました。

ワークフロー:

  1. zoom_changed のプロパティを設定します
    google.maps.event.addListener(map,'zoom_changed',function(){
    
       var z=this.getZoom();
    
        // zoom<=5 の場合は map.prop1 を Map-instance に設定し、それ以外の場合は null に設定します
       var p1=(z<=5)?this:null;if(this.get('prop1')!==p1){this.set('prop1',p1);}
    
        // zoom>5 の場合は map.prop2 を Map-instance に設定し、それ以外の場合は null に設定します
       var p2=(z>5)?this:null;if(this.get('prop2')!==p2){this.set('prop2',p2);}
    });
  2. オーバーレイのマップ プロパティを目的のプロパティにバインドします。
    //このポリゴンは最大 5 までのズームでのみ表示されます
    somePolygon.bindTo('map',map,'prop1');
  3. zoom_changed-event をトリガーしてプロパティを初期化します。
    google.maps.event.trigger(map, 'zoom_changed');

4 つの円を含む簡単なデモ: http://jsfiddle.net/doktormolle/FPvLx/

于 2013-07-03T00:51:15.090 に答える