leaflet学习笔记-带过滤的图例(九)

前言

图例不只能够帮助我们在查看地图的时候更加方便容易地分辨不同颜色代表的要素,本文要介绍的图例组件还可以按需求过滤掉不用显示的要素,使地图的更能清晰的显示我们需要显示的内容

技术核心

说到过滤要素,第一时间想到的就是滑块组件,这里我们选择了Element-plus的Slider 滑块组件,主要功能就是根据滑块背景的不同颜色,滑动滑块过滤掉滑块范围以外背景颜色的要素。这里遇到一个大麻烦,本来以为很容易解决的,后面发现没有这么容易完成,就是滑块的背景颜色添加,这里想了好几种方式,最后还是只能使用原生js通过操作dom实现背景颜色的添加和上下两个滑块遮罩的添加(将要过滤的颜色范围遮盖掉)。核心代码如下:

watchEffect(() => {let [min, max] = sliderValue.value//为了添加滑块的遮罩,达到想要的效果(重点)nextTick(() => {let runway = document.getElementsByClassName('sliderLegend')?.[0]?.querySelectorAll('.el-slider__runway')[0]if (!runway.querySelector('.maxBar')) {let div = document.createElement('div')div.setAttribute('class', 'maxBar maskBar')runway.appendChild(div)}if (!runway.querySelector('.minBar')) {let div = document.createElement('div')div.setAttribute('class', 'minBar maskBar')runway.appendChild(div)}let maxMaskBar = document.querySelector('.maxBar')let minMaskBar = document.querySelector('.minBar')if (maxMaskBar) {maxMaskBar.style.height = new BigNumber(100).minus(max).toNumber() + '%'}if (minMaskBar) {minMaskBar.style.height = min + '%'}})
})

完整代码

/**
* sliderLegend.vue 可以拖动滑块过滤的图例
* @Author ZhangJun
* @Date  2024/1/19 9:36
**/
<template><el-card class='slider-block absolute right-10 bottom-10'v-if='grades.values&&grades.values.length>0'style='z-index: 1000;'><el-space direction='vertical' :size='20'><el-text size='large' type='info'>{{ grades.desc }}{{ grades.unit }}</el-text><div style='width: 60px;text-align: left;'><el-slider ref='legendRef'class='sliderLegend'v-model='sliderValue'@change='onChange':range='true'vertical:marks='marks'v-bind='options' /></div></el-space></el-card>
</template><script setup>
import { ref, defineProps, computed, reactive, watchEffect, nextTick } from 'vue'
import BigNumber from 'bignumber.js'const props = defineProps({gradesValues: { type: Array, default: () => ([]) },//分级的value数值gradesColors: { type: Array, default: () => ([]) },//分级的color数值(需要与gradesValues一一对应)
})const emits = defineEmits(['update:modeValue'])let legendRef = ref()//当前滑块的值
let sliderValue = ref([0, 100])//间隔数值
let interval = ref()//为了获取真实数据和百分比之间的映射关系
let percentage2ValueDic = {}
let valueDic2Percentage = {}/*** @Description 生成滑块的背景颜色* @Param colors 备选颜色集合* @Author ZhangJun* @Date  2024-01-19 01:43:56* @return void**/
let generationLinearGradient = computed(() => {let { colors } = gradeslet interval = new BigNumber(1).div(colors?.length)let temp = colors.map((color, index) => {let percentage = interval.times(index).times(100).toFixed(0) + '%'let rgba = `rgba(${color[0]},${color[1]},${color[2]},${color.length > 3 ? color[3] / 255 : 1})`if (index === 0) {return [rgba]} else {return [percentage, rgba]}})return `linear-gradient(to top,${temp.flat()})`
})//刻度值
const marks = computed(() => {//清空percentage2ValueDic = {}valueDic2Percentage = {}let { values, unit } = gradesinterval.value = new BigNumber(1).div(values?.length - 1)let marks = {}values.forEach((value, index) => {let percentageVal = interval.value.times(index).times(100).toFixed(0)marks = { ...marks, [percentageVal]: `${value}` }//做映射使用percentage2ValueDic = { ...percentage2ValueDic, [percentageVal]: value }valueDic2Percentage = { ...valueDic2Percentage, [value]: percentageVal }})return marks
})//分级数据
let grades = reactive({values: props.gradesValues,colors: props.gradesColors,unit: undefined,desc: '',
})//默认的配置参数
let options = computed(() => {let { values } = gradeslet height = (values?.length - 1) * 40height = height > 300 ? 300 : heightreturn {min: 0,max: 100,height: `${height}px`,step: interval.value.times(100).toFixed(0),showTooltip: false,}
})/*** @Description 初始化当前control* @Param gradesData 分级参数* @Author ZhangJun* @Date  2024-01-22 09:38:17* @return void**/
function initControl(gradesData) {sliderValue.value = [0, 100]grades = Object.assign(grades, gradesData)
}/*** @Description 获取数组里面最接近这个值的数* @Param arr 数组* @Param target 目标值* @Author ZhangJun* @Date  2024-01-19 07:19:21* @return void**/
function getClosestNumber(arr = [], target) {let minDistance = Math.abs(target - arr[0])let [closestNumber] = arrfor (let i = 1; i < arr.length; i++) {let distance = Math.abs(target - arr[i])if (distance < minDistance) {minDistance = distanceclosestNumber = arr[i]}}return closestNumber
}/*** @Description 滑块数值改变* @Param e 事件回调参数* @Author ZhangJun* @Date  2024-01-22 09:38:59* @return void**/
function onChange(e) {let [min, max] = elet arr = Object.keys(percentage2ValueDic)min = getClosestNumber(arr, min)max = getClosestNumber(arr, max)emits('update:modeValue', [percentage2ValueDic[min], percentage2ValueDic[max]])
}watchEffect(() => {let [min, max] = sliderValue.value//为了添加滑块的遮罩,达到想要的效果(重点)nextTick(() => {let runway = document.getElementsByClassName('sliderLegend')?.[0]?.querySelectorAll('.el-slider__runway')[0]if (!runway.querySelector('.maxBar')) {let div = document.createElement('div')div.setAttribute('class', 'maxBar maskBar')runway.appendChild(div)}if (!runway.querySelector('.minBar')) {let div = document.createElement('div')div.setAttribute('class', 'minBar maskBar')runway.appendChild(div)}let maxMaskBar = document.querySelector('.maxBar')let minMaskBar = document.querySelector('.minBar')if (maxMaskBar) {maxMaskBar.style.height = new BigNumber(100).minus(max).toNumber() + '%'}if (minMaskBar) {minMaskBar.style.height = min + '%'}})
})defineExpose({ initControl })</script><style scoped lang='scss'>
::v-deep .el-slider__runway {background: v-bind(generationLinearGradient);.maskBar {width: 100%;height: auto;background: lightgrey;position: absolute;border-radius: 6px;}.maxBar {top: -3px;}.minBar {bottom: -3px;}
}::v-deep .el-slider__bar {background: transparent;
}
</style>

