Google Maps API v3: как динамически изменять значок маркера?

105

Как программно изменить значок маркера с помощью Google Maps API v3?

Я бы хотел, чтобы при наведении курсора на ссылку соответствующий значок маркера на карте менял цвет, чтобы обозначить рассматриваемый маркер.

По сути, та же функция, что и Roost.

Когда вы наводите указатель мыши на список домов слева, соответствующий маркер справа меняет цвет

TedK
источник
Ваш живой пример упал. Просто хотел, чтобы вы знали. Полагаю, это похоже на то, что происходит на airbnb.com?
FujiRoyale

Ответы:

181

Позвоните в marker.setIcon('newImage.png')... Посмотрите здесь документы.

Вы спрашиваете, как это сделать? Вы можете просто создать каждый div, а также добавить mouseoverи mouseoutпрослушиватель, который изменит значок и обратно для маркеров.

Судхир Джонатан
источник
6
это помогло мне понять, как изменить анимацию маркера:markersArray[0].setAnimation(google.maps.Animation.BOUNCE);
Ray
19

Вы также можете использовать кружок в качестве значка маркера, например:

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
        })
Римский
источник
8

Этот поток может быть мертв, но StyledMarker доступен для API v3. Просто привяжите изменение цвета, которое вы хотите, к правильному событию DOM, используя метод addDomListener () . Этот пример довольно близок к тому, что вы хотите сделать. Если вы посмотрите на источник страницы, измените:

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");
});

Этого должно быть достаточно, чтобы вы начали двигаться дальше.

Страница Wikipedia, посвященная событиям DOM , также поможет вам настроить таргетинг на событие, которое вы хотите зафиксировать на стороне клиента.

Удачи (если она еще нужна)

татлар
источник
Да, но изменение указателя карт выполняется путем изменения свойства курсора в CSS, а не в API Карт - см. Документацию
tatlar
Этот вопрос и ответы на StackOverflow могут помочь вам в дальнейшем.
tatlar
5

В библиотеке утилит GMaps есть плагин под названием MapIconMaker, который упрощает создание различных стилей маркеров на лету. Он использует Google Charts для рисования маркеров.

Там хорошая демонстрация здесь , что показывает , какие маркеры вы можете сделать с ним.

Крис Б.
источник
3
MapIconMaker недоступен для API карт версии 3
Бенджисейл,
StyledMarker для API v3 есть. HTH.
tatlar
1
К сожалению, Google Charts API недавно официально устарел :(
Дэнни Си,
4

Вы можете попробовать этот код

    <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>
Md. Noor-A-Alam Siddique
источник