国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

leaflet學習筆記-帶過濾的圖例(九)

這篇具有很好參考價值的文章主要介紹了leaflet學習筆記-帶過濾的圖例(九)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

圖例不只能夠幫助我們在查看地圖的時候更加方便容易地分辨不同顏色代表的要素,本文要介紹的圖例組件還可以按需求過濾掉不用顯示的要素,使地圖的更能清晰的顯示我們需要顯示的內(nèi)容

技術(shù)核心

說到過濾要素,第一時間想到的就是滑塊組件,這里我們選擇了Element-plus的Slider 滑塊組件,主要功能就是根據(jù)滑塊背景的不同顏色,滑動滑塊過濾掉滑塊范圍以外背景顏色的要素。這里遇到一個大麻煩,本來以為很容易解決的,后面發(fā)現(xiàn)沒有這么容易完成,就是滑塊的背景顏色添加,這里想了好幾種方式,最后還是只能使用原生js通過操作dom實現(xiàn)背景顏色的添加和上下兩個滑塊遮罩的添加(將要過濾的顏色范圍遮蓋掉)。核心代碼如下:

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數(shù)值
  gradesColors: { type: Array, default: () => ([]) },//分級的color數(shù)值(需要與gradesValues一一對應)
})

const emits = defineEmits(['update:modeValue'])

let legendRef = ref()

//當前滑塊的值
let sliderValue = ref([0, 100])

//間隔數(shù)值
let interval = ref()

//為了獲取真實數(shù)據(jù)和百分比之間的映射關(guān)系
let percentage2ValueDic = {}
let valueDic2Percentage = {}

/**
 * @Description 生成滑塊的背景顏色
 * @Param colors 備選顏色集合
 * @Author ZhangJun
 * @Date  2024-01-19 01:43:56
 * @return void
 **/
let generationLinearGradient = computed(() => {
  let { colors } = grades
  let 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 } = grades
  interval.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
})

//分級數(shù)據(jù)
let grades = reactive({
  values: props.gradesValues,
  colors: props.gradesColors,
  unit: undefined,
  desc: '',
})

//默認的配置參數(shù)
let options = computed(() => {
  let { values } = grades
  let height = (values?.length - 1) * 40
  height = height > 300 ? 300 : height
  return {
    min: 0,
    max: 100,
    height: `${height}px`,
    step: interval.value.times(100).toFixed(0),
    showTooltip: false,
  }
})

/**
 * @Description 初始化當前control
 * @Param gradesData 分級參數(shù)
 * @Author ZhangJun
 * @Date  2024-01-22 09:38:17
 * @return void
 **/
function initControl(gradesData) {
  sliderValue.value = [0, 100]
  grades = Object.assign(grades, gradesData)
}

/**
 * @Description 獲取數(shù)組里面最接近這個值的數(shù)
 * @Param arr 數(shù)組
 * @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] = arr

  for (let i = 1; i < arr.length; i++) {
    let distance = Math.abs(target - arr[i])
    if (distance < minDistance) {
      minDistance = distance
      closestNumber = arr[i]
    }
  }

  return closestNumber
}

/**
 * @Description 滑塊數(shù)值改變
 * @Param e 事件回調(diào)參數(shù)
 * @Author ZhangJun
 * @Date  2024-01-22 09:38:59
 * @return void
 **/
