Changing icon based on zoom level

前端 未结 3 986
无人共我
无人共我 2020-12-19 03:52

How do I go about changing an icon height & width based on the Google Maps zoom level?

I\'m using Google Maps api v3.

相关标签:
3条回答
  • 2020-12-19 04:17

    This code will change the size of the icon every time the zoom level changes so the icon is the same geographic size.

    //create a marker image with the path to your graphic and the size of your graphic
    var markerImage = new google.maps.MarkerImage(
        'myIcon.png',
        new google.maps.Size(8,8), //size
        null, //origin
        null, //anchor
        new google.maps.Size(8,8) //scale
    );
    
    var marker = new google.maps.Marker({
        position: new google.maps.LatLng(38, -98),
        map: map,
        icon: markerImage //set the markers icon to the MarkerImage
    });
    
    //when the map zoom changes, resize the icon based on the zoom level so the marker covers the same geographic area
    google.maps.event.addListener(map, 'zoom_changed', function() {
    
        var pixelSizeAtZoom0 = 8; //the size of the icon at zoom level 0
        var maxPixelSize = 350; //restricts the maximum size of the icon, otherwise the browser will choke at higher zoom levels trying to scale an image to millions of pixels
    
        var zoom = map.getZoom();
        var relativePixelSize = Math.round(pixelSizeAtZoom0*Math.pow(2,zoom)); // use 2 to the power of current zoom to calculate relative pixel size.  Base of exponent is 2 because relative size should double every time you zoom in
    
        if(relativePixelSize > maxPixelSize) //restrict the maximum size of the icon
            relativePixelSize = maxPixelSize;
    
        //change the size of the icon
        marker.setIcon(
            new google.maps.MarkerImage(
                marker.getIcon().url, //marker's same icon graphic
                null,//size
                null,//origin
                null, //anchor
                new google.maps.Size(relativePixelSize, relativePixelSize) //changes the scale
            )
        );        
    });
    
    0 讨论(0)
  • 2020-12-19 04:27

    This is the code I used eventually:

    google.maps.event.addListener(google_map, 'zoom_changed', function() {
        var z = google_map.getZoom();
    
        _.each(map_shapes, function(s) {
    
            if (! $.isFunction(s.shape.getPosition)) return;
    
            var w = s.shape.getIcon().size.width;
            var h = s.shape.getIcon().size.height;
    
            s.shape.setIcon(new google.maps.MarkerImage(
                s.shape.getIcon().url, null, null, null, new google.maps.Size(
                    w - Math.round(w / 3 * (last_zoom - z)),
                    h - Math.round(h / 3 * (last_zoom - z)))
                )
            );
    
        });
    
        last_zoom = z;
    });
    
    0 讨论(0)
  • 2020-12-19 04:36

    You should be able to add a listener on the zoom change per the docs. It doesnt get passed anything, but you can get the property via the api.

    google.maps.event.addListener(map, 'zoom_changed', function() {
        zoomLevel = map.getZoom();
        //this is where you will do your icon height and width change.     
      });
    
    0 讨论(0)
提交回复
热议问题