Google Maps API v3: ฉันจะเปลี่ยนไอคอนเครื่องหมายแบบไดนามิกได้อย่างไร


105

เมื่อใช้ Google Maps API v3 ฉันจะเปลี่ยนไอคอนเครื่องหมายโดยทางโปรแกรมได้อย่างไร

สิ่งที่ฉันต้องการจะทำคือเมื่อมีคนวางเมาส์เหนือลิงก์เพื่อให้ไอคอนเครื่องหมายที่เกี่ยวข้องบนแผนที่เปลี่ยนสีเพื่อแสดงเครื่องหมายที่เป็นปัญหา

โดยพื้นฐานแล้วฟังก์ชันเดียวกับที่ Roost ทำ

เมื่อคุณวางเมาส์เหนือรายการบ้านทางด้านซ้ายเครื่องหมายที่เกี่ยวข้องทางด้านขวาจะเปลี่ยนสี


ตัวอย่างสดของคุณล่มสลายไปแล้ว แค่อยากจะแจ้งให้คุณทราบ ฉันคิดว่ามันคล้ายกับสิ่งที่เกิดขึ้นที่ airbnb.com?
FujiRoyale

คำตอบ:


181

โทรmarker.setIcon('newImage.png')... ดูที่นี่สำหรับเอกสาร

คุณกำลังถามเกี่ยวกับวิธีการทำจริงหรือไม่? คุณสามารถสร้างแต่ละรายการdivและเพิ่มmouseoverและmouseoutผู้ฟังที่จะเปลี่ยนไอคอนและย้อนกลับสำหรับเครื่องหมาย


6
ที่ช่วยฉันหาวิธีเปลี่ยนภาพเคลื่อนไหวของเครื่องหมาย:markersArray[0].setAnimation(google.maps.Animation.BOUNCE);
เรย์

20

คุณยังสามารถใช้วงกลมเป็นไอคอนเครื่องหมายได้เช่น:

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 ไม่ใช่ใน Maps API - ดูเอกสารประกอบ
tatlar

คำถามและคำตอบ StackOverflowนี้อาจแนะนำคุณเพิ่มเติม
tatlar

5

ยูทิลิตี้ห้องสมุด GMapsมีปลั๊กอินที่เรียกว่าMapIconMakerที่ทำให้มันง่ายในการสร้างรูปแบบเครื่องหมายที่แตกต่างกันเกี่ยวกับการบิน ใช้ Google Charts เพื่อวาดเครื่องหมาย

มีการสาธิตที่ดีที่นี่ซึ่งแสดงให้เห็นว่าคุณสามารถทำเครื่องหมายประเภทใดได้


3
MapIconMaker ไม่สามารถใช้ได้กับแผนที่ API v3
benjisail

StyledMarkerสำหรับ API v3 คือ HTH.
tatlar

1
น่าเสียดายที่ Google Charts API เพิ่งเลิกใช้งานอย่างเป็นทางการโดย Google :(
Danny C

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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.