uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)

news2024/11/16 11:45:59

uniapp结合Canvas+renderjs根据经纬度绘制轨迹

文章目录

    • uniapp结合Canvas+renderjs根据经纬度绘制轨迹
      • 效果图
      • template
      • renderjs
      • js
      • 数据结构


  • 根据官方建议要想在 app-vue 流畅使用 Canvas 动画,需要使用 renderjs 技术,把操作canvas的js逻辑放到视图层运行,避免逻辑层和视图层频繁通信。
  • 这里呢结合 renderjs 技术实现绘制轨迹图形。

你可能需要先了解renderjs如何数据通讯:renderjs 与 app-vue之间数据交互

html中使用canvas根据经纬度绘制轨迹


效果图

在这里插入图片描述


template

  • coordsAll 监听数据变化,只要 coordsAll 数据改变,就是触发 initData 方法。
 <template>
	<view class="map-track-wrap">
      	<!-- xxx -->
      	<view class="track-list" :prop="coordsAll" :change:prop="canvas.initData">
          	<!-- xxx -->
          <view class="d-flex canvas-box">
            	<canvas class="canvas" :class="`canvas${index}`"></canvas>
          </view>
       	</view>
    </view>
</template>

renderjs

<script module="canvas" lang="renderjs">
	export default {
		methods: {
			initData() {
				for (let i = 0; i < this.coordsAll.length; i++) {
					// 绘制图形
					this.draw(this.coordsAll[i], i);
				}
			},
			draw(locationList, idx) {
				let canvasHeight = 72,
					canvasWidth = 72,
					canvasEle = document.querySelectorAll(`.canvas${idx}>canvas`)[0],
					ctx = canvasEle.getContext('2d'),
					amuXArr = [],
					amuYArr = []

				for (let i = 0; i < locationList.length; i++) {
					amuXArr.push(locationList[i].lat);
					amuYArr.push(locationList[i].lng);
				}
				
				amuYArr = amuYArr.map((item) => {
					return item * -1;
				});

				let xMax = Math.max(...amuXArr);
				let xMin = Math.min(...amuXArr);
				let yMax = Math.max(...amuYArr);
				let yMin = Math.min(...amuYArr);

				let xScale = canvasWidth / (xMax - xMin);
				let yScale = canvasHeight / (yMax - yMin);
				let scale = xScale < yScale ? xScale : yScale;

				let xoffset = (canvasWidth - (xMax - xMin) * scale) / 2;
				let yoffset = (canvasHeight - (yMax - yMin) * scale) / 2;
				
				ctx.save(); // 保存状态
				ctx.translate(0, canvasHeight);
				ctx.rotate(-Math.PI / 2);
				ctx.beginPath();

				// 根据偏移量移动点位并画图
				ctx.moveTo(
					(amuXArr[0] - xMin) * scale + xoffset,
					(yMax - amuYArr[0]) * scale + yoffset
				);
				for (let i = 1; i < amuXArr.length; i++) {
					ctx.lineTo(
						(amuXArr[i] - xMin) * scale + xoffset,
						(yMax - amuYArr[i]) * scale + yoffset
					);
				}
				ctx.strokeStyle = '#1FE298';
				ctx.stroke();
				ctx.restore(); // 恢复状态
			}
		}
	}
</script>

js

  • renderjs中不支持uni.request,所以请求后台获取数据操作在script中进行,然后监听参数变化,将参数传递过来进行渲染。
searchList() {      	
  	// 处理数据
  	let list = this.dataList;
  	if (list.length > 0) {
    	for(let i = 0; i < list.length; i++) {
      		let tmpLocation = list[i].locations;
         	// 页面监听 coordsAll,把数据传递renderjs,会触发 initData 方法
      		this.coordsAll.push(JSON.parse(tmpLocation));
    	}
  	}
}

数据结构

  • 测试数据,具体根据个人所需处理数据
