leaflet【十】实时增加轨迹点轨迹回放效果实现

实时轨迹回放

在前面有用leaflet-trackplayer实现了一个轨迹回放的效果,单击前往:轨迹回放效果&控制台控制轨迹运动效果

这篇文章主要是实现一下实时增加轨迹点,不改变原来运行轨迹和速度。这里是简易做了一个demo效果,大概讲述一下实现过程和一些注意的点。整个源码会贴在文章最后:

leaflet-trackplayer

插件npm地址,里面有对应API说明 leaflet-trackplayer

首先准备好一个路径的数据,这里简单循环模拟一下

const path = [];
for (let i = 0; i < 10; i++) {path.push({lat: 34 + Math.random() * 0.5,lng: 108 + Math.random() * 0.5});
}

然后创建一个track对象,也就是利用这个插件实例化一个路径回放的对象,里面的配置什么的就根据实际开发改一下就好了,并且在这里我抽离了一个方法出来,后面回来说这个有什么用。

const createTrack = (path) => {// 创建播放器对象并添加至地图track = new L.TrackPlayer(path,// 轨迹配置,都可以不要,保留markerIcon一个就可以了{markerIcon,speed: 500, // 播放速度weight: 10, // 轨迹线宽度passedLineColor: '#0eb0c9', // 已行驶轨迹部分的颜色notPassedLineColor: '#add5a2', // 未行驶轨迹部分的颜色panTo: true, // 地图跟随移动markerRotation: true // 是否开启marker的旋转}).addTo(map);track.start();// 监听运动过程走了多少百分比track.on('progress', (progress, {lng, lat}, index) => {// 把这个值记录下来,然后给el-progress绑定,这样也就是一个进度条的可视化了。sliderProgress.value = progress * 100;console.log(`progress:${progress.toFixed(2)} - position:${lng.toFixed(2)},${lat.toFixed(2)} - trackIndex:${index}`);});
};

在这个里面有一个track.setProgress(0.5);方法用来设置整个运动的进度,取值在0-1之间,那么进度条反向绑定运动的效果就是这样实现的。

<el-slider v-model="sliderProgress" :format-tooltip="formatTooltip" @input="changeProgress"/>const changeProgress = (val) => {track.setProgress(val / 100);
};

最后实时更新轨迹,因为这个插件并没有什么实现setPath改变路径数据的方法,那么实现的方法也只能是先删除轨迹,然后重新绘制轨迹,这也是为什么我把创建一个track对象抽成一个方法的原因(创建轨迹运动这一大段代码可以复用)。这里重点在于新增了点之后怎么计算他的一个进度值,在下面代码注释有说明可以理解一下。

// 删除轨迹对象
const deleteTrack = () => {track.remove();
};// 模拟实时更新
const updatePath = () => {deleteTrack();const oldLength = path.length;for (let i = 0; i < 10; i++) {path.push({lat: 34 + Math.random() * 0.5,lng: 108 + Math.random() * 0.5});}createTrack(path);// 需要重新设置进度,除100是转成0-1之间的值,再除整个长度和旧数据的长度的比值// 相当于最开始一共十个点,运动到了第五个点,现在进度是50%// 这个时候实时增加了5个点,现在就是15个点,如果取15的百分之50就变成了运动到7.5这个点,就显然不对了// 15 / 10 = 1.5  这个时候再用50% / 1.5 得到的值是 1/3,那么也正好是第五个点相对于现在整个15个点的位置了。track.setProgress(sliderProgress.value / 100 / (path.length / oldLength));
};

到这里就是完成了,然后前后端交互就看什么时候调用接口就相当于走上面这个updatePath方法。

存在一个小缺陷就是,在更新数据的时候由于是先删再画就会有一点点闪烁。录制的效果不是很好,可以测试一下在点击增加轨迹点,当前这个图标运动的位置(也就是整体进度)是不会发生改变的

在这里插入图片描述

完整源码

