【类 型】:feat

【原  因】:完成 查看飞机 历史飞行轨迹  地图组件 显示功能
【过  程】:
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
This commit is contained in:
air 2025-06-16 15:22:57 +08:00
parent e575d42358
commit 8b7a2161ba
2 changed files with 60 additions and 61 deletions

View File

@ -177,6 +177,7 @@ export default {
this.init().then(() => {
//
this.map.on('load', () => {
this.$emit('map-ready') //
/* 更新样式,添加自定义 sprite */
//
@ -355,6 +356,26 @@ export default {
}), 'top-left')
}
},
/**
* @description 通用地图图层和数据源清除方法
* @param {Array} layerIds - 要清除的图层ID数组
* @param {Array} sourceIds - 要清除的数据源ID数组
*/
clearMapElements (layerIds = [], sourceIds = []) {
//
layerIds.forEach(id => {
if (this.map.getLayer(id)) {
this.map.removeLayer(id)
}
})
//
sourceIds.forEach(id => {
if (this.map.getSource(id)) {
this.map.removeSource(id)
}
})
},
/**
* @description: 清除地图上的航线
*/
@ -625,49 +646,6 @@ export default {
this.guidedMarker = null //
}
},
/**
* @description 简单画线飞机轨迹忽略高度仅绘制经纬度路径
* @param {Array} coordinatesArray - 坐标数组每项为 [lng, lat, alt]
*/
drawSimplePath (coordinatesArray) {
const coords2D = coordinatesArray.map(coord => [coord[0], coord[1]])
const geojson = {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: coords2D
}
}
//
if (this.map.getLayer('path')) {
this.map.removeLayer('path')
}
if (this.map.getSource('path')) {
this.map.removeSource('path')
}
// source layer
this.map.addSource('path', {
type: 'geojson',
data: geojson
})
this.map.addLayer({
id: 'path',
type: 'line',
source: 'path',
layout: {
'line-cap': 'round',
'line-join': 'round'
},
paint: {
'line-color': 'blue',
'line-width': 3
}
})
},
/**
* @description: 创建飞机轨迹 ps:原理删除之前的轨迹 重新绘制
* @param {arr} coordinatesArray 飞机经纬高度数组
@ -772,9 +750,10 @@ export default {
* @description: 镜头跳转
* @param {obj} lonLat {lon:lon,lat:lat} 经纬度
*/
goto (lonLat) {
goto (lonLat, zoom = 18) {
this.map.flyTo({
center: lonLat,
zoom: zoom,
speed: 2,
curve: 1,
easing (t) {

View File

@ -13,7 +13,7 @@
<div class="chart-area" v-if="flyDataList.length">
<div v-if="boxShow" id="main" class="chart-container"></div>
<map-box v-else ref="mapbox" />
<map-box v-else ref="mapbox" @map-ready="onMapReady"/>
</div>
<div v-else class="no-data-tip">暂无数据</div>
</div>
@ -90,12 +90,14 @@ export default {
const keyMap = {
飞行时长: (item) => {
if (!item.start_time || !item.end_time) return 0
return (item.end_time - item.start_time) / 60
return Math.round((item.end_time - item.start_time) / 60)
},
飞行距离: (item) => Number(item.distance || 0),
消耗电量: (item) => Number(item.power_used || 0)
}
if (this.radioClass === '飞行轨迹') return []//
this.flyDataList.forEach(item => {
const planeName = item.plane_name
const date = new Date(item.start_time * 1000)
@ -164,16 +166,12 @@ export default {
}
//
if (!this.boxShow && newVal.length) {
this.$nextTick(() => {
this.drawAllPathsOnMap()
})
this.onMapReady()
}
},
boxShow (newVal) {
if (!newVal) { // boxShow false
this.$nextTick(() => {
this.drawAllPathsOnMap()
})
boxshow (val) {
if (!val) {
this.onMapReady()
}
},
dateRange: {
@ -183,7 +181,7 @@ export default {
immediate: true
},
source (newVal) {
if (newVal.length > 1) {
if (Array.isArray(newVal) && newVal.length > 1) {
this.initChart()
}
},
@ -199,20 +197,42 @@ export default {
}
},
methods: {
//
onMapReady () {
this.drawAllPathsOnMap()
},
//
drawAllPathsOnMap () {
if (!this.$refs.mapbox) return
if (!this.flyDataList.length) return
// mapbox
this.$refs.mapbox.clearPaths && this.$refs.mapbox.clearPaths()
//
this.$refs.mapbox.clearMapElements(['path'], ['path'])
//
this.flyDataList.forEach(item => {
if (item.gps_path) {
if (!item.gps_path) return
try {
const pathArray = JSON.parse(item.gps_path)
this.$refs.mapbox.createPathWithArray(pathArray)
if (Array.isArray(pathArray) && pathArray.length > 0) {
this.$refs.mapbox.createPathWithArray(pathArray)
}
} catch (e) {
console.warn('gps_path 解析失败', item.gps_path)
}
})
//
if (this.flyDataList.length > 0 && this.flyDataList[0].gps_path) {
try {
const firstPath = JSON.parse(this.flyDataList[0].gps_path)
if (Array.isArray(firstPath) && firstPath.length > 0) {
const [lon, lat] = firstPath[0]
this.$refs.mapbox.goto({ lon, lat })
}
} catch (e) {
//
}
}
},
//
async loadFlyData () {
@ -260,7 +280,7 @@ export default {
xAxis: { type: 'category' },
yAxis: {
gridIndex: 0,
name: this.radioClass === '飞行时长' ? '分钟' : this.radioClass === '飞行距离' ? '米' : 'mAh'
name: this.radioClass === '飞行时长' ? '分钟' : this.radioClass === '飞行距离' ? '米' : '毫安'
},
grid: { top: '55%' },
series: [