在vue2中引用高德地图,外卖骑手的路线规划

news/2025/3/15 11:14:09/文章来源:https://www.cnblogs.com/moranjl/p/18773404

参照路径规划-参考手册-地图 JS API 1.4 | 高德地图API

AMap.Riding

AMap.Riding骑行路径规划服务,提供起始、终点骑行路线查询服务。用户可以通过自定义回调函数取回并显示查询结果。若服务请求失败,系统将返回错误信息。

相关示例:位置经纬度 + 骑行路线规划-骑行路径规划-示例中心-JS API 1.4 示例 | 高德地图API

构造函数

说明

AMap.Riding (opts:RidingOptions )

构造函数,提供步行路径规划功能

 

RidingOptions

类型

说明

map

Map

AMap.Map对象, 展现结果的地图实例。

当指定此参数后,搜索结果的标注、线路等均会自动添加到此地图上。可选参数

policy

Number

骑行路线规划策略;可选值为:

0:推荐路线及最快路线综合

1:推荐路线

2:最快路线

默认值:0

panel

String|HTMLElement

结果列表的HTML容器id或容器元素,提供此参数后,结果列表将在此容器中进行展示。可选参数

hideMarkers

Boolean

设置隐藏路径规划的起始点图标,设置为true:隐藏图标;设置false:显示图标 默认值为:false

isOutline

Boolean

使用map属性时,绘制的规划线路是否显示描边。缺省为true

outlineColor

String

使用map属性时,绘制的规划线路的描边颜色。缺省为'white'

autoFitView

Boolean

用于控制在路径规划结束后,是否自动调整地图视野使绘制的路线处于视口的可见范围

 

方法

返回值

说明

search(origin:LngLat,destination:LngLat,

callback:function(status:String,result:info/RidingResult))

或 search(point:Array.<Object>,

callback:function(status:String,result:info/RidingResult))                 

 

根据起点和终点坐标,实现骑行路径规划;

当按起点、终点名称时,point为包含起点、终点的数组,

例:[{keyword:‘方恒国际中心A座’},{keyword:‘望京站’}]

当数组超过两个元素时,取前两个元素为起点、终点,其余元素忽略;

当status为complete时,result为RidingResult;

当status为error时,result为错误信息info;

当status为no_data时,代表检索返回0结果。

clear()

 

清除搜索的结果

 

事件

参数

说明

complete

RidingResult

当查询成功时触发此事件

error

ErrorStatus

当查询失败时触发此事件

RidingResult 对象

属性

类型

说明

info

String

成功状态说明

origin

LngLat

骑行导航起点坐标

destination

LngLat

骑行导航终点坐标

start

Poi

骑行导航起点

end

Poi

骑行导航终点

count

Number

骑行导航路段数目

routes

Array.<RideRoute>

骑行规划路线列表

RideRoute 对象

属性

类型

说明

distance

Number

起点到终点总步行距离,单位:米

time

Number

步行时间预计,单位:秒

rides

Array.<RideStep>

路段列表,以道路名称作为分段依据,将整个骑行导航方案分隔成若干路段

RideStep 对象

属性

类型

说明

start_location

LngLat

本路段的起点坐标

end_location

LngLat

本路段的终点坐标

instruction

String

此路段说明,如“沿北京南站路骑行565米右转”

distance

Number

此路段距离,单位:米

time

Number

此路段预计使用时间,单位:秒

path

Array.<LngLat>

此路段坐标集合

action

String

本骑行子路段完成后动作

assist_action

String

本骑行子路段完成后辅助动作,一般为到达某个目的地时返回

orientation

String

步行方向

road

String

道路

 

具体示例:

一、 页面调取

