Google maps 如何在Google Maps API v3中使用SVG标记

Google maps 如何在Google Maps API v3中使用SVG标记,google-maps,google-maps-api-3,svg,Google Maps,Google Maps Api 3,Svg,我可以将转换后的image.svg用作谷歌地图图标吗。我正在将我的png图像转换为svg,我想使用这个可以旋转的类似谷歌地图的符号。我已经尝试使用谷歌地图符号,但我想有一个像汽车,男人等图标。。。这就是为什么我将我的一些png文件转换为svg,就像这个示例站点,他用什么来处理这些文件 有关更多信息,请参阅 以下是一个基本示例: var icon = { path: "M-20,0a20,20 0 1,0 40,0a20,20 0 1,0 -40,0", fillColor: '

我可以将转换后的image.svg用作谷歌地图图标吗。我正在将我的png图像转换为svg,我想使用这个可以旋转的类似谷歌地图的符号。我已经尝试使用谷歌地图符号,但我想有一个像汽车,男人等图标。。。这就是为什么我将我的一些png文件转换为svg,就像这个示例站点,他用什么来处理这些文件

有关更多信息,请参阅

以下是一个基本示例:

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图标的工作示例:

编辑:

另一个带有复杂图标的示例:

编辑2:

以下是如何将SVG文件作为图标:


是的,您可以使用.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
});

我知道这篇文章有点老了,但我在网站上看到了太多关于这篇文章的不好信息,以至于我会尖叫。所以我必须用一种完全不同的方法投入我的两分钱,我知道这种方法是有效的,因为我在很多地图上都可靠地使用它。除此之外,我相信OP希望能够围绕地图点旋转箭头标记,这与围绕其自身的x、y轴旋转图标不同,这将改变箭头标记在地图上的指向

首先,请记住,我们正在使用Google地图和SVG,因此我们必须适应Google为标记(或实际上是符号)部署SVG实现的方式。Google将SVG标记图像的定位点设置为0,0,这不是SVG视图框的左上角。为了解决这个问题,您必须以稍微不同的方式绘制SVG图像,以满足Google的需要。。。是的,答案是您在SVG编辑器(Illustrator、Inkscape等)中实际创建SVG路径的方式

第一步是去掉viewBox。这可以通过将XML中的viewBox设置为0来实现。。。没错,只是一个零,而不是viewBox通常的四个参数。这将关闭视图框(是的,这在语义上是正确的)。当您这样做时,您可能会注意到图像的大小会立即跳转,这是因为svg不再具有缩放图像的基础(viewBox)。因此,我们直接创建该引用,方法是将宽度和高度设置为您希望图像在SVG编辑器的XML编辑器中的实际像素数

通过在XML编辑器中设置svg图像的宽度和高度,可以创建用于缩放图像的基线,默认情况下,标记比例属性的此大小值为1。您可以看到这对于标记的动态缩放的优势

现在已经确定了图像的大小,移动图像,直到希望作为定位点的图像部分位于svg编辑器的0,0坐标之上。完成此操作后,复制svg路径的d属性的值。您会注意到大约一半的数字是负数,这是将图像的0,0(而不是viewBox)定位点对齐的结果

然后,使用此技术可以围绕地图上的lat和lng点正确旋转标记。这是将svg标记上的点绑定到标记位置的lat和long的唯一可靠方法

我试着去做,但是那里的实现中有一些bug,这也是我不太喜欢重新解释代码的原因之一。因此,我在下面提供了一个完全独立的示例,您可以尝试、修改并用作参考。这是我在JSFIDLE上尝试的失败代码,但它毫无怨言地通过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>

创建可拖动和可旋转的SVG标记
#文件正文{
保证金:0;
边界:0;
填充:10px;
字体系列:Arial,无衬线;
字体大小:14px;
字体大小:粗体;
颜色:#f0f9f9;
文本对齐:居中;
文本阴影:1px 1px 1px#000;
背景:#1楼;;
}
#贴图#画布#旋转#控件{
保证金:1px;
边框:1px实心#000;
背景:#444;
-webkit边界半径:4px;
-moz边界半径:4px;
边界半径:4px;
}
#地图{
宽度:100%;
高度:360px;
}
#旋转控制{
宽度:自动;
填充物:5px;
}
#旋转_值{
保证金:1px;
边框:1px实心#999;
宽度:60px;
填充:2px;
字体大小:粗体;
颜色:#00cc00;
文本对齐:居中;
背景:#111;
边界半径:4px;
}
变量映射、箭头标记、箭头选项;
var map_center={lat:41.0,lng:-103.0};
变量箭头图标={
这道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道道47.58228 5.035926,-48 4.534681,-48 l-9.06959,0c-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.287005,0.1815',
strokeColor:'黑色',
频闪不透明度:1,
冲程重量:1,
fillColor:“#fefe99”,
不透明度:1,
轮换:0,
比例:1.0
};
函数init(){
map=new google.maps.map(document.getElementById('map_canvas'){
中心:地图中心,
缩放:4,
mapTypeId:google.maps.mapTypeId.HYBRID
});
箭头_选项={
位置:地图中心,
图标:箭头图标,
可点击:fa
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,});
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);
<!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>
        marker = new google.maps.Marker({
            position: {lat: 36.720426, lng: -4.412573},
            map: map,
            draggable: true,
            icon: "img/tree.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">