fitBounds()显示整个地球(如果地图首先隐藏然后显示)

我有一堆或标记,我只想显示包含它们的区域。 我发现了一长串类似的问题(请参阅帖子的底部),但没有一个解决方案适用于我。 LatLngBounds构建正确,但是当我调用fitBounds时,结果如下所示: 在调用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);

我阅读和尝试过的一些帖子(列表不全面):

  • Google Maps v3 - 自动缩放级别?
  • 谷歌地图V3自定义标记图像和fitBounds()
  • 带有fitBounds的Google地图不会缩放
  • Google maps api V3中的fitbounds()不适合边界

  • 编辑 :这实际上发生,如果(如我在我的应用程序中)地图是第一次隐藏,只显示在后面。 我以这种方式隐藏它:

    $('#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)

    下一篇: google maps V3 fitBounds not accurate