7

ズームが変更された後にマップの境界を取得しようとしていますが、境界が再計算される前にzoom_changed イベントが発生します。したがって、zoom_changed ハンドラーでは、新しい境界ではなく、以前の境界を取得します。

ズームの変更で適切な境界を取得する方法はありますか?

4

4 に答える 4

17

これはバグです。興味がある場合は、この問題にスターを付けてください。

それには醜い回避策があります:

google.maps.event.addListener(map, 'zoom_changed', function () {
    google.maps.event.addListenerOnce(map, 'bounds_changed', function (e) {
            my_zoom_handler(); // do your job here
    });
});
于 2011-11-23T09:38:44.067 に答える
3

APIドキュメントから:

ビューポートの変更を検出しようとしている場合は、構成要素であるzoom_changedおよびcenter_changedイベントではなく、特定のbounds_changedイベントを使用してください。Maps APIはこれらの後者のイベントを個別に発生させるため、get_bounds()は、ビューポートが正式に変更されるまで、有用な結果を報告しない場合があります。このようなイベントの後にget_bounds()を実行する場合は、代わりに必ずbounds_changedイベントをリッスンしてください。

于 2009-06-17T08:29:35.570 に答える
2

bounds_changed をバインドし、ズーム後にマーカー/マップを操作するには、次を使用します。

google.maps.event.addListener(map, 'zoom_changed', function() {
    this.zoomChanged = true;
});

google.maps.event.addListener(map,"bounds_changed",function() {
    if (this.zoomChanged) {
        this.zoomChanged = false;
        // DO YOUR STUFF
    }
});
于 2012-07-05T17:55:56.627 に答える
0

これと同じ問題がありました。他のソリューションで抱えていたいくつかの問題を解決するために、私が最終的に取り組んだことは次のとおりです。

*マウスまたは矢印キーを使用するかどうかに関係なく、境界を適切に適用します

* 矢印キーを押したままにしても、パンの加速によりエッジを 1 ステップで「オーバーシュート」するため、エッジの手前で停止しません。端を叩いて離し、もう一度押すと、いくつかの解決策では、もう少しスクロールします)

※エッジに当たって「跳ね返らない」

*ズーム変更の境界を適切に適用

編集:スクロールホイールでズームを変更すると機能しますが、ズームコントロールでは機能しません。少しいじってみましょう。それも機能するかどうかを確認します...

編集 2: 問題は、パン コントロールを削除したためです。パン コントロールが存在する限り、これはスクロール ホイールとズーム コントロールの両方で正常に機能します。

EDIT 3: いいえ...そうではありませんでした。ズーム コントロールを処理するようにコードを更新しました。

// bounds of the desired area
var allowedBounds = new google.maps.LatLngBounds(
                    new google.maps.LatLng(-64, -64), 
                    new google.maps.LatLng(64, 64)
                    );

var zoomChanged = false;

google.maps.event.addListener(map, 'center_changed', function() {
  var mapBounds = map.getBounds();

  if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
    var newCenter = new google.maps.LatLng(map.getCenter().lat() -
                                           (mapBounds.getNorthEast().lat() -
                                           allowedBounds.getNorthEast().lat()),
                                           map.getCenter().lng(), true);
    map.panTo(newCenter);
    return;
  }

  if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
    var newCenter = new google.maps.LatLng(map.getCenter().lat(),
                                           map.getCenter().lng() -
                                           (mapBounds.getNorthEast().lng() -
                                           allowedBounds.getNorthEast().lng()), true);
    map.panTo(newCenter);
    return;
  }

  if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
    var newCenter = new google.maps.LatLng(map.getCenter().lat() +
                                           (allowedBounds.getSouthWest().lat() -
                                           mapBounds.getSouthWest().lat()),
                                           map.getCenter().lng(), true);
    map.panTo(newCenter);
    return;
  }

  if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
    var newCenter = new google.maps.LatLng(map.getCenter().lat(),
                                           map.getCenter().lng() +
                                           (allowedBounds.getSouthWest().lng() -
                                           mapBounds.getSouthWest().lng()), true);
    map.panTo(newCenter);
    return;
  }
}, this);

google.maps.event.addListener(map, 'zoom_changed', function() {
  zoomChanged = true;
}, this);

google.maps.event.addListener(map, 'bounds_changed', function() {
  if(zoomChanged) {   
    var mapBounds = map.getBounds();

    if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
      var newCenter = new google.maps.LatLng(map.getCenter().lat() -
                                             (mapBounds.getNorthEast().lat() -
                                             allowedBounds.getNorthEast().lat()),
                                             map.getCenter().lng(), true);
      map.panTo(newCenter);
      return;
    }

    if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
      var newCenter = new google.maps.LatLng(map.getCenter().lat(),
                                             map.getCenter().lng() -
                                             (mapBounds.getNorthEast().lng() -
                                             allowedBounds.getNorthEast().lng()), true);
      map.panTo(newCenter);
      return;
    }

    if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
      var newCenter = new google.maps.LatLng(map.getCenter().lat() +
                                             (allowedBounds.getSouthWest().lat() -
                                             mapBounds.getSouthWest().lat()),
                                             map.getCenter().lng(), true);
      map.panTo(newCenter);
      return;
    }

    if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
      var newCenter = new google.maps.LatLng(map.getCenter().lat(),
                                             map.getCenter().lng() +
                                             (allowedBounds.getSouthWest().lng() -
                                             mapBounds.getSouthWest().lng()), true);
      map.panTo(newCenter);
      return;
    }

    zoomChanged = false;
  }
}, this);
于 2013-06-26T19:22:25.087 に答える