วิธีใช้เครื่องหมาย SVG ใน Google Maps API v3.0


92

ฉันสามารถใช้ image.svg ที่แปลงแล้วเป็นไอคอนแผนที่ของ Google ได้ไหม ฉันกำลังแปลงรูปภาพ png ของฉันเป็น svg และฉันต้องการใช้สิ่งนี้เช่นสัญลักษณ์แผนที่ google ที่สามารถหมุนได้ ฉันพยายามใช้สัญลักษณ์แผนที่ google แล้ว แต่ฉันต้องการมีไอคอนเช่นรถยนต์ผู้ชายและอื่น ๆ นั่นเป็นเหตุผลที่ฉันแปลงไฟล์ png ของฉันเป็น svg เช่นเดียวกับไซต์ตัวอย่างนี้เขาใช้อะไรกับhttp: / /www.goprotravelling.com/


1
สำหรับผู้ที่ค้นหาคำถามที่คล้ายกันนี้: โซลูชันที่เข้ากันได้กับ IE 9+ บางส่วนที่นี่: stackoverflow.com/a/30890373/634386จะวาง SVG ใน DOM แทนบนผืนผ้าใบเพื่อให้คุณสามารถจัดการกับ CSS3 หลังจาก (ถ้าคุณ ' กำลังต้องการหมุนองค์ประกอบนั้นโดยเฉพาะในทันที)
Mike Kormendy

คำตอบ:


146

คุณสามารถแสดงผลไอคอนของคุณโดยใช้สัญกรณ์ SVG เส้นทาง

ดูเอกสารของ Googleสำหรับข้อมูลเพิ่มเติม

นี่คือตัวอย่างพื้นฐาน:

var icon = {

    path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0",
    fillColor: '#FF0000',
    fillOpacity: .6,
    anchor: new google.maps.Point(0,0),
    strokeWeight: 0,
    scale: 1
}

var marker = new google.maps.Marker({
    position: event.latLng,
    map: map,
    draggable: false,
    icon: icon
});

นี่คือตัวอย่างการทำงานเกี่ยวกับวิธีการแสดงและปรับขนาดไอคอน SVG ของเครื่องหมาย:

การสาธิต JSFiddle

แก้ไข:

อีกตัวอย่างหนึ่งที่มีไอคอนซับซ้อน:

การสาธิต JSFiddle

แก้ไข 2:

และนี่คือวิธีที่คุณสามารถมีไฟล์ SVG เป็นไอคอน:

การสาธิต JSFiddle


มันยากมากที่จะสร้างรถ svg
jemz

คุณมีภาพ SVG ของรถคันนั้นที่คุณต้องการหรือไม่? จากนั้นเปิดด้วยโปรแกรมแก้ไขข้อความและค้นหาเส้นทางในนั้น!
MrUpsidown

3
SVG มักใช้สำหรับไอคอนและสัญลักษณ์อื่น ๆ สีเดียว. มันเป็นเพียงเส้นทางเช่นตัวอักษรในแบบอักษร ข้อดีคือคุณสามารถปรับขนาดหมุนและเปลี่ยนสีได้อย่างง่ายดายโดยไม่สูญเสียคุณภาพ มันเป็นรูปเวกเตอร์
MrUpsidown

1
นั่นเป็นหนึ่งในสิ่งที่มีประโยชน์ที่สุดที่ฉันอ่านในปีนี้! ขอบคุณมาก
Jonathan La'Fey

2
@MrUpsidown แต่แน่นอน SVG ทำงานได้ดีนอกแผนที่ - ไม่เคยมีปัญหาที่นั่น มันเกี่ยวข้องกับความผิดพลาดในการรองรับ SVG ของ Google ในการเรนเดอร์แคนวาสซึ่งสามารถปิดได้เพื่อให้ SVG ถูกแทรกลงใน DOM แทน จากนั้นมีปัญหากับขนาดที่คำนวณได้ของเครื่องหมายซึ่งมีคุณสมบัติสองสามอย่างในการใช้งานสำหรับเครื่องหมายแผนที่ที่สามารถบังคับขนาดได้ฉันพบวิธีแก้ปัญหาบางส่วนที่นี่: stackoverflow.com/a/30890373/634386
Mike Kormendy

70

หากคุณต้องการ svg แบบเต็มไม่เพียง แต่เส้นทางและคุณต้องการให้มันแก้ไขได้ในฝั่งไคลเอนต์ (เช่นเปลี่ยนข้อความซ่อนรายละเอียด ... ) คุณสามารถใช้ 'URL' ข้อมูลทางเลือกที่มี svg รวมอยู่ด้วย:

var svg = '<svg width="400" height="110"><rect width="300" height="100" /></svg>';
icon.url = 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg);

JavaScript (Firefox) btoa () ใช้เพื่อรับการเข้ารหัส base64 จากข้อความ SVG คุณอาจใช้http://dopiaza.org/tools/datauri/index.phpเพื่อสร้าง URL ข้อมูลพื้นฐาน

นี่คือตัวอย่างทั้งหมดjsfiddle :

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
    </head>
    <body>
        <div id="map" style="width: 500px; height: 400px;"></div>
        <script type="text/javascript">
            var map = new google.maps.Map(document.getElementById('map'), {
                zoom: 10,
                center: new google.maps.LatLng(-33.92, 151.25),
                mapTypeId: google.maps.MapTypeId.ROADMAP
            });

            var template = [
                '<?xml version="1.0"?>',
                    '<svg width="26px" height="26px" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">',
                        '<circle stroke="#222" fill="{{ color }}" cx="50" cy="50" r="35"/>',
                    '</svg>'
                ].join('\n');
            var svg = template.replace('{{ color }}', '#800');

            var docMarker = new google.maps.Marker({
                position: new google.maps.LatLng(-33.92, 151.25),
                map: map,
                title: 'Dynamic SVG Marker',
                icon: { url: 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg), scaledSize: new google.maps.Size(20, 20) },
optimized: false
            });

            var docMarker = new google.maps.Marker({
                position: new google.maps.LatLng(-33.95, 151.25),
                map: map,
                title: 'Dynamic SVG Marker',
                icon: { url: 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg), scaledSize: new google.maps.Size(20, 20) },
optimized: false
            });
        </script>
    </body>
</html>

ข้อมูลเพิ่มเติมสามารถพบได้ที่นี่

หลีกเลี่ยงการเข้ารหัส base64:

เพื่อหลีกเลี่ยงการเข้ารหัส base64 คุณสามารถแทนที่'data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg)ด้วย'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg)

สิ่งนี้ควรใช้ได้กับเบราว์เซอร์สมัยใหม่จนถึง IE9 ข้อดีคือencodeURIComponentเป็นฟังก์ชัน js เริ่มต้นและมีอยู่ในเบราว์เซอร์สมัยใหม่ทั้งหมด คุณอาจได้รับลิงค์เล็ก ๆ แต่คุณต้องทดสอบสิ่งนี้และพิจารณาใช้'แทน"ใน svg ของคุณ

ดูการเพิ่มประสิทธิภาพ SVG ใน URI ข้อมูลสำหรับข้อมูลเพิ่มเติม

IE สนับสนุน: เพื่อสนับสนุน SVG เครื่องหมายใน IE หนึ่งความต้องการของทั้งสอง adaptions ขนาดเล็กตามที่อธิบายไว้ที่นี่: SVG เครื่องหมายใน IE ฉันอัปเดตโค้ดตัวอย่างเพื่อรองรับ IE


3
ข้อมูลที่ดี แต่โปรดทราบอย่างรวดเร็วว่าการเข้ารหัส base64 ไม่จำเป็นหรือไม่ต้องการจริงๆ คุณสามารถใช้การเข้ารหัส svg โดยตรงใน URI ข้อมูลแทนเช่นdata:image/svg+xml;utf8,. ข้อมูลเพิ่มเติม: css-tricks.com/pro อาจ-dont
Josh จาก Qaribou

