fitBounds()显示整个地球(如果地图首先隐藏然后显示)
我有一堆或标记,我只想显示包含它们的区域。 我发现了一长串类似的问题(请参阅帖子的底部),但没有一个解决方案适用于我。 LatLngBounds构建正确,但是当我调用fitBounds时,结果如下所示: 代替: 任何人都可以在我的代码中发现明显的错误?
var opt = {
zoom: 8,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map"),opt);
var box = new google.maps.LatLngBounds();
for(var i=0;i<list.length;i++){
var p = new google.maps.LatLng(list[i].lat,list[i].lon);
var marker = new google.maps.Marker({
position: p,
map: map
});
box.extend(p);
}
map.fitBounds(box);
map.panToBounds(box);
我阅读和尝试过的一些帖子(列表不全面):
编辑 :这实际上发生,如果(如我在我的应用程序中)地图是第一次隐藏,只显示在后面。 我以这种方式隐藏它:
$('#map').hide();
并显示它:
$('#map').show(function(){
//this is necessary because otherwise
//the map will show up in the upper left corner
//until a window resize takes place
google.maps.event.trigger(map, 'resize');
});
任何线索为什么发生这种情况以及如何防止它(除了第一次显示时初始化地图)?
在附注中,如果我在声明地图对象时设置了缩放和居中(即,我不使用fitBounds()
),则即使在隐藏/显示之后地图也会正确显示。 不过,我无法设置缩放和居中,因为点的列表在别处被检索到,我不知道它们在哪里。
解决(虽然不是一个好方法)。 我最终做的是在加载页面时使用点初始化LatLngBounds
,但仅在显示地图时进行平移和缩放。 这样它就能正常工作。 例如
var box;
function init(){
var opt = {
zoom: 8,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map"),opt);
box = new google.maps.LatLngBounds();
for(var i=0;i<list.length;i++){
var p = new google.maps.LatLng(list[i].lat,list[i].lon);
var marker = new google.maps.Marker({
position: p,
map: map
});
box.extend(p);
}
}
然后,稍后(例如点击一个按钮)
function showMap(){
$('#map').show(function(){
google.maps.event.trigger(map, 'resize');
map.fitBounds(box);
map.panToBounds(box);
});
}
它可以工作,但我不喜欢让这个全局变量悬而未决。 我使用OpenLayers实现了完全相同的行为,并且它可以正常工作,而不需要这种攻击。 如果有人有更好的解决方案,请将其发布,如果有效,我会接受。
感谢@Engineer和@Matt Handy帮助我消除一个可能的错误来源。
我在一个小提琴中尝试了你的代码,它按预期工作。
所以你的代码失败的原因必须在你的数据点的定义中(正如工程师所建议的那样)。 将您的列表定义与我的相比较,并检查它们是否不同。
修改您的需求
map.fitBounds(bounds);
var listener = google.maps.event.addListener(map, "idle", function() {
if (map.getZoom() > 16) map.setZoom(16);
google.maps.event.removeListener(listener);
});
链接地址: http://www.djcxy.com/p/81535.html
上一篇: fitBounds() shows whole earth (if map is first hidden and then shown)