Google Maps API v3:如何动态更改标记图标?

问题描述:

使用Google Maps API v3,如何以编程方式更改标记图标?Google Maps API v3:如何动态更改标记图标?

我想要做的是,当有人悬停在一个链接上 - 让地图上的相应标记图标改变颜色来表示相关标记。

本质上,与Roost所做的功能基本相同。

当你将鼠标悬停在左侧家上市后,在右边的相应标记改变颜色

+0

您的示例已停用。只是想让你知道。我认为它与airbnb.com发生的情况类似? – FujiRoyale 2015-04-30 18:23:08

调用marker.setIcon('newImage.png') ......看here的文档。

您是否在问实际的方法?您可以创建每个div,并添加一个mouseovermouseout侦听器,该侦听器将更改图标并返回标记。

+7

这应该被标记为最佳答案。 – 2012-10-24 14:32:16

+5

,帮助我弄清楚如何更改标记的动画:'markersArray [0] .setAnimation(google.maps.Animation.BOUNCE);' – Ray 2012-10-26 17:40:19

GMaps Utility Library有一个名为MapIconMaker的插件,可以方便地生成不同的标记样式。它使用Google Charts来绘制标记。

有一个很好的演示here,它显示了你可以用它做什么样的标记。

+3

MapIconMaker不适用于地图API v3 – benjisail 2010-08-18 09:04:29

+0

[StyledMarker](http:/ /尽管如此,API v3的/google-maps-utility-library-v3.googlecode.com/svn/trunk/styledmarker/)。 HTH。 – tatlar 2011-11-12 00:21:05

+1

不幸的是,Google Charts API最近已被Google正式弃用:( – 2013-06-09 12:22:29

此线程可能已经死机,但StyledMarker可用于API v3。只需使用addDomListener()方法将想要的颜色更改绑定到正确的DOM事件。这example是非常接近你想要做的。如果你看一下页面的源代码,更改:

google.maps.event.addDomListener(document.getElementById("changeButton"),"click",function() { 
    styleIcon.set("color","#00ff00"); 
    styleIcon.set("text","Go"); 
}); 

喜欢的东西:

google.maps.event.addDomListener("mouseover",function() { 
    styleIcon.set("color","#00ff00"); 
    styleIcon.set("text","Go"); 
}); 

这应该是足以让你一起移动。

DOM Events上的维基百科页面也将帮助您定位要在客户端捕获的事件。

运气好(如果你仍然需要它)

+0

有没有办法将地图指针更改为任何自定义形状? – 2015-03-30 06:23:10

+0

是的,但更改地图指针是通过更改CSS中的游标属性完成的,而不是在地图中API - 请参阅[文档](http://www.w3.org/TR/css3-ui/#cursor) – tatlar 2015-03-31 12:52:18

+0

This [StackOverflow question and answers](http://stackoverflow.com/questions/8652178)可能会进一步指导你。 – tatlar 2015-03-31 12:54:35

你也可以使用一个圆形的标记图标,例如:

var oMarker = new google.maps.Marker({ 
    position: latLng, 
    sName: "Marker Name", 
    map: map, 
    icon: { 
     path: google.maps.SymbolPath.CIRCLE, 
     scale: 8.5, 
     fillColor: "#F00", 
     fillOpacity: 0.4, 
     strokeWeight: 0.4 
    }, 
}); 

,然后,如果你要动态地改变标记(像鼠标悬停),就可以了,例如:

oMarker.setIcon({ 
      path: google.maps.SymbolPath.CIRCLE, 
      scale: 10, 
      fillColor: "#00F", 
      fillOpacity: 0.8, 
      strokeWeight: 1 
     }) 

你可以试试这个代码

<script src="http://maps.googleapis.com/maps/api/js"></script> 
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js"></script> 

<script> 

    function initialize() 
    { 
     var map; 
     var bounds = new google.maps.LatLngBounds(); 
     var mapOptions = { 
          zoom: 10, 
          mapTypeId: google.maps.MapTypeId.ROADMAP  
         }; 
     map = new google.maps.Map(document.getElementById("mapDiv"), mapOptions); 
     var markers = [ 
      ['title-1', '<img style="width:100%;" src="canberra_hero_image.jpg"></img>', 51.508742, -0.120850, '<p> Hello - 1 </p>'], 
      ['title-2', '<img style="width:100%;" src="canberra_hero_image.jpg"></img>', 51.508742, -0.420850, '<p> Hello - 2 </p>'], 
      ['title-3', '<img style="width:100%;" src="canberra_hero_image.jpg"></img>', 51.508742, -0.720850, '<p> Hello - 3 </p>'], 
      ['title-4', '<img style="width:100%;" src="canberra_hero_image.jpg"></img>', 51.508742, -1.020850, '<p> Hello - 4 </p>'], 
      ['title-5', '<img style="width:100%;" src="canberra_hero_image.jpg"></img>', 51.508742, -1.320850, '<p> Hello - 5 </p>'] 
     ]; 

     var infoWindow = new google.maps.InfoWindow(), marker, i; 
     var testMarker = []; 
     var status = []; 
     for(i = 0; i < markers.length; i++) 
     { 
      var title = markers[i][0]; 
      var loan = markers[i][1]; 
      var lat = markers[i][2]; 
      var long = markers[i][3]; 
      var add = markers[i][4]; 


      var iconGreen = 'img/greenMarker.png'; //green marker 
      var iconRed = 'img/redMarker.png';  //red marker 

      var infoWindowContent = loan + "\n" + placeId + add; 

      var position = new google.maps.LatLng(lat, long); 
      bounds.extend(position); 

      marker = new google.maps.Marker({ 
       map: map, 
       title: title, 
       position: position, 
       icon: iconGreen 
      }); 
      testMarker[i] = marker; 
      status[i] = 1; 
      google.maps.event.addListener(marker, 'click', (function toggleBounce(i,status,testMarker) 
      { 
       return function() 
       { 
        infoWindow.setContent(markers[i][1]+markers[i][4]); 
        if(status[i] === 1) 
        { 
         testMarker[i].setIcon(iconRed); 
         status[i] = 0; 

        } 
        for(var k = 0; k < markers.length ; k++) 
        { 
         if(k != i) 
         { 
          testMarker[k].setIcon(iconGreen); 
          status[i] = 1; 

         } 
        } 
        infoWindow.open(map, testMarker[i]); 
       } 
      })(i,status,testMarker)); 
      map.fitBounds(bounds); 
     } 
     var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) 
     { 
      this.setZoom(8); 
      google.maps.event.removeListener(boundsListener); 
     }); 
    } 
    google.maps.event.addDomListener(window, 'load', initialize); 

</script> 

<div id="mapDiv" style="width:820px; height:300px"></div>