2011-08-12 4 views
8

Googleマップのズームレベルに基づいて、アイコンの高さを&の幅に変更するにはどうすればよいですか?ズームレベルに基づいてアイコンを変更する

私はGoogle Maps API v3を使用しています。

+0

何らかのonzoomイベントを処理してからアイコンを変更しますか? Dunno、v3で動作しない... – TMS

答えて

6

the docsのズーム変更にリスナーを追加できるはずです。それは何も渡されませんが、あなたは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

しかし、どのようにアイコンの幅と高さを変更しますか? – CamelCamelCamel

+0

どのアイコンを変更しようとしていますか? –

+0

私は配列内にたくさんのマーカーを持っています。 – CamelCamelCamel

8

これは私が最終的に使用するコードです:

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以下でないことを確認してください。それ以外の場合は、厄介なjavascriptエラーが発生します:)常にアイコンの幅と高さが1以上であることを確認してください – Radek

+0

この回答は受け入れられるべきです。 – Andrey

+0

Google Maps API 3.11以降、 'MarkerImage'は' Icon'です。オブジェクトのフィールドに名前を付けたのは 'scaledSize'です。参照:https://developers.google.com/maps/documentation/javascript/markers#complex_icons – andi

3

アイコンが同じ地理的な大きさであるように、このコードは、たびに、ズームレベルの変更をアイコンのサイズを変更します。

//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 
     ) 
    );   
}); 
関連する問題