0

境界が変更された場合にトリガーされるイベントがあることは知っていbounds_changedますが、fitBounds がいつ完了したか (境界が変更されたとき、または境界が同じままであったとき) を知る必要があります。

Google にはある種の許容範囲があり、境界がほとんど変更されていない場合、実際には境界が変更されず、bounds_changed が呼び出されません。これがいつ起こるかを知る必要があります。

タイムアウトを使用してこれを正常に実行しましたが、bounds_changed がトリガーされるのに 100 ミリ秒以上かかると、ハッキーでエラーが発生する可能性があります。

例を参照してください: http://jsbin.com/sosurexuke/1/edit?js,console,output

より良い解決策はありますか?

編集: map.getBounds() が fitBounds() を送信しているものと同じかどうかを確認するだけだと思う​​場合、境​​界へのフィッティングの結果が通常、送信した境界に近くないことを知ってがっかりするでしょう. これが可能かもしれないと思ってこの関数を書きました

function boundsAreIdentical(bounds1, bounds2) {
        if (!bounds1 || !bounds2) return false;

        var tolerance = 0.00001;
        console.log(bounds1.getNorthEast().lat(), bounds2.getNorthEast().lat());
        console.log(bounds1.getNorthEast().lng(), bounds2.getNorthEast().lng());
        console.log(bounds1.getSouthWest().lat(), bounds2.getSouthWest().lat());
        console.log(bounds1.getSouthWest().lng(), bounds2.getSouthWest().lng());
        if (
            (Math.abs(bounds1.getNorthEast().lat() - bounds2.getNorthEast().lat()) <= tolerance) &&
            (Math.abs(bounds1.getNorthEast().lng() - bounds2.getNorthEast().lng()) <= tolerance) &&
            (Math.abs(bounds1.getSouthWest().lat() - bounds2.getSouthWest().lat()) <= tolerance) &&
            (Math.abs(bounds1.getSouthWest().lng() - bounds2.getSouthWest().lng()) <= tolerance)) {
            return true;
        }
        return false;
    }

2年後に編集:

Google マップの最新の実験的バージョン (3.32) ではbounds_changed、境界が現在の境界と同じ場合でも起動されるようです。

元の問題をまだ示しているバージョン 3.31 に元の例を更新しました。

4

2 に答える 2

1

この質問の最初の部分 (境界の変更がいつ完了したかを知ること) を解決する最も簡単な方法は、idle イベントリスナーを使用することです。

境界を変更する場合は、境界を変更する直前にこのイベントを設定してください。そうすれば、境界がすべて解決されると、マップはアイドルとして登録され、アイドル イベントが発生し、その中でシズを行うことができます。イベントが重ならないように、同時にクリアしてください。

少しいじる必要があるかもしれません。フィドルといえば、フィドルです。このフィドルでは、毎回アラートが発生するように設定しました。

https://jsbin.com/kapimov/edit?js,output「境界の変更」をクリックすると、それが何度も繰り返されることがわかります:)

編集:失敗したときに fitBounds() が起動したかどうかを確認するには、fitBounds() を起動する前後の中心を比較します。

境界を同じ座標に 2 回設定しようとしても、中心が変化して表示され、比較できます。境界のマップが実際に移動する前に中心チェックが行われるように見えますが、その関数を呼び出すと常に変化します。

[Fit Current Bounds] ボタンを 2 回押して、実際の動作を確認します。'bounds_changed' が初めて発火し、2 回目は発火しませんが、中心は正しくチェックされます。fitBounds() 関数をコメントアウトして、それなしでは中心が変化しないことを確認してください。

于 2016-03-03T07:52:00.227 に答える