คุณคิดถูกจะดีมากถ้าเราสามารถหลีกเลี่ยงการเข้ารหัส base64 ได้ คุณทำได้อย่างไรช่วยยกตัวอย่าง ถ้าฉันแค่เพิ่มโค้ด svg ลงใน URI มันจะใช้ไม่ได้กับบางตัวอักษรเช่น#คุณใช้การเข้ารหัส URL หรือไม่?
ทอม

ฉันควรพูดถึงมันเข้ารหัส utf8; svg คือรูปแบบ ลิงค์ที่ให้มามีหลายตัวอย่าง
Josh จาก Qaribou

1
วิธีใช้หมุนภาพ svg โดยใช้สิ่งนี้?
สมนาถคร

พวกเราทุกคนไม่ชอบ IE;) ตามปกติมันต้องมีการทำงานเพิ่มเติมเพื่อให้มันใช้งานได้กับทุกเบราว์เซอร์ ฉันปรับตัวอย่างให้รองรับ IE หวังว่านี่จะช่วยได้
ทอม

31

ฉันรู้ว่าโพสต์นี้เก่าไปหน่อย แต่ฉันได้เห็นข้อมูลที่ไม่ดีมากมายเกี่ยวกับเรื่องนี้ที่ SO จนฉันสามารถกรีดร้องได้ ดังนั้นฉันต้องโยนสองเซ็นต์ของฉันด้วยวิธีการที่แตกต่างกันโดยสิ้นเชิงที่ฉันรู้ว่าใช้ได้ผลเพราะฉันใช้มันได้อย่างน่าเชื่อถือในหลาย ๆ แผนที่ นอกจากนั้นฉันเชื่อว่า OP ต้องการความสามารถในการหมุนเครื่องหมายลูกศรรอบ ๆ จุดบนแผนที่เช่นกันซึ่งแตกต่างจากการหมุนไอคอนรอบแกน x, y ของตัวเองซึ่งจะเปลี่ยนตำแหน่งที่เครื่องหมายลูกศรชี้ไปบนแผนที่

อันดับแรกจำไว้ว่าเรากำลังเล่นกับ Google Maps และ SVG ดังนั้นเราต้องรองรับวิธีที่ Google ปรับใช้ SVG สำหรับเครื่องหมาย (หรือสัญลักษณ์จริงๆ) Google กำหนดจุดยึดสำหรับภาพเครื่องหมาย SVG ที่ 0,0 ซึ่งไม่ใช่มุมบนซ้ายของช่องมอง SVG ในการแก้ไขปัญหานี้คุณต้องวาดภาพ SVG ของคุณให้แตกต่างออกไปเล็กน้อยเพื่อให้ Google ได้สิ่งที่ต้องการ ... ใช่คำตอบคือวิธีที่คุณสร้างเส้นทาง SVG ในโปรแกรมแก้ไข SVG ของคุณ (Illustrator, Inkscape และอื่น ๆ .).

ขั้นตอนแรกคือการกำจัด viewBox สิ่งนี้สามารถทำได้โดยการตั้งค่า viewBox ใน XML ของคุณเป็น 0 ... ถูกต้องเพียงหนึ่งศูนย์แทนที่จะเป็นสี่อาร์กิวเมนต์ปกติสำหรับ viewBox สิ่งนี้จะปิดกล่องมุมมอง (และใช่นี่เป็นความหมายที่ถูกต้อง) คุณอาจจะสังเกตเห็นขนาดของรูปภาพของคุณที่เพิ่มขึ้นอย่างรวดเร็วเมื่อคุณทำสิ่งนี้และนั่นเป็นเพราะ svg ไม่มีฐาน (viewBox) ในการปรับขนาดภาพอีกต่อไป ดังนั้นเราจึงสร้างข้อมูลอ้างอิงนั้นโดยตรงโดยตั้งค่าความกว้างและความสูงเป็นจำนวนพิกเซลจริงที่คุณต้องการให้รูปภาพของคุณอยู่ในโปรแกรมแก้ไข XML ของโปรแกรมแก้ไข SVG ของคุณ

