先看效果
實現(xiàn)效果:
- 根據(jù)不同速度繪制不同顏色的軌跡
- 根據(jù)終點起點獲取地圖中心點,盡可能在屏幕內(nèi)完全展示軌跡
- 獲取最快的路段并顯示
- 自定義點圖標
實現(xiàn)步驟:
- map組件
view標簽部分
<template>
<view>
<map id="map1"
:longitude="longitude"
:latitude="latitude"
:markers="markers"
:scale="scale"
:polyline="polyline"
:style="{height: height,width:width}"
></map>
</view>
</template>
js部分
<script>
export default {
props: {
height: {
type: String,
default: '100vh'
},
width: {
type: String,
default: '100%'
},
points: {
type: Array,
default() {
return []
}
},
},
data() {
return {
maxSpeed: null, // 最快速度的點
scale: 3, // 地圖縮放比例
markers: [], // 標記點集合
polyline: [{
points: [],
},], // 坐標點集合
latitude: 39.806466,
longitude: 98.226473,
centerPoint: {
latitude: 0,
longitude: 0
}, // 中間點
}
},
watch: {
points(e) {
let that = this;
if (that.points.length > 0) {
that.setDateByPoints(that.points);
}
},
},
created: function () {
let that = this;
if (that.points.length > 0) {
that.setDateByPoints(that.points);
}
},
methods: {
// 根據(jù)速度計算路線顏色
computePointsSpeed(points) {
let lineColor = '#ffd500'
let list = []
if (!points || !points.length) {
return list
}
let lastArr = []
let lastSpeed = 0
for (let i = 0; i < points.length; i++) {
let speed = this.covertSpeed(points[i].speed)
if (!this.maxSpeed) {
this.maxSpeed = points[i]
} else {
if (points[i].speed > this.maxSpeed.speed) {
this.maxSpeed = points[i]
}
}
if (i === points.length - 1 || !speed) {
// 還剩最后一個不計入
continue
}
let nextPoint = points[i + 1]
let nextSpeed = this.covertSpeed(points[i + 1].speed)
if (!nextSpeed) {
continue
}
lastSpeed = speed
if (!lastArr.length) {
lastArr.push(points[i], nextPoint)
} else {
lastArr.push(nextPoint)
}
if (speed <= 20) {
lineColor = '#ffd500'
if (nextSpeed > 20) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
if (speed > 20 && speed <= 40) {
lineColor = '#ff8800'
if (nextSpeed <= 20 || nextSpeed > 40) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
if (speed > 40 && speed <= 60) {
lineColor = '#ff5d00'
if (nextSpeed <= 40 || nextSpeed > 60) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
if (speed > 60 && speed <= 80) {
lineColor = '#ff4d00'
if (nextSpeed <= 60 || nextSpeed > 80) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
if (speed > 80 && speed <= 100) {
lineColor = '#ff3d00'
if (nextSpeed <= 80 || nextSpeed > 100) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
if (speed > 100 && speed <= 120) {
lineColor = '#ff2d00'
if (nextSpeed <= 100 || nextSpeed > 120) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
if (speed > 120) {
lineColor = '#ff1d00'
if (nextSpeed <= 120) {
// 清空
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
lastArr = []
}
}
}
this.centerPoint = points[Math.round(points.length / 2)]
console.log("centerPoint", this.centerPoint)
if (!list.length && lastArr.length) {
list.push({
points: lastArr,
color: lineColor,
arrowLine: true, //帶箭頭的線
width: 8,
})
}
return list
},
// 設(shè)置路線和點
setDateByPoints(points) {
let that = this;
let color = "#ffd500"
// 標記點集合
that.polyline = this.computePointsSpeed(points)
if (!that.polyline.length) {
that.polyline = [{
points: points,
color: color,
arrowLine: true, //帶箭頭的線
width: 8,
}]
}
if (that.maxSpeed) {
that.maxSpeed.iconPath = '../../static/icon/map/flash.png'
that.maxSpeed.width = 24
that.maxSpeed.height = 24
that.maxSpeed.id = 2
that.maxSpeed.callout = {
color: '#5d5d5d',
fontSize: 14,
borderRadius: 6,
padding: 8,
bgColor: '#fff',
content: `極速 ${this.covertSpeed(this.maxSpeed.speed)} km/h`
}
that.markers.push(this.maxSpeed)
}
let start = points[0]
let end = points[points.length - 1]
start.id = 1
start.width = 35
start.height = 35
start.iconPath = '../../static/icon/map/start.png'
end.id = 3
end.width = 35
end.height = 35
end.iconPath = '../../static/icon/map/end.png'
that.markers.push(start, end);
this.setCenterPoint(start, end)
},
// 地圖中心點 (計算3個點的中心點)
setCenterPoint(start, end) {
this.longitude = (start.longitude + this.centerPoint.longitude + end.longitude) / 3
this.latitude = (start.latitude + this.centerPoint.latitude + end.latitude) / 3
let distance1 = this.getDistance(start.latitude, start.longitude, this.centerPoint.latitude, this.centerPoint.longitude)
let distance2 = this.getDistance(this.centerPoint.latitude, this.centerPoint.longitude, end.latitude, end.longitude)
const distance = Number(distance1) + Number(distance2)
console.log('計算兩點之間的距離', distance1, distance2, distance)
if (distance < 200) {
this.scale = 17
}
if (distance >= 200 && distance < 1000) {
this.scale = 15
}
if (distance >= 1000 && distance < 5000) {
this.scale = 13
}
if (distance >= 5000 && distance < 10000) {
this.scale = 12
}
if (distance >= 10000 && distance < 15000) {
this.scale = 11
}
if (distance >= 15000 && distance < 50000) {
this.scale = 10
}
if (distance >= 50000 && distance < 200000) {
this.scale = 8
}
if (distance > 200000) {
this.scale = 5
}
},
// 速度轉(zhuǎn)換 m/s -> km/h
covertSpeed(ms) {
if (ms <= 0) {
return 0.00
}
const kmh = ms * (60 * 60)
return parseFloat(String(kmh / 1000)).toFixed(2)
},
// 計算兩坐標點之間的距離
getDistance: function (lat1, lng1, lat2, lng2) {
let rad1 = lat1 * Math.PI / 180.0;
let rad2 = lat2 * Math.PI / 180.0;
let a = rad1 - rad2;
let b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
let r = 6378137;
return (r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math
.sin(b / 2), 2)))).toFixed(0)
},
},
}
</script>
points 數(shù)據(jù)格式文章來源:http://www.zghlxwxcb.cn/news/detail-514109.html
points:[
{
latitude: 22,
longitude: 98,
speed: 6.4352341234, //speed m/s
},
{
latitude: 22,
longitude: 98,
speed: 6.4352341234, //speed m/s
},
{
latitude: 22,
longitude: 98,
speed: 6.4352341234, //speed m/s
}
]
注意:由于小程序會不斷更新迭代,源碼和體驗效果可能有一定的差異。
轉(zhuǎn)載務(wù)必說明出處文章來源地址http://www.zghlxwxcb.cn/news/detail-514109.html
到了這里,關(guān)于uniapp 微信小程序?qū)崿F(xiàn)運動軌跡、行車軌跡、歷史軌跡、軌跡回放、不同速度有不同的路線顏色的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!