<template><!-- 骑手位置地图 start--><view class="card-panel map-panel" v-if="riderLocationMap"><szyCommonMap ref="commonMapRef" :markers="markers" :refreshLoading="refreshLoading":rider_status_level="rider_status_level" @refreshMap="refreshMap" /></view><!-- 骑手位置地图 end -->
</template>
<script>import szyCommonMap from '@/components/szy-common/szy-common-map/szy-common-map.vue'export default {components: {szyCommonMap},data() {return {refreshLoading: false, // 点击刷新riderLocationMap: false, // 骑手位置地图refresh: 0, // 地图自动刷新时间latitude: 0,longitude: 0,rider_status_level: 0,markers: [{id: 0,latitude: 0,longitude: 0,callout: {content: '配送骑手'},}, {id: 1,latitude: 0,longitude: 0,callout: {content: '发货商家'}}, {id: 2,latitude: 0,longitude: 0,callout: {content: '我的位置'}}],}},async created() {this.initData();},methods: {initData: function(load = true) {let url = this.getUrl('info');this.$http.get(url, {id: this.order_id,}, {load: load}).then(data => {// 骑手初始位置if (data.dada_info) {this.latitude = Number(data.dada_info.rider_lat);this.longitude = Number(data.dada_info.rider_lng);this.markers[0].latitude = Number(data.dada_info.rider_lat);this.markers[0].longitude = Number(data.dada_info.rider_lng);this.markers[1].latitude = Number(data.dada_info.store_address_lat);this.markers[1].longitude = Number(data.dada_info.store_address_lng);this.markers[2].latitude = Number(data.dada_info.user_address_lat);this.markers[2].longitude = Number(data.dada_info.user_address_lng);// 判断地图是否显示if (data.dada_info.rider_lat != '' && data.dada_info.rider_lng != '') {this.riderLocationMap = true;this.rider_status_level = data.rider_status.level;}if (this.order_info.order_status == 1 && data.rider_status && data.rider_status.level == 4 || data.rider_status == null) {this.riderLocationMap = false;}}// 骑手位置地图自动刷新倒计时if (data.dada_info) {let timer = Number(data.dada_info.refresh);if (timer != 0) {if (this.refresh) clearInterval(this.refresh);this.refresh = setInterval(() => {if (timer > 0) {timer -= 1;} else {this.refreshMap();timer = Number(data.dada_info.refresh);}}, 1000);}}}),},// 骑手位置地图刷新refreshMap: function() {this.refreshLoading = true;this.$http.post('/user/order/get-dada-position', {order_id: this.order_id}, {isFactory: false}).then(res => {let data = res.data;if (data.code == 0) {this.latitude = Number(data.data.rider_lat);this.longitude = Number(data.data.rider_lng);this.markers[0].latitude = Number(this.latitude);this.markers[0].longitude = Number(this.longitude);this.refreshLoading = false;this.$refs.commonMapRef.initMap();}})},}}a
</script>

二、 地图组件

/**
* 组件名称:高德地图组件
*/
<template><view class="map-box"><div id="container" style="height: 650rpx;"></div><view class="refresh-btn" @click="refreshMap"><i class="icon iconfont">&#xe639;</i></view><view class="refresh-mark" v-if="refreshLoading"></view></view>
</template><script>export default {data() {return {mapKey: '这里调取你的key',riderRemainingDistance: 0, // 距离riderRemainingTime: 0, // 时间rider_lat: 0, // 骑手位置rider_lng: 0,store_address_lat: 0, //商家位置store_address_lng: 0,user_address_lat: 0, // 用户位置user_address_lng: 0,}},props: {// 标记点 [0]骑手,[1]发货商家,[2]用户markers: {type: [Object, Array]},// 判断骑手取货状态rider_status_level: {type: Number,},// 遮罩refreshLoading: {type: Boolean,default: false}},methods: {refreshMap() {this.$emit('refreshMap');},initMap() {this.rider_lat = this.markers[0].latitude;this.rider_lng = this.markers[0].longitude;this.store_address_lat = this.markers[1].latitude;this.store_address_lng = this.markers[1].longitude;this.user_address_lat = this.markers[2].latitude;this.user_address_lng = this.markers[2].longitude;var map = new AMap.Map("container", {resizeEnable: true,center: [this.rider_lng, this.rider_lat], //地图中心点 - 骑手位置zoom: 16 //地图显示的缩放级别});// 从骑手取到货开始计算与用户的距离和时间if (this.rider_status_level == 3) {//骑行导航var riding = new AMap.Riding({map: map,policy: 1,hideMarkers: false,isOutline: true,outlineColor: '#ffeeee',autoFitView: true});//根据起终点坐标规划骑行路线var that = this;riding.search([this.rider_lng, this.rider_lat], [this.user_address_lng, this.user_address_lat], function(status,result) {// result即是对应的骑行路线数据信息,相关数据结构文档请参考  https://lbs.amap.com/api/javascript-api/reference/route-search#m_RidingResultif (status === 'complete') {console.log('绘制骑行路线完成', result);that.riderRemainingDistance = Number(result.routes[0].distance); // 距离,单位:米that.riderRemainingTime = Math.ceil(result.routes[0].time /60); // 时间,单位:分钟,向上取整} else {console.log('骑行路线数据查询失败' + result)}});}setTimeout(() => {// 途经点 -发货商家var viaMarkerContent = `<div class="custom-content-marker store">
<img src="../../../static/image/store.png">
</div>`;var viaMarker = new AMap.Marker({content: viaMarkerContent,position: new AMap.LngLat(this.store_address_lng, this.store_address_lat), // 商家位置offset: new AMap.Pixel(-25, -50),label: {content: this.rider_status_level <= 2 ? "商家备货中" : "商家已发货", //文本内容position: 'TM',minZoom: 15, //label的最小显示级别,即文本标注在地图15级及以上,才会显示},});// 起点 - 骑手var startMarkerContent = `<div class="custom-content-marker rider">
<img src="../../../static/image/rider.png">
</div>`;var startMarker = new AMap.Marker({content: startMarkerContent,position: new AMap.LngLat(this.rider_lng, this.rider_lat), // 骑手位置offset: new AMap.Pixel(-25, -50), // 图标偏移label: {content: this.rider_status_level <= 2 ? "骑手正赶往商家" :"骑手正在配送</br>距用户<strong class='c-red'>" + this.riderRemainingDistance +'米 ' + this.riderRemainingTime + "分钟</strong>",position: 'TM',minZoom: 15, //label的最小显示级别,即文本标注在地图15级及以上,才会显示},});// 终点 - 用户var endMarkerContent = `<div class="custom-content-marker user"><img src="../../../static/image/location.png"></div>`;var endMarker = new AMap.Marker({content: endMarkerContent,position: new AMap.LngLat(this.user_address_lng, this.user_address_lat), // 用户位置offset: new AMap.Pixel(-25, -50),label: {content: "我的位置", //文本内容position: 'TM',minZoom: 15, //label的最小显示级别,即文本标注在地图15级及以上,才会显示},});// 将 markers 添加到地图map.add([viaMarker, startMarker, endMarker]);}, 500);},},mounted() {window._AMapSecurityConfig = {securityJsCode: 'c584b989869f3dac0e571fc5f3031ec5',}const script1 = document.createElement('script');script1.src = 'https://webapi.amap.com/maps?v=2.0&key=' + this.mapKey + '&plugin=AMap.Riding';script1.onload = () => {this.initMap(); // 确保地图初始化代码在脚本加载完成后执行};document.head.appendChild(script1);const script2 = document.createElement('script');script2.src = 'https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js';document.head.appendChild(script2);},}
</script><style lang="scss">.map-box {position: relative;}::v-deep div {line-height: 40rpx !important;}::v-deep a .csssprite,::v-deep .amap-logo {display: none !important;}::v-deep .amap-markers {.custom-content-marker {width: 100rpx;height: 100rpx;img {max-width: 100% !important;max-height: 100% !important;}}.amap-lib-marker-to,.amap-lib-marker-from {display: none;}.amap-marker-label {border-color: #eee;border-radius: 4rpx;font-size: 28rpx;padding: 12rpx;color: #222;left: 50% !important;top: -26px !important;transform: translate(-50%, -50%);&:after {position: absolute;z-index: -1;content: '';bottom: -30rpx;content: '';width: 0;height: 0;left: 50%;border-width: 18rpx;transform: translate(-50%, 0%);border-style: solid dashed dashed dashed;border-color: #fff transparent transparent transparent;display: block;}.c-red {color: red;}}}.refresh-mark {position: absolute;top: 0;right: 0;left: 0;bottom: 0;z-index: 3;background: rgba(255, 255, 255, 0.6);}.refresh-btn {position: absolute;top: 20rpx;right: 20rpx;z-index: 2;background: #fff;width: 65rpx;height: 65rpx;display: flex;align-items: center;justify-content: center;border-radius: 10rpx;overflow: hidden;box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.3);&:active {background: #ccc;.icon {color: #000;}}.icon {color: #666;font-size: 34rpx;}}
</style>

 展示效果:

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

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

相关文章

软件分析——OBS Studio

课程社区链接:首页 - 2025年春季软件工程(罗杰、任健) - 北京航空航天大学 - 班级博客 - 博客园 (cnblogs.com) 作业要求链接:[I.2] 个人作业:软件案例分析 - 作业 - 2025年春季软件工程(罗杰、任健) - 班级博客 - 博客园 (cnblogs.com) 课程目标:让学生掌握软件开发的…

JDK7-时间类、时间格式化类--java进阶day07

1.Date类:表示时间的类 1.Date常用的构造方法.2.Date常用的成员方法1.getTime:返回从时间原点到对象设定的时间之间的时间2.setTime:将对象的时间设置为setTime里的时间 d3是此刻的时间,被setTime设置为了时间原点2.SimpleDateFormat类:时间格式化类 Date类默认的格式不好看…

RN里遇到初始计算值是一样的,布局位置却不一致的问题

在tabs切换下面的小动画 但在页面上显示确是这样的,只有切换回来一次后才显示正常。计算结果确始终都是7 问了下AI,说是,在RN中,布局计算是异步的。在组件首次渲染时,即使布局事件已经触发并且获取到了layout对象,实际DOM可能还没有完全应用这些尺寸。这会导致第一次动画…

idea安装激活图文详细教程_激活至永久_亲测有效

一、安装 IDEA打开下载好的安装包,按照提示完成安装。 image.png自定义安装路径,我这里安装在了 E:\ 盘下,继续点击下一步按钮: image.png image.png安装完成后,暂时不要启动程序,直接关闭它。三、补丁安装步骤 1. 下载补丁 点击以下链接获取补丁:点击获取补丁文件。htt…

『Plotly实战指南』--绘图初体验

今天,打算通过绘制一个简单的散点图,来开启我们 Plotly 绘图的初次尝试。 本文目的不是介绍如何绘制散点图,而是通过散点图来介绍Plotly 绘图的基础步骤。 1. 绘制散点图:初探 Plotly 散点图是展示变量关系的基础图表,在Plotly中,绘制散点图非常简单。 以下是一个示例代码…

分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!

前言 在人工智能技术日新月异的今天,DeepSeek-R1模型以其卓越的性能和广泛的应用场景,成为了众多用户心中的明星模型。它不仅具备强大的日常写作、翻译、问答等基础功能,更引入了独特的深度思考模式,结合联网搜索能力,在编程、解题、文献解读等复杂任务中展现出卓越的推理…

读书笔记:Spring实战

第1部分 Spring基础 第1章 Spring起步 3 1.1 什么是Spring 4 Spring 的核心是一个 容器,通常称为 Spring 应用上下文,用于创建和管理应用程序组件。这些组件也可以称为bean,会在 Spring 应用上下文中装配在一起,从而形成一个完整的应用程序。 将 bean 连接在一起的行为是…

信息检索系统评估指标的层级分析:从单点精确度到整体性能度量

在构建搜索引擎系统时,有效的评估机制是保证系统质量的关键环节。当用户输入查询词如"machine learning tutorials python",系统返回结果列表后,如何客观评估这些结果的相关性和有效性?这正是信息检索评估指标的核心价值所在。 分析用户与搜索引擎的交互模式,我…

[题目记录] CF1793F Rebrending

一道小清新支配对数据结构 , 非常轻松娱乐的同时足够educational , 好题 .题意 一个 \(n\) 个数的序列 , \(q\) 次询问 . 每次问区间 $ [l,r]$ 中选择两个数,他们的差的绝对值最小是多少 . 题解 注意到这道题不是很好用传统的数据结构维护 . 但是这个形式存在很明显的支配关系…

ollama系列1:轻松3步本地部署deepseek,普通电脑可用

本文主要介绍如何通过ollama快速部署deepseek、qwq、llama3、gemma3等大模型,网速好的小伙伴10分钟就能搞定。让你摆脱GPU焦虑,在普通电脑上面玩转大模型。 安装指南(无废话版) 第一步:安装ollama 我们可以从官网下载ollama,此步骤支持windows、mac、ubuntu操作系统,此处…