function onChange(e) {
  let [min, max] = e
  let 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>

效果

leaflet學習筆記-帶過濾的圖例(九),leaflet學習筆記,學習,筆記,javascript,圖例,leaflet

過濾后的效果

leaflet學習筆記-帶過濾的圖例(九),leaflet學習筆記,學習,筆記,javascript,圖例,leaflet

本來原理很簡單,主要時間還是花費到了slider的背景顏色上,還要添加一個上下滑動的遮罩,才能將要過濾掉的顏色范圍遮掉

進階版

加入可橫向/豎向選擇

/**
* sliderLegend.vue 可以拖動滑塊過濾的圖例
* @Author ZhangJun
* @Date  2024/1/19 9:36
**/
<template>
  <el-card
    class="slider-block absolute right-10 bottom-10 text-center"
    v-if="grades.values && grades.values.length > 0"
    :body-style="getBodyStyle"
    style="z-index: 600"
  >
    <el-space direction="vertical" :size="vertical ? 20 : 0">
      <el-text type="info">{{ grades.desc }}{{ grades.unit }}</el-text>

      <div style="text-align: left">
        <el-slider ref="legendRef" class="sliderLegend" v-model="sliderValue" @change="onChange" :range="true" :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數(shù)值
  gradesColors: { type: Array, default: () => [] }, //分級的color數(shù)值(需要與gradesValues一一對應)
  intervalHeight: { type: Number, default: 40 }, //間隔的高的
  maxHeight: { type: Number, default: 195 }, //圖例最高高度限制
  width: { type: Number, default: 130 }, //圖例寬度
  vertical: { type: Boolean, default: false }, //是否垂直模式
})

const emits = defineEmits(['update:modeValue'])

let legendRef = ref()

//當前滑塊的值
let sliderValue = ref([0, 100])

//間隔數(shù)值
let interval = ref()

//為了獲取真實數(shù)據(jù)和百分比之間的映射關(guān)系
let percentage2ValueDic = {}
let valueDic2Percentage = {}

//得到內(nèi)容部分的樣式
let getBodyStyle = computed(() => {
  if (props?.vertical) {
    return { padding: `10px 0 0`, width: `${props.width}px` }
  } else {
    return { padding: `10px`, height: `${props.width}px` }
  }
})

/**
 * @Description 生成滑塊的背景顏色
 * @Param colors 備選顏色集合
 * @Author ZhangJun
 * @Date  2024-01-19 01:43:56
 * @return void
 **/
let generationLinearGradient = computed(() => {
  let { colors } = grades
  let interval = new BigNumber(1).div(colors?.length - 1)
  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]
    }
  })
  if (props?.vertical) {
    return `linear-gradient(to top,${temp.flat()})`
  } else {
    return `linear-gradient(to right,${temp.flat()})`
  }
})

//刻度值
const marks = computed(() => {
  //清空
  percentage2ValueDic = {}
  valueDic2Percentage = {}
  let { values, unit } = grades
  interval.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
})

//分級數(shù)據(jù)
let grades = reactive({
  values: props.gradesValues,
  colors: props.gradesColors,
  unit: undefined,
  desc: '',
})

//默認的配置參數(shù)
let options = computed(() => {
  let { values } = grades
  let height = new BigNumber(props.intervalHeight).times(values?.length - 1).toNumber()
  height = height > props.maxHeight ? props.maxHeight : height

  let options_temp = {
    min: 0,
    max: 100,
    step: interval.value.times(100).toFixed(0),
    showTooltip: false,
    vertical: props?.vertical,
    size: 'small',
  }

  if (props?.vertical) {
    options_temp = {
      ...options_temp,
      height: `${height}px`,
    }
  } else {
    options_temp = {
      ...options_temp,
      style: {
        margin: '0 20px 0',
        width: `${height}px`,
      },
    }
  }

  return options_temp
})

/**
 * @Description 初始化當前control
 * @Param gradesData 分級參數(shù)
 * @Author ZhangJun
 * @Date  2024-01-22 09:38:17
 * @return void
 **/
function initControl(gradesData) {
  sliderValue.value = [0, 100]
  grades = Object.assign(grades, gradesData)
}

/**
 * @Description 獲取數(shù)組里面最接近這個值的數(shù)
 * @Param arr 數(shù)組
 * @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] = arr

  arr.forEach((value, index) => {
    if (index > 0) {
      let distance = Math.abs(target - value)
      if (distance < minDistance) {
        minDistance = distance
        closestNumber = value
      }
    }
  })

  return closestNumber
}

/**
 * @Description 滑塊數(shù)值改變
 * @Param e 事件回調(diào)參數(shù)
 * @Author ZhangJun
 * @Date  2024-01-22 09:38:59
 * @return void
 **/
