<template>
<div class="amap-wrapper" id="amap"></div>
</template>
<script>
import BaiduMap from "@/utils/BaiduMap";
import { getTrajectoryBySchemeid } from "@/api/iot/inspectionPlan";
import carIcon from "@/assets/image/car.png";
let map;
let driving;
let car;
let BMap;
export default {
props: {
row: {
type: Object,
},
},
data() {
return {
data: [],
pathdata: [],
points: [],
label: "",
centerPoint: [],
totalTime: 0,
pastTime: 0,
rangeLen: 0,
judge: true,
timer: null,
index: 0,
};
},
methods: {
addMaker(points) {
points.forEach((item) => {
let marker = new BMap.Marker(item);
map.addOverlay(marker);
});
map.setViewport(points);
},
initMap() {
BaiduMap.init(BaiduMap)
.then((_BMap) => {
BMap = _BMap;
})
.then((_) => {
return getTrajectoryBySchemeid({
schemeid: this.row.schemeid,
id: this.row.id,
});
})
.then((response) => {
this.data = response.data;
this.pathdata = response.data.map((item) => {
return new BMap.Point(item.lng, item.lat);
});
})
.then((_) => BaiduMap.initTrackAnimation())
.then((_) => {
map = new BMap.Map("amap");
if (this.pathdata.length > 0) {
map.centerAndZoom(this.pathdata[0], 17);
} else {
map.centerAndZoom("南京", 16);
}
map.enableScrollWheelZoom();
})
.then((_) => this.addMaker(this.pathdata))
.then((_) => {
this.makeDriver();
});
},
makeDriver() {
driving = new BMap.DrivingRoute(map);
driving.search(
this.pathdata[this.rangeLen],
this.pathdata[this.rangeLen + 1]
);
driving.setSearchCompleteCallback(() => {
this.points = driving.getResults().getPlan(0).getRoute(0).getPath();
this.totalTime = this.points.length * 5;
car = new BMap.Marker(this.points[0], {
icon: new BMap.Icon(carIcon, new BMap.Size(32, 32), {
anchor: new BMap.Size(24, 24),
}),
enableRotation: true,
});
map.addOverlay(car);
this.rangeLen++;
this.play(5);
});
},
play(speed) {
this.pastTime += speed;
var point = this.points[this.index];
if (this.index > 0) {
map.addOverlay(
new BMap.Polyline([this.points[this.index - 1], point], {
strokeColor: "#46a6ff",
strokeWeight: 5,
strokeOpacity: 0.8,
})
);
}
car.setPosition(point);
this.index++;
if (
this.totalTime - this.pastTime <= 1500 &&
this.judge &&
this.rangeLen < this.pathdata.length
) {
this.judge = false;
this.addPoints();
}
if (this.followPoint(point)) {
map.centerAndZoom(point, 17);
}
if (this.index < this.points.length) {
this.timer = window.setTimeout(() => {
this.play(speed);
}, speed);
} else {
}
},
addPoints() {
if (this.rangeLen + 1 == this.pathdata.length) {
console.log(this.pathdata);
setTimeout(() => map.setViewport(this.pathdata), 1000);
return;
}
driving.search(
this.pathdata[this.rangeLen],
this.pathdata[this.rangeLen + 1]
);
driving.setSearchCompleteCallback((_) => {
var pwe = driving.getResults().getPlan(0).getRoute(0).getPath();
this.points = this.points.concat(pwe);
this.totalTime = this.points.length * 5;
this.rangeLen++;
this.judge = true;
});
},
followPoint(p) {
var bound = map.getBounds();
if (bound.containsPoint(p) != true) {
return true;
} else {
return false;
}
},
},
mounted() {
this.initMap();
},
};
</script>
<style>
.amap-wrapper {
width: 100%;
height: 500px;
}
</style>