传单自定义图标在缩放时调整大小。性能图标vs divicon

Pep*_*epe 4 css jquery marker leaflet

放大传单时,我试图调整自定义图标的大小。为此,我提出了两种解决方案。一个使用L.Icon标记,另一个使用L.divIcon。在两个示例中,我都只设置了1个标记和一个组以提高可读性

使用L.Icon的方法1:使用标记进行分组。然后zoomend我使用mygroup.eachLayer(function (layer)更改1层的所有图标layer.setIcon()。我对所有小组重复

<script>
// Setting map options
....

// Setting Icon
var normalicon = L.icon({
    iconUrl: 'icon1.jpg',
    iconSize:     [40,40],
    iconAnchor:   [20,20],
    popupAnchor:  [0,-20] 
    });


// Create a group
var normalLayer = L.layerGroup([
    L.marker([200,200], {icon:normalicon})
]).addTo(map);

// Resizing on zoom
map.on('zoomend', function() {

    // Normal icons
    var normaliconresized = L.Icon.extend({
        options: {
            iconSize: [20*(map.getZoom()+2), 20*(map.getZoom()+2)], // New size!
            iconAnchor:   [20,20],
            popupAnchor:  [0,-20]
        }
    });

    var normaliconchange = new normaliconresized({iconUrl: 'icon1.jpg'})
    normalLayer.eachLayer(function (layer) {
        layer.setIcon(normaliconchange);
    });

    .... Do the same for the other groups
});             
</script>
Run Code Online (Sandbox Code Playgroud)

使用L.divIcon的方法2:我制作图标和不同的组,并为每个带有background-image属性的图标添加一些CSS 。然后,zoomend我只需使用JQuery更改CSS。background-sizeCSS属性允许我更改图像大小。我对我拥有的每个divIcon类都执行此操作

Css
.iconsdiv{
    width:20px; height:20px;
    background-image:url("icon2.jpg");
    background-size: 20px 20px;
}


Script
<script>
// Setting map options
....


// Setting Icon

var divicon = L.divIcon({className: 'iconsdiv', iconSize: null }); // Explicitly set to null or you will default to 12x12


// Create a group
var divLayer = L.layerGroup([
    L.marker([200,200], {icon:divicon})
]).addTo(map);


// Resizing on zoom
map.on('zoomend', function() {

    var newzoom = '' + (20*(map.getZoom()+2)) +'px';
    $('#map .iconsdiv').css({'width':newzoom,'height':newzoom,'background-size':newzoom + ' ' + newzoom}); 

     ... repeat for the other classes
});


</script>
Run Code Online (Sandbox Code Playgroud)

我对javascript / jquery /几乎没有任何经验。

第二个选项是否可取,因为它不需要重新设置每个图标?当存在大量的组/图标时,它将提高性能吗?

Pep*_*epe 6

我自己使用进行了测试performance.now()。我在1024x1180(边界)自定义地图上进行了测试。曾经有676个制造商。然后使用大约一半的标记,最后使用100个标记。性能是在map.on('zoomend', function() {函数内部测量的。

  • 对于676个标记L.Icon,更新方法花费了2500-2900毫秒。对于L.divIcon这仅10-30毫秒。
  • 这次标记的数量也减半。
  • 大约100个标记(104)L.Icon花费了300-400毫秒来更新。L.divIcon在4-5毫秒内完成了相同的操作。

我还L.layerGroup([...]).addTo(map)对676个标记的初始化()进行了计时。L.Icon花费了2200-2400毫秒 L.divIcon在80-95毫秒内完成了相同的操作。

L.divIcon显然做得更好(如预期)。虽然有点作弊,但我想我更喜欢使用这种方法。我不能直接考虑为什么L.Icon在我们要缩放的情况下首选该方法的原因

编辑:我注意到,根据Leaflet Documentation'Icon',您还可以为图标分配一个className。使用CSS-性能widthheight同样可以像我一样以前为divIcons,从而为您节省大量的加载时间,还让您使用链接到所有的选项来完成L.Icon。您的初始化时间仍然会更长。