在 Google Maps API v3.0 中多次调用 map.fitBounds()
Posted
技术标签:
【中文标题】在 Google Maps API v3.0 中多次调用 map.fitBounds()【英文标题】:Calling map.fitBounds() Multiple Times in Google Maps API v3.0 【发布时间】:2011-04-21 20:28:22 【问题描述】:我刚刚开始使用 Google Maps API (v3.0),到目前为止已经取得了很大的成功。我正在从数据库中加载一组具有纬度和经度值的对象,将它们传递到我的脚本中,然后在脚本中循环它们以将它们添加到地图中。
我正在使用“bounds.extend()
/map.fitBounds()
”方法来设置地图的缩放和边界(参见下面的代码),这在第一次时可以正常工作;但是,如果我清除现有标记,获取另一组对象,然后在同一个地图实例上做同样的事情,它会错误地设置边界,通常会导致最小缩放(宇航员的视图)。
我怀疑我的地图对象对我给它的前一组边界有一些记忆,我需要在分配新的边界之前找到一种方法来清除这些边界,但我真的不能太确定了。
非常感谢任何帮助!
var locationList = [];
for (var i = 0; i < mapPoints.length; i++) // mapPoints is a collection of DTOs
var mapPoint = mapPoints[i];
var location = new google.maps.LatLng(mapPoint.Latitude, mapPoint.Longitude);
locationList.push(location);
var marker = new google.maps.Marker(
map: map,
icon: '/Content/images/map/' + mapPoint.Status.Icon,
shadow: '/Content/images/map/shadow.png',
position: location
);
markers.push(marker); // markers is an Array that is managed outside this loop
var bounds = new google.maps.LatLngBounds();
for (var j = 0; j < locationList.length; j++)
bounds.extend(locationList[j]);
map.fitBounds(bounds);
【问题讨论】:
加载一组新标记时是否清除了locationList
变量?
locationList
每次都被初始化(代码示例中的第一行),因此在循环开始之前为空。
【参考方案1】:
可以这么说,这不是答案,而是我在 Google Maps javascript API v3 组的 thread 上发现的一个(有点骇人听闻的)解决方法:
//map.fitBounds(bounds);
setTimeout( function() map.fitBounds( bounds ); , 1 );
【讨论】:
setTimeout 或 Angular 的 $timeout 在执行之前等待当前的摘要周期完成,虽然我不确定为什么会这样,但我猜还有其他一些与 fitBounds 冲突的进程去完成。更好的选择可能是监听该进程的完成事件,如果你知道它是什么。 也适合我。很奇怪。 谢谢!我不得不使用 100 毫秒而不是 1 毫秒来解决问题。此外,这还给了我一个有趣的动画!【参考方案2】:如果上述答案对您不起作用(对我不起作用),则问题可能出在引导程序中(假设您正在使用它)。当我在其中嵌入地图对象时,引导模式会特别产生各种不稳定的行为。如果/当我在那里放置“警报”时会奇怪地纠正自己。无论如何,我通过构建自己的模式解决了我所有的问题(即,不使用引导模式)。
【讨论】:
以上是关于在 Google Maps API v3.0 中多次调用 map.fitBounds()的主要内容,如果未能解决你的问题,请参考以下文章
Google Maps Place API 和 Google Maps Time Zone API 之间的区别
在 maps.google.com 上的缩放比在 Google Maps API v3 上更流畅
google maps js v3 api教程 -- 在地图上添加标记
Google Places API 中缺少 Google Maps 中的地点