ด้วยการตั้งค่าความกว้างและความสูงของอิมเมจ svg ในโปรแกรมแก้ไข XML คุณจะสร้างพื้นฐานสำหรับการปรับขนาดของรูปภาพและขนาดนี้จะกลายเป็นค่า 1 สำหรับคุณสมบัติมาตราส่วนของเครื่องหมายโดยค่าเริ่มต้น คุณสามารถดูข้อได้เปรียบที่มีสำหรับการปรับขนาดของเครื่องหมายแบบไดนามิก

เมื่อคุณมีขนาดภาพของคุณแล้วให้เลื่อนรูปภาพไปจนถึงส่วนของภาพที่คุณต้องการเนื่องจากจุดยึดอยู่เหนือพิกัด 0,0 ของตัวแก้ไข svg เมื่อคุณคัดลอกค่าของแอตทริบิวต์dของเส้นทาง svg เสร็จแล้ว คุณจะสังเกตเห็นว่าตัวเลขประมาณครึ่งหนึ่งเป็นค่าลบซึ่งเป็นผลมาจากการจัดตำแหน่งจุดยึดของคุณให้ตรงกับ 0,0 ของรูปภาพแทนที่จะเป็น viewBox

การใช้เทคนิคนี้จะช่วยให้คุณหมุนเครื่องหมายได้อย่างถูกต้องรอบ ๆ จุด lat และ lng บนแผนที่ นี่เป็นวิธีเดียวที่เชื่อถือได้ในการผูกจุดบนเครื่องหมาย svg ที่คุณต้องการกับ lat และความยาวของตำแหน่งเครื่องหมาย

ฉันพยายามสร้างJSFiddle สำหรับสิ่งนี้แต่มีข้อบกพร่องบางอย่างในการใช้งานที่นั่นหนึ่งในเหตุผลที่ฉันไม่ชอบการตีความโค้ดซ้ำ ดังนั้นฉันจึงได้รวมตัวอย่างที่มีอยู่ในตัวเองทั้งหมดไว้ด้านล่างเพื่อให้คุณสามารถทดลองปรับเปลี่ยนและใช้เป็นข้อมูลอ้างอิงได้ นี่เป็นรหัสเดียวกับที่ฉันลองที่ JSFiddle ที่ล้มเหลว แต่มันแล่นผ่าน Firebug โดยไม่มีเสียงครวญคราง

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport"  content="width=device-width, initial-scale=1" />
    <meta name="author"    content="Drew G. Stimson, Sr. ( Epiphany )" />
    <title>Create Draggable and Rotatable SVG Marker</title>
    <script src="http://maps.googleapis.com/maps/api/js?sensor=false"> </script>
    <style type="text/css">
      #document_body {
        margin:0;
        border: 0;
        padding: 10px;
        font-family: Arial,sans-serif;
        font-size: 14px;
        font-weight: bold;
        color: #f0f9f9;
        text-align: center;
        text-shadow: 1px 1px 1px #000;
        background:#1f1f1f;
      }
      #map_canvas, #rotation_control {
        margin: 1px;
        border:1px solid #000;
        background:#444;
        -webkit-border-radius: 4px;
           -moz-border-radius: 4px;
                border-radius: 4px;
      }
      #map_canvas { 
        width: 100%;
        height: 360px;
      }
      #rotation_control { 
        width: auto;
        padding:5px;
      }
      #rotation_value { 
        margin: 1px;
        border:1px solid #999;
        width: 60px;
        padding:2px;
        font-weight: bold;
        color: #00cc00;
        text-align: center;
        background:#111;
        border-radius: 4px;
      }
</style>

