import _ from "lodash"; import {getImages} from '@/plugins/images.js' import store from '@/store' //图标 let cheliangtuli_tingche1 = getImages('/assetsMobile/svg/icon-cheliangtuli_tingche1.svg') //停留报警 let cheliangtuli_baojing1 = getImages('/assetsMobile/svg/icon-cheliangtuli_baojing1.svg') //违规报警 let origin = getImages('/assetsMobile/svg/origin.svg') //起点 let destination = getImages('/assetsMobile/svg/destination.svg') //终点 // 经过点类型 1.标注点 2.收集点 3.转运站 4.处理厂 5.公厕 6.投放点 7.垃圾桶 途径点不同类型图标 let vehis1Icon = getImages('/assetsMobile/svg/icon-cheliangtuli_biaozhudian.svg') let vehis2Icon = getImages('/assetsMobile/svg/icon-cheliang_shoujidian.svg') let vehis3Icon = getImages('/assetsMobile/svg/icon-cheliangtuli_zhuanyunzhan.svg') let vehis4Icon = getImages('/assetsMobile/svg/icon-cheliang_chulichang.svg') let vehis5Icon = getImages('/assetsMobile/svg/icon-cheliang_toufangdian.svg') let vehis6Icon = getImages('/assetsMobile/svg/icon-cheliang_toufangdian.svg') let vehis7Icon = getImages('/assetsMobile/svg/icon-cheliangtuli_lajitong.svg') /**创建弧线*/ export function createPulseLinkLayer(map) { // 创建 Loca 实例 let loca = new Loca.Container({ map: map }); // 弧线 var pulseLink = new Loca.PulseLinkLayer({ // loca, zIndex: 10, opacity: 1, visible: true, zooms: [2, 22], depth: true, }); var geo = new Loca.GeoJSONSource({ url: 'https://a.amap.com/Loca/static/loca-v2/demos/mock_data/data-line-out.json', }); pulseLink.setSource(geo); pulseLink.setStyle({ unit: 'meter', dash: [40000, 0, 40000, 0], lineWidth: function () { return [10000, 1000]; }, height: function (index, feat) { return feat.distance / 3 + 10; }, // altitude: 1000, smoothSteps: 30, speed: function (index, prop) { return 1000 + Math.random() * 200000; }, flowLength: 100000, lineColors: function (index, feat) { return ['rgb(255,228,105)', 'rgb(255,164,105)', 'rgba(1, 34, 249,1)']; }, maxHeightScale: 0.3, // 弧顶位置比例 headColor: 'rgba(255, 255, 0, 1)', trailColor: 'rgba(255, 255,0,0)', }); loca.add(pulseLink); loca.animate.start(); } /**创建聚合点*/ export function createMarkerCluster(map, data, callBack) { let { points } = data /**完全自定义点样式*/ function _renderMarker(context) { // console.log(context,'context') // var content = ``; var content = `

