LeafLet加载自定义Legend的设计与实现

news/2024/5/3 23:45:33/文章来源:https://blog.csdn.net/yelangkingwuzuhu/article/details/130325313

背景

        众所周知,在GIS的世界里,图例和地图永远是一对一起出现的对象。在地图上表示地理环境各要素,比如山脉、河流、城市、铁路等所用的符号叫做图例。这些符号所表示的意义,常注明在地图的边角上。图例是表达地图内容的基本形式和方法,是现代地图的语言,是读图和用读所借助的工具。地图符号一般包括各种大小、粗细、颜色不同的点、线、图形等。符号的设计要能表达地面景物的形状、大小和位置,而且还能反映出各种景物的质和量的特征,以及相互关系。因此图例常设计成与实地景物轮廓相似的几何图形。

         还有一些地图,专门表示各种自然条件、工业分布等。在这些图上,也必然有相应的图例,说明某种符号代表某种森林,某种符号代表某种矿产,某种符号代表某种工业,等等。读图之前,先把图例中的地图符号和注记的意义弄清楚,对于正确理解地图内容就方便多了。可以这样说,图例是读图的“线索”,方便用户按图索骥。

         在之前的博文中,介绍了很多Leaflet的内容,关于图例的展示一直没有涉及。本文简单讲讲在Leaflet中如何进行图例的展示,基于Leaflet.Legend进行图例的展示。通过讲解Leaflet.Legend得集成,核心API的讲解,让您对Leaflet.Legend有一个基本的认识和了解。

一、Leaflet.Legend简介

        Leaflet本身是一个非常轻量级的前端组件,基于Leaflet有很多的扩展插件,围绕Leaflet的生态非常丰富。在Leaflet中的插件中,可以找到下面的插件列表内容。

 1、Legend的开源协议

        Leaflet.Legend是一个MIT协议,非常宽松的协议。可放心在项目中使用。Leaflet.Legend 是一个 Leaflet 插件, 用于显示图例符号和切换相应的叠加层的显示.开源地址:Legend。

MIT LicenseCopyright (c) 2020 ptma@163.comPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

 2、Legend API介绍

        打开src目录下的leaflet.legend.js文件,这里是整个图例类的源码文件,如上图所示的各个Symbol类都定义在这里。下面就这些类进行深入的讲解。

options: {position: "topleft",title: "Legend",legends: [],symbolWidth: 24,symbolHeight: 24,opacity: 1.0,column: 1,collapsed: false,},initialize: function (options) {L.Util.setOptions(this, options);this._legendSymbols = [];this._buildContainer();},

        上述代码定义了创建图例对象的各个属性,具体的参数说明如下:

参数名称类型默认值描述 
positionStringtopleft图例控件位置
titleStringLegend图例控件的标题
opacityNumber1.0图例面板的透明度
legendsLegendSymbol[][][LegendSymbol](#legendsymbol) 图例符号数组。
symbolWidthNumber24图例符号的宽度,以像素为单位
symbolHeightNumber24图例符号的高度,以像素为单位
columnNumber1图例符号排列的列数
collapsedBooleanfalse图例面板是否默认展开

        LegendSymbol对象的定义如下:

参数名称类型默认值描述
labelStringundefined图例符号的文本标签。
typeStringundefined图例符号的类型. 可以是image','circle','rectangle','polygon' 或 'polyline'。
urlStringundefined图里图片的 URL,仅用于 type 为 'image' 时
radiusNumberundefined圆形图例的半径,以像素为单位,仅用于 type 为 'circle' 时
sidesNumberundefined正多边形的边数,仅用于 type 为 'polygon' 时。
layersLayerLayer[]undefined,图例符号关联的叠加层. 关联叠加层后可通过点击图例来切换相应叠加层的可见性。
inactiveBooleanundefined图例符号是否为非激活的, 非激活的图例会减淡显示
strokeBooleantrue是否绘制边框
colorString#3388ff边框颜色
weightNumber边框宽度
opacityNumber1.0边框透明度
lineCapStringround指定如何绘制每一条线段末端的属性。有 3 个可能的值,分别是:'butt','round' 或 ’square‘
lineJoinStringround用来设置2个长度不为0的相连部分(线段,圆弧,曲线)如何连接在一起的属性(长度为0的变形部分,其指定的末端和控制点在同一位置,会被忽略)
dashArrayStringnull控制用来描边的点划线的图案范式
dashOffsetStringnulldash模式到路径开始的距离
fillBooleandepends是否用颜色填充
fillColorString*填充色,默认与边框颜色相同
fillOpacityNumber0.2 填充透明度
fillRuleStringevenodd填充规则

二、Legend实例开发

        有了上面对图例API的基础认知之后,我们便可以进行相应的实例开发。下面将使用一个详细的案例讲解,来详细说明Legend如何进行深入开发。

1、新建html页面

<!DOCTYPE html>
<html><head><title>Leaflet legend control</title><meta charset="utf-8" /><style type="text/css">body {padding: 0;margin: 0;}html,body,#map {height: 100%;}</style><link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" /><script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script><link rel="stylesheet" href="../src/leaflet.legend.css" /><script type="text/javascript" src="../src/leaflet.legend.js"></script>
</head><body><div id="map"></div>
</body>
</html>

2、创建Leaflet对象引用

var map = L.map("map", {center: [29.797751134173065, 120.7012939453125],zoom: 5
});L.tileLayer('file:///D%3A/wzh_test/q0403/{z}/{x}/{y}.png', {minZoom: 0,maxZoom: 7,tms: false,attribution: '图例功能测试-夜郎king'
}).addTo(map);

3、图例定义

var marker = L.circleMarker(L.latLng(29.702368038541767, 120.47607421874999), {radius: 6,fillColor: "#ff0000",color: "blue",weight: 2,opacity: 1,fillOpacity: 0.6,});var latlngs = [[29.204918463909035,119.6246337890625,],[29.79358002272772,120.27008056640624,],[29.70087695780884,120.2984046936035,]];var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map);const legend = L.control.Legend({position: "bottomleft",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: [{label: "位置",type: "image",url: "marker/marker-red.png",}, {label: "Marker2",type: "image",url: "marker/purple.png"}, {label: "Circle",type: "circle",radius: 6,color: "blue",fillColor: "#FF0000",fillOpacity: 0.6,weight: 2,layers: [marker],inactive: true,}, {label: "Real line",type: "polyline",color: "#FF0000",fillColor: "#FF0000",weight: 2,layers: polyline}, {label: "Dotted line",type: "polyline",color: "#0000FF",fillColor: "#0000FF",dashArray: [5, 5],weight: 2}, {label: "Rectangle",type: "rectangle",color: "#FF0000",fillColor: "#FF0000",weight: 2}, {label: "Square",type: "polygon",sides: 4,color: "#FF0000",fillColor: "#FF0000",weight: 2}, {label: "Regular triangle",type: "polygon",sides: 3,color: "#FF0000",fillColor: "#FF0000",weight: 2}, {label: "Regular polygon",type: "polygon",sides: 5,color: "#FF0000",fillColor: "#FF0000",weight: 2}]}).addTo(map);

4、展示效果

         点击Circle图例还可以进行图层的切换,默认情况下,地图上不展示这些信息,点击之后会在地图上添加相应的图层对象。

5、图例调用过程

        在源码中进行debug调试,观察相应的代码如何执行的。首先进行Legend初始化,调用initialize方法,在这个方法中会将出入的参数进行解析,然后再创建元素对象。

_buildContainer: function () {this._container = L.DomUtil.create("div", "leaflet-legend leaflet-bar leaflet-control");this._container.style.backgroundColor = "rgba(255,255,255, " + this.options.opacity + ")";this._contents = L.DomUtil.create("section", "leaflet-legend-contents", this._container);this._link = L.DomUtil.create("a", "leaflet-legend-toggle", this._container);this._link.title = "Legend";this._link.href = "#";var title = L.DomUtil.create("h3", "leaflet-legend-title", this._contents);title.innerText = this.options.title || "Legend";var len = this.options.legends.length;var colSize = Math.ceil(len / this.options.column);var legendContainer = this._contents;for (var i = 0; i < len; i++) {if (i % colSize == 0) {legendContainer = L.DomUtil.create("div", "leaflet-legend-column", this._contents);}var legend = this.options.legends[i];this._buildLegendItems(legendContainer, legend);}},

         在上面的代码执行过程中定义相应的图例对象,同时将对象放置到页面元素中。下面重点看一下各个图例对象是怎么进行初始化的。

