123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- 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 = `<img style="width: 28px;" src="${context.data[0].item.img}" />`;
- var content = `
- <div style="position: relative;">
- <img src="${context.data[0].item.img}"
- style="width: 28px; transform:rotate(${context.data[0].item.direction}deg)"/></br>
- <div style="
- border:solid 1px #00a0e9;
- background-color:#ffffff;
- position: absolute;
- padding: 2px;
- white-space: nowrap;
- left: 50%;
- top: 100%;
- font-size: 12px;
- transform: translate(-50%,0%);
- "
-
- >
- ${context.data[0].item.label}
- </div>
- </div>
- `;
- 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),
- });
- }
|