<script type="text/javascript">
  var map, arrow_marker, arrow_options;
  var map_center = {lat:41.0, lng:-103.0};
  var arrow_icon = {
    path: 'M -1.1500216e-4,0 C 0.281648,0 0.547084,-0.13447 0.718801,-0.36481 l 17.093151,-22.89064 c 0.125766,-0.16746 0.188044,-0.36854 0.188044,-0.56899 0,-0.19797 -0.06107,-0.39532 -0.182601,-0.56215 -0.245484,-0.33555 -0.678404,-0.46068 -1.057513,-0.30629 l -11.318243,4.60303 0,-26.97635 C 5.441639,-47.58228 5.035926,-48 4.534681,-48 l -9.06959,0 c -0.501246,0 -0.906959,0.41772 -0.906959,0.9338 l 0,26.97635 -11.317637,-4.60303 c -0.379109,-0.15439 -0.812031,-0.0286 -1.057515,0.30629 -0.245483,0.33492 -0.244275,0.79809 0.0055,1.13114 L -0.718973,-0.36481 C -0.547255,-0.13509 -0.281818,0 -5.7002158e-5,0 Z',
    strokeColor: 'black',
    strokeOpacity: 1,
    strokeWeight: 1,
    fillColor: '#fefe99',
    fillOpacity: 1,
    rotation: 0,
    scale: 1.0
  };

function init(){
  map = new google.maps.Map(document.getElementById('map_canvas'), {
    center: map_center,
    zoom: 4,
    mapTypeId: google.maps.MapTypeId.HYBRID
  });
  arrow_options = {
    position: map_center,
    icon: arrow_icon,
    clickable: false,
    draggable: true,
    crossOnDrag: true,
    visible: true,
    animation: 0,
    title: 'I am a Draggable-Rotatable Marker!' 
  };
  arrow_marker = new google.maps.Marker(arrow_options);
  arrow_marker.setMap(map);
}
function setRotation(){
  var heading = parseInt(document.getElementById('rotation_value').value);
  if (isNaN(heading)) heading = 0;
  if (heading < 0) heading = 359;
  if (heading > 359) heading = 0;
  arrow_icon.rotation = heading;
  arrow_marker.setOptions({icon:arrow_icon});
  document.getElementById('rotation_value').value = heading;
}
</script>
</head>
<body id="document_body" onload="init();">
  <div id="rotation_control">
    <small>Enter heading to rotate marker&nbsp;&nbsp;&nbsp;&nbsp;</small>
    Heading&deg;<input id="rotation_value" type="number" size="3" value="0" onchange="setRotation();" />
    <small>&nbsp;&nbsp;&nbsp;&nbsp;Drag marker to place marker</small>
    </div>
    <div id="map_canvas"></div>
</body>
</html>

นี่คือสิ่งที่ Google ทำเนื่องจากมีสัญลักษณ์เพียงไม่กี่ตัวที่มีอยู่ในคลาส SYMBOL ของ Maps API ดังนั้นหากไม่ทำให้คุณเชื่อ ... อย่างไรก็ตามฉันหวังว่านี่จะช่วยให้คุณสร้างและตั้งค่าเครื่องหมาย SVG ได้อย่างถูกต้องสำหรับ แผนที่ Google ของคุณมีความพยายาม


2
คำตอบที่ดีฉันได้สร้างรหัสของคุณที่ใช้งานได้เพื่อให้ผู้คนเห็นjsfiddle.net/v2pjfp7r
Rob Schmuecker

"<3" นี่คือข้อมูลสำคัญที่ควรเป็นส่วนหนึ่งของเอกสารของ Google
user7653815

12

ได้คุณสามารถใช้ไฟล์. svg สำหรับไอคอนได้เช่นเดียวกับที่คุณทำได้. png หรือไฟล์รูปภาพรูปแบบอื่น เพียงตั้งค่า url ของไอคอนเป็นไดเร็กทอรีที่มีไฟล์. svg อยู่ ตัวอย่างเช่น:

var icon = {
        url: 'path/to/images/car.svg',
        size: new google.maps.Size(sizeX, sizeY),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(sizeX/2, sizeY/2)
};

var marker = new google.maps.Marker({
        position: event.latLng,
        map: map,
        draggable: false,
        icon: icon
});

1
วัตถุไอคอนที่คุณแสดงเป็นของเครื่องหมายมาตรฐานไม่ใช่เครื่องหมาย SVG เครื่องหมาย svg ใช้คุณสมบัติของคลาสสัญลักษณ์ซึ่งถูกกำหนดให้เป็นคุณสมบัติไอคอนของคลาสเครื่องหมาย (ดูวัตถุไอคอน MrUpsidown สำหรับการอ้างอิงที่ถูกต้อง ... )
Epiphany

2
สิ่งนี้จะพังเช่นกันหาก SVG มีเส้นทางมากกว่าหนึ่ง 'd' (โดยปกติจะเกี่ยวข้องกับเลเยอร์มากกว่าหนึ่งเลเยอร์ในภาพ svg)
Epiphany

2
โปรดทราบว่าไฟล์ svg ของคุณควรกำหนดขนาดของไอคอนอย่างชัดเจนดังนี้: width="33px" height="50px"- ดูstackoverflow.com/a/21783089/165673
Yarin

9

สิ่งต่างๆกำลังดีขึ้นตอนนี้คุณสามารถใช้ไฟล์ SVG ได้แล้ว

        marker = new google.maps.Marker({
            position: {lat: 36.720426, lng: -4.412573},
            map: map,
            draggable: true,
            icon: "img/tree.svg"
        });

1
ไม่อนุญาตให้หมุนเวียน
Matt Westlake

6

ดังที่ผู้อื่นกล่าวถึงในชุดข้อความนี้อย่าลืมกำหนดแอตทริบิวต์ความกว้างและความสูงอย่างชัดเจนใน svg ดังนี้:

<svg id="some_id" data-name="some_name" xmlns="http://www.w3.org/2000/svg"
     viewBox="0 0 26 42"
     width="26px" height="42px">

หากคุณไม่ทำเช่นนั้นไม่มีการปรับแต่ง js สามารถช่วยคุณได้เนื่องจาก gmaps จะไม่มีกรอบอ้างอิงและใช้ขนาดมาตรฐานเสมอ

(ฉันรู้ว่ามีการพูดถึงในบางความคิดเห็น แต่พลาดง่ายข้อมูลนี้ช่วยฉันได้หลายกรณี)


1

ตกลง! ฉันทำสิ่งนี้ในเว็บเร็ว ๆ นี้ฉันลองสองวิธีในการสร้างเครื่องหมายแผนที่ Google ที่กำหนดเองการเรียกใช้โค้ดนี้ใช้ canvg.js เป็นความเข้ากันได้ที่ดีที่สุดสำหรับเบราว์เซอร์โค้ด Commented-Out ไม่รองรับ IE11 ในทันที

var marker;
var CustomShapeCoords = [16, 1.14, 21, 2.1, 25, 4.2, 28, 7.4, 30, 11.3, 30.6, 15.74, 25.85, 26.49, 21.02, 31.89, 15.92, 43.86, 10.92, 31.89, 5.9, 26.26, 1.4, 15.74, 2.1, 11.3, 4, 7.4, 7.1, 4.2, 11, 2.1, 16, 1.14];

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 13,
    center: {
      lat: 59.325,
      lng: 18.070
    }
  });
  var markerOption = {
    latitude: 59.327,
    longitude: 18.067,
    color: "#" + "000",
    text: "ha"
  };
  marker = createMarker(markerOption);
  marker.setMap(map);
  marker.addListener('click', changeColorAndText);
};

function changeColorAndText() {
  var iconTmpObj = createSvgIcon( "#c00", "ok" );
  marker.setOptions( {
                icon: iconTmpObj
            } );
};

