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

2024-03-29

我试图在放大传单时调整自定义图标的大小。我为此想出了两种解决方案。一个使用L.Icon标签,另一个使用L.divIcon。在这两个示例中,为了便于阅读,我仅设置了 1 个标记和组

Method 1 using L.Icon:用标记进行分组。然后在zoomend i use 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>

Method 2 using L.divIcon:我制作图标和不同的组,并为每个图标添加一些 CSSbackground-image财产。然后在zoomend我只是使用 JQuery 来更改 css。background-sizecss-property 允许我更改图像大小。我为每个 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>

我几乎没有任何关于 javascript/jquery/... 的经验

第二个选项是否更好,因为它不需要重新设置每个图标?当有大量组/图标时,它会提高性能吗?


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

  • 对于 676 个标记,需要 2500-2900 毫秒L.Icon方法来更新。为了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如果我们想要缩放,方法将是首选

编辑: 我注意到根据传单文档“图标” http://leafletjs.com/reference-1.2.0.html#icon您还可以为图标指定一个类名。使用 css 属性width and height可以像我之前对 divIcons 所做的那样,从而节省大量加载时间,但允许您使用链接到的所有选项L.Icon。不过你的初始化时间仍然会更长。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传单自定义图标在缩放时调整大小。性能图标与 divicon 的相关文章

  • Codeigniter 滚动分页

    我正在使用 jquery 插件滚动分页在 codeigniter 中 我面临的问题是我的循环不会终止 并且也无法给出准确的结果 这是我的html code div div div class image box style margin l
  • ASP.NET 更新面板停止 jquery 工作

    我已经为 mouseenter mouseleave 以及 jquery Draggable 绑定了 jquery 事件集 div 被放置在更新面板中 当单击按钮时 信息将发送到数据库并更新更新面板 但是 当面板更新时 jquery 事件不
  • DIV 内的右对齐按钮

    作为一名后端开发人员 我感觉更舒服 但我有一个样式问题困扰着我 我已经发布了我的场景示例here http jsfiddle net jDaM8 1 我正在创建一个 div 它根据单击按钮显示 隐藏以显示特定项目的详细信息 该部分工作正常
  • 使用 JQuery 从文本框中删除不需要的字符

    我想了解的是如何使用 JQuery 从文本框 或文本区域 中删除某些字符 我有 C 代码 但我似乎无法将其转换为 JQuery javascript 我的问题是 我不知道如何从文本框中获取字符数组的值 然后我可以循环遍历该值并与给定的不需要
  • 如何使用 ng-repeat 更改 AngularJS 中特定 的背景颜色

    如何为每一行设置不同的背景颜色 举个例子 第 1 行 蓝色 第2行 红色 第三行 绿色 main js scope names fName John lName David fName Richard lName Daniel fName
  • 添加自定义 CSS 到 Jekyll

    我是 Jekyll 新手 我正在按顺序使用自定义 html 和 css 制作一个网站 Jekyll 默认下载 minima 主题 所以我用以下 html 覆盖了主页 all my html
  • 在 Firefox 中访问全局事件对象

    目标 运行一些函数 ajaxStart 但仅限于由特定事件触发时 代码 loading indicator ajaxStart function if event null if event type hashchange event ty
  • jQuery 插件与小部件

    几个月前 我开始使用 jQuery 插件进行一些实验 我在互联网上找到了一些教程 然后开始整理一些东西 几天前 我需要构建自己的 插件 并回到我的旧项目 当我试图在互联网上找到更多信息时 我偶然发现了这些称为小部件的新 东西 据我了解 我应
  • 的 CSS margin-top 影响父级的边距

    我已经研究这个问题有一段时间了 但还没有找到直接的答案 当向元素添加页边距顶部时 就我而言 它主要发生在标题上 在许多情况下 边距顶部是与父级共享的 HTML div h1 My title h1 div CSS div padding 2

  • css 表格单元格,内容有不必要的上边距

    我在代码中使用 div 块的表格单元格排列 我的代码有问题 我的 html 的预览是here http jsbin com avozik 10 edit preview 当我的第一个面板中有任何内容 文本或图像 时 inner第二个和第三个
  • 为什么 Google Developer Library 的 jQuery 链接中没有协议?

    我总是很怀疑 我认为谷歌很聪明 但是当我复制那里的开发者网站的 jquery 链接时https developers google com speed libraries devguide https developers google c
  • 角度材料在一个表单字段中输入和选择

    I want the input field and the drop down field in the same area like the one on the left I did this on the inspector 无论我
  • jQuery 解析 JSON

    当我尝试解析 JSON 验证的字符串时收到此错误 JSON parse 意外字符 当我删除需要转义的字符 style width 400px 时 它完美地工作 我缺少什么 在使用 parseJSON 之前是否有一种独特的方法来转义字符 va
  • 角度按钮单击旋转图标

    我有以下按钮
  • 点击事件的事件处理程序自动触发 - jQuery [重复]

    这个问题在这里已经有答案了 可能的重复 为什么单击事件处理程序会在页面加载后立即触发 https stackoverflow com questions 7102413 why does click event handler fire i
  • 如何使用 jQuery 或 php 从 Instagram 令牌获取访问令牌

    我是 Instagram API 的新手 发现一些与了解如何获取访问令牌相关的问题 我所做的是在 Instagram 上注册 创建了一个应用程序 并使用了客户端 id 和重定向 url 当我将以下内容发布到浏览器中时 它会给我一个 code
  • jQuery 使用 Next 设置选定选项

    如何使用 jQuery 将已选定项目的 下一个 项目设置为 选定 例如 如果我有
  • 在 Angular 5 中使用 jquery 插件

    我正在尝试在 Angular 5 项目中使用以下日期选择器 但我不确定如何导入它 https bootstrap datepicker readthedocs io en latest index html https bootstrap
  • 如何让浏览器后退按钮通过 AJAX 调用带您返回?

    我有一个页面 上面有很多动态生成的复选框 当用户单击这些复选框时 页面上的许多内容会通过 ajax 动态更改 最终用户抱怨 在点击提交然后点击后退按钮更改某些内容后 他们的选择被破坏了 他们必须重新做一遍 我见过一些网站 gmail fac
  • 只允许在输入字段中输入数字

    我想要打开电话号码字段这个网站 http myfrugaltech com dev savoo register 只接受数字或数字 我无权编辑 HTML 代码 那么可以使用 jQuery 通过定位字段 ID 来完成此操作吗 如果可以的话 该

随机推荐