【问题标题】:change size of marker in leaflet更改传单中标记的大小
【发布时间】:2013-04-16 13:17:54
【问题描述】:

我在传单中的地图上有一个标记:

var centerMarker = L.marker(centerPoint, { title: 'unselected' }).bindLabel(schools[i][0]);
centerMarker.on('click', selectMarker);
centerMarker.addTo(map);

我想在点击时更改该标记的大小。

我知道我们可以更改图标,但我只想更改标记的相同图标的大小。

【问题讨论】:

  • API中不支持,需要删除后重新添加。
  • 试试setIcon,设置相同的图标大小不同?
  • 试过 setIcon 但对我不起作用。任何其他建议
  • 你试过答案了吗?如果是这样,什么不起作用?

标签: javascript icons leaflet


【解决方案1】:

您可以从标记本身获取旧图标,更改图标大小,然后使用更改后的图标调用setIcon

var icon = centerMarker.options.icon;
icon.options.iconSize = [newwidth, newheight];
centerMarker.setIcon(icon);

【讨论】:

  • 这个答案是有效的,但是要谨慎使用,因为这会修改原始图标的图标大小,并且可能会影响使用相同图标的其他标记。如果不想修改原来的icon,只想改变这个pin的icon大小,可以const newIcon = L.icon({ iconUrl: url, iconSize: newSize, iconAnchor: newAnchor })centerMarker.setIcon(newIcon)创建一个分支新icon
  • 感谢@DanielHu 指出这一点,也许您可​​以在新答案中解释您的方法?我不清楚如何用这个小sn-p获得这个图标的副本......你如何相应地设置参数iconUrliconAnchor
  • 感谢您的建议,我发布了自己的答案,就在这个问题下。或者你可以点击这个链接:*.com/a/70690009/9182804
【解决方案2】:

在标记上使用setIcon,提供具有相同图像但大小和锚点不同的新图标。

var centerPoint = L.latLng(55.4411764, 11.7928708);
var centerMarker = L.marker(centerPoint, { title: 'unselected' });
centerMarker.addTo(map);

centerMarker.on('click', function(e) {
    centerMarker.setIcon(bigIcon);
});

演示(对中心和阴影等使用有些草率的设置):

http://jsfiddle.net/pX2xn/4/

【讨论】:

  • 我更喜欢这个答案而不是@m13r,因为通过创建一个全新的变量bigIcon,它不会影响图标的原始副本,因此可以帮助您避免一些不良行为。
【解决方案3】:

虽然这是一个老问题,但如果有人正在寻找答案以外的其他可能选项。

L.marker([coord.latitude, coord.longitude], {
    color: 'red',
    icon: getIcon(), 
    data: coord
}).addTo(myMap).on("click", circleClick);

function getIcon(total_dead_and_missing) {
    var icon_size = [50, 50];   //for dynamic icon size, 
    var image_url = '1.png';        //for dynamic images

    L.icon({
        iconUrl: image_url,
        shadowUrl: 'leaf-shadow.png',

        iconSize:    icon_size , // size of the icon
        shadowSize:   [50, 64], // size of the shadow
        iconAnchor:   [22, 94], // point of the icon which will correspond to marker's location
        shadowAnchor: [4, 62],  // the same for the shadow
        popupAnchor:  [-3, -76] // point from which the popup should open relative to the iconAnchor
    });
}

资源:https://leafletjs.com/examples/custom-icons/

【讨论】:

    【解决方案4】:

    根据@m13r 的建议,我发布了一个关于如何创建大尺寸图标副本的新答案。

    /// Returns a scaled copy of the marker's icon.
    function scaleIconForMarker(marker, enlargeFactor) {
      const iconOptions = marker.options.icon.options;
    
      const newIcon = L.icon({
        iconUrl: iconOptions.iconUrl,
        iconSize: multiplyPointBy(enlargeFactor, iconOptions.iconSize),
        iconAnchor: multiplyPointBy(enlargeFactor, iconOptions.iconAnchor),
      });
    
      return newIcon;
    }
    
    /// Helper function, for some reason, 
    /// Leaflet's Point.multiplyBy(<Number> num) function is not working for me, 
    /// so I had to create my own version, lol
    /// refer to https://leafletjs.com/reference.html#point-multiplyby
    function multiplyPointBy(factor, originalPoint) {
      const newPoint = L.point(
        originalPoint[0] * factor,
        originalPoint[1] * factor
      );
    
      return newPoint;
    }
    

    用法很简单:

      marker.on("click", function () {
        // enlarge icon of clicked marker by (2) times, other markers using the same icon won't be effected
        const largeIcon = scaleIconForMarker(marker, 2);
        marker.setIcon(largeIcon);
    
      });
    

    这样你只放大你点击的标记的图标,其他标记在刷新后保持不变。

    【讨论】: