fix bugs
This commit is contained in:
parent
94746d9a85
commit
27e35c3665
2
components.d.ts
vendored
2
components.d.ts
vendored
@ -104,7 +104,7 @@ declare module 'vue' {
|
|||||||
MenubarSubContent: typeof import('./src/components/ui/menubar/MenubarSubContent.vue')['default']
|
MenubarSubContent: typeof import('./src/components/ui/menubar/MenubarSubContent.vue')['default']
|
||||||
MenubarSubTrigger: typeof import('./src/components/ui/menubar/MenubarSubTrigger.vue')['default']
|
MenubarSubTrigger: typeof import('./src/components/ui/menubar/MenubarSubTrigger.vue')['default']
|
||||||
MenubarTrigger: typeof import('./src/components/ui/menubar/MenubarTrigger.vue')['default']
|
MenubarTrigger: typeof import('./src/components/ui/menubar/MenubarTrigger.vue')['default']
|
||||||
Month_power_wave_plot: typeof import('./src/components/dense/saber/month_power_wave_plot.vue')['default']
|
Month_year_power_wave_plot: typeof import('./src/components/dense/saber/month_year_power_wave_plot.vue')['default']
|
||||||
NavigationMenu: typeof import('./src/components/ui/navigation-menu/NavigationMenu.vue')['default']
|
NavigationMenu: typeof import('./src/components/ui/navigation-menu/NavigationMenu.vue')['default']
|
||||||
NavigationMenuContent: typeof import('./src/components/ui/navigation-menu/NavigationMenuContent.vue')['default']
|
NavigationMenuContent: typeof import('./src/components/ui/navigation-menu/NavigationMenuContent.vue')['default']
|
||||||
NavigationMenuIndicator: typeof import('./src/components/ui/navigation-menu/NavigationMenuIndicator.vue')['default']
|
NavigationMenuIndicator: typeof import('./src/components/ui/navigation-menu/NavigationMenuIndicator.vue')['default']
|
||||||
|
|||||||
@ -85,7 +85,7 @@ function download() {
|
|||||||
</ParamsCard>
|
</ParamsCard>
|
||||||
</ResizablePanel>
|
</ResizablePanel>
|
||||||
<ResizableHandle id="demo-handle-1" />
|
<ResizableHandle id="demo-handle-1" />
|
||||||
<ResizablePanel id="demo-panel-2" :default-size="500">
|
<ResizablePanel id="demo-panel-2" :default-size="350">
|
||||||
<ImageContainer v-slot="metadata" :image-result="imageResult">
|
<ImageContainer v-slot="metadata" :image-result="imageResult">
|
||||||
<slot name="extra-meta" :metadata="metadata.metadata" />
|
<slot name="extra-meta" :metadata="metadata.metadata" />
|
||||||
</ImageContainer>
|
</ImageContainer>
|
||||||
|
|||||||
@ -43,12 +43,12 @@ const queryUrl = computed(() => {
|
|||||||
query.set('model_name', mode)
|
query.set('model_name', mode)
|
||||||
query.set('wind_type', windType)
|
query.set('wind_type', windType)
|
||||||
query.set('H', (selectedH.value * 1000).toString())
|
query.set('H', (selectedH.value * 1000).toString())
|
||||||
query.set('mode', selectedDateType.value)
|
query.set('mode', props.isDay ? 'day' : selectedDateType.value)
|
||||||
if (props.isDay) {
|
if (props.isDay) {
|
||||||
const queryDay = `${selectedDate.value.slice(0, 4)}-${selectedDate.value.slice(4, 6)}-${selectedDate.value.slice(6, 8)}`
|
const queryDay = `${selectedDate.value.slice(0, 4)}-${selectedDate.value.slice(4, 6)}-${selectedDate.value.slice(6, 8)}`
|
||||||
query.set('day', queryDay)
|
query.set('day', queryDay)
|
||||||
}
|
}
|
||||||
if (selectedDateType.value === 'month') {
|
if (!props.isDay && selectedDateType.value === 'month') {
|
||||||
query.set('month', selectedMonth.value)
|
query.set('month', selectedMonth.value)
|
||||||
}
|
}
|
||||||
// const query = `?station=${station}&year=${year}&model_name=${mode}&wind_type=${windType}&H=${selectedH.value}`
|
// const query = `?station=${station}&year=${year}&model_name=${mode}&wind_type=${windType}&H=${selectedH.value}`
|
||||||
@ -85,11 +85,16 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
paths.value = data
|
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, (newV) => {
|
watch([selectedYear, selectedMonth], () => {
|
||||||
selectedDate.value = Array.from(dates.value).filter(
|
selectedDate.value = Array.from(dates.value).filter(
|
||||||
d => d.startsWith(newV),
|
d => d.startsWith(`${selectedYear.value}${selectedMonth.value.padStart(2, '0')}`),
|
||||||
)[0]
|
)[0]
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
@ -179,26 +184,7 @@ watch(selectedYear, (newV) => {
|
|||||||
</SelectGroup>
|
</SelectGroup>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<div v-if="selectedDateType === 'day'">
|
|
||||||
<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),
|
|
||||||
)" :key="date" :value="date"
|
|
||||||
>
|
|
||||||
{{ date }}
|
|
||||||
</SelectItem>
|
|
||||||
</SelectGroup>
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
<div v-if="selectedDateType === 'month'">
|
<div v-if="selectedDateType === 'month'">
|
||||||
<Label>月份</Label>
|
<Label>月份</Label>
|
||||||
<Select v-model="selectedMonth">
|
<Select v-model="selectedMonth">
|
||||||
@ -219,6 +205,26 @@ watch(selectedYear, (newV) => {
|
|||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</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>
|
||||||
</div>
|
</div>
|
||||||
</Denseframework>
|
</Denseframework>
|
||||||
|
|||||||
@ -22,10 +22,28 @@ const lat_ranges = [
|
|||||||
'50,60',
|
'50,60',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const lon_ranges = [
|
||||||
|
'0 ~ 24',
|
||||||
|
'24 ~ 48',
|
||||||
|
'48 ~ 72',
|
||||||
|
'72 ~ 96',
|
||||||
|
'96 ~ 120',
|
||||||
|
'120 ~ 144',
|
||||||
|
'144 ~ 168',
|
||||||
|
'168 ~ 192',
|
||||||
|
'192 ~ 216',
|
||||||
|
'216 ~ 240',
|
||||||
|
'240 ~ 264',
|
||||||
|
'264 ~ 288',
|
||||||
|
'288 ~ 312',
|
||||||
|
'312 ~ 336',
|
||||||
|
'336 ~ 360',
|
||||||
|
]
|
||||||
|
|
||||||
const selected = reactive({
|
const selected = reactive({
|
||||||
path: '',
|
path: '',
|
||||||
day: '',
|
day: '',
|
||||||
cycle_no: 1,
|
cycle_no: '1',
|
||||||
lat_range: '0,10',
|
lat_range: '0,10',
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -105,14 +123,31 @@ watch(() => selected.path, async () => {
|
|||||||
</SelectGroup>
|
</SelectGroup>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<Label for="age">Cycle No.</Label>
|
<Label for="age">纬度范围</Label>
|
||||||
<NumberField id="age" v-model:model-value="selected.cycle_no" :default-value="1" :min="0">
|
<Select v-model="selected.cycle_no">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择纬度范围" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>纬度范围</SelectLabel>
|
||||||
|
<SelectItem v-for="i in 15" :key="i" :value="i.toString()">
|
||||||
|
{{ lon_ranges[i - 1] }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
<!-- <NumberField
|
||||||
|
id="age"
|
||||||
|
v-model:model-value="selected.cycle_no"
|
||||||
|
:default-value="1" :min="0"
|
||||||
|
>
|
||||||
<NumberFieldContent>
|
<NumberFieldContent>
|
||||||
<NumberFieldDecrement />
|
<NumberFieldDecrement />
|
||||||
<NumberFieldInput />
|
<NumberFieldInput />
|
||||||
<NumberFieldIncrement />
|
<NumberFieldIncrement />
|
||||||
</NumberFieldContent>
|
</NumberFieldContent>
|
||||||
</NumberField>
|
</NumberField> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</DenseFramework>
|
</DenseFramework>
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import { currentSaberDays, parseDayOfYear, refreshCurrentSaberDays, refreshPath,
|
|||||||
const selected = reactive({
|
const selected = reactive({
|
||||||
path: './saber/data/2012/SABER_Temp_O3_April2012_v2.0.nc',
|
path: './saber/data/2012/SABER_Temp_O3_April2012_v2.0.nc',
|
||||||
day: '',
|
day: '',
|
||||||
cycle_no: 1,
|
cycle_no: '1',
|
||||||
lat_range: '0,10',
|
lat_range: '0,10',
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -29,6 +29,24 @@ const lat_ranges = [
|
|||||||
'50,60',
|
'50,60',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const lon_ranges = [
|
||||||
|
'0 ~ 24',
|
||||||
|
'24 ~ 48',
|
||||||
|
'48 ~ 72',
|
||||||
|
'72 ~ 96',
|
||||||
|
'96 ~ 120',
|
||||||
|
'120 ~ 144',
|
||||||
|
'144 ~ 168',
|
||||||
|
'168 ~ 192',
|
||||||
|
'192 ~ 216',
|
||||||
|
'216 ~ 240',
|
||||||
|
'240 ~ 264',
|
||||||
|
'264 ~ 288',
|
||||||
|
'288 ~ 312',
|
||||||
|
'312 ~ 336',
|
||||||
|
'336 ~ 360',
|
||||||
|
]
|
||||||
|
|
||||||
const urll = computed(() => {
|
const urll = computed(() => {
|
||||||
// const path = encodeURIComponent(selected.path)
|
// const path = encodeURIComponent(selected.path)
|
||||||
// const day = encodeURIComponent(selected.day)
|
// const day = encodeURIComponent(selected.day)
|
||||||
@ -105,14 +123,20 @@ watch(() => selected.path, async () => {
|
|||||||
</SelectGroup>
|
</SelectGroup>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<Label for="age">Cycle No.</Label>
|
<Label for="age">纬度范围</Label>
|
||||||
<NumberField id="age" v-model:model-value="selected.cycle_no" :default-value="1" :min="0">
|
<Select v-model="selected.cycle_no">
|
||||||
<NumberFieldContent>
|
<SelectTrigger>
|
||||||
<NumberFieldDecrement />
|
<SelectValue placeholder="选择纬度范围" />
|
||||||
<NumberFieldInput />
|
</SelectTrigger>
|
||||||
<NumberFieldIncrement />
|
<SelectContent>
|
||||||
</NumberFieldContent>
|
<SelectGroup>
|
||||||
</NumberField>
|
<SelectLabel>纬度范围</SelectLabel>
|
||||||
|
<SelectItem v-for="i in 15" :key="i" :value="i.toString()">
|
||||||
|
{{ lon_ranges[i - 1] }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</DenseFramework>
|
</DenseFramework>
|
||||||
|
|||||||
@ -1,82 +0,0 @@
|
|||||||
<route lang="json">
|
|
||||||
{
|
|
||||||
"meta": {
|
|
||||||
"title": "Saber月周期功率波图",
|
|
||||||
"description": "Saber月周期功率波图",
|
|
||||||
"group": "Saber",
|
|
||||||
"item_name": "月周期功率波图"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</route>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { API_BASE_URL } from '~/CONSTANT'
|
|
||||||
import { refreshPath, renderPath, saberPaths } from './utils'
|
|
||||||
|
|
||||||
const lat_ranges = [
|
|
||||||
'0,10',
|
|
||||||
'10,20',
|
|
||||||
'20,30',
|
|
||||||
'30,40',
|
|
||||||
'40,50',
|
|
||||||
'50,60',
|
|
||||||
]
|
|
||||||
|
|
||||||
const selected = reactive({
|
|
||||||
path: '',
|
|
||||||
lat_range: '0,10',
|
|
||||||
})
|
|
||||||
|
|
||||||
const urll = computed(() => {
|
|
||||||
const query = new URLSearchParams()
|
|
||||||
query.set('path', selected.path)
|
|
||||||
query.set('lat_range', selected.lat_range)
|
|
||||||
return `${API_BASE_URL}/saber/render/gravity_wave/per_month/power_wave_plot?${query}`
|
|
||||||
})
|
|
||||||
|
|
||||||
onMounted(async () => {
|
|
||||||
await refreshPath()
|
|
||||||
selected.path = saberPaths.value[0]
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<DenseFramework :image-query="urll">
|
|
||||||
<div>
|
|
||||||
<div flex="~ col items-stretch gap-3" py-3>
|
|
||||||
<Label>纬度带</Label>
|
|
||||||
<Select v-model="selected.lat_range">
|
|
||||||
<SelectTrigger>
|
|
||||||
<SelectValue placeholder="选择纬度带" />
|
|
||||||
</SelectTrigger>
|
|
||||||
<SelectContent>
|
|
||||||
<SelectGroup>
|
|
||||||
<SelectLabel>纬度带</SelectLabel>
|
|
||||||
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
|
|
||||||
{{ lat_range.replace(",", " ~ ") }}
|
|
||||||
</SelectItem>
|
|
||||||
</SelectGroup>
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
<Label for="day">年月</Label>
|
|
||||||
<Select v-model="selected.path">
|
|
||||||
<SelectTrigger>
|
|
||||||
<SelectValue placeholder="选择日期" />
|
|
||||||
</SelectTrigger>
|
|
||||||
<SelectContent>
|
|
||||||
<SelectGroup>
|
|
||||||
<SelectLabel>月份</SelectLabel>
|
|
||||||
<SelectItem v-for="path in saberPaths.sort((a, b) => renderPath(a).localeCompare(renderPath(b)))" :key="path" :value="path">
|
|
||||||
{{ renderPath(path) }}
|
|
||||||
</SelectItem>
|
|
||||||
</SelectGroup>
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DenseFramework>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
145
src/components/dense/saber/month_year_power_wave_plot.vue
Normal file
145
src/components/dense/saber/month_year_power_wave_plot.vue
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
<route lang="json">
|
||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"title": "Saber月周期功率波图",
|
||||||
|
"description": "Saber月周期功率波图",
|
||||||
|
"group": "Saber",
|
||||||
|
"item_name": "月周期功率波图"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</route>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { API_BASE_URL } from '~/CONSTANT'
|
||||||
|
import { refreshPath, renderPath, saberPaths } from './utils'
|
||||||
|
|
||||||
|
const currentMode = ref('月统计图')
|
||||||
|
const allYears = ref([] as string[])
|
||||||
|
const lat_ranges = [
|
||||||
|
'-60,-50',
|
||||||
|
'-50,-40',
|
||||||
|
'-40,-30',
|
||||||
|
'-30,-20',
|
||||||
|
'-20,-10',
|
||||||
|
'-10,0',
|
||||||
|
'0,10',
|
||||||
|
'10,20',
|
||||||
|
'20,30',
|
||||||
|
'30,40',
|
||||||
|
'40,50',
|
||||||
|
'50,60',
|
||||||
|
]
|
||||||
|
|
||||||
|
const selected = reactive({
|
||||||
|
path: '',
|
||||||
|
lat_range: '0,10',
|
||||||
|
year: '',
|
||||||
|
})
|
||||||
|
|
||||||
|
const urll = computed(() => {
|
||||||
|
if (currentMode.value === '月统计图') {
|
||||||
|
const query = new URLSearchParams()
|
||||||
|
query.set('path', selected.path)
|
||||||
|
query.set('lat_range', selected.lat_range)
|
||||||
|
return `${API_BASE_URL}/saber/render/gravity_wave/per_month/power_wave_plot?${query}`
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const query = new URLSearchParams()
|
||||||
|
query.set('year', selected.year)
|
||||||
|
query.set('lat_range', selected.lat_range)
|
||||||
|
return `${API_BASE_URL}/saber/render/gravity_wave/per_year/power_wave_plot?${query}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await refreshPath()
|
||||||
|
selected.path = saberPaths.value[0]
|
||||||
|
// traverse all paths to get all years,
|
||||||
|
// in each item, str is like ../data/saber/2017/SABER_Temp_O3_June2017_v2.0.nc
|
||||||
|
const years = Array.from(new Set(saberPaths.value.map((str: string) => str.match(/(\d{4})/)?.[1])))
|
||||||
|
allYears.value = years.filter(year => year !== null).map(year => year!)
|
||||||
|
selected.year = allYears.value[0]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<DenseFramework :image-query="urll">
|
||||||
|
<div>
|
||||||
|
<Label>模式</Label>
|
||||||
|
<Tabs v-model="currentMode">
|
||||||
|
<TabsList class="grid grid-cols-2 w-full">
|
||||||
|
<TabsTrigger value="月统计图">
|
||||||
|
月统计图
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value="年统计图">
|
||||||
|
年统计图
|
||||||
|
</TabsTrigger>
|
||||||
|
</TabsList>
|
||||||
|
</Tabs>
|
||||||
|
<div v-if="currentMode === '月统计图'" flex="~ col items-stretch gap-3" py-3>
|
||||||
|
<Label for="day">年月</Label>
|
||||||
|
<Select v-model="selected.path">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择日期" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>月份</SelectLabel>
|
||||||
|
<SelectItem v-for="path in saberPaths.sort((a, b) => renderPath(a).localeCompare(renderPath(b)))" :key="path" :value="path">
|
||||||
|
{{ renderPath(path) }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
<Label>纬度带</Label>
|
||||||
|
<Select v-model="selected.lat_range">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择纬度带" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>纬度带</SelectLabel>
|
||||||
|
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
|
||||||
|
{{ lat_range.replace(",", " ~ ") }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div v-else class="flex flex-col gap-3 py-2">
|
||||||
|
<Label>年份</Label>
|
||||||
|
<Select v-model="selected.year">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择年份" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>年份</SelectLabel>
|
||||||
|
<SelectItem v-for="year in allYears" :key="year" :value="year">
|
||||||
|
{{ year }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
<Label>纬度带</Label>
|
||||||
|
<Select v-model="selected.lat_range">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择纬度带" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>纬度带</SelectLabel>
|
||||||
|
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
|
||||||
|
{{ lat_range.replace(",", " ~ ") }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</DenseFramework>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -108,14 +108,7 @@ async function customHandle(resp: Response) {
|
|||||||
<span v-for="(v, k) in metadata" :key="k">{{ k }}: {{ v }}</span>
|
<span v-for="(v, k) in metadata" :key="k">{{ k }}: {{ v }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<Label>选择模式</Label>
|
|
||||||
<Tabs v-model="selected.selectedMode" default-value="观测的二阶多项式拟合">
|
|
||||||
<TabsList class="grid grid-cols-1 w-full">
|
|
||||||
<TabsTrigger v-for="m in modes" :key="m" :value="m">
|
|
||||||
{{ m }}
|
|
||||||
</TabsTrigger>
|
|
||||||
</TabsList>
|
|
||||||
</Tabs>
|
|
||||||
<Label>选择台站</Label>
|
<Label>选择台站</Label>
|
||||||
<Select v-model="selected.station">
|
<Select v-model="selected.station">
|
||||||
<SelectTrigger>
|
<SelectTrigger>
|
||||||
@ -144,6 +137,14 @@ async function customHandle(resp: Response) {
|
|||||||
</SelectGroup>
|
</SelectGroup>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
|
<Label>选择模式</Label>
|
||||||
|
<Tabs v-model="selected.selectedMode" default-value="观测的二阶多项式拟合">
|
||||||
|
<TabsList class="grid grid-cols-1 w-full">
|
||||||
|
<TabsTrigger v-for="m in modes" :key="m" :value="m">
|
||||||
|
{{ m }}
|
||||||
|
</TabsTrigger>
|
||||||
|
</TabsList>
|
||||||
|
</Tabs>
|
||||||
</DenseFramework>
|
</DenseFramework>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -10,12 +10,29 @@ meta:
|
|||||||
import { API_BASE_URL } from '~/CONSTANT'
|
import { API_BASE_URL } from '~/CONSTANT'
|
||||||
|
|
||||||
const selectedMode = ref('w/f值统计结果')
|
const selectedMode = ref('w/f值统计结果')
|
||||||
|
const selectedStation = ref('LIN')
|
||||||
|
const allStations = ref([] as string[])
|
||||||
|
|
||||||
const isIllegal = ref(false)
|
const isIllegal = ref(false)
|
||||||
|
|
||||||
const startYear = ref(2017)
|
const startYear = ref(2017)
|
||||||
const endYear = ref(2024)
|
const endYear = ref(2024)
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await baseFetch<string []>(`${API_BASE_URL}/balloon/metadata`).json().then(({ data }) => {
|
||||||
|
const das = data.value!
|
||||||
|
|
||||||
|
const _allStations = das.map((a: string) => {
|
||||||
|
const stationPattern = /data\/balloon\/(\w+)\//
|
||||||
|
return a.match(stationPattern)?.[1]
|
||||||
|
}) as string[]
|
||||||
|
|
||||||
|
const stations = Array.from(new Set(_allStations))
|
||||||
|
allStations.value = stations
|
||||||
|
selectedStation.value = stations[0]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
const modes = [
|
const modes = [
|
||||||
|
|
||||||
'w/f值统计结果',
|
'w/f值统计结果',
|
||||||
@ -70,26 +87,22 @@ watch([selectedMode, startYear, endYear], () => {
|
|||||||
<DenseFramework :image-query="queryUrl">
|
<DenseFramework :image-query="queryUrl">
|
||||||
<div flex="col gap-5 ~ justify-center">
|
<div flex="col gap-5 ~ justify-center">
|
||||||
<div>
|
<div>
|
||||||
<Label>统计参数</Label>
|
<Label>选择台站</Label>
|
||||||
<Select v-model="selectedMode">
|
<Select v-model="selectedStation">
|
||||||
<SelectTrigger>
|
<SelectTrigger>
|
||||||
<SelectValue placeholder="Select a fruit" />
|
<SelectValue placeholder="选择台站" />
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
<SelectGroup>
|
<SelectGroup>
|
||||||
<SelectLabel>模式</SelectLabel>
|
<SelectLabel>台站</SelectLabel>
|
||||||
<SelectItem
|
<SelectItem v-for="s in allStations" :key="s" :value="s">
|
||||||
v-for="mode in Array.from(modes).sort(((a, b) => {
|
{{ s }}
|
||||||
return mode_display_mapping[a].length - mode_display_mapping[b].length
|
|
||||||
}))"
|
|
||||||
:key="mode" :value="mode"
|
|
||||||
>
|
|
||||||
{{ mode_display_mapping[mode] }}
|
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
</SelectGroup>
|
</SelectGroup>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<NumberField
|
<NumberField
|
||||||
id="start"
|
id="start"
|
||||||
v-model:model-value="startYear" :format-options="{
|
v-model:model-value="startYear" :format-options="{
|
||||||
@ -118,6 +131,27 @@ watch([selectedMode, startYear, endYear], () => {
|
|||||||
<NumberFieldIncrement />
|
<NumberFieldIncrement />
|
||||||
</NumberFieldContent>
|
</NumberFieldContent>
|
||||||
</NumberField>
|
</NumberField>
|
||||||
|
<div>
|
||||||
|
<Label>统计参数</Label>
|
||||||
|
<Select v-model="selectedMode">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="Select a fruit" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>模式</SelectLabel>
|
||||||
|
<SelectItem
|
||||||
|
v-for="mode in Array.from(modes).sort(((a, b) => {
|
||||||
|
return mode_display_mapping[a].length - mode_display_mapping[b].length
|
||||||
|
}))"
|
||||||
|
:key="mode" :value="mode"
|
||||||
|
>
|
||||||
|
{{ mode_display_mapping[mode] }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</DenseFramework>
|
</DenseFramework>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -33,10 +33,26 @@ const df = new DateFormatter('zh-CN', {
|
|||||||
dateStyle: 'long',
|
dateStyle: 'long',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const lat_ranges = [
|
||||||
|
'-60 ~ -50',
|
||||||
|
'-50 ~ -40',
|
||||||
|
'-40 ~ -30',
|
||||||
|
'-30 ~ -20',
|
||||||
|
'-20 ~ -10',
|
||||||
|
'-10 ~ 0',
|
||||||
|
'0 ~ 10',
|
||||||
|
'10 ~ 20',
|
||||||
|
'20 ~ 30',
|
||||||
|
'30 ~ 40',
|
||||||
|
'40 ~ 50',
|
||||||
|
'50 ~ 60',
|
||||||
|
]
|
||||||
|
|
||||||
const selected = reactive({
|
const selected = reactive({
|
||||||
year: '2008',
|
year: '2008',
|
||||||
day: '1',
|
day: '1',
|
||||||
mode: 'mean_ktemp_Nz',
|
mode: 'mean_ktemp_Nz',
|
||||||
|
lat_range: '0 ~ 10',
|
||||||
})
|
})
|
||||||
|
|
||||||
const value = ref<DateValue>(
|
const value = ref<DateValue>(
|
||||||
@ -52,13 +68,14 @@ const queryUrl = computed(() => {
|
|||||||
const day_No = getDayOfYear(theDate)
|
const day_No = getDayOfYear(theDate)
|
||||||
query.set('day', day_No.toString())
|
query.set('day', day_No.toString())
|
||||||
query.set('mode', selected.mode)
|
query.set('mode', selected.mode)
|
||||||
|
query.set('lat_range', selected.lat_range)
|
||||||
return `/cosmic/render/gravity_wave/perday?${query}`
|
return `/cosmic/render/gravity_wave/perday?${query}`
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<DenseFramework :image-query="queryUrl">
|
<DenseFramework :image-query="queryUrl">
|
||||||
<Label>模式</Label>
|
<Label>统计参数</Label>
|
||||||
<Tabs v-model:model-value="selected.mode">
|
<Tabs v-model:model-value="selected.mode">
|
||||||
<TabsList class="grid grid-cols-1 w-full">
|
<TabsList class="grid grid-cols-1 w-full">
|
||||||
<TabsTrigger value="mean_ktemp_Nz">
|
<TabsTrigger value="mean_ktemp_Nz">
|
||||||
@ -102,6 +119,20 @@ const queryUrl = computed(() => {
|
|||||||
<Calendar v-model="value " initial-focus />
|
<Calendar v-model="value " initial-focus />
|
||||||
</PopoverContent>
|
</PopoverContent>
|
||||||
</Popover>
|
</Popover>
|
||||||
|
<Label>纬度带</Label>
|
||||||
|
<Select v-model="selected.lat_range">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择纬度带" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>纬度带</SelectLabel>
|
||||||
|
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
|
||||||
|
{{ lat_range }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
</DenseFramework>
|
</DenseFramework>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -22,18 +22,35 @@ const MODES = [
|
|||||||
'不同高度下的逐日统计分析',
|
'不同高度下的逐日统计分析',
|
||||||
'每月浮力频率变化趋势',
|
'每月浮力频率变化趋势',
|
||||||
'每月平均重力势能的折线图',
|
'每月平均重力势能的折线图',
|
||||||
'布伦特-维萨拉频率分布',
|
'浮力频率均值',
|
||||||
|
'每月平均N^2的折线图',
|
||||||
|
]
|
||||||
|
const lat_ranges = [
|
||||||
|
'-60 ~ -50',
|
||||||
|
'-50 ~ -40',
|
||||||
|
'-40 ~ -30',
|
||||||
|
'-30 ~ -20',
|
||||||
|
'-20 ~ -10',
|
||||||
|
'-10 ~ 0',
|
||||||
|
'0 ~ 10',
|
||||||
|
'10 ~ 20',
|
||||||
|
'20 ~ 30',
|
||||||
|
'30 ~ 40',
|
||||||
|
'40 ~ 50',
|
||||||
|
'50 ~ 60',
|
||||||
]
|
]
|
||||||
|
|
||||||
const selected = reactive({
|
const selected = reactive({
|
||||||
year: '2008',
|
year: '2008',
|
||||||
// begin_day
|
// begin_day
|
||||||
mode: '不同高度下的逐日统计分析',
|
mode: '不同高度下的逐日统计分析',
|
||||||
|
lat_range: '0 ~ 10',
|
||||||
})
|
})
|
||||||
const queryUrl = computed(() => {
|
const queryUrl = computed(() => {
|
||||||
const q = new URLSearchParams()
|
const q = new URLSearchParams()
|
||||||
q.set('year', selected.year)
|
q.set('year', selected.year)
|
||||||
q.set('mode', selected.mode)
|
q.set('mode', selected.mode)
|
||||||
|
q.set('lat_range', selected.lat_range)
|
||||||
return `${API_BASE_URL}/cosmic/render/gravity_wave/multiday?${q}`
|
return `${API_BASE_URL}/cosmic/render/gravity_wave/multiday?${q}`
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
@ -54,7 +71,7 @@ const queryUrl = computed(() => {
|
|||||||
</SelectGroup>
|
</SelectGroup>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<Label>模式</Label>
|
<Label>统计参数</Label>
|
||||||
<Tabs v-model="selected.mode">
|
<Tabs v-model="selected.mode">
|
||||||
<TabsList class="grid grid-cols-1 w-full">
|
<TabsList class="grid grid-cols-1 w-full">
|
||||||
<TabsTrigger v-for="mode in MODES" :key="mode" :value="mode">
|
<TabsTrigger v-for="mode in MODES" :key="mode" :value="mode">
|
||||||
@ -62,6 +79,20 @@ const queryUrl = computed(() => {
|
|||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
</TabsList>
|
</TabsList>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
<Label>纬度带</Label>
|
||||||
|
<Select v-model="selected.lat_range">
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder="选择纬度带" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
<SelectLabel>纬度带</SelectLabel>
|
||||||
|
<SelectItem v-for="lat_range in lat_ranges" :key="lat_range" :value="lat_range">
|
||||||
|
{{ lat_range }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
</DenseFramework>
|
</DenseFramework>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -7,5 +7,5 @@
|
|||||||
</route>
|
</route>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Month_power_wave_plot />
|
<Month_year_power_wave_plot />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -21,8 +21,9 @@ const selected = reactive({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const ranges = [
|
const ranges = [
|
||||||
'-20',
|
'-30',
|
||||||
'30',
|
'30',
|
||||||
|
'-60',
|
||||||
'60',
|
'60',
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -30,6 +31,7 @@ const queryUrl = computed(() => {
|
|||||||
const q = new URLSearchParams()
|
const q = new URLSearchParams()
|
||||||
q.set('year', selected.year)
|
q.set('year', selected.year)
|
||||||
q.set('T', selected.T.toString())
|
q.set('T', selected.T.toString())
|
||||||
|
q.set('k', selected.k.toString())
|
||||||
return `${API_BASE_URL}/saber/render/planet_wave/per_year/energy_plot?${q}`
|
return `${API_BASE_URL}/saber/render/planet_wave/per_year/energy_plot?${q}`
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
@ -74,7 +76,7 @@ const queryUrl = computed(() => {
|
|||||||
}" :default-value="94"
|
}" :default-value="94"
|
||||||
:step="20"
|
:step="20"
|
||||||
:max="110"
|
:max="110"
|
||||||
:min="70"
|
:min="30"
|
||||||
>
|
>
|
||||||
<NumberFieldContent>
|
<NumberFieldContent>
|
||||||
<NumberFieldDecrement />
|
<NumberFieldDecrement />
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user