_buildLegendItems: function (legendContainer, legend) {var legendItemDiv = L.DomUtil.create("div", "leaflet-legend-item", legendContainer);if (legend.inactive) {L.DomUtil.addClass(legendItemDiv, "leaflet-legend-item-inactive");}var symbolContainer = L.DomUtil.create("i", null, legendItemDiv);var legendSymbol;if (legend.type === "image") {legendSymbol = new ImageSymbol(this, symbolContainer, legend);} else if (legend.type === "circle") {legendSymbol = new CircleSymbol(this, symbolContainer, legend);} else if (legend.type === "rectangle") {legendSymbol = new RectangleSymbol(this, symbolContainer, legend);} else if (legend.type === "polygon") {legendSymbol = new PolygonSymbol(this, symbolContainer, legend);} else if (legend.type === "polyline") {legendSymbol = new PolylineSymbol(this, symbolContainer, legend);} else {L.DomUtil.remove(legendItemDiv);return;}this._legendSymbols.push(legendSymbol);symbolContainer.style.width = this.options.symbolWidth + "px";symbolContainer.style.height = this.options.symbolHeight + "px";var legendLabel = L.DomUtil.create("span", null, legendItemDiv);legendLabel.innerText = legend.label;if (legend.layers) {L.DomUtil.addClass(legendItemDiv, "leaflet-legend-item-clickable");L.DomEvent.on(legendItemDiv,"click",function () {this._toggleLegend.call(this, legendItemDiv, legend.layers);},this);}},

 以上就是Legend图例对象的主要执行过程,有兴趣的朋友可以把源码clone到本地进行深入研究。

总结

        以上就是本文的主要内容,本文简单讲解在Leaflet中如何进行图例的展示。通过讲解Leaflet.Legend的集成,核心API的讲解,让您对Leaflet.Legend有一个基本的认识和了解。本文行文仓促,难免有误,欢迎批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102335.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小六壬学习笔记

小六壬学习笔记 简介前置知识:十二地支和十二时辰适用范围起课&#xff1a;月令日时卦象 疑问&#xff1a;遇到闰月怎么办&#xff1f;禁忌数字起课法手机计算器取余数 简单解卦 简介 马前课&#xff0c;又名&#xff1a;小六壬。 小六壬历史渊源&#xff1a;https://m.sohu.c…

统信UOS 20 安装达梦数据库V8

统信UOS 20 安装达梦数据库V8 1、安装教程2、启动数据库实例服务失败解决方法3、使用dm管理工具连接数据库 1、安装教程 https://blog.csdn.net/OceanWaves1993/article/details/129936878 此教程进行到启动数据库实例步骤时 使用下面命令启动数据库实例服务时&#xff0c;报…

大数据技术之集群数据迁移

在大数据集群数据迁移的项目中涉及到很多技术细节&#xff0c;本博客记录了迁移的大致的操作步骤。 迁移借用Hadoop自带的插件&#xff1a;distcp。 一、Hadoop集群数据迁移 **DistCp&#xff08;分布式拷贝&#xff09;**是用于大规模集群内部和集群之间拷贝的工具。它使用M…

DHCP笔记

目录 DHCP动态主机配置协议——UDP67/68端口 DHCP获取IP地址 客户端首次获取IP地址 客户端再次获取IP地址 租期/续租 DHCP的工作报文 DHCP的配置 案例 DHCP动态主机配置协议——UDP67/68端口 DHCP是应用层协议&#xff0c;采用C/S服务模式&#xff0c;只能在一个广播域…

数据科学与机器学习在软件开发中的应用

数据科学和机器学习是现代软件开发的重要组成部分&#xff0c;可以帮助开发人员更好地理解和分析数据&#xff0c;从而提高软件的质量和性能。在本篇博客中&#xff0c;我将深入探讨数据科学和机器学习在软件开发中的应用&#xff0c;并讨论它们如何帮助我们创建更好的软件。 …

Xshell中的基本命令

whoami 当我们刚登录上Xshell的时候&#xff0c;我们应该做什么呢&#xff1f;&#xff1f; 我们上次说了如何增加使用者&#xff0c;和删除使用者&#xff0c;今天我们说一下其他的基本命令。 我们刚开始登录的时候可以用root登录 那么我们怎么看自己事谁呢&#xff1f; …

Android 一个获取网址时间的Demo

Android 一个获取网址时间的Demo 文章目录 Android 一个获取网址时间的Demo通过一个网址获取时间的代码关于Android NTP 时间Android 同步时间代码 前段时间有个客户想用局域网同步Android 设备的时间&#xff0c;开发后把这个demo分享一下。 效果&#xff1a; 这里也获取了阿…

