我知道如果边界已更改,就会触发一个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/