效果

过滤后的效果

在这里插入图片描述

本来原理很简单,主要时间还是花费到了slider的背景颜色上,还要添加一个上下滑动的遮罩,才能将要过滤掉的颜色范围遮掉


本文为学习笔记,仅供参考

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

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

相关文章

一个大的rosbag数据包怎么分割成一个小的数据包?

文章目录 1. 按时间范围分割&#xff1a;2. 按照消息类型分割&#xff1a;3. 使用split命令&#xff1a;4. 使用Python脚本&#xff1a; 在ROS&#xff08;机器人操作系统&#xff09;中&#xff0c; rosbag是一个用于记录和回放ROS主题消息的工具。如果你有一个大的 rosbag数…

[C++] external “C“的作用和使用场景(案例)

C中extern "C"的作用是什么&#xff1f; 在 C 中&#xff0c;extern "C" 的作用是告诉编译器按照 C 语言的规范来处理函数名和变量名。这是因为 C 编译器会对函数名和变量名进行名称修饰(name mangling)&#xff0c;以区分不同的函数和变量。而在 C 语言中…

搭建互联网医疗平台:构建智慧医院APP的开发指南

本文将从技术层面出发&#xff0c;为大家提供构建互联网医疗平台、打造智慧医院APP的详细开发指南。 一、确定需求与功能 在开始开发之前&#xff0c;首先需要明确智慧医院APP的需求与功能。这包括患者预约挂号、在线咨询、病历查看、医疗报告查询等功能。 二、选择合适的开发…

安科瑞ARTM系列-无线测温解决方案

产品简介 温度在线监测主要是针对高低压开关柜内母排搭接点&#xff0c;断路器触头、电缆接头等电气连接点的温度进行监测&#xff0c;防止在运行过程中因氧化、松动、灰尘等因素造成接点接触电阻过大而发热成为隐患&#xff0c;温度在线监测能够提升设备安全保障&#xff0c;及…

宝塔面板优惠券(折扣券)领取入口及使用教程

宝塔面板是一款服务器管理软件&#xff0c;支持Linux与Windows系统&#xff0c;提供了丰富的功能和插件&#xff0c;让服务器管理变得更加简单、安全、高效。为了让更多用户体验到宝塔面板的便利&#xff0c;官方会不定期推出优惠券活动。本文将为大家详细介绍宝塔面板优惠券的…

ROS:rosdep与ROS2的安装记录

鱼香ROS一键安装&#xff1a; 一键安装微信使用指南 | 鱼香ROS rosdep安装&#xff1a; rosdep 是一个在ROS&#xff08;Robot Operating System&#xff09;生态系统中非常重要的工具&#xff0c;它用于安装ROS包的依赖项。rosdep 确保了ROS包所需的系统依赖项能够被正确安装…

MNIST 数据集详析:使用残差网络RESNET识别手写数字(文末送书)

