fitBounds() shows whole earth (if map is first hidden and then shown)

前端 未结 5 1817
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-15 06:43

I have a bunch or markers, and I want to show only the area containing them. I found a long list of similar questions (see at the bottom of the post for some), but none of the s

相关标签:
5条回答
  • 2021-02-15 07:22

    To expand a bit on @JayThakkar 's answer, this worked for me

    google.maps.event.addListenerOnce(map, 'idle', function(){
        map.fitBounds(bounds);
    });
    

    The addListenerOnce function removes the need to call google.maps.event.removeListener(listener);. And calling map.fitBounds(bounds) inside the listener let us use the calculated bounds's zoom level.

    0 讨论(0)
  • 2021-02-15 07:35

    I tried your code in a fiddle, and it works as expected.

    So the reason why your code fails must be in the definition of your datapoints (as already suggested by Engineer). Compare your list definition with mine and check if they are different.

    0 讨论(0)
  • 2021-02-15 07:43

    Modify to your needs

    map.fitBounds(bounds);
    
    var listener = google.maps.event.addListener(map, "idle", function() { 
      if (map.getZoom() > 16) map.setZoom(16); 
      google.maps.event.removeListener(listener); 
    });
    
    0 讨论(0)
  • 2021-02-15 07:43

    same problem, found the reason is that I hide the map (make the container of the map display: none;) before calling fitbounds()

    0 讨论(0)
  • 2021-02-15 07:48

    Solved (not in a nice way, though). What I ended up doing was initialising the LatLngBounds with the points when loading the page, but panning and zooming only when showing the map. In this way it works correctly. E.g.

    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);
      }
    }
    

    and then, later (click on a button for example)

    function showMap(){
      $('#map').show(function(){
        google.maps.event.trigger(map, 'resize');
        map.fitBounds(box);
        map.panToBounds(box);
      });
    }
    

    It works, but I don't like to have that global var hanging around. I implement the exact same behavior using OpenLayers, and it works correctly without the need for this hack. If anybody has a better solution, please post it and I will accept it if it works.

    Thanks to @Engineer and @Matt Handy for helping me eliminate one possible source of errors.

    0 讨论(0)
提交回复
热议问题