当前位置: 首页 > news >正文

源码分析之Leaflet中Icon类

概述

在Leaflet中,Icon类用于创建图标对象,可以用于标记点的图标。Icon类继承自Class类,提供了一些方法用于创建图标对象。

源码分析

源码实现

Icon类源码实现如下:

export var Icon = Class.extend({options: {popupAnchor: [0, 0],// 弹出框的锚点tooltipAnchor: [0, 0],// 弹出框和提示框的锚点crossOrigin: false, // 跨域处理},initialize: function (options) {setOptions(this, options);},createIcon: function (oldIcon) {return this._createIcon("icon", oldIcon);},createShadow: function (oldIcon) {return this._createIcon("shadow", oldIcon);},_createIcon: function (name, oldIcon) {var src = this._getIconUrl(name);if (!src) {if (name == "icon") {throw new Error("iconUrl not set in Icon options (see the docs.)");}return null;}var img = this._createImg(src,oldIcon && oldIcon.tagName === "IMG" ? oldIcon : null);this._setIconStyles(img, name);if (this.options.crossOrigin || this.options.crossOrigin === "") {img.crossOrigin =this.options.crossOrigin === true ? "" : this.options.crossOrigin;}return img;},_setIconStyles: function (img, name) {var options = this.options;var sizeOption = options[name + "Size"];if (typeof sizeOption === "number") {sizeOption = [sizeOption, sizeOption];}var size = point(sizeOption),anchor = point((name === "shadow" && options.shadowAnchor) ||options.iconAnchor ||(size && size.divideBy(2, true)));img.className = "leaflet-marker-" + name + " " + (options.className || "");if (anchor) {img.style.marginLeft = -anchor.x + "px";img.style.marginTop = -anchor.y + "px";}if (size) {img.style.width = size.x + "px";img.style.height = size.y + "px";}},_createImg: function (src, el) {el = el || document.createElement("img");el.src = src;return el;},_getIconUrl: function (name) {return ((Browser.retina && this.options[name + "RetinaUrl"]) ||this.options[name + "Url"]);},
});export function icon(options) {return new Icon(options);
}

源码详解

核心配置项

Icon类的配置项实际上比上述还要多,如下所示:

options= {iconUrl: null,        // 必须的图标路径iconRetinaUrl: null,  // Retina屏专用路径iconSize: null,       // 图标尺寸(像素)iconAnchor: null,     // 图标锚点位置popupAnchor: [0,0],   // 弹出框锚点偏移shadowUrl: null,      // 阴影图片路径crossOrigin: false    // 跨域处理shadowRetinaUrl: null,// Retina屏专用路径shadowSize: null,     // 阴影尺寸shadowAnchor: null,   // 阴影锚点位置className: null,      // 自定义类名
}
核心方法实现
  1. 初始化方法

Icon类继承于Class基类,因此其初始化方法为initialize。在初始化方法中,会调用setOptions方法来设置options属性,合并配置项。

  1. 图标创建流程

Icon类提供了两个方法:createIconcreateShadow,用于创建图标和阴影。这两个方法都会调用_createIcon方法,该方法根据传入的name参数来确定创建的是图标还是阴影。

_createIcon方法中,首先会根据参数name获取图片的路径,若图标的默认路径不存在则抛出异常。然后会调用_createImg创建图片的DOM元素设置src属性,再就是调用_setIconStyle方法设置图标的样式包括大小以及偏移值,偏移值主要是通过参数进行计算,最后根据参数crossOrigin设置图标的跨域属性。

  1. 动态URL选择
  • 自动检测Retina屏幕
  • 优先使用Retina专用高清图片
  1. 样式定位算法

样式定位算法,主要是通过CSS margin精确控制锚点的样式,因为图标的锚点默认在左上角,通过负的margin可以将图标的中心或者指定锚点位置对准地图上的坐标点,该方法也叫做负边距定位法

总结

Icon类的主要职责是根据提供的选项创建和管理图标及其阴影的DOM元素,处理不同分辨率的资源,设置正确的位置和样式,确保图标在地图上正确显示。通过选项配置,用户可以灵活地定制图标的各种属性,如大小、锚点位置、弹出窗口的位置偏移等。

相关文章:

  • 【EDA】EDA中聚类(Clustering)和划分(Partitioning)
  • 《算法笔记》4.2小节——算法初步->哈希
  • 观测云数据在Grafana展示的最佳实践
  • Milvus(7):Schema、主字段和自动识别
  • Apache Spark 源码解析
  • Go 语言 TCP 端口扫描器实现与 Goroutine 池原理
  • Modbus主从通信功能码与报文格式
  • 如何在SpringBoot中通过@Value注入Map和List并使用YAML配置?
  • 电子学会—青少年软件编程 python一级等级考试真题—2025年03月
  • 20242817-李臻-课上测试:信号处理
  • uniapp自定义封装tabbar
  • TDengine 数据缓存技术
  • iOS/Flutter混合开发之PlatformView配置与使用
  • 记录一次无界微前端的简单使用
  • Ubuntu 上手动安装 Go 环境并解决“可执行文件格式错误”
  • Mac「brew」快速安装Redis
  • 输入电抗器和输出电抗器的作用-杭州干扰净电子科技
  • 二叉树的遍历(广度优先搜索)
  • Springboot 手搓 后端 滑块验证码生成
  • 【GCC bug】libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found
  • 政治局会议:创设新的结构性货币政策工具,设立新型政策性金融工具,支持科技创新、扩大消费、稳定外贸等
  • 美联储官员:若特朗普高额关税致失业率飙升,将支持降息
  • 小马智行彭军:今年是Robotaxi量产元年,有望3年后盈亏平衡
  • “70后”女博士张姿卸任国家国防科技工业局副局长
  • 研究|和去年相比,人们使用AI的需求发生了哪些变化?
  • “家门口的图书馆”有多好?上海静安区居民给出答案