<script lang="js" setup>
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';
import CAR from '@/assets/image/car.png';
import 'leaflet-trackplayer';onMounted(() => {initMap();
});let map;
const initMap = () => {map = L.map('map', {layers: []}).setView([30, 110], 5);const sourceUrl = 'https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}.png';const tileLayer = L.tileLayer(sourceUrl, {maxZoom: 18,minZoom: 2,attribution: '© modify'});tileLayer.addTo(map);
};let track = null;
const path = [];
for (let i = 0; i < 10; i++) {path.push({lat: 34 + Math.random() * 0.5,lng: 108 + Math.random() * 0.5});
}// 进度条,这个值在0-100之间
const sliderProgress = ref(0);// 定义沿着轨迹移动的Icon
const markerIcon = L.icon({iconSize: [27, 54],iconUrl: CAR, // 前面导入的img资源iconAnchor: [13.5, 27]
});const initPath = () => {createTrack(path);
};// 创建track对象
const createTrack = (path) => {// 创建播放器对象并添加至地图track = new L.TrackPlayer(path,// 轨迹配置,都可以不要,保留markerIcon一个就可以了{markerIcon,speed: 500, // 播放速度weight: 10, // 轨迹线宽度passedLineColor: '#0eb0c9', // 已行驶轨迹部分的颜色notPassedLineColor: '#add5a2', // 未行驶轨迹部分的颜色panTo: true, // 地图跟随移动markerRotation: true // 是否开启marker的旋转}).addTo(map);track.start();track.on('progress', (progress, {lng, lat}, index) => {sliderProgress.value = progress * 100;console.log(`progress:${progress.toFixed(2)} - position:${lng.toFixed(2)},${lat.toFixed(2)} - trackIndex:${index}`);});
};// 轨迹删除
const deleteTrack = () => {track.remove();
};const formatTooltip = (val) => {return val.toFixed(2);
};const changeProgress = (val) => {track.setProgress(val / 100);
};// 模拟实时更新
const updatePath = () => {deleteTrack();const oldLength = path.length;for (let i = 0; i < 10; i++) {path.push({lat: 34 + Math.random() * 0.5,lng: 108 + Math.random() * 0.5});}createTrack(path);track.setProgress(sliderProgress.value / 100 / (path.length / oldLength));// 如果速度也变了记得也一起更新track.setSpeed(500 * selectSpeed.value);
};/**------------------------改变速度---------------------------------------*/
const selectSpeed = ref(1);
const options = [{value: 0.5,label: 'X0.5'},{value: 1,label: 'X1'},{value: 2,label: 'X2'},{value: 3,label: 'X3'},{value: 5,label: 'X5'}
];
const changeSpeed = (val) => {track.setSpeed(500 * val);
};
</script><template><div id="map" ref="mapContainer" class="w-full h-4/6"></div><div class="m-2"><el-button type="primary" @click="initPath">查询轨迹</el-button><el-button type="primary" @click="track.start()">开始</el-button><el-button type="primary" @click="track.pause()">暂停</el-button><el-button type="primary" @click="deleteTrack">删除轨迹</el-button><el-button type="primary" @click="updatePath">模拟接口更新</el-button></div><br/><div class="m-2 bg-blue-200 p-2 rounded-md"><div class="font-bold">控制台</div><div>进度条</div><div class="w-[400px] ml-2"><el-slider v-model="sliderProgress" :format-tooltip="formatTooltip" @input="changeProgress"/></div><div>运动速度:<el-selectv-model="selectSpeed"style="width: 140px"@change="changeSpeed"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"/></el-select></div></div>
</template>

leaflet-plugin-trackplayback

然后还有这个轨迹回放的插件,这个插件就可以根据时间来进行控制,这个功能后续实现在更新一下这个文章,

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

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

相关文章

计算机网络 --- 【1】欢迎来到计算机网络/计算机网络基本概念/计算机网络、互连网、互联网的区别

目录 一、计算机网络学什么&#xff1f; 二、 什么是计算机网络&#xff1f;计算机网络、互联网(因特网&#xff0c;Internet)、互连网(internet)之间的区别&#xff1f; 2.1 计算机网络的定义 2.2 计算机网络与互连网的区别 2.3 互连网 三、总结部分 一、计算机网络学…

Nginx+Tomcat(负载均衡、动静分离)

目录 一、Nginx概述 1.Nginx应用 二、正向代理和反向代理 1.正向代理 1.1主要作用 1.2工作原理 2.反向代理 2.1主要作用 2.2工作原理 三、负载均衡模式 1.轮询 2.最少连接数 3.IP 哈希 4.加权轮询 5.最少时间算法 6.一致性哈希 四、规划部署负载均衡和反向…

oracle数据库安装和配置详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Oracle 数据库是全球广泛使用的关系型数据库管理系统 (RDBMS)&#xff0c;提供高性能、可靠性、安全性和可扩展性&#xff0c;广泛应用于企业关键任务系统。下面详细介绍如何在 CentOS 系统上安装和配置 Or…

【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

智能家居环境监测系统设计(论文+源码)

1. 系统方案 系统由9个部分构成&#xff0c;分别是电源模块、烟雾传感器模块、GSM发送短信模块、报警模块、温度传感器模块、人体红外感应模块、按键设置模块、显示模块、MCU模块。各模块的作用如下&#xff1a;电源模块为系统提供电力&#xff1b;烟雾传感器模块检测烟雾浓度&…

