## 进入地图两种情况,状态2显示实时折现,其他的显示地图轨迹
<script setup lang="ts">
import { getDictListApi } from '@/service/api/common';
import { ref, watch, nextTick, onBeforeUnmount } from 'vue';
import { WS_TRANSPORTATION_GPS_URL } from '@/config';
import { gettransportGpsListApi } from '@/service/api/purchaseOrder';
import { throttle } from 'lodash-es'
const status = defineModel('status');
const orderDetails: any = defineModel('orderDetails');
const emit = defineEmits(['update:mileage', 'update:paths']);
let map = <any>(null);
const TMap = (window as any).TMap;
let multiPolyline: any = null;
const startAddressList = ref<any[]>([]);
const endAddressList = ref<any[]>([]);
const start = ref([])
const end = ref([])
const ws = ref<any>(null);
const polyArray = ref<any[]>([]);
const initMap = async () => {
if (status.value === 3) {
getSockeData()
transportationInit()
} else {
trajectoryInit()
}
};
const transportationInit = () => {
initMapData()
addStartAndEndMarker()
multiPolylineInit()
}
const trajectoryInit = async () => {
initMapData()
addStartAndEndMarker()
moveTrajectory()
}
const initMapData = () => {
const center = new TMap.LatLng(39.80, 109.97);
map = new TMap.Map('container', {
center: center,
zoom: 17.2,
pitch: 43.5,
rotation: 45
});
}
const getSockeData = () => {
ws.value = new WebSocket(`${WS_TRANSPORTATION_GPS_URL}?transportOrderId=${orderDetails.value.transportOrderId}`)
ws.value.onopen = () => {
console.log('WebSocket 连接成功')
}
ws.value.onmessage = (event: any) => {
const jsonData = JSON.parse(event.data)
if (jsonData.type === 'GPS_DATA') {
if (jsonData.data && Array.isArray(jsonData.data)) {
changeJsonDataArray(jsonData)
}
if (jsonData.data && typeof jsonData.data === 'object' && !Array.isArray(jsonData.data)) {
changeJsonDataObject(jsonData)
}
}
ws.value.onclose = () => {
console.log('WebSocket 连接关闭')
}
ws.value.onerror = (error: any) => {
console.error('WebSocket 错误:', error)
}
}
}
const changeJsonDataArray = (jsonData: any) => {
emit('update:mileage', jsonData.data[jsonData.data.length - 1].totalDistance)
emit('update:paths', jsonData.data[jsonData.data.length - 1].currentGpsPoint)
let latLngArray = [];
if (jsonData.data.length > 0) {
latLngArray = jsonData.data.map((item: any) => {
return [
item.currentGpsPoint.latitude,
item.currentGpsPoint.longitude
]
})
}
const startPoint = [start.value[0], start.value[1]];
polyArray.value = [startPoint, ...latLngArray]
if (multiPolyline) {
multiPolyline.updateGeometries({
'id': 'pl_1',
'styleId': 'style_blue',
'paths': polyArray.value.map(p => new TMap.LatLng(p[0], p[1]))
})
const newCenter = new TMap.LatLng(polyArray.value[polyArray.value.length - 1][0], polyArray.value[polyArray.value.length - 1][1]);
map.setCenter(newCenter);
}
}
const changeJsonDataObject = (jsonData: any) => {
emit('update:mileage', jsonData.data.totalDistance)
emit('update:paths', jsonData.data.currentGpsPoint)
if (multiPolyline) {
polyArray.value.push([jsonData.data.currentGpsPoint.latitude, jsonData.data.currentGpsPoint.longitude])
multiPolyline.updateGeometries({
'id': 'pl_1',
'styleId': 'style_blue',
'paths': polyArray.value.map(p => new TMap.LatLng(p[0], p[1]))
})
const newCenter = new TMap.LatLng(jsonData.data.currentGpsPoint.latitude, jsonData.data.currentGpsPoint.longitude);
map.setCenter(newCenter);
}
}
const getStartAndEnd = async () => {
try {
const res1 = await getDictListApi('start_address')
startAddressList.value = res1.data.data
const res2 = await getDictListApi('aim_address')
endAddressList.value = res2.data.data
} catch (error) {
startAddressList.value = []
endAddressList.value = []
console.log(error)
}
}
const multiPolylineInit = () => {
multiPolyline = new TMap.MultiPolyline({
id: 'polyline-layer',
map: map,
styles: {
'style_blue': new TMap.PolylineStyle({
'color': '#3777FF',
'width': 6,
'borderWidth': 5,
'borderColor': '#FFF',
'lineCap': 'butt'
}),
},
geometries: [
{
id: 'pl_1',
styleId: 'style_blue',
paths: [
new TMap.LatLng(start.value[0], start.value[1]),
new TMap.LatLng(start.value[0], start.value[1]),
]
},
]
})
}
const addStartAndEndMarker = () => {
start.value = startAddressList.value.find((item: any) => Number(item.dictValue) === Number(orderDetails.value.startAddress)).remark.split(',').map(Number)
end.value = endAddressList.value.find((item: any) => Number(item.dictValue) === Number(orderDetails.value.aimAddress)).remark.split(',').map(Number)
new TMap.MultiMarker({
map: map,
styles: {
startStyle: new TMap.MarkerStyle({
width: 40,
height: 40,
anchor: { x: 15, y: 40 },
src: 'https://minio.zkny.top/zkny-bucket-sm-modules-system/image/2025/09/18/94074516-57f0-47cf-92b1-316d266485a2.png'
}),
endStyle: new TMap.MarkerStyle({
width: 40,
height: 40,
anchor: { x: 15, y: 40 },
src: 'https://minio.zkny.top/zkny-bucket-sm-modules-system/image/2025/09/18/c335e841-42ae-4fff-8594-f74e780b0c3c.png'
})
},
geometries: [
{
id: 'start',
styleId: 'startStyle',
position: new TMap.LatLng(start.value[0], start.value[1])
},
{
id: 'end',
styleId: 'endStyle',
position: new TMap.LatLng(end.value[0], end.value[1])
}
]
});
}
const emitPaths = throttle((lat: number, lng: number) => {
emit('update:paths', { latitude: lat, longitude: lng })
}, 1000)
const moveTrajectory = async () => {
try {
const res = await gettransportGpsListApi(orderDetails.value.transportOrderId)
if (res.data.code === 200) {
const path = res.data.data.map((item: any) => {
return new TMap.LatLng(item.currentGpsPoint.latitude, item.currentGpsPoint.longitude);
});
path.unshift(new TMap.LatLng(start.value[0], start.value[1]))
path.push(new TMap.LatLng(end.value[0], end.value[1]))
new TMap.MultiPolyline({
id: 'polyline-layer',
map: map,
styles: {
'style_blue': new TMap.PolylineStyle({
'color': '#3777FF',
'width': 6,
'borderWidth': 5,
'borderColor': '#FFF',
'lineCap': 'butt'
}),
},
geometries: [
{
id: 'pl_1',
styleId: 'style_blue',
paths: path
},
]
})
var marker = new TMap.MultiMarker({
map,
styles: {
'car-down': new TMap.MarkerStyle({
'width': 40,
'height': 40,
'anchor': {
x: 20, y: 20,
},
'faceTo': 'map',
'rotate': 180,
'src': 'https://minio.zkny.top/zkny-bucket-sm-modules-system/image/2025/09/19/6f013209-fb57-45c4-b9c1-72ad216a8d9e.png',
})
},
geometries: [{
id: 'car',
styleId: 'car-down',
position: new TMap.LatLng(start.value[0], start.value[1]),
}]
});
marker.moveAlong({
"car": {
path,
speed: 70
}
}, {
autoRotation: true
}
)
marker.on('moving', (evt: any) => {
if (evt.car && evt.car.passedLatLngs.length > 0) {
const carPos = evt.car.passedLatLngs[evt.car.passedLatLngs.length - 1]
map.setCenter(carPos)
const paths = {
latitude: carPos.lat,
longitude: carPos.lng
}
emitPaths(paths.latitude, paths.longitude)
}
})
}
} catch (error) {
console.log(error)
}
}
watch(orderDetails, async () => {
if (map) {
map.destroy();
map = null;
}
await nextTick();
await getStartAndEnd()
initMap();
}, { immediate: true })
onBeforeUnmount(() => {
console.log('关闭WebSocket')
ws.value?.close()
})
</script>
<template>
<div class="wh-full relative">
<div id="container" class="h-full w-full"></div>
</div>
</template>
<style></style>