[
    {
        locations: [
          	{
                "lng": 113.980502,
                "lat": 22.54161
        	},
            {
              "lng": 113.972839,
              "lat": 22.533976
            },
            {
              "lng": 113.98925,
              "lat": 22.524669
            },
            {
              "lng": 113.990034,
              "lat": 22.537097
            },
            {
              "lng": 114.00916,
              "lat": 22.534477
            }
    	]
  	},
    {
      	locations: [
            {
              "lng": 113.924271,
              "lat": 22.537654
            },
            {
              "lng": 113.9367,
              "lat": 22.532806
            },
            {
              "lng": 113.928494,
              "lat": 22.518594
            },
            {
              "lng": 113.942673,
              "lat": 22.524502
            },
            {
              "lng": 113.944302,
              "lat": 22.538601
            }
    	]
  	},
  	{
      	locations: [
            {
                "lng": 113.98049,
                "lat": 22.54301
            },
            {
                "lng": 114.06374,
                "lat": 22.51134
            },
            {
                "lng": 114.06259,
                "lat": 22.50951
            },
            {
                "lng": 114.06178,
                "lat": 22.51031
            },
            {
                "lng": 113.96047,
                "lat": 22.54611
            }
       ]
  	}
]

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

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

相关文章

优化物料编码规则,提升物料管理效率

导 读 ( 文/ 2358 ) 物料是生产过程的必需品。对物料进行身份的唯一标识&#xff0c;可以更好的管理物料库存、库位&#xff0c;更方便的对物料进行追溯。通过编码规则的设计&#xff0c;可以对物料按照不同的属性、类别或特征进行分类&#xff0c;从而更好地进行库存分析、计划…

win10 maven 安装环境变量设置不成功

maven 按照正常步骤设置环境变量 输入命令总是不能正常现实mvn的版本 解决方案: 1.删除掉设置的用户环境变量 2.将maven的完整目录写入系统变量path中 3.将该路径放到所有变量的最前面 4.点击确定,重新打开cmd 输入 mvn -v 正常了

C语言刷题指南(四)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

摆动序列【贪心算法】

