2016-03-03 73 views
0

我知道有一个bounds_changed事件,如果边界已经改变,则触发,但是我需要知道fitBounds何时完成(当边界已更改或边界保持不变)。谷歌地图fitBounds回调

谷歌有某种宽容,如果边界变化很小,它实际上不会改变边界/调用bounds_changed。我需要知道这是什么时候发生的。

我已经用超时功能成功完成了这项工作,但它似乎很难做,而且在bounds_changed需要超过100ms触发时可能会出现一些错误。

见例如:http://jsbin.com/hipavurilo/3/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; 
    } 

回答

1

来解决这个问题(当界限完成更改知道)的第一部分,最简单的方法是使用idle event listener

如何改变边界,在即将改变它们之前设置此事件。这样,当界限全部结算后,地图将被注册为空闲状态,空闲事件触发,在这里你可以做你的shiz。为了防止事件相互堆叠,请同时清除它。你可能不得不随意摆弄一下。说到摆弄,这里是一个小提琴。在这拨弄我刚才设置的警报发生的每一次:

https://jsbin.com/kapimov/edit?js,output单击“更改边界”,你会看到它在发生,在:)

编辑:要检查是否fitBounds()当它失败时触发,比较发射前后的中心fitBounds()。

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

点击“Fit Current Bounds”按钮两次以查看它的行动;第一次'bounds_changed'被触发,第二次它不但中心仍然正确检查。注释掉fitBounds()函数以查看没有它的情况下中心如何更改。

+0

调用'fitBounds'不能修改地图的边界,这就是这个问题的关键所在 –

+0

嗯,我知道,当fitBounds()不能成功移动地图时。我用一个确定的失败案例更新了小提琴,将界限定为当前界限。然后我用另一个属性 - 中心 - 来检查边界是否总是改变它。事实证明它确实!编辑我的答案以反映新的解决方案。 – tempranova

+0

拟合电流界限按钮无法正常工作,去海洋。当我使它工作时,它从不触发bounds_changed。值得注意的是,getCenter会立即触发,而不会在边界可能发生变化之后触发。也就是说,getCenter会在fitBounds之后0.1毫秒触发,但边界的更改通常在10毫秒内发生。为了使中心技巧正常工作,您需要知道fitBounds何时完成(您需要回调),以回到原始问题。 – ParoX