[项目实战]EOS多节点部署

文章总览&#xff1a;YuanDaiMa2048博客文章总览 EOS多节点部署 &#xff08;一&#xff09;环境设计&#xff08;二&#xff09;节点配置&#xff08;三&#xff09;区块信息同步&#xff08;四&#xff09;启动节点并验证同步EOS单节点的环境如何配置 &#xff08;一&#xf…

开放系统,面向各类业务需求可提供定制化服务的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

计算机毕业设计 智慧物业服务系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Python数据分析 Pandas库-初步认识

Python数据分析 Pandas库-初步认识 认识Pandas ​ pandas是一个非常实用的Python工具&#xff0c;我们可以把它想象成一个超级强大的表格处理工具&#xff0c;它比Excel更智能&#xff0c;操作更为简单。pands可以从各种文件格式&#xff08;CSV、JSON、SQL、Excel&#xff0…

ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯

IGT-DSER智能网关模块支持西门子、三菱、欧姆龙、罗克韦尔AB等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表、变频器等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需PLC内编程开发&#xff0c;只要在IGT-DSER智…

AI大模型与产品经理:替代与合作的深度剖析

在创业的征途中&#xff0c;产品经理常常被外界以一种半开玩笑的口吻提及&#xff1a;“就差一个程序员了。”这句话背后&#xff0c;既蕴含着对产品经理创意与策略能力的认可&#xff0c;也揭示了技术实现环节对于产品成功不可或缺的重要性。然而&#xff0c;随着AI技术的飞速…

2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus大会时间&#xff1a;2024年9月20-22日地点&#xff1a;成都…

Golang数据流处理:掌握Reader和Writer接口的技巧

Golang数据流处理&#xff1a;掌握Reader和Writer接口的技巧 引言理解Reader和Writer接口Reader接口的定义和基本方法Writer接口的定义和基本方法 Reader接口的深入探讨Reader接口的实现示例使用io.Reader读取文件内容从网络连接中读取数据 常用Reader类型及其应用场景strings.…

Selenium打开浏览器后闪退问题解决

笔者这两天在做一个自动化方案&#xff0c;用来优化数据统计。其中一部分数据需要通过云上堡垒机跳转访问&#xff0c;而这个堡垒机在笔者日常使用的火狐浏览器上运行不是很正常&#xff08;表现在有些复制粘贴按钮显示不太灵敏&#xff09;。 但在Edge浏览器上基本正常&#…

Unity3d 以鼠标位置点为中心缩放视角(正交模式下)

思路整理&#xff1a; 缩放前&#xff1a; 缩放后&#xff1a; 记录缩放前鼠标的屏幕坐标 A&#xff0c;计算鼠标位置对应的世界坐标 A_world 缩放完成后&#xff0c;根据当前屏幕下A所对应的世界坐标A1_world 计算A1_world 和 A_world 的偏移量 移动摄像机 代码&#xff…

数据集 wider person 户外密集行人检测 >> DataBall

数据集 wider person 用于野外密集行人检测的多样化数据集 行人检测 目标检测 户外密集行人检测的多样化数据集 WiderPerson: A Diverse Dataset for Dense Pedestrian Detection in the Wild article{zhang2019widerperson, Author {Zhang, Shifeng and Xie, Yiliang and Wa…

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

作者&#xff1a; 尚雷5580 原文来源&#xff1a; https://tidb.net/blog/beeb9eaf 注&#xff1a;本文基于 TiDB 官网 董菲老师 《TiDB 数据库核心原理与架构&#xff08;101) 》系列教程之 《Lesson 01 TiDB 数据库架构概述》内容进行整理和补充。 课程链接&#xff1a;…

跟《经济学人》学英文:2024年09月14日这期 Demand for high-end cameras is soaring

Demand for high-end cameras is soaring The ubiquity of smartphones has helped ubiquity: 美 [juːˈbɪkwəti] 到处存在&#xff1b;遍在 注意发音 原文&#xff1a; Buying a Leica feels like buying a piece of art. Made in Germany, the cameras are sold in th…

电容的充放电时间的计算(容性负载的输出建立时间)

本文重点叙述开关电源带容性负载时&#xff0c;电源的输出建立时间&#xff08;对应电容的充电时间&#xff09;和掉电时间&#xff08;对应电容的放电时间&#xff09;。 无论是恒压源还是恒流源&#xff0c;其输出的电流都是可以确定的&#xff0c;因此&#xff0c;电容的充…

高职院校人工智能技术和无人机技术实训室建设方案

一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能&#xff08;AI&#xff09;和无人机技术作为当今科技领域的两大热点&#xff0c;正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告&#xff0c;全球人工智能市场规模预计将在2024年…