Google Maps v3: Enforcing min. zoom level when using fitBounds

前端 未结 8 1712
攒了一身酷
攒了一身酷 2020-12-12 15:02

I\'m drawing a series of markers on a map (using v3 of the maps api).

In v2, I had the following code:

  bounds = new GLatLngBounds();

  ... loop th         


        
相关标签:
8条回答
  • 2020-12-12 15:13

    At this discussion on Google Groups I discovered that basically when you do a fitBounds, the zoom happens asynchronously so you need to capture the zoom and bounds change event. The code in the final post worked for me with a small modification... as it stands it stops you zooming greater than 15 completely, so used the idea from the fourth post to have a flag set to only do it the first time.

    // Do other stuff to set up map
    var map = new google.maps.Map(mapElement, myOptions);
    // This is needed to set the zoom after fitbounds, 
    google.maps.event.addListener(map, 'zoom_changed', function() {
        zoomChangeBoundsListener = 
            google.maps.event.addListener(map, 'bounds_changed', function(event) {
                if (this.getZoom() > 15 && this.initialZoom == true) {
                    // Change max/min zoom here
                    this.setZoom(15);
                    this.initialZoom = false;
                }
            google.maps.event.removeListener(zoomChangeBoundsListener);
        });
    });
    map.initialZoom = true;
    map.fitBounds(bounds);
    

    Hope that helps,

    Anthony.

    0 讨论(0)
  • 2020-12-12 15:16

    You can also set the maxZoom option just before calling fitBounds() and reset the value afterwards:

    if(!bounds.isEmpty()) {
        var originalMaxZoom = map.maxZoom;
        map.setOptions({maxZoom: 18});
        map.fitBounds(bounds);
        map.setOptions({maxZoom: originalMaxZoom});
    }
    
    0 讨论(0)
  • 2020-12-12 15:16

    Anthony's solution is very nice. I only needed to fix the zoom for the inital page load (ensuring that you weren't too far zoomed in to start with) and this did the trick for me:

    var zoomChangeBoundsListener =
        google.maps.event.addListener(map, 'bounds_changed', function(event) {
            google.maps.event.removeListener(zoomChangeBoundsListener);
            map.setZoom( Math.min( 15, map.getZoom() ) );
        });
    
    
    map.fitBounds( zoomBounds );
    
    0 讨论(0)
  • 2020-12-12 15:27

    When you call map.fitBounds() on one item - the map may zoom in too closely. To fix this, simply add 'maxZoom' to mapOptions...

    var mapOptions = {
      maxZoom: 15
    };
    
    0 讨论(0)
  • 2020-12-12 15:29

    In my case, I simply wanted to set the zoom level to one less than what google maps chose for me during fitBounds. The purpose was to use fitBounds, but also ensure no markers were under any map tools, etc.

    My map is created early and then a number of other dynamic components of the page have an opportunity to add markers, calling fitBounds after each addition.

    This is in the initial block where the map object is originally created...

    var mapZoom = null;
    

    Then this is added to each block where a marker is added, right before the map.fitBounds is called...

    google.maps.event.addListenerOnce(map, 'bounds_changed', function() { 
        if (mapZoom != map.getZoom()) { 
            mapZoom = (map.getZoom() - 1); 
            map.setZoom(mapZoom); 
        } 
    });
    

    When using 'bounds_changed' without the check in place, the map zoomed out once for every marker regardless of whether it needed it or not. Conversely, when I used 'zoom_changed', I would sometimes have markers under map tools because the zoom didn't actually change. Now it is always triggered, but the check ensures that it only zooms out once and only when needed.

    Hope this helps.

    0 讨论(0)
  • 2020-12-12 15:29

    Since Google Maps V3 is event driven, you can tell the API to set back the zoom to a proper amount when the zoom_changed event triggers:

    var initial = true
    google.maps.event.addListener(map, "zoom_changed", function() {
        if (initial == true){
           if (map.getZoom() > 11) {
             map.setZoom(11);
             initial = false;
           }
        }
    }); 
    

    I used initial to make the map not zooming too much when the eventual fitBounds is permorfed, but to let the user zoom as much as he/she wants. Without the condition any zoom event over 11 would be possible for the user.

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