|
@@ -0,0 +1,230 @@
|
|
|
+export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ lineArr: [],
|
|
|
+ // 巡航轨迹
|
|
|
+ AMap: null,
|
|
|
+ map: null,
|
|
|
+ PathSimplifier: null,
|
|
|
+ beforeInit: true,
|
|
|
+ isPlay: true,
|
|
|
+ sliderVal: 0, // 进度条
|
|
|
+ times: 1, // 倍速
|
|
|
+ maxSpeed: 40, // 最高倍速
|
|
|
+ navgtrSpeed: 1000, // 速度
|
|
|
+ isMinSpeed: true,
|
|
|
+ isMaxSpeed: false,
|
|
|
+ navgtr: null,
|
|
|
+ pathSimplifierIns: null,
|
|
|
+ actualList: [],
|
|
|
+ defaultRenderOptions: {
|
|
|
+ renderAllPointsIfNumberBelow: -1, // 描绘路径点,如不需要设为-1
|
|
|
+ pathTolerance: 2,
|
|
|
+ keyPointTolerance: 0,
|
|
|
+ pathLineStyle: {
|
|
|
+ lineWidth: 6,
|
|
|
+ strokeStyle: '#409eff',
|
|
|
+ borderWidth: 1,
|
|
|
+ borderStyle: '#eeeeee',
|
|
|
+ dirArrowStyle: false
|
|
|
+ },
|
|
|
+ pathLineHoverStyle: {
|
|
|
+ lineWidth: 6,
|
|
|
+ strokeStyle: '#ff0000',
|
|
|
+ borderWidth: 1,
|
|
|
+ borderStyle: '#cccccc',
|
|
|
+ dirArrowStyle: false
|
|
|
+ },
|
|
|
+ dirArrowStyle: {
|
|
|
+ stepSpace: 30,
|
|
|
+ strokeStyle: '#ffffff',
|
|
|
+ lineWidth: 2
|
|
|
+ },
|
|
|
+ pathLineSelectedStyle: {
|
|
|
+ lineWidth: 6,
|
|
|
+ strokeStyle: '#409eff',
|
|
|
+ borderWidth: 1,
|
|
|
+ borderStyle: '#cccccc',
|
|
|
+ dirArrowStyle: true
|
|
|
+ },
|
|
|
+ keyPointStyle: {
|
|
|
+ radius: 0,
|
|
|
+ fillStyle: 'rgba(8, 126, 196, 1)',
|
|
|
+ lineWidth: 1,
|
|
|
+ strokeStyle: '#eeeeee'
|
|
|
+ },
|
|
|
+ keyPointHoverStyle: {
|
|
|
+ radius: 0,
|
|
|
+ fillStyle: 'rgba(0, 0, 0, 0)',
|
|
|
+ lineWidth: 2,
|
|
|
+ strokeStyle: '#ffa500'
|
|
|
+ },
|
|
|
+ keyPointOnSelectedPathLineStyle: {
|
|
|
+ radius: 0,
|
|
|
+ fillStyle: 'rgba(8, 126, 196, 1)',
|
|
|
+ lineWidth: 2,
|
|
|
+ strokeStyle: '#eeeeee'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ isCursorAtPathEnd: false,
|
|
|
+ palyStayus: 0, //0->未开始 1->行驶中 2->暂停
|
|
|
+ value: 0, // 进度条初始化
|
|
|
+
|
|
|
+ // signMarker: null,
|
|
|
+ currentPoint: null,
|
|
|
+
|
|
|
+ timeValue: '',
|
|
|
+ trackData: []
|
|
|
+ };
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ initLineArr() {
|
|
|
+ let _this = this;
|
|
|
+ let that = this;
|
|
|
+
|
|
|
+ AMapUI.load(['ui/misc/PathSimplifier'], PathSimplifier => {
|
|
|
+ if (!PathSimplifier.supportCanvas) {
|
|
|
+ alert('当前环境不支持 Canvas!');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果已存在巡航轨迹,则删除
|
|
|
+ if (window.pathSimplifierIns && that.pathSimplifierIns) {
|
|
|
+ //通过该方法清空上次传入的轨迹
|
|
|
+ that.pathSimplifierIns.setData([]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化坐标点
|
|
|
+ if (_this.lineArr.length > 0) {
|
|
|
+ that.actualList = _this.lineArr;
|
|
|
+
|
|
|
+ //创建一个巡航轨迹路线
|
|
|
+ that.pathSimplifierIns = new PathSimplifier({
|
|
|
+ zIndex: 100, //地图层级,
|
|
|
+ map: this.map, //所属的地图实例
|
|
|
+ //巡航路线轨迹列表
|
|
|
+ getPath: (pathData, pathIndex) => {
|
|
|
+ return pathData.path;
|
|
|
+ },
|
|
|
+ //hover每一个轨迹点,展示内容
|
|
|
+ getHoverTitle: function (pathData, pathIndex, pointIndex) {
|
|
|
+ return '';
|
|
|
+ },
|
|
|
+ //自定义样式,可设置巡航器样式,巡航轨迹样式,巡航轨迹点击、hover等不同状态下的样式,不设置则用默认样式,详情请参考api文档 renderOptions:{}
|
|
|
+ //绘制路线节点
|
|
|
+ renderOptions: that.defaultRenderOptions
|
|
|
+ });
|
|
|
+ window.pathSimplifierIns = that.pathSimplifierIns;
|
|
|
+ //设置数据
|
|
|
+ that.pathSimplifierIns.setData([
|
|
|
+ {
|
|
|
+ name: '轨迹路线',
|
|
|
+ path: that.actualList
|
|
|
+ }
|
|
|
+ ]);
|
|
|
+ that.pathSimplifierIns.setSelectedPathIndex(0);
|
|
|
+
|
|
|
+ function onload() {
|
|
|
+ that.pathSimplifierIns.renderLater();
|
|
|
+ }
|
|
|
+
|
|
|
+ function onerror(e) {
|
|
|
+ console.log('图片加载失败!');
|
|
|
+ }
|
|
|
+
|
|
|
+ //对第一条线路(即索引 0)创建一个巡航器
|
|
|
+ let image = PathSimplifier.Render.Canvas.getImageContent('https://webapi.amap.com/images/car.png', onload, onerror);
|
|
|
+ that.navgtr = that.pathSimplifierIns.createPathNavigator(0, {
|
|
|
+ loop: false, //循环播放
|
|
|
+ speed: that.navgtrSpeed, //巡航速度,单位千米/小时
|
|
|
+ pathNavigatorStyle: {
|
|
|
+ width: 20,
|
|
|
+ height: 30,
|
|
|
+ //使用图片
|
|
|
+ content: image, // 自定义巡航样式
|
|
|
+ strokeStyle: null,
|
|
|
+ fillStyle: null,
|
|
|
+ //经过路径的样式
|
|
|
+ pathLinePassedStyle: {
|
|
|
+ lineWidth: 6,
|
|
|
+ strokeStyle: '#69f81e',
|
|
|
+ dirArrowStyle: {
|
|
|
+ stepSpace: 15,
|
|
|
+ strokeStyle: '#FFF'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ that.navgtr.on('start resume', function () {
|
|
|
+ that.navgtr._startTime = Date.now();
|
|
|
+ that.navgtr._startDist = this.getMovedDistance();
|
|
|
+ });
|
|
|
+ that.navgtr.on('stop pause', function () {
|
|
|
+ that.navgtr._movedTime = Date.now() - that.navgtr._startTime;
|
|
|
+ that.navgtr._movedDist = this.getMovedDistance() - that.navgtr._startDist;
|
|
|
+ });
|
|
|
+ that.navgtr.on('move', function (data, position) {
|
|
|
+ that.isCursorAtPathEnd = false;
|
|
|
+ let idx = position.dataItem.pointIndex; //走到了第几个点
|
|
|
+ let tail = position.tail; //至下一个节点的比例位置
|
|
|
+ let totalIdx = idx + tail;
|
|
|
+ let len = position.dataItem.pathData.path.length - 1;
|
|
|
+ // 设置当前点位
|
|
|
+ that.currentPoint = that.actualList[idx];
|
|
|
+ if (idx < len - 1) {
|
|
|
+ that.navgtr.setSpeed(that.navgtrSpeed * that.times);
|
|
|
+ }
|
|
|
+ // 进度条实时展示tail
|
|
|
+ !that.isOnSlider && (that.sliderVal = (totalIdx / len) * 100);
|
|
|
+
|
|
|
+ // 如果到头了,回到初始状态
|
|
|
+ if (that.navgtr.isCursorAtPathEnd()) {
|
|
|
+ that.isCursorAtPathEnd = true;
|
|
|
+ that.initPlayBox();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 加载完成
|
|
|
+ that.beforeInit = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ initPlayBox() {
|
|
|
+ // 暂停
|
|
|
+ this.navgControl('pause');
|
|
|
+ this.playIcon = 'start';
|
|
|
+ this.isPlay = true; // 播放图标
|
|
|
+ this.palyStayus = 0; // 继续状态
|
|
|
+ },
|
|
|
+ // 控制播放按钮
|
|
|
+ navgControl(type) {
|
|
|
+ if (!this.navgtr || !type) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (type === 'start' || type === 'resume') {
|
|
|
+ this.isPlay = false;
|
|
|
+ this.palyStayus = 2;
|
|
|
+ // 如果已经到了终点,重新定位坐标
|
|
|
+ if (this.isCursorAtPathEnd && this.actualList.length > 0) {
|
|
|
+ this.map.setCenter(this.actualList[0]);
|
|
|
+
|
|
|
+ }
|
|
|
+ } else if (type === 'pause') {
|
|
|
+ this.isPlay = true;
|
|
|
+ this.palyStayus = 1;
|
|
|
+ }
|
|
|
+ this.navgtr[type]();
|
|
|
+ this.map.setFitView();
|
|
|
+ },
|
|
|
+ // carReLocate() {
|
|
|
+ // // 鼠标从滑动条抬起时,重新定位
|
|
|
+ // if (this.currentPoint) {
|
|
|
+ // let timeout = setTimeout(() => {
|
|
|
+ // clearTimeout(timeout)
|
|
|
+ // this.map.setCenter(this.currentPoint)
|
|
|
+ // }, 0)
|
|
|
+ // }
|
|
|
+ // },
|
|
|
+ }
|
|
|
+};
|