距离和时间随着动画会递减

This commit is contained in:
huangchenhao 2025-11-28 04:05:41 +08:00
parent 33665263fb
commit 18913c6ae8
2 changed files with 43 additions and 26 deletions

View File

@ -7,6 +7,7 @@ import { ref } from 'vue'
import * as Cesium from 'cesium'
import { ROUTE_STYLES, LABEL_STYLE } from '../constants/routeStyles'
import { formatDistance, formatDuration } from '../utils/geoUtils'
import { CallbackProperty } from 'cesium'
export function useRouteVisualization() {
// 路线实体集合
@ -144,27 +145,36 @@ export function useRouteVisualization() {
return null
}
// 计算中点位置
const midIndex = Math.floor(positions.length / 2)
const labelPosition = positions[midIndex]
// 格式化文本
const distanceText = formatDistance(routeData.distance)
const durationText = formatDuration(routeData.duration)
const labelText = `${distanceText} | ${durationText}`
// 存储初始值
const initialDistance = routeData.distance
const initialDuration = routeData.duration
const startTime = Date.now()
const durationMs = 60000 // 60秒
// 添加降级标识
const finalText = routeData.isFallback ? `${labelText} (直线)` : labelText
// 获取标签颜色
const type = routeData.isFallback ? 'fallback' : (routeData.type || 'personnel')
const style = ROUTE_STYLES[type] || ROUTE_STYLES.personnel
// 创建标签实体
const entity = viewer.entities.add({
position: labelPosition,
label: {
text: finalText,
text: new Cesium.CallbackProperty(() => {
const elapsed = Date.now() - startTime
const progress = Math.min(elapsed / durationMs, 1)
// 计算新的距离和时间
const currentDistance = initialDistance * (1 - progress)
const currentDuration = initialDuration * (1 - progress)
const distanceText = formatDistance(currentDistance)
const durationText = formatDuration(currentDuration)
// 添加降级标识
const finalText = routeData.isFallback ?
`${distanceText} | ${durationText} (直线)` :
`${distanceText} | ${durationText}`
return finalText
}, false),
font: LABEL_STYLE.font,
fillColor: LABEL_STYLE.fillColor,
outlineColor: LABEL_STYLE.outlineColor,
@ -186,7 +196,13 @@ export function useRouteVisualization() {
}
})
labelEntities.value.push(entity)
// 在 Vue 的 ref 中存储实体以便后续清除
labelEntities.value.push({
entity: entity,
routeId: routeData.id
})
console.log(`[useRouteVisualization] 添加标签实体: ${routeData.name} (${routeData.id})`)
return entity
}
@ -206,9 +222,9 @@ export function useRouteVisualization() {
})
// 清除标签实体
labelEntities.value.forEach(entity => {
if (entity) {
viewer.entities.remove(entity)
labelEntities.value.forEach(item => {
if (item && item.entity) {
viewer.entities.remove(item.entity)
}
})
@ -239,7 +255,7 @@ export function useRouteVisualization() {
// 清除路线实体
routeEntities.value = routeEntities.value.filter(entity => {
if (entity && entity.properties) {
// 关键修复:使用 getValue() 获取 Cesium Property 的实际值
// 使用 getValue() 获取 Cesium Property 的实际值
const entityRouteId = entity.properties.routeId?.getValue ? entity.properties.routeId.getValue() : entity.properties.routeId
console.log(`[useRouteVisualization] 检查路线实体 routeId: "${entityRouteId}", 目标: "${routeId}", 匹配: ${entityRouteId === routeId}`)
@ -254,14 +270,15 @@ export function useRouteVisualization() {
})
// 清除标签实体
labelEntities.value = labelEntities.value.filter(entity => {
if (entity && entity.properties) {
// 关键修复:使用 getValue() 获取 Cesium Property 的实际值
const entityRouteId = entity.properties.routeId?.getValue ? entity.properties.routeId.getValue() : entity.properties.routeId
labelEntities.value = labelEntities.value.filter(item => {
if (item && item.entity && item.entity.properties) {
// 使用 getValue() 获取 Cesium Property 的实际值
const entityRouteId = item.entity.properties.routeId?.getValue ?
item.entity.properties.routeId.getValue() :
item.entity.properties.routeId
if (entityRouteId === routeId) {
console.log(`[useRouteVisualization] 移除标签实体: ${routeId}`)
viewer.entities.remove(entity)
viewer.entities.remove(item.entity)
removedLabels++
return false
}

View File

@ -1461,7 +1461,7 @@ const initializeScene = async () => {
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
priority: Number.MAX_SAFE_INTEGER, //
priority: 10000, //
});
console.log("[index.vue] 中心点标记已添加");