function onChange(e) {
  let [min, max] = e
  let 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 ${props?.vertical ? 'verticalBar' : ''}`)
      runway.appendChild(div)
    }

    if (!runway?.querySelector('.minBar')) {
      let div = document.createElement('div')
      div.setAttribute('class', `minBar maskBar ${props?.vertical ? 'verticalBar' : ''}`)
      runway.appendChild(div)
    }

    let maxMaskBar = document.querySelector('.maxBar')
    let minMaskBar = document.querySelector('.minBar')

    if (maxMaskBar) {
      if (props?.vertical) {
        maxMaskBar.style.height = new BigNumber(100).minus(max).toNumber() + '%'
      } else {
        debugger
        maxMaskBar.style.width = new BigNumber(100).minus(max).toNumber() + '%'
      }
    }

    if (minMaskBar) {
      if (props?.vertical) {
        minMaskBar.style.height = min + '%'
      } else {
        minMaskBar.style.width = min + '%'
      }
    }
  })
})

defineExpose({ initControl })
</script>

<style scoped lang="scss">
::v-deep .el-slider__runway {
  background: v-bind(generationLinearGradient);

  .maskBar {
    height: 100%;
    width: auto;
    top: 0;

    &.verticalBar {
      width: 100%;
      height: auto;
      top: auto;
    }

    background: lightgrey;
    position: absolute;
    border-radius: 6px;
  }

  .maxBar {
    right: -3px;

    &.verticalBar {
      top: -3px;
      right: auto;
    }
  }

  .minBar {
    left: -3px;

    &.verticalBar {
      bottom: -3px;
      left: auto;
    }
  }
}

::v-deep .el-slider__bar {
  background: transparent;
}
</style>

本文為學習筆記,僅供參考文章來源地址http://www.zghlxwxcb.cn/news/detail-814842.html

到了這里,關(guān)于leaflet學習筆記-帶過濾的圖例(九)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 讀SQL學習指南(第3版)筆記05_過濾

    讀SQL學習指南(第3版)筆記05_過濾

    3.2.4.1.?concat(\\\'Learning\\\', \\\' \\\', \\\'SQL\\\') 3.2.6.1.?(\\\'Boston\\\', \\\'New York\\\', \\\'Chicago\\\') 3.3.1.1.?=、!=、<、>、<>、like、in和between 3.3.2.1.?+、?、*和/ 4.3.3.1.?當需要同時限制范圍的上限和下限時,可以選擇使用between運算符構(gòu)建單個查詢條件,而不用兩個單獨的條件 4.3.3.2.?首先必須指定范圍的下

    2024年02月11日
    瀏覽(20)
  • OpenCvSharp學習筆記13--使用InRange進行HSV閾值過濾、漸變色生成

    OpenCvSharp學習筆記13--使用InRange進行HSV閾值過濾、漸變色生成

    HSV色彩空間介紹 使用InRange操作閾值 基于HSV色彩空間的像素值范圍檢測對象 生成漸變色 HSV(Hue, Saturation, Value)是根據(jù)顏色的直觀特性由A. R. Smith在1978年創(chuàng)建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。HSV色系對用戶來說是一種直觀的顏色模型,對于顏色,人們直觀的會問”

    2024年02月04日
    瀏覽(51)
  • Spring MVC學習筆記,包含mvc架構(gòu)使用,過濾器、攔截器、執(zhí)行流程等等

    Spring MVC學習筆記,包含mvc架構(gòu)使用,過濾器、攔截器、執(zhí)行流程等等

    ??????創(chuàng)作不易,各位看官點贊收藏. Spring MVC:Spring MVC是Spring Framework的一部分,是基于java實現(xiàn)的MVC的輕量級Web框架。 官網(wǎng)文檔地址:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 輕量級,簡單易學。 高效,基于請求和響應的MVC框架。 與Spri

    2024年02月15日
    瀏覽(29)
  • JavaScript學習筆記05

    JavaScript學習筆記05

    什么是 BOM BOM(Browser Object Model)是指 瀏覽器對象模型 ,是用于描述這種對象與對象之間層次關(guān)系的模型。 瀏覽器對象模型(BOM)提供了獨立于內(nèi)容的、可以與瀏覽器窗口進行互動的對象結(jié)構(gòu)。 瀏覽器 主流的瀏覽器分為 IE、Microsoft Edge、Chrome、Firefox、Safari、Opera 等幾大類

    2024年02月07日
    瀏覽(19)
  • 【前端學習筆記2】javaScript基礎(chǔ)

    是一種運行在客戶端(服務器的編程語言) javacript分為行內(nèi)JavaScript,內(nèi)部JavaScript,外部JavaScript 內(nèi)部JavaScript 直接寫在html中body里面 alert(“hello,world”) 我們將script放在html文件的地步附近的原因是瀏覽器會按照代碼在文件中的順序加載html 如果先加載的JavaScript期望修改其

    2024年01月22日
    瀏覽(55)
  • 學習筆記 JavaScript基礎(chǔ)語法(全)

    學習筆記 JavaScript基礎(chǔ)語法(全)

    1.1 瀏覽器執(zhí)行 JS 簡介 瀏覽器分成兩部分:渲染引擎和 JS 引擎 渲染引擎 :用來解析HTML與CSS,俗稱內(nèi)核,比如 chrome 瀏覽器的 blink ,老版本的 webkit JS 引擎 :也稱為 JS 解釋器。 用來讀取網(wǎng)頁中的JavaScript代碼,對其處理后運行,比如 chrome 瀏覽器的 V8 1.2 JS的組成 1.2.1 ECMAScr

    2024年02月05日
    瀏覽(29)
  • 尚硅谷JavaScript高級學習筆記

    尚硅谷JavaScript高級學習筆記

    JavaScript中函數(shù)是對象。我們后續(xù)描述構(gòu)造函數(shù)的內(nèi)存模型時,會將構(gòu)造函數(shù)稱為 構(gòu)造函數(shù)對象。 typeof 運算符來查看值的類型,它返回的是類型的字符串值 == 會做數(shù)據(jù)轉(zhuǎn)換 輸出: 每個函數(shù)都有一個prototype屬性,它默認指向一個0bject空對象(即稱為:原型對象) 給原型對象添加

    2024年03月11日
    瀏覽(22)
  • JavaWEB學習筆記(二)------HTTP、Servlet、會話、過濾器、監(jiān)聽器、Ajax、前端工程化

    JavaWEB學習筆記(二)------HTTP、Servlet、會話、過濾器、監(jiān)聽器、Ajax、前端工程化

    目錄 HTTP HTTP1.1 請求和響應的報文格式 請求報文 響應報文 常見狀態(tài)響應碼 Servlet? 靜態(tài)資源和動態(tài)資源 ?編輯 ?Servlet簡介? Servlet開發(fā)流程 導入和響應頭問題 url-pattern不同寫法 url-pattern工作方式 Servlet注解方式配置 Servlet生命周期? Servlet繼承結(jié)構(gòu) Servlet接口 GenerisServlet類 Ht

    2024年01月21日
    瀏覽(28)
  • JavaScript 學習筆記(Day5)

    JavaScript 學習筆記(Day5)

    「寫在前面」 本文為 b 站黑馬程序員 pink 老師 JavaScript 教程的學習筆記。本著自己學習、分享他人的態(tài)度,分享學習筆記,希望能對大家有所幫助。推薦先按順序閱讀往期內(nèi)容: 1. JavaScript 學習筆記(Day1) 2. JavaScript 學習筆記(Day2) 3. JavaScript 學習筆記(Day3) 4. JavaScript

    2024年01月19日
    瀏覽(17)
  • 前端學習筆記:JavaScript基礎(chǔ)語法(ECMAScript)

    前端學習筆記:JavaScript基礎(chǔ)語法(ECMAScript)

    此博客參考b站:【黑馬程序員前端JavaScript入門到精通全套視頻教程,javascript核心進階ES6語法、API、js高級等基礎(chǔ)知識和實戰(zhàn)教程】https://www.bilibili.com/video/BV1Y84y1L7Nn?p=76vd_source=06e5549bf018e111f4275c259292d0da 這份筆記適用于已經(jīng)學過一門編程語言(最好是C語言)的同學,如果你沒有

    2024年02月16日
    瀏覽(67)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包