Dustella 70298d740b
Some checks are pending
Test / build (lts/*, ubuntu-latest) (push) Waiting to run
Test / build (lts/*, windows-latest) (push) Waiting to run
sync
2025-03-05 11:39:17 +08:00

234 lines
7.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup lang="ts">
const props = defineProps<{
waveType: '潮汐波' | '行星波'
isDay?: boolean
}>()
const selectedWave = computed(() => props.waveType)
const selectedMode = ref('2日行星波')
const selectedDateType = ref('month')
const selectedStation = ref('武汉左岭镇站')
const selectedYear = ref('2017')
const selectedWindType = ref('uwind')
const selectedH = ref(94)
const selectedDate = ref('20170316')
const selectedMonth = ref('1')
const modes = [
'2日行星波',
'5日行星波',
'10日行星波',
'16日行星波',
]
const paths = ref([] as string[])
const stations = ref<Set<string>>(new Set())
const years = ref<Set<string>>(new Set())
const dates = ref<Set<string>>(new Set())
const queryUrl = computed(() => {
const station = selectedStation.value
const year = encodeURIComponent(selectedYear.value)
const mode = selectedWave.value === '潮汐波'
? '潮汐波'
: selectedMode.value
const windType = selectedWindType.value
const query = new URLSearchParams()
query.set('station', station)
query.set('year', year)
query.set('model_name', mode)
query.set('wind_type', windType)
query.set('H', (selectedH.value * 1000).toString())
query.set('mode', props.isDay ? 'day' : selectedDateType.value)
if (props.isDay) {
const queryDay = `${selectedDate.value.slice(0, 4)}-${selectedDate.value.slice(4, 6)}-${selectedDate.value.slice(6, 8)}`
query.set('day', queryDay)
}
if (!props.isDay && selectedDateType.value === 'month') {
query.set('month', selectedMonth.value)
}
// const query = `?station=${station}&year=${year}&model_name=${mode}&wind_type=${windType}&H=${selectedH.value}`
const path = `/radar/render/heatmap?${query}`
return path
})
const urlModel = defineModel<string>()
syncRef(urlModel, queryUrl, { direction: 'rtl' })
onMounted(async () => {
const resp = await baseFetch(`/radar/metadata`).json()
const data = await resp.data.value
// use regex to extract the year from the path,
// ./radar/data\\武汉左岭镇站\\2017\\ZLT_MET01_DLL_L21_01D_20170316.txt
const station_pattern = /data\/radar\/(.*?)\//
const year_pattern = /(\d{4})\/ZLT_/
const date_pattern = /01D_(\d{8})\.txt/
const pairs = data.map((source_text: string) => {
const station = source_text.match(station_pattern)?.[1]
const year = source_text.match(year_pattern)?.[1]
const date = source_text.match(date_pattern)?.[1]
return { station, year, date }
})
pairs.forEach(({ station, year, date }: {
station: string
year: string
date: string
}) => {
stations.value.add(station)
years.value.add(year)
dates.value.add(date)
})
paths.value = data
if (props.isDay) {
selectedDate.value = Array.from(dates.value).filter(
d => d.startsWith(`${selectedYear.value}${selectedMonth.value.padStart(2, '0')}`),
)[0]
}
})
watch([selectedYear, selectedMonth], () => {
selectedDate.value = Array.from(dates.value).filter(
d => d.startsWith(`${selectedYear.value}${selectedMonth.value.padStart(2, '0')}`),
)[0]
})
</script>
<template>
<DenseFramework :image-query="queryUrl">
<div>
<div flex="~ col gap-3" py-3>
<div v-if="selectedWave === '行星波'">
<Label>行星波周期</Label>
<Tabs v-model="selectedMode" default-value="2日行星波">
<TabsList class="grid grid-cols-4 w-full">
<TabsTrigger v-for="m in modes" :key="m" :value="m">
{{ m.replace("行星波", "") }}
</TabsTrigger>
</TabsList>
</Tabs>
</div>
<Label for="wind_type">风类型</Label>
<Tabs id="wind_type" v-model="selectedWindType" default-value="uwind">
<TabsList class="grid grid-cols-2 w-full">
<TabsTrigger value="uwind">
纬向风
</TabsTrigger>
<TabsTrigger value="vwind">
经向风
</TabsTrigger>
</TabsList>
</Tabs>
<div v-if="!props.isDay">
<Label for="H">日期类型</Label>
<Tabs id="date_type" v-model="selectedDateType" default-value="month">
<TabsList class="grid grid-cols-2 w-full">
<!-- <TabsTrigger value="day">
</TabsTrigger> -->
<TabsTrigger value="month">
</TabsTrigger>
<TabsTrigger value="year">
</TabsTrigger>
</TabsList>
</Tabs>
</div>
<Label>观测站</Label>
<Select v-model="selectedStation">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>观测站</SelectLabel>
<SelectItem v-for="station in stations" :key="station" :value="station">
{{ station }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<Label>高度km</Label>
<NumberField
id="start"
v-model:model-value="selectedH" :format-options="{
useGrouping: false,
}" :default-value="94"
:step="2"
:max="110"
:min="70"
>
<NumberFieldContent>
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
<Label>年份</Label>
<Select v-model="selectedYear">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>年</SelectLabel>
<SelectItem v-for="year in years" :key="year" :value="year">
{{ year }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<div v-if="selectedDateType === 'month'">
<Label>月份</Label>
<Select v-model="selectedMonth">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel></SelectLabel>
<SelectItem
v-for="month in [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
]" :key="month" :value="month.toString()"
>
{{ month }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
<div v-if="props.isDay ">
<Label>日期</Label>
<Select v-model="selectedDate">
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel></SelectLabel>
<SelectItem
v-for="date in Array.from(dates).filter(
(d) => d.startsWith(`${selectedYear}${selectedMonth.padStart(2, '0')}`),
)" :key="date" :value="date"
>
{{ date }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
</div>
</Denseframework>
</template>
<style lang="scss" scoped>
</style>