fix:优化数据显示
This commit is contained in:
@@ -656,26 +656,32 @@ export function WarMap() {
|
|||||||
}),
|
}),
|
||||||
[effectiveIsraelPaths]
|
[effectiveIsraelPaths]
|
||||||
)
|
)
|
||||||
/** 盟军打击目标点位(林肯/福特/以色列→伊朗+以色列→黎巴嫩),带衰减系数;全部/实时下按 effectiveCutoffDays 过滤 */
|
/** 盟军打击目标点位(林肯/福特/以色列→伊朗+以色列→黎巴嫩)。全部/单项:显示全部目标;实时:仅 effectiveCutoffDays 内 */
|
||||||
const alliedStrikeTargetsFeatures = useMemo(() => {
|
const alliedStrikeTargetsFeatures = useMemo(() => {
|
||||||
const out: GeoJSON.Feature<GeoJSON.Point, { name: string; decay: number }>[] = []
|
const out: GeoJSON.Feature<GeoJSON.Point, { name: string; decay: number }>[] = []
|
||||||
|
const onlyRealtimeFilter =
|
||||||
|
strikeLegendFilter === null && isRealtimeView
|
||||||
for (const line of strikeLines) {
|
for (const line of strikeLines) {
|
||||||
if (strikeLegendFilter != null && strikeLegendFilter !== 'lincoln' && strikeLegendFilter !== 'ford' && strikeLegendFilter !== 'israel') continue
|
if (strikeLegendFilter != null && strikeLegendFilter !== 'lincoln' && strikeLegendFilter !== 'ford' && strikeLegendFilter !== 'israel') continue
|
||||||
if (strikeLegendFilter === 'lincoln' && line.sourceId !== 'lincoln') continue
|
if (strikeLegendFilter === 'lincoln' && line.sourceId !== 'lincoln') continue
|
||||||
if (strikeLegendFilter === 'ford' && line.sourceId !== 'ford') continue
|
if (strikeLegendFilter === 'ford' && line.sourceId !== 'ford') continue
|
||||||
if (strikeLegendFilter === 'israel' && line.sourceId !== 'israel') continue
|
if (strikeLegendFilter === 'israel' && line.sourceId !== 'israel') continue
|
||||||
for (const t of line.targets) {
|
for (const t of line.targets) {
|
||||||
if (!isWithinAnimationWindow(t.struck_at ?? null, referenceTime, effectiveCutoffDays)) continue
|
if (onlyRealtimeFilter && !isWithinAnimationWindow((t as { struck_at?: string | null }).struck_at ?? null, referenceTime, effectiveCutoffDays))
|
||||||
const decay = getDecayFactor(t.struck_at ?? null, referenceTime, effectiveCutoffDays)
|
continue
|
||||||
|
const struckAt = (t as { struck_at?: string | null }).struck_at ?? null
|
||||||
|
const decay = onlyRealtimeFilter
|
||||||
|
? getDecayFactor(struckAt, referenceTime, effectiveCutoffDays)
|
||||||
|
: 1
|
||||||
out.push({
|
out.push({
|
||||||
type: 'Feature',
|
type: 'Feature',
|
||||||
properties: { name: t.name ?? '', decay },
|
properties: { name: (t as { name?: string }).name ?? '', decay },
|
||||||
geometry: { type: 'Point', coordinates: [t.lng, t.lat] },
|
geometry: { type: 'Point', coordinates: [t.lng, t.lat] },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out
|
return out
|
||||||
}, [strikeLines, referenceTime, strikeLegendFilter, effectiveCutoffDays])
|
}, [strikeLines, referenceTime, strikeLegendFilter, isRealtimeView, effectiveCutoffDays])
|
||||||
const hezbollahLinesGeoJson = useMemo(
|
const hezbollahLinesGeoJson = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
type: 'FeatureCollection' as const,
|
type: 'FeatureCollection' as const,
|
||||||
@@ -856,7 +862,7 @@ export function WarMap() {
|
|||||||
const blink = 0.5 + 0.5 * Math.sin(elapsed * 0.003)
|
const blink = 0.5 + 0.5 * Math.sin(elapsed * 0.003)
|
||||||
map.setPaintProperty('points-damaged', 'circle-opacity', blink)
|
map.setPaintProperty('points-damaged', 'circle-opacity', blink)
|
||||||
}
|
}
|
||||||
// attacked: 红色脉冲,半径 = 基准×phase×zoomScale×decayScale(线性衰减)
|
// 脉冲:仅更新半径与透明度,颜色使用 Layer 默认(美军基地遭袭=红,盟军打击伊朗目标=蓝)
|
||||||
if (map.getLayer('points-attacked-pulse')) {
|
if (map.getLayer('points-attacked-pulse')) {
|
||||||
const cycle = 2000
|
const cycle = 2000
|
||||||
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
||||||
@@ -955,7 +961,7 @@ export function WarMap() {
|
|||||||
})
|
})
|
||||||
hormuzSrc.setData({ type: 'FeatureCollection', features })
|
hormuzSrc.setData({ type: 'FeatureCollection', features })
|
||||||
}
|
}
|
||||||
// 盟军打击目标:脉冲半径 = 基准×decayScale×zoomScale,线性衰减,镜头拉远半径变小
|
// 盟军打击目标(伊朗境内等):脉冲动画,颜色保持 Layer 默认蓝
|
||||||
if (map.getLayer('allied-strike-targets-pulse')) {
|
if (map.getLayer('allied-strike-targets-pulse')) {
|
||||||
const cycle = 2000
|
const cycle = 2000
|
||||||
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
||||||
@@ -1032,7 +1038,7 @@ export function WarMap() {
|
|||||||
const blink = 0.5 + 0.5 * Math.sin(elapsed * 0.004)
|
const blink = 0.5 + 0.5 * Math.sin(elapsed * 0.004)
|
||||||
map.setPaintProperty('gdelt-events-orange', 'circle-opacity', blink)
|
map.setPaintProperty('gdelt-events-orange', 'circle-opacity', blink)
|
||||||
}
|
}
|
||||||
// GDELT 红色:脉冲半径随 zoom×decayScale 线性变化
|
// GDELT 高烈度:脉冲动画,颜色保持 Layer 默认
|
||||||
if (map.getLayer('gdelt-events-red-pulse')) {
|
if (map.getLayer('gdelt-events-red-pulse')) {
|
||||||
const cycle = 2200
|
const cycle = 2200
|
||||||
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
||||||
@@ -1041,7 +1047,7 @@ export function WarMap() {
|
|||||||
map.setPaintProperty('gdelt-events-red-pulse', 'circle-radius', r)
|
map.setPaintProperty('gdelt-events-red-pulse', 'circle-radius', r)
|
||||||
map.setPaintProperty('gdelt-events-red-pulse', 'circle-opacity', opacity)
|
map.setPaintProperty('gdelt-events-red-pulse', 'circle-opacity', opacity)
|
||||||
}
|
}
|
||||||
// 真主党攻击目标:脉冲半径衰减线性插值,镜头拉远变小
|
// 真主党攻击目标:脉冲动画,颜色保持 Layer 默认
|
||||||
if (map.getLayer('hezbollah-attack-targets-pulse')) {
|
if (map.getLayer('hezbollah-attack-targets-pulse')) {
|
||||||
const cycle = 2000
|
const cycle = 2000
|
||||||
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
||||||
@@ -1050,7 +1056,7 @@ export function WarMap() {
|
|||||||
map.setPaintProperty('hezbollah-attack-targets-pulse', 'circle-radius', r)
|
map.setPaintProperty('hezbollah-attack-targets-pulse', 'circle-radius', r)
|
||||||
map.setPaintProperty('hezbollah-attack-targets-pulse', 'circle-opacity', opacity)
|
map.setPaintProperty('hezbollah-attack-targets-pulse', 'circle-opacity', opacity)
|
||||||
}
|
}
|
||||||
// 霍尔木兹海峡被打击目标:脉冲半径随 zoom×decayScale
|
// 霍尔木兹海峡被打击目标:脉冲动画,颜色保持 Layer 默认
|
||||||
if (map.getLayer('iran-hormuz-targets-pulse')) {
|
if (map.getLayer('iran-hormuz-targets-pulse')) {
|
||||||
const cycle = 2000
|
const cycle = 2000
|
||||||
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
const phase = Math.max(0, Math.min(1, (elapsed % cycle) / cycle))
|
||||||
|
|||||||
Reference in New Issue
Block a user