VUE3子组件-业务代码优化

Vue3子组件 1.简介 Vue 3组件的主要优势之一就是它们可以帮助你将你的应用程序分解成可维护和可重用的部分。当你在应用程序中多次使用相同的代码时&#xff0c;你可以将它们抽象成一个组件&#xff0c;然后在应用程序中的多个地方使用该组件&#xff0c;而不必每次都编写相同…

User Diverse Preference Modeling by Multimodal Attentive Metric Learning

BACKGROUND 现有模型通常采用一个固定向量去表示用户偏好&#xff0c;在假设——特征向量每一个维度都代表了用户的一种特性或者一个方面&#xff0c;这种方式似乎不妥&#xff0c;因为用户对于不同物品的偏好是不一样的&#xff0c;例如因演员喜欢一部电影&#xff0c;而因特…

Linux 静态库的制作与使用

目录 静态库1、 什么是库2、 静态库的制作2.1 命名规则与制作规则 3、 静态库的使用 静态库 1、 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供使用者可以直接拿来用的变量、函数或类。库是一种特殊的程序&#xff…

多兴趣推荐召回模型:ComiRec

前言 多兴趣向量召回系列&#xff1a; 通过Youtube DNN推荐模型来理解推荐流程 多兴趣召回模型&#xff1a;MIND 推荐系统可以表达为序列推荐问题的形式&#xff0c;序列推荐任务是通过用户的历史行为来预测用户下一个感兴趣的item&#xff0c;这也与真实场景的推荐场景是符…

ERROR org.springframework.web.context.ContextLoader

项目启动时报错&#xff1a; ERROR org.springframework.web.context.ContextLoader - Context initialization failed java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationUtils.clearCache() 原因分析 这个错误的原因可能是因为 Spring 的不同…

Go 语言进阶与依赖管理

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、语言进阶1. 并发和并行2. 协程(Goroutine…

Ubuntu20.04软件安装大全

目录 Ubuntu20.04 软件安装大全前言1. Windows和Ubuntu双系统安装1.1 下载Ubuntu系统镜像1.2 磁盘分区1.3 GPT分区安装Ubuntu1.4 系统完成后的一些设置1.5 遇到的一些小bug 2. 换源2.1 apt换源2.2 pip换源 3. 显卡驱动安装3.1 卸载显卡驱动3.2 准备工作3.3 驱动安装3.4 验证 4.…

Python自动发送消息小脚本,可用于各种聊天框~

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…

2023-04-23 算法面试中常见的动态规划问题

动态规划 1 什么是动态规划 以菲波那切数列求和为例&#xff0c;通过 1.普通的递归2.引入记忆数组memo3.自下而上地解决问题&#xff0c;即动态规划 动态规划的定义 dynamic programming (also known as dynamic optimization) is a method for solving a complex problem by…

C嘎嘎~~ 【初识C++ 下篇】

初识C 下篇 1.引用1.1引用的概念1.2引用的特点1.3常引用1.4引用使用的场景1.5引用和指针的区别 2.指针空值 --- nullptr3.内联函数3.1 内联函数的概念3.2内联函数的使用场景3.3内联函数的特性 1.引用 1.1引用的概念 相信大家小时候&#xff0c; 肯定有小名、绰号、亲朋好友的昵…

Zuul源码解析(二)

Zuul 的自动配置 ZuulProxyAutoConfiguration 如何触发 如上图&#xff0c;在 spring.factory 中配置 ZuulProxyAutoConfiguration 自动配置了&#xff0c;直接点进去 如上图所示&#xff0c;发现这有个条件注解&#xff0c;需要有 org.springframework.cloud.netflix.zuul.Zu…

“支付+SaaS”赋能传统产业数字化转型

易观&#xff1a;传统支付业务利润空间在政策监管和市场竞争下不断被压缩&#xff0c;多家上市支付机构逐步将业务经营重点转移切入到企业交易环节&#xff0c;为企业提供包括SaaS服务、行业解决方案、营销服务及金融科技服务等在内的企业服务收入成为新的增长点。 伴随着“十四…

Linux网络服务之yum仓库

目录 一、yum仓库简介二. ftp搭建yum源三. 搭建国内在线源四. 本地源和在线yum同时使用五. 通过缓存的方式保存所下载的软件包六 . 制作yum仓库 一、yum仓库简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机…