摆动序列 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 class Solution {public int wiggleMaxLength(int…

Windows下 MySql通过拷贝data目录迁移数据库的方法

MySQL数据库的文件目录下图所示&#xff0c; 现举例说明通过COPY文件夹data下数据库文件&#xff0c;进行数据拷贝的步骤&#xff1b;源数据库运行在A服务器上&#xff0c;拷贝到B服务器&#xff0c;假定B服务器上MySQL数据库已经安装完成&#xff0c;为空数据库。 首先进入A服…

Java 程序打印 OpenCV 的版本

我们可以使用 Java 程序来使用 OpenCV。 OpenCV 的使用需要动态库的加载才可以。 加载动态库 到 OpenCV 的官方网站上下载最新的发布版本。 Windows 下载的是一个可执行文件&#xff0c;没关系&#xff0c;这个可执行文件是一个自解压程序。 当你运行以后会提示你进行解压。…

百度“AI智障”到AI智能体验之旅

目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结&#xff1a;四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格&#xff0c;正巧之前也体验过它的前身&q…

分析系统 - 使用Python爬虫

在竞争激烈的市场环境中&#xff0c;了解和分析竞争对手的销售策略和市场表现对于企业的成功至关重要。本文将介绍如何利用Python爬虫建立低成本的销售竞争对手分析系统&#xff0c;探索其方法、工具和好处&#xff0c;并同时解决可能出现的问题。 销售竞争对手分析的目标是获取…

PyTorch 模型性能分析和优化 - 第 2 部分

动动发财的小手&#xff0c;点个赞吧&#xff01; 这是有关分析和优化在 GPU 上运行的 PyTorch 模型主题的系列文章的第二部分。在第一篇文章中&#xff0c;我们演示了使用 PyTorch Profiler 和 TensorBoard 迭代分析和优化 PyTorch 模型的过程以及巨大潜力。在这篇文章中&…

36、springboot --- 对 tomcat服务器 和 undertow服务器 配置访客日志

springboot 配置访客日志 ★ 配置访客日志&#xff1a; 访客日志&#xff1a; Web服务器可以将所有访问用户的记录都以日志的形式记录下来&#xff0c;主要就是记录来自哪个IP的用户、在哪个时间点、访问了哪个资源。 Web服务器可将所有访问记录以日志形式记录下来&#xff…

Vue2向Vue3过度核心技术进阶语法

目录 1 v-model简化代码1.目标&#xff1a;2.如何简化&#xff1a;3.代码示例 2 sync修饰符1.作用2.场景3.本质4.语法5.代码示例6.总结 3 ref和$refs1.作用2.特点&#xff1a;3.语法4.注意5.代码示例 4 异步更新 & $nextTick1.需求2.代码实现3.问题4.解决方案 1 v-model简化…

MES管理系统如何让传统汽车行业从“制造”走向“智造”

在传统制造业中&#xff0c;“数字化转型”是一个老生常谈的话题&#xff0c;然而&#xff0c;许多传统制造业仍处于“信息化”的阶段&#xff0c;距离真正的数字化还有很长的路要走。如果要在所有传统制造行业中寻找那些可以成为转型“先行者”的领域&#xff0c;那么深度与广…

水果flstudio好用吗?中文版FL21最新版本如何下载

FL Studio21版是一款功能强大的音乐制作软件&#xff0c;广泛应用于电子音乐、流行音乐、电影配乐等领域。它提供了丰富多样的音频合成和编辑工具&#xff0c;使音乐制作变得更加灵活多样。无论是初学者还是专业音乐制作人&#xff0c;都可以通过直观的界面和丰富的音频特效来实…

【IMX6ULL驱动开发学习】12.Linux SPI驱动实战:DAC驱动设计流程

基础回顾&#xff1a; 【IMX6ULL驱动开发学习】10.Linux I2C驱动实战&#xff1a;AT24C02驱动设计流程_阿龙还在写代码的博客-CSDN博客 【IMX6ULL驱动开发学习】11.Linux之SPI驱动_阿龙还在写代码的博客-CSDN博客 一、编写驱动 查看芯片手册&#xff0c;有两种DAC数据格式&a…

量化QAT QLoRA GPTQ

模型量化的思路可以分为PTQ&#xff08;Post-Training Quantization&#xff0c;训练后量化&#xff09;和QAT&#xff08;Quantization Aware Training&#xff0c;在量化过程中进行梯度反传更新权重&#xff0c;例如QLoRA&#xff09;&#xff0c;GPTQ是一种PTQ的思路。 QAT…

CORBA-架构师真题(一十三)

1、某企业内部主要功能已封装web服务。为了扩展业务&#xff0c;需要将现有业务功能 进行多种组合&#xff0c;形成新的业务功能。针对业务灵活组合的要求&#xff0c;采用&#xff08;&#xff09;架构风格最为合适。 答案&#xff1a; 解释器 解析&#xff1a; 解释器分下…

Windows 转 mac 记录

初次从Windows转mac可能会不适应&#xff0c;建议先看看 【6分钟搞定MacBook】不懂时无所适从&#xff0c;学会后越用越爽&#xff01;_哔哩哔哩_bilibili 我主要是做一些补充记录 1、Windows的右键等于mac的双击触控板、control单击触控板 2、运行中的应用下方会有一个点&…

项目部署之后页面没有刷新怎么办?

最近项目部署成功之后&#xff0c;突然产品找我&#xff0c;上线之后&#xff0c;页面没有生效&#xff0c;这是怎么回事&#xff1f;我这是第一次部署这个项目,也不太清楚历史问题,接下来就慢慢寻找答案吧, 如果心急的可以直接看后面的总结&#xff0c;下面我们好好聊聊缓存的…

桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)

1.分为三类 健康的桃子叶片 &#xff0c;251张 桃疮痂病一般&#xff0c;857张 桃疮痂病严重&#xff0c;770 张 2. GUI界面识别效果和predict.py识别效果如视频所示桃子叶片病害识别&#xff08;Python代码&#xff0c;pyTorch框架&#xff0c;深度卷积网络模型&#xff0…

python实现的淘宝自动发货脚本

pyhton # 文件用ini # 自动应答&#xff0c;自动点发货