首页 > 其他分享 >leaflet + vue 海量点位批量显示,根据不同缩放级别显示不同数量的点位

leaflet + vue 海量点位批量显示,根据不同缩放级别显示不同数量的点位

时间:2022-10-26 10:23:21浏览次数:55  
标签:map vue const 缩放 bounds latitude 点位 Math

     最近在项目中遇到一个需求,以前点位是根据区县进行分组聚合式显示的,但是交互不够友好直接,需要不断地点开才行,因此产品要求把所有点位平铺显示,不要分组,根据不同的缩放级别显示不同数量的点位。咨询了同事,给出这样一个方案:

     定义一个新数组,循环所有点位,先把点位的经纬度转换成屏幕的坐标(用到 leaflet 的 latLngToContainerPoint 方法),然后计算该点位和新数组里所有点的距离(勾股定理),大于某个距离(比如50px)就push进新数组,然后在地图上显示新数组的点位,这样点位就不会全部密密麻麻的显示在地图上了,而是每个点之间都有一定的距离。

    因为循环次数比较多,为了提高渲染速度,做了以下处理:

    1. 首先增加一个判断条件,只渲染地图可视范围内的点位,不在可视范围内的点直接退出循环

    2. 尽量不要在循环体中去访问 this,很耗费时间,把所有可以保存成变量的都放在外面定义好,直接拿去循环里用

    效果如下:

 

 

 核心代码如下:

 1 createPointsByZoom(key) {
 2       // 放大到 14 级别以上,展示所有的点位
 3       if (this.map.getZoom() > 14) {
 4         this.staData.push(...this.points[key])
 5         return
 6       }
 7 
 8       const TARGET_DISTANCE = 50 // 两点之间的距离:50px
 9       const zoom = this.map.getZoom()
10       const newList = [this.points[0]] // this.points 是指所有点位,默认放入一个点位
11       const bounds = this.map.getBounds() // 地图边界
12       const lat1 = bounds._southWest.lat
13       const lat2 = bounds._northEast.lat
14       const lon1 = bounds._southWest.lng
15       const lon2 = bounds._northEast.lng
16 
17       this.points.map(item => {
18         const { latitude, longitude } = item
19 
20         // 只画可视范围内的
21         if (!this.isInView(lat1, lat2, lon1, lon2, latitude, longitude)) {
22           return
23         }
24 
25         const latLng1 = L.latLng([latitude, longitude])
26         const location1 = this.map.latLngToContainerPoint(latLng1, zoom) // { x: 123, y: 123 }
27         const { x, y } = location1
28 
29         /**
30          * 比较每一个点和容器中的点的距离
31          * latLngToContainerPoint: 将经纬度转换为相对地图容器的屏幕坐标
32          */
33         const moreThanStandardDistance = newList.every(data => {
34           const latLng2 = L.latLng([data.latitude, data.longitude])
35           const location2 = this.map.latLngToContainerPoint(latLng2, zoom)
36           // 计算两点之间的屏幕距离, 勾股定理
37           const distanceX = Math.abs(x - location2.x)
38           const distanceY = Math.abs(y - location2.y)
39           const distance = Math.pow(distanceX, 2) + Math.pow(distanceY, 2)
40           return distance > Math.pow(TARGET_DISTANCE, 2)
41         })
42 
43         if (moreThanStandardDistance) {
44           newList.push(item)
45         }
46       })
47 
48       this.staData.push(...newList)
49     }

 

标签:map,vue,const,缩放,bounds,latitude,点位,Math
From: https://www.cnblogs.com/buluzombie/p/16827340.html

相关文章

  • vue-cli常用命令&各种包的下载
    一、常用命令1、下载生产依赖环境npmi2、ctrlc:终止程序y安装之前需要检查是否有npm和Nodenpm-vnode-v3、安装命令npminstall-g@vue/cli4、检查......
  • vue笔记
    笔记脚手架文件结构├──node_modules├──public│├──favicon.ico:页签图标│└──index.html:主页面├──src│├──assets:存放静态......
  • vue中父组件异步数据通过props方式传递给子组件,子组件接收不到的问题
    问题描述组件化开发中经常用到父子组件的通信,父传子子传父等数据的操作,如果父组件的数据是发请求从后端获取的异步数据,那么父组件将这个数据传递给子组件的时候,因为是异步......
  • 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag
    今天看到一篇文章中提到了一个好用的工具release-it。刚好可以用在我正在开发的vue3组件库。纸上得来终觉浅,绝知此事要躬行,说干就干,下面就介绍如何将release-it应用到实......
  • VUE---vif和vfor为什么不能一起使用
    在对前端代码进行优化的时候,考虑到执行效率,不能将v-if 和v-for放到一个DOM元素里面:v-if和v-for不能同时的原因:v-for的执行优先比v-if要高<template><divclas......
  • VUE - Cesium 计算视角中心点
    VUE-Cesium计算视角中心点 cesium根据输入角度设置中心点(俯仰角度)1.初始化地图this.viewer=newCesium.Viewer('cesiumContainer',{animation:true,......
  • vue3模板编译
    @keyup.entervue<[email protected]>HelloWorld</div>jsimport{withKeysas_withKeys,openBlockas_openBlock,createElementBlockas_createElementBlock......
  • 9_Vue事件修饰符
    概述首先需要理解下什么是事件修饰符常用事件修饰符案例1_阻止默认行为发生我这里有一个a标签这个标签呢我会给它配置一个点击事件点击事件输出一句话,那么效果是这......
  • 11_Vue键盘事件与别名
    键盘事件@keyup和@keydownkeyup:按键弹起触发keydown:键盘按下触发,一直按住一直触发准备工作那么针对keyup和keydown,我们可以设计单独的按键监听事件,也就是针对一......
  • 12_Vue事件总结
    事件总结事件修饰符连携准备工作html<!--定义一个容器--><divclass="app"><!--事件修饰符连携--><divclass="box"@click="toBaidu"><ahre......