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

这篇具有很好参考价值的文章主要介绍了uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

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

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


效果图

uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二),uniapp,uniapp绘制轨迹,使用renderjs绘制轨迹,canvas绘制轨迹文章来源地址https://www.toymoban.com/news/detail-672614.html


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
            }
       ]
  	}
]

到了这里,关于uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NC文件根据经纬度提取点上数值

    Hello,Hello,Hello,大家好,时隔上一次更新已经很久了,今天主要和大家分享一组简单的代码,来提取NC文件中某一点的数值! 本次实例数据依旧使用喜闻乐见的NCEP数据,数据使用的是多层气温。或者可以直接点击这里下载 这个就是下载好的数据: 大家可以看一下,这个数

    2024年02月05日
    浏览(49)
  • Python根据经纬度在地图上显示(folium)

    1、location地图中心点 经纬度,list 或者 tuple 格式,顺序为 latitude(纬度), longitude(经度) 2、zoom_start地图等级 缩放值,默认为 10,值越大比例尺越小,地图放大级别越大 3、tiles 显示样式,默认*‘OpenStreetMap’*,也就是开启街道显示;也有一些其他的内建地图样式,如’Stamen T

    2024年02月14日
    浏览(56)
  • Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐

    目录 前言 一、根据坐标经纬度计算两点距离(5种方法) 1.方法一 2.方法二 3.方法三 4.方法四 5.方法五 5.1 POM引入第三方依赖 5.2 代码 6.测试结果对比 二、校验经纬度是否在制定区域内 1.判断一个坐标是否在圆形区域内 2.判断一个坐标是否在一个多边形区域内 3.结果 总结   

    2024年02月10日
    浏览(86)
  • 用ES实现根据经纬度由近及远推荐店铺

    ES中特有的类型geo_point,是用来存储地图类型的。店铺推荐、地图搜索和外卖平台等,实现目标距离你多少米,就是用这个数据类型做出来的。 其中,ES支持的地图检索方式有以下几种; geo_distance:直线距离检索,如给定点A,要求返回地图上距离点A三千米的店铺 geo_bounding

    2024年02月13日
    浏览(40)
  • 根据手机指南针经纬度在地图上找到其位置

    使用手机指南针获取经纬度,然后在地图上找到位置。 1、使用手机指南针获取经纬度: 2、将度分秒转换为度: 分/60+秒/3600+整数度数,得到以度为单位的数值 手机经纬度:117.1291666,31.842777 3、坐标系转换: 地图坐标系转换 - 在线工具 输入手机经纬度:117.1291666,31.842777 得到

    2024年02月09日
    浏览(41)
  • Java调用高德地图API根据详细地址获取经纬度

    访问高德开放平台https://lbs.amap.com/ 登录后,在控制台中创建一个应用,获取生成的应用key。这个key将用于访问高德地图API。   您可以使用Java中的 HttpURLConnection 或 HttpClient 等工具发送HTTP请求到高德地图API,并传递参数以获取经纬度信息。以下是一个使用 HttpURLConnection 的示例

    2024年02月05日
    浏览(55)
  • 如何利用地图API接口根据地址获取具体的经纬度?

     目录 一、登录到百度地图开放平台 二、认证为开发者 三、创建应用 四、地址转经纬度API接口 五、封装JAVA工具类 百度地图开放平台网址:https://lbsyun.baidu.com/ 这里你有两种选择,可以选择认证个人开发者或者企业开发者,区别在企业认证每日接口调用次数配额更多,并发

    2024年02月16日
    浏览(55)
  • ElasticSearch - 根据经纬度,简单搜索指定距离范围内的数据

    ES的地图检索方式 ES支持的地图检索方式有以下几种; geo_distance geo_bounding_box geo_polygon 1、 geo_distance :直线距离检索,如给定点A,要求返回地图上距离点A三千米的商家(点外卖场景) 2、查找索引内距离北京站(116.433733,39.908404)3000米内的点 geo_distance涉及的参数如下 location:确

    2024年02月14日
    浏览(47)
  • 百度开发者平台API地理编码,根据地址获取经纬度

    地理编码 | 百度地图API SDK (baidu.com) 原始csv 结果: 字段名称: 社区名称、经度、纬度、看下表吧。 地理编码 | 百度地图API SDK (baidu.com) 或者参考这篇博文: http://t.csdn.cn/AghZk

    2024年02月15日
    浏览(40)
  • 根据经纬度计算地球上两点之间的距离——Haversine公式介绍及计算步骤

    目录 摘要 1.半正矢公式(Haversine Formula)介绍 2.半正矢公式应用 3.半正矢公式计算 3.1 主要思路 3.2 计算步骤 3.2.1 平面向量计算方法 3.2.2 空间向量计算方法 写本文的出发点是需要在Qlik中根据经纬度计算地球上两点间的距离。我在社区上搜到了相关公式的分享,这个公式叫做

    2023年04月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包