MNIST 数据集已经是一个几乎每个初学者都会接触的数据集, 很多实验、很多模型都会以MNIST 数据集作为训练对象, 不过有些人可能对它还不是很了解, 那么今天我们一起来学习一下MNIST 数据集&#xff0c;同时构建残差网络来识别手写数字。 1.MNIST 介绍 MNIST手写数字数据库具有…

spring-framework6.x版本源码构建

6.x.修改gradle仓库构建 IDEA版本及gradle构建设置 在gradle指定仓库地址/wrapper/dists/找到与gradle wrapper相对应的gradle版本&#xff0c;在gradle的init.d/目录下新建init.gradle文件&#xff0c;内容如下&#xff1a; allprojects{repositories {mavenLocal()maven { …

中仕教育:选调生和考研可以一起准备吗?

研究生入学考试&#xff0c;是本科生们提升学历继续深造的主要途径。而选调生&#xff0c;是指通过考试选拔的优秀应届毕业生&#xff0c;经过锻炼后分配到各级工作。这两者作为大部分人选择的方向&#xff0c;发展前景都是比较好的。 考研和选调生可以一起准备吗? 是可以的…

python+ctypes:ctypes调用so库

之前接到一个任务就是用python调用so库&#xff0c;也就是python调用cso库&#xff0c;也是第一次做这个&#xff0c;而且要的还很急&#xff0c;导致我也很忙碌&#xff0c;很多之前做的事请都丢下了。下面就介绍了ctypes调用so的简单例子。 ctypes 是 Python 的外部函数库。…

[MySQL]关于表的增删改查

目录 1.插入 1.1单行数据全列插入 1.2多行插入&#xff0c;指定列插入 ​编辑2.查询 2.1全列查询 2.2指定列查询 3.3查询字段为表达式 2.4别名 ​编辑2.5去重 2.6排序 2.7条件查询 2.7.1基本查询: 2.7.2 AND 和OR 2.7.3范围查询 2.7.4模糊查询 2.7.5分页查询 limit …

vue3 中组合键实现换行

vue3 中组合键实现换行 需求背景 有一个聊天室功能&#xff0c;采用输入框的形式&#xff0c;输入完毕使用Enter&#xff0c;可以直接进行发送。使用一些组合键 比如 commandEnter / shiftEnter / alt Enter … 可以实现换行操作。但现实的情况是&#xff0c;原生 Enter 天然…

【JavaEE Spring】MyBatis 操作数据库(基础操作)

MyBatis 操作数据库 本节目标前⾔JDBC 操作⽰例回顾1. 什么是MyBatis?2. MyBatis⼊⻔2.1 准备⼯作2.1.1 创建⼯程2.1.2 数据准备 2.2 配置数据库连接字符串2.3 写持久层代码2.4 单元测试 3. MyBatis的基础操作3.1 打印⽇志3.2 参数传递3.3 增(Insert)3.4 删(Delete)3.5 改(Upd…

太赞了!微信自动回复法宝,让沟通更高效!

如今&#xff0c;微信已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;对于一些有多个微信账号的人说&#xff0c;常常会因为微信号太多&#xff0c;消息太多没能及时回复&#xff0c;或是客户咨询的问题很多都差不多&#xff0c;每次都要复制粘贴很是麻烦。 要想一…

记录yolov8_obb训练自己的数据集

一.数据集制作 1.标注软件&#xff1a;roLabelImg roLabelImg是基于labelImg改进的&#xff0c;是用来标注为VOC格式的数据&#xff0c;但是在labelImg的基础上增加了能够使标注的框进行旋转的功能。 2.数据格式转换 2.1 xml转txt # 文件名称 &#xff1a;roxml_to_dota.p…

Leetcode—40.组合总和II【中等】

2023每日刷题&#xff08;七十七&#xff09; Leetcode—40.组合总和II 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int…

深度解析SD-WAN和混合WAN的网络方案区别

在企业网络的不断发展中&#xff0c;根据业务需要选择不同的广域网&#xff08;WAN&#xff09;解决方案显得至关重要。传统的基于传输控制协议/因特网协议&#xff08;TCP/IP&#xff09;的WAN是一种私有广域网&#xff0c;由企业网络和互联网服务提供商&#xff08;ISP&#…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

Vue 动态组件与异步组件:深入理解与全面应用

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 动态组件实现原理&#xff1a;用法示例&#xff1a; 2. 异步组件实现原理&#xff1a;用法示例&#xff1a; 3. 异步组件的高级应用a. 异步组件的命名&#xff1a;b. 异步组件的加载状态管理&#xff1a; ⭐ 写在最后 ⭐ 专栏简…

element plus表格的表头和内容居中

文章目录 需求分析 需求 对于 element-plus 中的 table 进行表头和内容的居中显示 分析 单列的表头和内容居中 &#xff1a; 在对应的那一列加上align“center” 即可 <el-table-column prop"name" label"商品名称" align"center" />…