2010-07-19 8 views
9

J'ai une carte Google fonctionnant sur l'API v3, j'ai ajouté des marqueurs personnalisés, est-il possible de les faire évoluer en fonction du niveau de zoom de la carte? J'ai essayé de rechercher la référence mais je n'arrive pas à trouver de méthodes pour redimensionner une MarkerImage.Redimensionner les marqueurs en fonction du zoom Google maps v3

Peut-être que je dois supprimer des marqueurs tout le zoom de la carte et créer de nouveaux marqueurs de taille différente?

Répondre

7

Malheureusement, vous devez définir setIcon à chaque fois. Cependant, vous pouvez les prédéfinir, puis les appliquer au marqueur.

zoomIcons = [null, icon1, icon2]; // No such thing as zoom level 0. A global variable or define within object. 
marker.setIcon(zoomIcons[map.getZoom()]); 
+2

Vous pouvez également brancher à un événement zoom_changed, tels que: google.maps.event.addListener (carte, "zoom_changed", function() {var zoom = map.getZoom(); // faire quelque chose en fonction du zoom actuel}); – Dr1Ku

24

Ce code sera redimensionné à chaque fois que la carte est agrandie afin qu'elle couvre toujours la même zone géographique.

//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

Merci cela a fonctionné! J'aime aussi l'étape supplémentaire de mise à l'échelle pour couvrir la portion géographique. Cependant, pour moi, les marqueurs sont symboliques, donc j'ai juste utilisé des conditions de comparaison sur map.getZoom() pour les mettre à l'échelle de manière appropriée. – efwjames

+1

Merci pour votre code. Apparemment, MarkerImage était obsolète et supprimé. Utilisez maintenant ceci -> https://developers.google.com/maps/documentation/javascript/markers#convertingtoicon –

Questions connexes