${context.data[0].item.label}
`; var offset = new AMap.Pixel(-14, -14); context.marker.setContent(content) context.marker.setOffset(offset) // context.marker.setAngle(context.data[0].item.direction) } let cluster = new AMap.MarkerCluster(map, points, { gridSize: 60, // 设置网格像素大小 renderMarker: _renderMarker, clusterByZoomChange: false }); let handleClickData = _.throttle((e) => { // console.log('testeeee',e) callBack(e) },500, {leading: true,trailing: false}) cluster.on('click', (e) => { handleClickData(e) }) return cluster } /**创建标注点*/ let allmarkerArr = []; export function createMarker(map, data, callBack) { console.log('参', data) let iconMap = { 'vehStop': cheliangtuli_tingche1, 'veAlarm': cheliangtuli_baojing1, // 经过点类型 1.标注点 2.收集点 3.转运站 4.处理厂 5.公厕 6.投放点 7.垃圾桶 'vehis1': vehis1Icon, 'vehis2': vehis2Icon, 'vehis3': vehis3Icon, 'vehis4': vehis4Icon, 'vehis5': vehis5Icon, 'vehis6': vehis6Icon, 'vehis7': vehis7Icon, } let markerArr = data.list.map(e => { let icontype=data.type if(icontype==='vehis'){ //途径点 icontype=`${icontype}${e.type}` e.cloneType = e.type } // 创建一个 Icon let startIcon = new AMap.Icon({ // 图标尺寸 size: new AMap.Size(31, 40), // 图标的取图地址 image: iconMap[icontype],//'//a.amap.com/jsapi_demos/static/demo-center/icons/dir-marker.png', // 图标所用图片大小 imageSize: new AMap.Size(31, 40), }); let marker if (e.option) { marker = new AMap.Marker({ ...e.option }); } else { marker = new AMap.Marker({ icon: startIcon, position: [e.lng02, e.lat02], offset: new AMap.Pixel(0, 6), anchor: 'bottom-center' }); } marker.on('click', function (el) { console.log('点击', e) callBack('click', { ...e, type: data.type}) }) return marker }) map.add(markerArr); // 实例方法 allmarkerArr = allmarkerArr.concat(markerArr) const removeAllMarkers = () => { for (var i = 0; i < allmarkerArr.length; i++) { allmarkerArr[i].setMap(null); // 从地图上移除标记点 } allmarkerArr = []; // 清空存储标记点的数组 } return { removeAllMarkers }; } /**创建轨迹回放 */ let marker, originMarker, destinationMarker, polyline, passedPolyline, startAnimation, removeShowSpeed; const setCenterDebounce = _.throttle((map, e) => { var isVisible = map.getBounds().contains(e.target.getPosition()); if (!isVisible) { map.setCenter(e.target.getPosition(), true)//自动聚焦 } // map.setCenter(e.target.getPosition(), true)//自动聚焦 }, 0); export function createMoveAlong(map, data, callBack) { console.log(marker, 'marker数据', data) let pointsData = data.points let points = pointsData.map(e => { return [Number(e.lng02), Number(e.lat02)] }) let resetIdx; //清空已有实例 if (marker) { marker.stopMove(); marker.off('moving', markerMoving); marker.setMap(null); marker = null; } //清空起点和终点 if (originMarker) { originMarker.setMap(null); originMarker = null } if (destinationMarker) { destinationMarker.setMap(null); destinationMarker = null } if (polyline) { polyline.setMap(null); polyline = null; } if (passedPolyline) { passedPolyline.setMap(null); passedPolyline = null; } if (removeShowSpeed) { removeShowSpeed(); } if (pointsData.length <= 0) return; //无数据 let duration = pointsData[0].duration //传入的速度 let tabStyle = pointsData[0].tabStyle //传入的类型 人员车辆 // 1、创建图标 let icons if (store.state.pastRoute.mapImg) { icons = new AMap.Icon({ image: store.state.pastRoute.mapImg, // 图标的图片地址 size: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 imageSize: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 }) } else { icons = "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png" } marker = new AMap.Marker({ map: map, position: points[0], //points[0], icon: icons, zIndex: 18, offset: new AMap.Pixel(-13, -26), }); //创建起点终点图标显示 let originicons = new AMap.Icon({ image: origin, // 图标的图片地址 size: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 imageSize: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 }) originMarker = new AMap.Marker({ map: map, position: points[0], //points[0], icon: originicons, zIndex: 16, offset: new AMap.Pixel(-13, -26), }); let destinationicons = new AMap.Icon({ image: destination, // 图标的图片地址 size: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 imageSize: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 }) destinationMarker = new AMap.Marker({ map: map, position: points[points.length - 1], //points[0], icon: destinationicons, zIndex: 16, offset: new AMap.Pixel(-13, -26), }); // 2、创建路线 polyline = new AMap.Polyline({ map: map, path: points, zIndex: 10, showDir: true, strokeColor: "#28F", //线颜色 // strokeOpacity: 1, //线透明度 strokeWeight: 6, //线宽 // strokeStyle: "solid" //线样式 }); // 3、创建行驶路线 passedPolyline = new AMap.Polyline({ zIndex: 13, map: map, strokeColor: "#AF5", //线颜色 strokeWeight: 6, //线宽 }); // 4、事件监听 marker.on('moving', markerMoving); function markerMoving(e) { console.log('更新轨迹', e) // 更新轨迹 let passedPath = e.passedPath if (resetIdx) { e.index = e.index + resetIdx //拖拽 passedPath = [...points.slice(0, resetIdx), ...e.passedPath] //points.slice(0,index+1).concat(e.passedPath) } if (tabStyle === 'vehicle') { marker.setAngle(pointsData[e.index + 1].direction) //手动设置方向 } passedPolyline.setPath(passedPath);//聚焦 setCenterDebounce(map, e) callBack('moving', e) } marker.on('click', function (e) { if (resetIdx) { e.resetIdx = resetIdx } callBack('click', e) }) map.setFitView(marker,false,[60,60,160,60],10); // 开始 startAnimation = function startAnimation() { let resetPoints; if (resetIdx) { //拖拽 resetPoints = points.slice(resetIdx, points.length) if (resetPoints.length < 2) return; //moveAlong必须两点 } marker.moveAlong(resetPoints || points, { // 每一段的时长 duration: duration || 500,//可根据实际采集时间间隔设置 // JSAPI2.0 是否延道路自动设置角度在 moveAlong 里设置 autoRotation: false, //设置后setAngle无效BUG }); }; // 销毁事件 const pauseAnimation = function () { marker.pauseMove(); }; const resumeAnimation = function () { marker.resumeMove(); }; const stopAnimation = function () { marker.stopMove(); }; const moveTo = function ({ lnglat, angle, index }) { stopAnimation() resetIdx = index marker.setPosition(lnglat) // console.log('设置方向', angle) if (tabStyle === 'vehicle') { marker.setAngle(angle) } passedPolyline.setPath(points.slice(0, index + 1)); callBack('moveTo', { lnglat, angle, index }) // marker.moveTo(lnglat) //卡顿BUG } const resetMoveAlong = function () { startAnimation() } // 显示速度 let polylineArr = [] const showSpeed = function () { for (var i = 0; i < points.length - 1; i++) { let itempolyline = new AMap.Polyline({ path: [points[i], points[i + 1]], showDir: true, strokeColor: speedColor(pointsData[i].speed), strokeOpacity: 1, zIndex: 11, strokeWeight: 6,// 线宽 map: map }); polylineArr.push(itempolyline) } function speedColor(e) { //速度颜色 let speed = Number(e) let itemColor = '#16B92A' if (speed > 60 && speed <= 80) { itemColor = '#0000FE' } else if (speed > 80 && speed <= 100) { itemColor = '#F98202' } else if (speed > 100) { itemColor = '#FE0100' } return itemColor } } removeShowSpeed = () => { for (var i = 0; i < polylineArr.length; i++) { polylineArr[i].setMap(null); // 从地图上移除标记点 } polylineArr = []; // 清空存储标记点的数组 } return { startAnimation, pauseAnimation, resumeAnimation, stopAnimation, moveTo, resetMoveAlong, showSpeed, //显示速度 removeShowSpeed //关闭速度 } } /**创建一条展示路线 */ let PolylineShow,lineShoworiginMarker,lineShowdestinationMarker; export function createPolylineShow(map, data) { if (PolylineShow) { PolylineShow.setMap(null); PolylineShow = null; } if (lineShoworiginMarker) { lineShoworiginMarker.setMap(null); lineShoworiginMarker = null; } if (lineShowdestinationMarker) { lineShowdestinationMarker.setMap(null); lineShowdestinationMarker = null; } let { points } = data let pointsArr = points.map(e => { return [Number(e.lng02), Number(e.lat02)] }) PolylineShow = new AMap.Polyline({ map: map, path: pointsArr, strokeStyle: "solid", strokeColor: "#027AFF", //线颜色 strokeWeight: 6, //线宽 }); //创建起点终点图标显示 let originicons = new AMap.Icon({ image: origin, // 图标的图片地址 size: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 imageSize: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 }) lineShoworiginMarker = new AMap.Marker({ map: map, position: pointsArr[0], //points[0], icon: originicons, zIndex: 16, offset: new AMap.Pixel(-13, -26), }); let destinationicons = new AMap.Icon({ image: destination, // 图标的图片地址 size: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 imageSize: new AMap.Size(28, 28), // 设置图标的大小,这里是宽度和高度均为48像素 }) lineShowdestinationMarker = new AMap.Marker({ map: map, position: pointsArr[pointsArr.length - 1], //points[0], icon: destinationicons, zIndex: 16, offset: new AMap.Pixel(-13, -26), }); }