我知道如果边界已更改,就会触发一个bounds_changed事件,但是我需要知道fitBounds何时完成(边界已更改或边界保持不变)。

Google具有某种容忍度,如果边界变化很小,则实际上不会更改边界/调用bounds_changed。我需要知道什么时候发生。

我已经成功地完成了超时操作,但是当bounds_changed花费超过100ms的时间触发时,它似乎很笨拙,并且可能容易出错。

请参见示例: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;
    }


两年后编辑:

似乎在最新的Google Maps实验版本(3.32)中,即使边界与当前边界相同,也会触发bounds_changed

我将原始示例更新为版本3.31,该版本仍显示原始问题。

最佳答案

解决此问题的第一部分(知道边界何时完成更改)的最简单方法是使用idle event listener

更改边界的方式,请在更改边界之前设置此事件。这样,当边界全部确定后,地图将注册为空闲,并且将触发空闲事件,您可以在其中进行调整。为防止事件相互叠加,也请同时清除它。

您可能需要花些力气。说到摆弄,这是一个小提琴。在这个小提琴中,我只是将警报设置为每次发生:

https://jsbin.com/kapimov/edit?js,output单击“更改范围”,您将一遍又一遍地看到它:)

编辑:要检查是否失败时是否触发fitBounds(),请在触发fitBounds()之前和之后比较中心。

即使试图将边界设置为相同的坐标两次,中心也会发生变化并且可以比较。中心检查似乎发生在地图实际移动边界之前,但始终在调用该函数时发生变化。

两次点击“ Fit Current Bounds”(适应当前范围)按钮,以查看其实际效果;第一次“ bounds_changed”触发,第二次没有触发,但中心仍然正确检查。注释掉fitBounds()函数,看看没有它中心不会改变。

关于javascript - 谷歌 map fitBounds回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35761416/

10-09 03:02