import * as mars3d from "@/static/lib/mars3d/mars3d.js" import * as Cesium from "@/static/lib/Cesium/Cesium.js" import * as turf from '@turf/turf' import getMapJson from "@/utils/mapjson"; let refId let maps, smallMap let graphicLayer let uav //飞行器 let position let lineToGroundLayer let lineGraphic //连接地面的线 let wayPointList = [] // 航点数组 let waylinePositions = [] //需要连线的坐标111 let line //航线 let groundLineList = [] let polygon, graphic let isEdit = false let isIngraphic = false let targetPoint = null let targetHeight = null let isleft = false let boundgraphic = null let workLayer let clockTimer = null function getActionParam(type, params) { // console.log(type, params,4444) let actionType = { orientedShoot: { type: 'orientedShoot', name: '定向拍照', actionTriggerType: 'reachPoint', svg: 'takePhoto', actionUUID: params['wpml:actionUUID'], fileType: params['wpml:payloadLensIndex'] == 'visable,ir' ? 3 : params['wpml:payloadLensIndex'] == 'visable' ? 1 : 2 }, startRecord: { type: 'startRecord', name: '开始录像', actionTriggerType: 'reachPoint', svg: 'startRecord', actionUUID: params['wpml:actionUUID'], fileType: params['wpml:payloadLensIndex'] == 'visable,ir' ? 3 : params['wpml:payloadLensIndex'] == 'visable' ? 1 : 2 }, stopRecord: { type: 'stopRecord', name: '停止录像', actionTriggerType: 'reachPoint', svg: 'stopRecord', actionUUID: params['wpml:actionUUID'] }, hover: { type: 'hover', name: '悬停', actionTriggerType: 'reachPoint', svg: 'hover', time: type == 'hover' ? params['wpml:hoverTime'] : '', actionUUID: params['wpml:actionUUID'] }, rotateYaw: { type: 'rotateYaw', name: '飞行器偏航角', actionTriggerType: 'reachPoint', svg: 'rotateYaw', uavRotate: type == 'rotateYaw' ? params['wpml:aircraftHeading'] : '', actionUUID: params['wpml:actionUUID'] }, gimbalRotate: { type: 'gimbalRotate', name: '云台俯仰角', actionTriggerType: 'reachPoint', svg: 'gimbalRotate', gimbalRotate: type == 'gimbalRotate' ? params['wpml:gimbalPitchRotateAngle'] : '', actionUUID: params['wpml:actionUUID'] }, zoom: { type: 'gimbalRotate', name: '变焦', actionTriggerType: 'zoom', svg: 'gimbalRotate', actionUUID: params['wpml:actionUUID'] }, takePhoto: { type: 'gimbalRotate', name: '变焦', actionTriggerType: 'zoom', svg: 'gimbalRotate', actionUUID: params['wpml:actionUUID'] }, panoShot: { type: 'panoShot', name: '全景拍照', actionTriggerType: 'panoShot', svg: 'panoShot', actionUUID: params['wpml:actionUUID'] }, ai: { type: 'ai', name: 'ai', actionTriggerType: 'ai', svg: 'ai', actionUUID: params['wpml:actionUUID'] }, } return actionType[type] } export function initLineMap() { maps = new mars3d.Map("wayline-main-map", getMapJson()); workLayer = new mars3d.layer.GraphicLayer() graphicLayer = new mars3d.layer.GraphicLayer() lineToGroundLayer = new mars3d.layer.GraphicLayer() maps.addLayer(graphicLayer) maps.addLayer(lineToGroundLayer) maps.addLayer(workLayer) // addWmts(token) return maps } export function clearAll() { maps ? maps.graphicLayer.clear() : '' graphicLayer = null } export function closeMap() { waylineStore.distance = null waylineStore.wayPointList = [] waylineStore.wayPointNum = 0 waylineStore.workTime = '' waylineStore.qinxie_result = null //重置倾斜摄影总数据 maps ? maps.graphicLayer.clear() : '' if (waylineStore.currentEditWayline && waylineStore.currentEditWayline.wayLineId) { waylineStore.currentEditWayline.wayLineId = null; } waylineStore.polygonList = [] graphicLayer = null waylinePositions = [] groundLineList = [] uav = null lineGraphic = null clearInterval(clockTimer) if (maps) { maps.destroy() maps = null lineToGroundLayer = null } if (smallMap) { smallMap.destroy() smallMap = null } } export function initSmallMap(data) { smallMap = new mars3d.Map("view-map", setSmallMapScene()); if (data) { smallMap.setCameraView(data) } window.smallMap = smallMap // addWmts(token) } export function flyToPoint({ lng, lat, alt }) { smallMap.flyToPoint(new mars3d.LngLatPoint(lng, lat, alt), { radius: 2000, heading: 12, alt: 936, pitch: -32.8 }); } export function changeSmallView(data) { smallMap.setCameraView(data) } export function setSmallMapScene() { let json = { scene: { center: { lat: 27.62, lng: 111.59, alt: 1336414, heading: 0, pitch: -90 }, fxaa: true, // 不开启抗锯齿,可视域会闪烁 globe: { depthTestAgainstTerrain: true // 不加无法投射到地形上 }, contextOptions: { webgl: { preserveDrawingBuffer: true // 截图是黑色时,需要将该项设置为true } }, requestRenderMode: true, cameraController: { zoomFactor: 2, // 相机缩放速度的乘数 } }, control: { contextmenu: { hasDefault: false } // 右键菜单 }, terrain: { url: "//data.mars3d.cn/terrain", show: true, }, basemaps: [{ name: '天地图卫星', icon: 'img/basemaps/tdt_img.jpg', type: 'tdt', layer: 'img_d', key: ['938106e971ecf05ce7355a3af2a58099'], show: true }, { type: "gaode", layer: "img_z", show: true, zIndex: 12 } ], } return json } // 设置起飞点 export function addTakeoffPoint() { maps.setSceneOptions({ center: { lat: waylineStore.center.lat, lng: waylineStore.center.lng, alt: 2000, heading: 12, pitch: -85 } }) const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(waylineStore.center.lng, waylineStore.center.lat, waylineStore.center.alt), style: { image: "/assets/wayline/airport.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, width: 60, height: 60, clampToGround: true, visibleDepth: false, scaleByDistance: false, scale: 0.8, zIndex: 200, } }) graphicLayer.addGraphic(graphic) waylinePositions.push(graphic) //记录起飞点 waylineStore.takeoffPoint = graphic let takeoffPoint = mars3d.LngLatPoint.fromCartesian( waylineStore.takeoffPoint._position_draw ? waylineStore.takeoffPoint._position_draw : waylineStore.takeoffPoint._position ); waylineStore.takeoffPointHeight = takeoffPoint._alt addUAV(graphic._position, ((uav) => { // // 罗盘旋转 uav.on(mars3d.EventType.updateStyle, e => { waylineStore.heading = e.style.heading }); })) } // 这里是添加面状航线 export function addPolygonWayline() { maps.setSceneOptions({ center: { lat: waylineStore.center.lat, lng: waylineStore.center.lng, alt: 2000, heading: 12, pitch: -85 } }) const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(waylineStore.center.lng, waylineStore.center.lat, waylineStore.center.alt), style: { image: "/assets/wayline/airport.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, width: 60, height: 60, clampToGround: true, visibleDepth: false, scaleByDistance: false, scale: 0.8, zIndex: 200, } }) graphicLayer.addGraphic(graphic) waylinePositions.push(graphic) //记录起飞点 waylineStore.takeoffPoint = graphic let takeoffPoint = mars3d.LngLatPoint.fromCartesian( waylineStore.takeoffPoint._position_draw ? waylineStore.takeoffPoint._position_draw : waylineStore.takeoffPoint._position ); waylineStore.takeoffPointHeight = takeoffPoint._alt // addStartHigeht(takeoffPoint) //编辑面状航线 drawPolygon() } async function drawPolygon() { polygon = maps.graphicLayer.startDraw({ type: "polygon", style: { color: "#4786ef", opacity: 0.5, outline: false, outlineWidth: 3, outlineColor: "#ffffff", clampToGround: true, visibleDepth: false, zIndex: 299, label: { background: true, verticalOrigin: Cesium.VerticalOrigin.TOP, backgroundColor: '#000000', backgroundOpacity: 0.7, backgroundPadding: 10, text: "", font_size: 14, color: "#ffffff", clampToGround: true, visibleDepth: false, } }, }) maps.graphicLayer.on(mars3d.EventType.drawCreated, function (event) { waylineStore.Obliquephoto.pointsArr = event.positions event.positions.forEach(i => { waylineStore.polygonList.push(mars3d.LngLatPoint.fromCartesian(i)) }) if (waylineStore.currentEditWayline.wayLineType == 2) { showPolygonWayline() } else { startEditObliquephotographyline() } }) } function showPolygonWayline() { if (line) { line.remove() } let coordinates = [] waylineStore.polygonList.forEach(i => { let a = `${i._lng},${i._lat},0` coordinates.push(a) }) waylineStore.currentEditWayline.kmzJSON.Document.Folder.Placemark.Polygon.outerBoundaryIs.LinearRing.coordinates = coordinates.join(' ') let takeoffPoint = mars3d.LngLatPoint.fromCartesian( waylineStore.takeoffPoint._position_draw ? waylineStore.takeoffPoint._position_draw : waylineStore.takeoffPoint._position ); waylineStore.currentEditWayline.kmzJSON.Document['wpml:missionConfig']['wpml:takeOffRefPoint'] = takeoffPoint._lat + "," + takeoffPoint._lng + "," + takeoffPoint._alt; waylineStore.currentEditWayline.kmzJSON.Document.Folder.Placemark['wpml:ellipsoidHeight'] = 80 waylineStore.currentEditWayline.kmzJSON.Document.Folder.Placemark['wpml:height'] = 80 let RESULT_MAP = generate2dwayline(waylineStore.currentEditWayline, "myMap") waylineStore.polygonResult = RESULT_MAP line = new mars3d.graphic.PolylinePrimitive({ // asynchronous: false, positions: RESULT_MAP.PATH_ON_MAP, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); } lineToGroundLayer.addGraphic(line); } export function setPolygonWayline() { if (line) { line.remove() } let RESULT_MAP = generate2dwayline(waylineStore.currentEditWayline, "myMap") waylineStore.polygonResult = RESULT_MAP line = new mars3d.graphic.PolylinePrimitive({ // asynchronous: false, positions: RESULT_MAP.PATH_ON_MAP, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); } lineToGroundLayer.addGraphic(line); } function addStartHigeht(takeoffPoint) { const graphic = new mars3d.graphic.LabelEntity({ position: new mars3d.LngLatPoint(takeoffPoint._lng, takeoffPoint._lat, takeoffPoint.alt), style: { text: "高度" + takeoffPoint.alt, font_size: 46, // 字号放大一倍 scale: 0.5, // scale传0.5 font_family: "楷体", color: "#00ffff", outline: true, outlineColor: "#000000", outlineWidth: 2, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, visibleDepth: false }, }) graphicLayer.addGraphic(graphic) } // 添加飞行器 function addUAV(position, callback) { let copy = waylineStore.center let point = new mars3d.LngLatPoint(copy.lng, copy.lat, copy.alt); let point2 = new mars3d.LngLatPoint(copy.lng, copy.lat, 0); let height = 0 mars3d.PointUtil.getSurfaceHeight(maps.scene, point).then(result => { height = result.height_original.toFixed(2) - result.height.toFixed(2); position = position let a = point2.toCartesian() //规定要初始默认 离地高度为120 则需要换算 120减去初始的离地高 这是差值 waylineStore.center.alt 是机巢初始的经纬度高 则初始经纬度高加上差值 uav = new mars3d.graphic.ModelEntity({ name: "警车", position: mars3d.PointUtil.addPositionsHeight(a, 120 - height + waylineStore.center.alt ), style: { url: "/assets/wayline/UAV.gltf", scale: 0.02, minimumPixelSize: 48, // minimumPixelSize: 1, heading: 0, pitch: 0, roll: 0, zIndex: 999, visibleDepth: false, }, }) graphicLayer.addGraphic(uav) waylineStore.UAVOptions = uav.options.position uav.flyTo({ radius: 2000, heading: 12, alt: 936, pitch: -32.8 }); callback(uav) } ); } export function updatePosition(keys) { if (refId) { window.cancelAnimationFrame(refId); } refId = window.requestAnimationFrame(() => { if (keys && keys.length > 0 && uav) { if (keys.indexOf('q') !== -1 || keys.indexOf('Q') !== -1) { let heading = uav.options.style.heading - 0.4; uav.setStyle({ heading: heading }) } if (keys.indexOf('e') !== -1 || keys.indexOf('E') !== -1) { let heading = uav.options.style.heading + 0.4; uav.setStyle({ heading: heading }) } if (keys.indexOf('w') !== -1 || keys.indexOf('W') !== -1) { let newPosition = mars3d.PointUtil.getPositionByDirectionAndLen(uav._position, uav.options.style.heading - 90, 1); uav.setOptions({ position: newPosition }) position = newPosition; } if (keys.indexOf('s') !== -1 || keys.indexOf('S') !== -1) { let newPosition = mars3d.PointUtil.getPositionByDirectionAndLen(uav._position, uav.options.style.heading + 90, 1); uav.setOptions({ position: newPosition }) position = newPosition; } if (keys.indexOf('a') !== -1 || keys.indexOf('A') !== -1) { let newPosition = mars3d.PointUtil.getPositionByDirectionAndLen(uav._position, uav.options.style.heading + 180, 1); uav.setOptions({ position: newPosition }) position = newPosition; } if (keys.indexOf('d') !== -1 || keys.indexOf('D') !== -1) { let newPosition = mars3d.PointUtil.getPositionByDirectionAndLen(uav._position, uav.options.style.heading, 1); uav.setOptions({ position: newPosition }) position = newPosition; } if (keys.indexOf('c') !== -1 || keys.indexOf('C') !== -1) { let newPosition = mars3d.PointUtil.addPositionsHeight(uav._position, 1); mars3d.PointUtil.getSurfaceHeight(maps.scene, mars3d.LngLatPoint.fromCartesian(newPosition)).then(result => { if (result.height_original.toFixed(2) - result.height.toFixed(2) > 150) { ElMessage({ message: '已超出飞行高度', type: 'warning', plain: true, }) return } else { uav.setOptions({ position: newPosition }) position = newPosition; } }) } if (keys.indexOf('z') !== -1 || keys.indexOf('Z') !== -1) { let newPosition = mars3d.PointUtil.addPositionsHeight(uav._position, -1); mars3d.PointUtil.getSurfaceHeight(maps.scene, mars3d.LngLatPoint.fromCartesian(newPosition)).then(result => { }) uav.setOptions({ position: newPosition }) position = newPosition; } updatePosition(keys); updateToGroundLine() waylineStore.UAVOptions = uav.options.position } else { window.cancelAnimationFrame(refId); } }); } /** * @description 更新到地面的连接线 * */ function updateToGroundLine() { if (!lineGraphic) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); // let lonlatheight = GISUtils.cartesian3ToLonLatAlt(this.viewer, this.position); let p = mars3d.LngLatPoint.fromCartesian(uav != undefined ? uav._position : []) let a = [p._lng, p._lat, 0] lineGraphic = new mars3d.graphic.PolylinePrimitive({ asynchronous: false, positions: [ a, mars3d.PointUtil.addPositionsHeight( uav != undefined ? uav._position : [], ) ], style: { width: 1, color: '#FFFF00', zIndex: 1, materialType: mars3d.MaterialType.PolylineDash, // 虚线 materialOptions: { color: '#FFFF00', dashLength: 6 } } }); lineToGroundLayer.addGraphic(lineGraphic); } else { let newPosition = mars3d.LngLatPoint.fromCartesian(uav != undefined ? uav._position : []); let a = [newPosition._lng, newPosition._lat, 0] lineGraphic.setOptions({ positions: [a, mars3d.PointUtil.addPositionsHeight( uav ? uav._position : [], )] }) } } //鼠标双击添加航点 export function dbClickAddWaypoint(data) { if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); } let point = mars3d.LngLatPoint.fromCartesian(data) let position = [point._lng, point._lat, uav._point._alt] const wayPoint = new mars3d.graphic.BillboardEntity({ position: position, asynchronous: false, style: { image: '/assets/wayline/waypoint-active.png', // image: "img/wayline/dock.png", // image: dockImg, scale: 0.6, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER, pixelOffset: [0, -16], highlight: { image: '/assets/wayline/waypoint-active.png' }, // 新建航点字体设置 label: { text: waylineStore.wayPointList.length > 0 ? waylineStore.wayPointList.length + 1 : 1, font_family: '微软雅黑', font_size: 16, color: '#FFFFFF', visibleDepth: false, pixelOffset: [0, -22] }, zIndex: 201 }, attr: [] }) // 这块是判断航点是否与当前航线重合 let checkLine = [] let heightArr = [] let ischeck = false; let isHeightHave = false let isPointOnCurPoints = false let points = [wayPoint._point._lng, wayPoint._point._lat] waylineStore.wayPointList.forEach(i => { let point = [i._point._lng, i._point._lat] checkLine.push(point) heightArr.push(i._point._alt) if (Math.abs(point[0] - points[0]) < 0.00001) { ischeck = true } }) if (ischeck) { ElMessage({ message: '飞机处于航点上,无法新增航点', type: 'warning', plain: true, }) return } heightArr.forEach(i => { if (i == wayPoint._point._alt) { isHeightHave = true } }) if (waylineStore.wayPointList.length >= 2) { isPointOnCurPoints = turf.booleanPointOnLine(turf.point(points), turf.lineString(checkLine)) } else if (waylineStore.wayPointList.length == 1) { let point1 = turf.point([waylineStore.wayPointList[0]._point._lng, waylineStore.wayPointList[0]._point._lat]) let point2 = turf.point(points) isPointOnCurPoints = turf.booleanEqual(point1, point2) } if (isPointOnCurPoints && isHeightHave) { ElMessage({ message: '飞机处于航点上,无法新增航点', type: 'warning', plain: true, }) return } // wayPointList.push(wayPoint) waylineStore.wayPointList.push(wayPoint) waylineStore.wayPoint = wayPoint waylineStore.wayPointNum = waylineStore.wayPointList.length graphicLayer.addGraphic(wayPoint) // waylinePositions.push(uav._position) updataWayPointStyle() lineWaypoint() wayPoint.on(mars3d.EventType.mouseOver, function (e) { isIngraphic = true targetPoint = e.graphic targetHeight = e.graphic._point._alt }) wayPoint.on(mars3d.EventType.mouseOut, function (e) { isIngraphic = false targetPoint = null waylineStore.wayPoint = e.graphic chooseWayPoint(e.id) }) } //添加航点 export function addWaypoint() { if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); } let point = mars3d.LngLatPoint.fromCartesian(uav._position) let position = [point._lng, point._lat, point._alt] const wayPoint = new mars3d.graphic.BillboardEntity({ position: position, asynchronous: false, style: { image: '/assets/wayline/waypoint-active.png', // image: "img/wayline/dock.png", // image: dockImg, scale: 0.6, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER, visibleDepth: true, pixelOffset: [0, -16], highlight: { image: '/assets/wayline/waypoint-active.png' }, // 新建航点字体设置 label: { text: waylineStore.wayPointList.length > 0 ? waylineStore.wayPointList.length + 1 : 1, font_family: '微软雅黑', font_size: 20, color: '#FFFFFF', visibleDepth: false, pixelOffset: [0, -22] }, zIndex: 201 }, attr: [] }) wayPoint.on(mars3d.EventType.click, (e) => { waylineStore.wayPoint = e.graphic chooseWayPoint(e.id) }) // wayPointList.push(wayPoint) // 这块是判断航点是否与当前航线重合 let checkLine = [] let heightArr = [] waylineStore.wayPointList.forEach(i => { let point = [i._point._lng, i._point._lat] checkLine.push(point) heightArr.push(i._point._alt) }) let points = [wayPoint._point._lng, wayPoint._point._lat] let isPointOnCurPoints = false; let isHeightHave = false heightArr.forEach(i => { if (i == wayPoint._point._alt) { isHeightHave = true } }) if (waylineStore.wayPointList.length >= 2) { isPointOnCurPoints = turf.booleanPointOnLine(turf.point(points), turf.lineString(checkLine)) } else if (waylineStore.wayPointList.length == 1) { let point1 = turf.point([waylineStore.wayPointList[0]._point._lng, waylineStore.wayPointList[0]._point._lat]) let point2 = turf.point(points) isPointOnCurPoints = turf.booleanEqual(point1, point2) } if (isPointOnCurPoints && isHeightHave) { ElMessage({ message: '飞机处于航点上,无法新增航点', type: 'warning', plain: true, }) return } waylineStore.wayPointList.push(wayPoint) waylineStore.wayPoint = wayPoint waylineStore.wayPointNum = waylineStore.wayPointList.length graphicLayer.addGraphic(wayPoint) updataWayPointStyle() lineWaypoint() wayPoint.on(mars3d.EventType.mouseOver, function (e) { isIngraphic = true targetPoint = e.graphic targetHeight = e.graphic._point._alt }) wayPoint.on(mars3d.EventType.mouseOut, function (e) { isIngraphic = false targetPoint = null waylineStore.wayPoint = e.graphic chooseWayPoint(e.id) }) } export function deleteWayPoint(id) { waylineStore.wayPointNum-- waylineStore.wayPointList.forEach((i, index) => { if (i.id == id) { graphicLayer.getGraphicById(id).remove() waylineStore.wayPointList.splice(index, 1); lineWaypoint() updataWayPointStyle() } }) // waylineStore.wayPointNum = waylineStore.wayPointList.length 11 } export function chooseWayPoint(id) { waylineStore.wayPointList.forEach((i, index) => { if (i.id == id) { i.setStyle({ image: '/assets/wayline/waypoint-active.png' }) eventBus.emit('changeIndex', index) } else { i.setStyle({ image: '/assets/wayline/waypoint.png' }) } }) } // 更新航点的状态 function updataWayPointStyle() { waylineStore.wayPointList.forEach((i, index) => { if (index < waylineStore.wayPointList.length - 1) { i.setStyle({ image: '/assets/wayline/waypoint.png', label: { text: index + 1 } }) } else { i.setStyle({ image: '/assets/wayline/waypoint-active.png', label: { text: index + 1 } }) } }) } // 把航点给连接起来 1航线!! function lineWaypoint() { if (line) { line.remove() } if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); } let positions = [] let waylineList = [...waylinePositions, ...waylineStore.wayPointList] waylineList.forEach(i => { let newPosition = mars3d.LngLatPoint.fromCartesian(i.position); let a = [newPosition._lng, newPosition._lat, newPosition._alt] positions.push(a) }) line = new mars3d.graphic.PolylinePrimitive({ asynchronous: false, positions: positions, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, visibleDepth: false, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); waylineStore.distance = mars3d.MeasureUtil.formatDistance(line.distance) // 计算首尾距离 添加总航程 let start = positions[0] let end = positions[positions.length - 1] start[2] = 66 end[2] = 66 let backLinePosition = [start, end] let backLine backLine = new mars3d.graphic.PolylinePrimitive({ asynchronous: false, positions: backLinePosition, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); // 因为是直线返回 不计算高度问题 直接把首尾高度设为一致 随意值 只要一致就行 waylineStore.backDistance = mars3d.MeasureUtil.formatDistance(backLine.distance) let time; let distance; let backDistance; if (waylineStore.currentEditWayline.wayLineType == 1) { distance = waylineStore.distance; backDistance = waylineStore.backDistance; if (distance.includes("米")) { distance = Number(waylineStore.distance.split("米")[0]); } else if (distance.includes("公里")) { distance = Number(waylineStore.distance.split("公里")[0]) * 1000; } if (backDistance.includes("米")) { backDistance = Number(waylineStore.backDistance.split("米")[0]); } else if (backDistance.includes("公里")) { backDistance = Number(waylineStore.backDistance.split("公里")[0]) * 1000; } time = Math.ceil((distance + backDistance) / waylineStore.speed); waylineStore.workTime = time; } else if (waylineStore.currentEditWayline.wayLineType == 2) { distance = Number(waylineStore.polygonResult.COMMON_INFO.waylineLength); waylineStore.speed = waylineStore.polygonResult.KMZ_INFO.wayline.Document.Folder[ "wpml:autoFlightSpeed" ]; time = Math.ceil(distance / waylineStore.speed); } lineToGroundLayer.addGraphic(line); ToGroundLine() } // 画线 export function drawLine(positions) { // if (line) { // line.remove() // } console.log('lineToGroundLayer', lineToGroundLayer) if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); smallMap.addLayer(lineToGroundLayer); } line = new mars3d.graphic.PolylinePrimitive({ // asynchronous: false, positions: positions, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); lineToGroundLayer.addGraphic(line); return line } // 为每个航点添加连接地面的线 function ToGroundLine() { if (groundLineList.length) { groundLineList.forEach(i => { i.remove() }) } waylineStore.wayPointList.forEach((i, index) => { let middel = JSON.parse(JSON.stringify(i._point)) let p = new mars3d.LngLatPoint(middel._lng, middel._lat, middel._alt) let height = 0 mars3d.PointUtil.getSurfaceHeight(maps.scene, p).then(result => { height = (result.height_original.toFixed(2) - result.height.toFixed(2)).toFixed(2) let a = [p._lng, p._lat, 0] let constpoSition if (i.position.z) { constpoSition = i.position } else { constpoSition = i._position_draw } let groundLine = new mars3d.graphic.PolylinePrimitive({ asynchronous: false, positions: [ a, mars3d.PointUtil.addPositionsHeight( constpoSition, ) ], style: { width: 1, color: '#FFFFFF', zIndex: 1, materialType: mars3d.MaterialType.PolylineDash, // 虚线111 materialOptions: { color: '#FFFFFF', dashLength: 6 }, label: { text: `高度:${height}`, font_size: 18, color: "#ffffff", distanceDisplayCondition: true, distanceDisplayCondition_far: 500000, distanceDisplayCondition_near: 0, clampToGround: true, visibleDepth: false, } }, }); lineToGroundLayer.addGraphic(groundLine); groundLineList.push(groundLine) }) }) } export function showTheWayline() { let wayline = waylineStore.currentEditWayline.kmzJSON.Document // 先获取 起飞点的信息 let takeoff = wayline['wpml:missionConfig']['wpml:takeOffRefPoint'].split(',') setTakeOffPoint(takeoff, wayline.Folder.Placemark) // 2. 获取航点的信息 setWaylinePoint(wayline.Folder.Placemark, takeoff) } function setTakeOffPoint(takeoff, mark) { const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(takeoff[1], takeoff[0], takeoff[2]), style: { image: "/assets/wayline/airport.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, clampToGround: true, visibleDepth: true, scaleByDistance: false, zIndex: 200, highlight: { image: "/assets/wayline/airport.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER }, } }) graphicLayer.addGraphic(graphic) // waylinePositions.push(graphic) waylinePositions.push(graphic) // 需要的话再说1 反显的时候让飞行器和最后一个航点处于同一个位置 // let lnglat= mark[mark.length-1].Point.coordinates.split(',') // let navPositin = [Number(lnglat[0]), Number(lnglat[1]), mark[mark.length-1]['wpml:executeHeight']] //记录起飞点 waylineStore.takeoffPoint = graphic waylineStore.takeoffPointHeight = waylineStore.takeoffPoint._point._alt addUAV(graphic._position, ((uav) => { // // 罗盘旋转 uav.on(mars3d.EventType.updateStyle, e => { waylineStore.heading = e.style.heading }); })) graphic.flyTo({ radius: 2000, heading: 12, alt: 936, pitch: -72.8 }); } // 设置 航点 function setWaylinePoint(arr, takeoff) { if (!isArray(arr)) { let ponitList = [] ponitList.push(arr) arr = ponitList } lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); waylineStore.wayPointList = [] arr.forEach(i => { let alt let lnglat = i.Point.coordinates.split(',') if (i['wpml:ellipsoidHeight']) { alt = i['wpml:ellipsoidHeight'] + Number(takeoff[2]) } else { alt = i['wpml:executeHeight'] + + Number(takeoff[2]) } let position = [Number(lnglat[0]), Number(lnglat[1]), alt] let index = i['wpml:index'] + 1 let wayPoint = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(position[0], position[1], position[2]), style: { image: '/assets/wayline/waypoint.png', // image: "img/wayline/dock.png", // image: dockImg, scale: 0.6, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER, clampToGround: false, visibleDepth: true, scaleByDistance: false, pixelOffset: [0, -16], highlight: { image: '/assets/wayline/waypoint-active.png' }, // 新建航点字体设置 label: { // text: '航点' + (this_.waylinePointLayer.length === 0 ? '1' : this_.waylinePointLayer.length + 1) + '高度:' + (Math.floor(position.altitude)), // text: '航点' + (this_.waylinePointLayer.length === 0 ? '1' : this_.waylinePointLayer.length + 1), text: index, font_family: '微软雅黑', font_size: 16, color: '#FFFFFF', visibleDepth: false, pixelOffset: [0, -22] }, zIndex: 201 }, }) wayPoint.on(mars3d.EventType.click, (e) => { waylineStore.wayPoint = e.graphic chooseWayPoint(e.id) }) wayPoint.options.attr.actionList = [] if (i['wpml:actionGroup']) { if (i['wpml:actionGroup']['wpml:action'] && !i['wpml:actionGroup']['wpml:action'].length) { wayPoint.options.attr.actionList.push(getActionParam(i['wpml:actionGroup']['wpml:action']['wpml:actionActuatorFunc'], i['wpml:actionGroup']['wpml:action']['wpml:actionActuatorFuncParam'])) } else if (i['wpml:actionGroup']['wpml:action'].length) { //多个动作 i['wpml:actionGroup']['wpml:action'].forEach(j => { wayPoint.options.attr.actionList.push(getActionParam(j['wpml:actionActuatorFunc'], j['wpml:actionActuatorFuncParam'])) }) } } waylineStore.wayPointList.push(wayPoint) waylineStore.wayPoint = wayPoint waylineStore.wayPointNum = waylineStore.wayPointList.length graphicLayer.addGraphic(wayPoint) updataWayPointStyle() wayPoint.on(mars3d.EventType.mouseOver, function (e) { isIngraphic = true targetPoint = e.graphic targetHeight = e.graphic._point._alt }) wayPoint.on(mars3d.EventType.mouseOut, function (e) { isIngraphic = false targetPoint = null waylineStore.wayPoint = e.graphic chooseWayPoint(e.id) }) }) lineWaypoint() } //反显面状航线 export function reverseShowPolygonWayline() { let wayline = waylineStore.currentEditWayline.kmzJSON.Document // 先获取 起飞点的信息 let takeoff = wayline['wpml:missionConfig']['wpml:takeOffRefPoint'].split(',') setTakeOffPointPolygon(takeoff) if (waylineStore.currentEditWayline.wayLineType == 2) { showRectangle(wayline) } else { showObliquePolygon(wayline) } } //反显倾斜摄影 function showObliquePolygon(wayline) { let point = wayline.Folder.Placemark.Polygon.outerBoundaryIs.LinearRing.coordinates let positions = [] let xyzArr = [] point.split(' ').forEach(i => { let xyz = Cesium.Cartesian3.fromDegrees(i.split(',')[0], i.split(',')[1], i.split(',')[2]) positions.push([i.split(',')[0], i.split(',')[1], i.split(',')[2]]) xyzArr.push(xyz) }) const graphic = new mars3d.graphic.PolygonEntity({ positions: positions, style: { color: "#3388ff", opacity: 0.5, outline: false, clampToGround: true, visibleDepth: true, }, }) // let xyzString = wayline.Folder.Placemark['wpml:xyz'] // let xyzArr = [] // xyzString.split(' ').forEach(i => { // let Cartesian = new Cesium.Cartesian3(Number(i.split(',')[0]) , Number(i.split(',')[1]), Number(i.split(',')[2])); // xyzArr.push(Cartesian) // }) waylineStore.Obliquephoto.pointsArr = xyzArr waylineStore.Obliquephoto.height = wayline.Folder.Placemark['wpml:height'] waylineStore.Obliquephoto.lateralOverlapRate = wayline.Folder.Placemark['wpml:overlap']['wpml:orthoCameraOverlapW'] waylineStore.Obliquephoto.TiltLateralOverlapRate = wayline.Folder.Placemark['wpml:overlap']['wpml:inclinedCameraOverlapW'] waylineStore.Obliquephoto.mainCourseAngle = wayline.Folder.Placemark['wpml:direction'] maps.graphicLayer.addGraphic(graphic) startEditObliquephotographyline() } function setTakeOffPointPolygon(takeoff) { const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(takeoff[1], takeoff[0], takeoff[2]), style: { image: "/assets/wayline/takeoff-active.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, clampToGround: true, visibleDepth: true, scaleByDistance: false, zIndex: 200, highlight: { image: "/assets/wayline/takeoff-active.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER }, } }) graphicLayer.addGraphic(graphic) // waylinePositions.push(graphic) waylineStore.takeoffPoint = graphic waylinePositions.push(graphic) let takeoffPoint = mars3d.LngLatPoint.fromCartesian( waylineStore.takeoffPoint._position_draw ? waylineStore.takeoffPoint._position_draw : waylineStore.takeoffPoint._position ); waylineStore.Obliquephoto.startPoint = { lng: takeoffPoint._lng, lat: takeoffPoint._lat, height: takeoffPoint._alt } graphic.flyTo({ radius: 2000, heading: 12, alt: 936, pitch: -32.8 }); } function showRectangle(wayline) { let point = wayline.Folder.Placemark.Polygon.outerBoundaryIs.LinearRing.coordinates let positions = [] point.split(' ').forEach(i => { positions.push([i.split(',')[0], i.split(',')[1], i.split(',')[2]]) }) const graphic = new mars3d.graphic.PolygonEntity({ positions: positions, style: { color: "#3388ff", opacity: 0.5, outline: true, clampToGround: true, visibleDepth: true, }, }) maps.graphicLayer.addGraphic(graphic) bindLayerContextMenu() let RESULT_MAP = generate2dwayline(waylineStore.currentEditWayline, "myMap") waylineStore.distance = Number(RESULT_MAP.COMMON_INFO.waylineLength) waylineStore.speed = RESULT_MAP.KMZ_INFO.wayline.Document.Folder["wpml:autoFlightSpeed"] waylineStore.workTime = Math.ceil(waylineStore.distance / waylineStore.speed) line = new mars3d.graphic.PolylinePrimitive({ // asynchronous: false, positions: RESULT_MAP.PATH_ON_MAP, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, materialOptions: { // color: "#0BD7901", image: '/img/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); if (!lineToGroundLayer) { lineToGroundLayer = new mars3d.layer.GraphicLayer(); maps.addLayer(lineToGroundLayer); } lineToGroundLayer.addGraphic(line); } export function clearWayline() { waylineStore.wayPointList = [] waylineStore.wayPointNum = 0 graphicLayer ? graphicLayer.remove() : '' lineToGroundLayer ? lineToGroundLayer.remove() : '' graphicLayer = null waylinePositions = [] groundLineList = [] uav = null lineToGroundLayer = null lineGraphic.remove() } // 绑定矢量对象编辑 export function bindLayerContextMenu() { maps.graphicLayer.bindContextMenu([{ text: "开始编辑对象", icon: "fa fa-edit", show: function (e) { const graphic = e.graphic if (!graphic || !graphic.hasEdit) { return false } return !graphic.isEditing }, callback: (e) => { const graphic = e.graphic if (!graphic) { return false } if (graphic) { maps.graphicLayer.startEditing(graphic) } } }, { text: "停止编辑对象", icon: "fa fa-edit", show: function (e) { const graphic = e.graphic if (!graphic || !graphic.hasEdit) { return false } return graphic.isEditing }, callback: (e) => { //编辑结束后重新保存一下 const graphic = e.graphic if (!graphic) { return false } if (graphic) { graphic.stopEditing() } graphic._positions_show.forEach(i => { waylineStore.polygonList.push(mars3d.LngLatPoint.fromCartesian(i)) }) waylineStore.Obliquephoto.pointsArr = graphic._positions_show if (waylineStore.currentEditWayline.wayLineType == 2) { showPolygonWayline() } else if (waylineStore.currentEditWayline.wayLineType == 3) { startEditObliquephotographyline() } } }, { text: "删除对象", icon: "fa fa-trash-o", show: (event) => { graphic = event.graphic }, callback: (e) => { graphic = e.graphic if (!graphic) { return } const parent = graphic.parent // 右击是编辑点时1 graphicLayer.removeGraphic(graphic) } }, ]) } export function bindwayPointMenu() { graphicLayer.bindContextMenu([{ text: "开始编辑对象", icon: "fa fa-edit", show: function (e) { const graphic = e.graphic if (!graphic || !graphic.hasEdit) { return false } return !graphic.isEditing }, callback: (e) => { const graphic = e.graphic if (!graphic) { return false } if (graphic) { graphicLayer.startEditing(graphic) } } }, ]) } export function goWhere(data) { maps.flyToPoint(new mars3d.LngLatPoint(data.lng, data.lat, data.alt), { radius: 2000, heading: 12, alt: 936, pitch: -32.8 }); } export function changePointHeight(height) { waylineStore.wayPointList.forEach(i => { let point = i._point let newPosition = [point._lng, point._lat, point._alt + height] i.setOptions({ position: newPosition }) lineWaypoint() }) } export function goLocalPosition(data, type) { let radius // type == 1 ? 80000 : type == 2 ? 40000 : type == 3 ? 20000 : 8000, // 距离目标点的距离 switch (type) { case 1: radius = 80000; break; case 2: radius = 40000; break; case 3: radius = 20000; break; case 5: radius = 1036414; break; case 6: radius = 2000; break; default: radius = 8000; } const position = new mars3d.LngLatPoint(data.lng, data.lat, 10) maps.flyToPoint(position, { radius: radius, duration: 4, complete: function (e) { // 飞行完成回调方法 // graphic.openPopup() } }) } export function getWaylineParams(kml) { console.log(kml, 8828) } //倾斜摄影 export function Obliquephotography() { maps.setSceneOptions({ center: { lat: waylineStore.center.lat, lng: waylineStore.center.lng, alt: 2000, heading: 12, pitch: -85 } }) const graphic = new mars3d.graphic.BillboardEntity({ position: new mars3d.LngLatPoint(waylineStore.center.lng, waylineStore.center.lat, waylineStore.center.alt), style: { image: "/assets/wayline/airport.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, width: 60, height: 60, clampToGround: true, visibleDepth: false, scaleByDistance: false, scale: 0.8, zIndex: 200, } }) graphicLayer.addGraphic(graphic) waylinePositions.push(graphic) //记录起飞点 waylineStore.takeoffPoint = graphic let takeoffPoint = mars3d.LngLatPoint.fromCartesian( waylineStore.takeoffPoint._position_draw ? waylineStore.takeoffPoint._position_draw : waylineStore.takeoffPoint._position ); waylineStore.takeoffPointHeight = takeoffPoint._alt waylineStore.Obliquephoto.startPoint = { lng: takeoffPoint._lng, lat: takeoffPoint._lat, height: takeoffPoint._alt } drawPolygon() } //开始编辑倾斜摄影 export function startEditObliquephotographyline() { eventBus.emit('getObliquephotography', waylineStore.Obliquephoto) } //显示倾斜摄影的航线 export function showObliquephotographyline(data) { console.log(data, 5555555) data.target.pointArr.forEach(i => { let a = new Cesium.Cartesian3(i.x, i.y, i.z); i = mars3d.LngLatPoint.fromCartesian(a) }) if (line) { line.remove() } line = new mars3d.graphic.PolylinePrimitive({ // asynchronous: false, positions: data.target.pointArr, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); lineToGroundLayer.addGraphic(line); if (boundgraphic) { boundgraphic.remove() } //倾斜摄影的范围 boundgraphic = new mars3d.graphic.PolygonEntity({ positions: data.target.boundArr, style: { color: "#4786ef", opacity: 0.2, outline: false, clampToGround: true, visibleDepth: true, zIndex: 221 }, }) graphicLayer.addGraphic(boundgraphic) countLineInfo() } function countLineInfo() { let distance = 0 waylineStore.qinxie_result.ALL_pointArr.forEach(i => { let line = new mars3d.graphic.PolylinePrimitive({ asynchronous: false, positions: i.pointArr, style: { width: 5, // color: "#0BD790", materialType: mars3d.MaterialType.LineFlow, visibleDepth: false, materialOptions: { // color: "#0BD790", image: '/assets/wayline/line-interval2.png', repeat: new Cesium.Cartesian2(20, 1), speed: 1 } } }); distance += Number(mars3d.MeasureUtil.formatDistance(line.distance, { unit: 'km' }).split("公里")[0]) }) waylineStore.distance = distance.toFixed(2) + '公里' waylineStore.workTime = distance * 1000 / waylineStore.speed waylineStore.picNum = Math.floor(waylineStore.workTime / 2) } export function addWorkLayer(data) { workLayer.clear() const ENITTY_CLASS = { point: "PointEntity", polygon: "PolygonEntity", polyline: "PolylineEntity", circle: "CircleEntity", }; let params = JSON.parse(data.layerData) params.forEach(i => { let layer = new mars3d.graphic[ENITTY_CLASS[i.json.type]](i.json); workLayer.addGraphic(layer) // maps.addLayer(layer) }) } export function clearWorkLayer() { workLayer.clear() }