function createMarker(options) {
  //IE MarkerShape has problem
  var markerObj = new google.maps.Marker({
    icon: createSvgIcon(options.color, options.text),
    position: {
      lat: parseFloat(options.latitude),
      lng: parseFloat(options.longitude)
    },
    draggable: false,
    visible: true,
    zIndex: 10,
    shape: {
      coords: CustomShapeCoords,
      type: 'poly'
    }
  });

  return markerObj;
};

function createSvgIcon(color, text) {
  var div = $("<div></div>");

  var svg = $(
    '<svg width="32px" height="43px"  viewBox="0 0 32 43" xmlns="http://www.w3.org/2000/svg">' +
    '<path style="fill:#FFFFFF;stroke:#020202;stroke-width:1;stroke-miterlimit:10;" d="M30.6,15.737c0-8.075-6.55-14.6-14.6-14.6c-8.075,0-14.601,6.55-14.601,14.6c0,4.149,1.726,7.875,4.5,10.524c1.8,1.801,4.175,4.301,5.025,5.625c1.75,2.726,5,11.976,5,11.976s3.325-9.25,5.1-11.976c0.825-1.274,3.05-3.6,4.825-5.399C28.774,23.813,30.6,20.012,30.6,15.737z"/>' +
    '<circle style="fill:' + color + ';" cx="16" cy="16" r="11"/>' +
    '<text x="16" y="20" text-anchor="middle" style="font-size:10px;fill:#FFFFFF;">' + text + '</text>' +
    '</svg>'
  );
  div.append(svg);

  var dd = $("<canvas height='50px' width='50px'></cancas>");

  var svgHtml = div[0].innerHTML;

  canvg(dd[0], svgHtml);

  var imgSrc = dd[0].toDataURL("image/png");
  //"scaledSize" and "optimized: false" together seems did the tricky ---IE11  &&  viewBox influent IE scaledSize
  //var svg = '<svg width="32px" height="43px"  viewBox="0 0 32 43" xmlns="http://www.w3.org/2000/svg">'
  //    + '<path style="fill:#FFFFFF;stroke:#020202;stroke-width:1;stroke-miterlimit:10;" d="M30.6,15.737c0-8.075-6.55-14.6-14.6-14.6c-8.075,0-14.601,6.55-14.601,14.6c0,4.149,1.726,7.875,4.5,10.524c1.8,1.801,4.175,4.301,5.025,5.625c1.75,2.726,5,11.976,5,11.976s3.325-9.25,5.1-11.976c0.825-1.274,3.05-3.6,4.825-5.399C28.774,23.813,30.6,20.012,30.6,15.737z"/>'
  //    + '<circle style="fill:' + color + ';" cx="16" cy="16" r="11"/>'
  //    + '<text x="16" y="20" text-anchor="middle" style="font-size:10px;fill:#FFFFFF;">' + text + '</text>'
  //    + '</svg>';
  //var imgSrc = 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);

  var iconObj = {
    size: new google.maps.Size(32, 43),
    url: imgSrc,
    scaledSize: new google.maps.Size(32, 43)
  };

  return iconObj;
};
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Your Custom Marker </title>
  <style>
    /* Always set the map height explicitly to define the size of the div
       * element that contains the map. */
    #map {
      height: 100%;
    }
    /* Optional: Makes the sample page fill the window. */
    html,
    body {
      height: 100%;
      margin: 0;
      padding: 0;
    }
  </style>
</head>

<body>
  <div id="map"></div>
    <script src="https://canvg.github.io/canvg/canvg.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap"></script>
</body>

</html>


-4

optimized: falseคุณจะต้องผ่าน

เช่น

var img = { url: 'img/puff.svg', scaledSide: new google.maps.Size(5, 5) };
new google.maps.Marker({position: this.mapOptions.center, map: this.map, icon: img, optimized: false,});

โดยไม่ผ่านoptimized: falsesvg ของฉันก็ปรากฏเป็นภาพนิ่ง

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