谷歌地图API:SVG标记在缩放时相对于地图移动

7
我在地图上创建了两个标记,一个是标准标记,另一个使用SVG路径。当我缩小地图时,标准标记不会相对于地图移动,但SVG标记会移动。这里有一个fiddle演示可以看到我的意思:http://jsfiddle.net/9A4ET/。你有什么想法可以让SVG标记相对于地图保持位置不变吗?
<!DOCTYPE html>
<html>
    <head>
    <meta charset="UTF-8">
    <title>SVG Marker Moves</title>
    <script src="http://maps.google.com/maps/api/js?v=3&amp;sensor=false"></script>
    <style>
    html, body, #map_canvas {
        height: 100%;
        margin: 0;
    }
    </style>
    </head>
<body>
<div id="map_canvas"></div>
<script>

var islandLoc = new google.maps.LatLng(48.692492,-122.908192);
var birdLoc = new google.maps.LatLng(48.692615936699596, -122.90869625529479);

var map = new google.maps.Map(document.getElementById('map_canvas'),{
  zoom: 19,
  center: islandLoc,
  disableDefaultUI: false,
  zoomControl: true,
  zoomControlOptions: {
    style: google.maps.ZoomControlStyle.SMALL
  },
  mapTypeId: google.maps.MapTypeId.SATELLITE
});

var island_marker = new google.maps.Marker({
  position: islandLoc,
  map: map
});

var bird_icon = {
        path: "m130.90909,164l54.09091,-23c0,0 -2.09091,-45 31.90909,-46c34,-1 37,6 42,23c5,17 -30,56 -30,71c0,15 23,21 56,40c33,19 56,62 64,81c8,19 14,39 21,46c7,7 16,16 15.09091,16c-0.90909,0 -14.09091,7 -15,7c-0.90909,0 -37.09091,-23 -46.09091,-23c-9,0 -35,-6 -57,-15c-22,-9 -35,-21 -35.90909,-21c-0.90909,0 0.90909,18 -0.09091,27c-1,9 -5,27 -5.90909,27c-0.90909,0 -7.09091,-15 -7.09091,-20c0,-5 5,-19 4.09091,-19c-0.90909,0 -3.09091,-16 -4,-16c-0.90909,0 -12.09091,0 -13,0c-0.90909,0 2.90909,10 0.90909,17c-2,7 2,31 1.09091,31c-0.90909,0 -17.09091,14 -18,14c-0.90909,0 8.90909,-20 8,-20c-0.90909,0 -1.09091,-15 -2.09091,-20c-1,-5 -5,-22 -5.90909,-22c-0.90909,0 -15.09091,-9 -29.09091,-50c-14,-41 37,-86 39,-93c2,-7 -8,-19 -8.90909,-19c-0.90909,0 -59.09091,7 -59.09091,7z",
        fillColor: '#000000',
         strokeColor: '#FFFFFF',
        fillOpacity: 1,
        strokeWeight: 1,
        scale:.15
    }

var bird_marker = new google.maps.Marker({
    position: birdLoc,
    map: map,
    icon: bird_icon
});

</script>
</body>
</html>
1个回答

13

对于符号,锚点需定义(默认为左上角),而对于图片,默认则为底部中心。

对于这个特定的符号,当采用底部中心锚点时,坐标应该约为258,381

演示:http://jsfiddle.net/a3LKP/5/


关于在inkscape中计算底部中心原点的说明。

假设您并非自己创建此路径(符号),请使用给定路径创建SVG文档:

<svg
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   version="1.0">
  <g>
    <path d="m130.90909,164l54.09091,-23c0,0 -2.09091,-45 31.90909,-46c34,-1 37,6 42,23c5,17 -30,56 -30,71c0,15 23,21 56,40c33,19 56,62 64,81c8,19 14,39 21,46c7,7 16,16 15.09091,16c-0.90909,0 -14.09091,7 -15,7c-0.90909,0 -37.09091,-23 -46.09091,-23c-9,0 -35,-6 -57,-15c-22,-9 -35,-21 -35.90909,-21c-0.90909,0 0.90909,18 -0.09091,27c-1,9 -5,27 -5.90909,27c-0.90909,0 -7.09091,-15 -7.09091,-20c0,-5 5,-19 4.09091,-19c-0.90909,0 -3.09091,-16 -4,-16c-0.90909,0 -12.09091,0 -13,0c-0.90909,0 2.90909,10 0.90909,17c-2,7 2,31 1.09091,31c-0.90909,0 -17.09091,14 -18,14c-0.90909,0 8.90909,-20 8,-20c-0.90909,0 -1.09091,-15 -2.09091,-20c-1,-5 -5,-22 -5.90909,-22c-0.90909,0 -15.09091,-9 -29.09091,-50c-14,-41 37,-86 39,-93c2,-7 -8,-19 -8.90909,-19c-0.90909,0 -59.09091,7 -59.09091,7z"/>
  </g>
</svg>

使用inkscape打开该文档。

首先进入文件->文档属性->页面以确定文档高度(对我来说是1052.36px,我猜这是默认值)。

然后单击符号以选择它,在菜单栏中,您应该看到对象的属性:XYW(idth)和(H)eight。

对于我来说,现在是这样的:
文档高度:1052.36
对象-x:130.909
对象-y:671.362
对象宽度:254.155
对象高度:286.093

计算底部的y:
从文档高度中减去object-y(1052-671 = 381

计算中心点的x:
将对象的一半宽度加上对象的x(131 +(254/2)= 258

因此,锚定点为new google.maps.Point(258,381)


锚点:new google.maps.Point(220,390)位于鸟的脚下:[演示](http://jsfiddle.net/9A4ET/12/)。符号的左上角默认值是否有文档记录? - geocodezip
默认情况下,符号锚定在(0,0)处。该位置以与符号路径相同的坐标系表示。我会假设0,0是左上角(符号坐标系的左上角,而不是可见符号的左上角)。 - Dr.Molle
我的第一个计算是错误的,我使用了Inkscape,其中0,0是左下角,而我需要将其转换为左上角。 - Dr.Molle
谢谢您,Molle博士。我已将问题标记为已回答。但我仍不确定如何确定未来实例中的锚点。我需要熟悉Inkscape吗?如果有任何提示,将不胜感激。 - user1147171
@user1147171:我已经在上面添加了一个解释。 - Dr.Molle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接