507 lines
16 KiB
Python
507 lines
16 KiB
Python
from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QHeaderView
|
|
from PySide6.QtGui import QPixmap
|
|
from PySide6.QtCore import Qt
|
|
from qt import Ui_MainWindow
|
|
from qt_material import apply_stylesheet
|
|
import pandas as pd
|
|
import sys
|
|
import os
|
|
import re
|
|
import balloon
|
|
|
|
|
|
lat = 52.21
|
|
g = 9.76
|
|
|
|
tag_balloon_once = [
|
|
[
|
|
"地形重力波",
|
|
"垂直传播方向",
|
|
"水平传播方向",
|
|
"本征(固有)频率",
|
|
"本征周期",
|
|
"本征频率与固有频率的比值(即长短轴之比)",
|
|
],
|
|
[
|
|
"垂直波长",
|
|
"水平波长",
|
|
"纬向本征相速度",
|
|
"经向本征相速度",
|
|
"垂直本征相速度",
|
|
"波动能",
|
|
],
|
|
[
|
|
"势能",
|
|
"纬向动量通量",
|
|
"经向动量通量",
|
|
"纬向风扰动振幅",
|
|
"经向风扰动振幅",
|
|
"温度扰动振幅",
|
|
],
|
|
]
|
|
|
|
|
|
def set_table_balloon_once(table: QTableWidget, data: list):
|
|
for i in range(3):
|
|
for j in range(6):
|
|
table.setItem(i, j * 2, QTableWidgetItem(tag_balloon_once[i][j]))
|
|
if data[0] == True:
|
|
data[0] = "是"
|
|
else:
|
|
data[0] = "否"
|
|
if data[1] == 1:
|
|
data[1] = "上"
|
|
else:
|
|
data[1] = "下"
|
|
for i in range(2, len(data)):
|
|
data[i] = f"{data[i]} "
|
|
data[2] += "°"
|
|
data[3] += "rad/s"
|
|
data[4] += "h"
|
|
data[6] += "km"
|
|
data[7] += "km"
|
|
for i in [8, 9, 10, 15, 16]:
|
|
data[i] += "m/s"
|
|
data[11] += "J/kg"
|
|
data[12] += "J/kg"
|
|
data[13] += "mPa"
|
|
data[14] += "mPa"
|
|
data[17] += "K"
|
|
for i in range(18):
|
|
table.setItem(i // 6, (i % 6) * 2 + 1, QTableWidgetItem(data[i]))
|
|
|
|
|
|
class MainWindow(QMainWindow, Ui_MainWindow):
|
|
comboType = [
|
|
"探空气球",
|
|
"流星雷达",
|
|
"Saber",
|
|
"TIDI",
|
|
"COSMIC",
|
|
]
|
|
|
|
comboMode = [
|
|
["重力波单次", "重力波统计"],
|
|
["重力波月统计", "潮汐波单次", "潮汐波月统计"],
|
|
["行星波月统计", "重力波单次", "重力波月统计"],
|
|
["行星波月统计"],
|
|
["行星波月统计"],
|
|
]
|
|
|
|
comboDate = [
|
|
[["年", "时间"], ["起始年", "终止年"]],
|
|
[["年", "月"], ["年", "日期"], ["年", "月"]],
|
|
[["起始月", "-"], ["月", "日"], ["月", "-"]],
|
|
[["起始月", "-"]],
|
|
[["起始月", "-"]],
|
|
]
|
|
|
|
comboMap = [
|
|
[1, 2],
|
|
[3, 4, 5],
|
|
[6, 7, 8],
|
|
[9],
|
|
[10],
|
|
]
|
|
|
|
def get_date0_items(self):
|
|
match self.dataType:
|
|
case 0:
|
|
try:
|
|
self.currentDate0 = os.listdir(
|
|
f"./data/{self.comboType[self.dataType]}/{self.dataStation}")
|
|
except FileNotFoundError:
|
|
return []
|
|
return [i[-4:] for i in self.currentDate0]
|
|
case 1:
|
|
self.currentDate0 = ["2024"]
|
|
return self.currentDate0
|
|
case 2:
|
|
try:
|
|
self.currentDate0 = os.listdir(
|
|
f"./data/{self.comboType[self.dataType]}/{self.dataStation}")
|
|
except FileNotFoundError:
|
|
return []
|
|
return [re.search(r"_([A-z]+)\d{4}_", i).group(1) for i in self.currentDate0]
|
|
case _:
|
|
self.currentDate0 = ["Feb"]
|
|
return self.currentDate0
|
|
|
|
def get_date1_items(self):
|
|
if self.dataType == 0 and self.dataMode == 0:
|
|
try:
|
|
self.currentDate1 = os.listdir(
|
|
f"./data/{self.comboType[self.dataType]}/{self.dataStation}/{self.currentDate0[self.dataDate0]}")
|
|
except FileNotFoundError:
|
|
return []
|
|
return [re.search(r"_(\d{8}T\d{6}_\d+)", i).group(1) for i in self.currentDate1]
|
|
elif self.dataType == 0 and self.dataMode == 1:
|
|
return [i[-4:] for i in [end for j, end in enumerate(self.currentDate0) if j >= self.dataDate0]]
|
|
elif self.dataType == 1 and self.dataMode == 0:
|
|
self.currentDate1 = ["01"]
|
|
return self.currentDate1
|
|
elif self.dataType == 1 and self.dataMode == 1:
|
|
self.currentDate1 = ["20240317T000000"]
|
|
return self.currentDate1
|
|
elif self.dataType == 1 and self.dataMode == 2:
|
|
if self.dataStation == "黑龙江漠河":
|
|
self.currentDate1 = ["01"]
|
|
else:
|
|
self.currentDate1 = ["03"]
|
|
return self.currentDate1
|
|
elif self.dataType == 2 and self.dataMode == 1:
|
|
return [f"{i:02d}" for i in range(1, 31)]
|
|
else:
|
|
self.currentDate1 = [f"{i:02d}" for i in range(1, 13)]
|
|
return self.currentDate1
|
|
|
|
def __init__(self):
|
|
super(MainWindow, self).__init__()
|
|
self.setupUi(self)
|
|
|
|
self.stackedWidget.setCurrentIndex(0)
|
|
self.pixmap_logo = QPixmap("./data/logo.png")
|
|
|
|
self.dataType = -1
|
|
self.dataMode = -1
|
|
self.currentDate0 = []
|
|
self.currentDate1 = []
|
|
|
|
self.funcMap = [
|
|
[self.on_balloon_once_change, self.on_balloon_year_change],
|
|
[self.on_meteor_g_change, self.on_meteor_once_change,
|
|
self.on_meteor_month_change],
|
|
[self.on_Saber_twice_change, self.on_Saber_g_once_change,
|
|
self.on_Saber_g_month_change],
|
|
[self.on_TIDI_twice_change],
|
|
[self.on_COSMIC_twice_change],
|
|
]
|
|
|
|
self.clear_combo(0)
|
|
self.combo_type.addItems(self.comboType)
|
|
|
|
self.combo_type.currentTextChanged.connect(self.on_change_type)
|
|
self.combo_mode.currentTextChanged.connect(self.on_change_mode)
|
|
self.combo_station.currentTextChanged.connect(self.on_change_station)
|
|
self.combo_date0.currentTextChanged.connect(self.on_change_date0)
|
|
self.combo_date1.currentTextChanged.connect(self.on_change_date1)
|
|
|
|
s = self.size()
|
|
self.resize(s.width() + 1, s.height() + 1)
|
|
self.resize(s)
|
|
|
|
def resizeEvent(self, event):
|
|
self.on_resize()
|
|
super().resizeEvent(event)
|
|
|
|
def on_resize(self):
|
|
tmp = [
|
|
None,
|
|
None,
|
|
None,
|
|
self.label_meteor_g,
|
|
self.label_meteor_once,
|
|
self.label_meteor_month,
|
|
self.label_Saber_twice,
|
|
self.label_Saber_g_once,
|
|
self.label_Saber_g_month,
|
|
self.label_TIDI_twice,
|
|
self.label_COSMIC_twice,
|
|
]
|
|
match self.stackedWidget.currentIndex():
|
|
case 0:
|
|
l = self.label_idle_logo
|
|
p = self.pixmap_logo
|
|
l.setPixmap(p.scaled(l.size(), Qt.KeepAspectRatio,
|
|
Qt.SmoothTransformation))
|
|
case 1:
|
|
l = self.label_balloon_once
|
|
p = self.pixmap_balloon_once
|
|
if p.isNull():
|
|
self.clear_pixmap()
|
|
l.setText("无重力波")
|
|
else:
|
|
l.setPixmap(
|
|
p.scaled(l.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
|
|
case 2:
|
|
l = self.label_balloon_year
|
|
p = self.pixmap_balloon_year
|
|
if p.isNull():
|
|
self.clear_pixmap()
|
|
l.setText("无数据")
|
|
else:
|
|
l.setPixmap(
|
|
p.scaled(l.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
|
|
case 5:
|
|
i = self.stackedWidget.currentIndex()
|
|
l = tmp[i]
|
|
|
|
if self.dataStation == "黑龙江漠河":
|
|
p = QPixmap("./output/tmp_5_01.png")
|
|
else:
|
|
p = QPixmap("./output/tmp_5_03.png")
|
|
|
|
l.setPixmap(p.scaled(l.size(), Qt.KeepAspectRatio,
|
|
Qt.SmoothTransformation))
|
|
l.setCursor(Qt.CursorShape.PointingHandCursor)
|
|
case _:
|
|
i = self.stackedWidget.currentIndex()
|
|
l = tmp[i]
|
|
|
|
p = QPixmap(f"./output/tmp_{i}.png")
|
|
l.setPixmap(p.scaled(l.size(), Qt.KeepAspectRatio,
|
|
Qt.SmoothTransformation))
|
|
l.setCursor(Qt.CursorShape.PointingHandCursor)
|
|
|
|
def clear_pixmap(self):
|
|
self.pixmap_balloon_once = QPixmap()
|
|
self.pixmap_balloon_year = QPixmap()
|
|
self.pixmap_meteor_g = QPixmap()
|
|
self.pixmap_meteor_once = QPixmap()
|
|
self.pixmap_meteor_month = QPixmap()
|
|
self.pixmap_Saber_twice = QPixmap()
|
|
self.pixmap_Saber_g_once = QPixmap()
|
|
self.pixmap_Saber_g_month = QPixmap()
|
|
self.pixmap_TIDI_twice = QPixmap()
|
|
self.pixmap_COSMIC_twice = QPixmap()
|
|
|
|
self.table_balloon_once.setVisible(False)
|
|
|
|
for l in [
|
|
self.label_balloon_once,
|
|
self.label_balloon_year,
|
|
self.label_meteor_g,
|
|
self.label_meteor_once,
|
|
self.label_meteor_month,
|
|
self.label_Saber_twice,
|
|
self.label_Saber_g_once,
|
|
self.label_Saber_g_month,
|
|
self.label_TIDI_twice,
|
|
self.label_COSMIC_twice,
|
|
]:
|
|
l.setCursor(Qt.CursorShape.ArrowCursor)
|
|
|
|
def clear_combo(self, level: int):
|
|
self.clear_pixmap()
|
|
|
|
self.on_resize()
|
|
self.stackedWidget.setCurrentIndex(0)
|
|
|
|
for i, combo in enumerate(
|
|
[
|
|
self.combo_type,
|
|
self.combo_mode,
|
|
self.combo_station,
|
|
self.combo_date0,
|
|
self.combo_date1,
|
|
]
|
|
):
|
|
if i >= level:
|
|
combo.clear()
|
|
combo.setEnabled(i <= level)
|
|
|
|
def on_change_type(self):
|
|
if self.combo_type.currentIndex() < 0:
|
|
return
|
|
self.clear_combo(1)
|
|
self.dataType = self.combo_type.currentIndex()
|
|
self.combo_mode.addItems(self.comboMode[self.dataType])
|
|
|
|
self.combo_date0.setPlaceholderText("-")
|
|
self.combo_date1.setPlaceholderText("-")
|
|
|
|
def on_change_mode(self):
|
|
if self.combo_mode.currentIndex() < 0:
|
|
return
|
|
self.clear_combo(2)
|
|
self.dataMode = self.combo_mode.currentIndex()
|
|
|
|
if self.dataType < 2:
|
|
self.combo_station.setPlaceholderText("台站")
|
|
else:
|
|
self.combo_station.setPlaceholderText("年")
|
|
list_station = []
|
|
try:
|
|
# list_station = [i for i in os.listdir(f"./data/{self.comboType[self.dataType]}") if i.encode("utf-8").isupper()]
|
|
list_station = [i for i in os.listdir(
|
|
f"./data/{self.comboType[self.dataType]}")]
|
|
except FileNotFoundError:
|
|
return
|
|
self.combo_station.addItems(list_station)
|
|
|
|
date0, date1 = self.comboDate[self.dataType][self.dataMode]
|
|
self.combo_date0.setPlaceholderText(date0)
|
|
self.combo_date1.setPlaceholderText(date1)
|
|
|
|
def on_change_station(self):
|
|
if self.combo_station.currentIndex() < 0:
|
|
return
|
|
self.clear_combo(3)
|
|
self.dataStation = self.combo_station.currentText()
|
|
self.combo_date0.addItems(self.get_date0_items())
|
|
|
|
def on_change_date0(self):
|
|
if self.combo_date0.currentIndex() < 0:
|
|
return
|
|
self.clear_combo(4)
|
|
self.dataDate0 = self.combo_date0.currentIndex()
|
|
if self.dataType < 2 or (self.dataType == 2 and self.dataMode == 1):
|
|
self.combo_date1.addItems(self.get_date1_items())
|
|
return
|
|
self.combo_date1.setEnabled(False)
|
|
self.stackedWidget.setCurrentIndex(
|
|
self.comboMap[self.dataType][self.dataMode])
|
|
if f := self.funcMap[self.dataType][self.dataMode]:
|
|
f()
|
|
|
|
def on_change_date1(self):
|
|
if self.combo_date1.currentIndex() < 0:
|
|
return
|
|
self.dataDate1 = self.combo_date1.currentIndex()
|
|
self.stackedWidget.setCurrentIndex(
|
|
self.comboMap[self.dataType][self.dataMode])
|
|
if f := self.funcMap[self.dataType][self.dataMode]:
|
|
f()
|
|
|
|
def on_balloon_once_change(self):
|
|
path = os.path.join("./data/探空气球", self.dataStation,
|
|
self.currentDate0[self.dataDate0], self.currentDate1[self.dataDate1])
|
|
|
|
try:
|
|
data = balloon.read_data(path)
|
|
except Exception as e:
|
|
print(e)
|
|
return
|
|
|
|
path = "./output" + path[6:-2] + "png"
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
result = balloon.plot_once(data, path, lat, g)
|
|
|
|
if len(result) == 0:
|
|
self.pixmap_balloon_once = QPixmap()
|
|
self.on_resize()
|
|
return
|
|
|
|
self.pixmap_balloon_once = QPixmap(path)
|
|
self.label_balloon_once.setCursor(Qt.CursorShape.PointingHandCursor)
|
|
|
|
t = self.table_balloon_once
|
|
t.clear()
|
|
t.setRowCount(3)
|
|
t.setColumnCount(12)
|
|
t.setVisible(True)
|
|
t.verticalHeader().setHidden(True)
|
|
t.horizontalHeader().setHidden(True)
|
|
t.verticalScrollBar().setHidden(True)
|
|
t.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
|
set_table_balloon_once(t, result)
|
|
t.setMaximumHeight(t.rowHeight(0) * 3)
|
|
|
|
s = self.size()
|
|
self.resize(s.width() + 1, s.height() + 1)
|
|
self.resize(s)
|
|
|
|
def on_balloon_year_change(self):
|
|
columns = [
|
|
"file_name",
|
|
"c",
|
|
"a",
|
|
"b",
|
|
"omega_upper",
|
|
"w_f",
|
|
"ver_wave_len",
|
|
"hori_wave_len",
|
|
"c_x",
|
|
"c_y",
|
|
"c_z",
|
|
"Ek",
|
|
"E_p",
|
|
"MFu",
|
|
"MFv",
|
|
"u1",
|
|
"v1",
|
|
"T1",
|
|
"zhou_qi",
|
|
]
|
|
combined_df = pd.DataFrame()
|
|
for i in range(self.dataDate1 + 1):
|
|
path = f"./output/探空气球/{self.dataStation}/{self.currentDate0[self.dataDate0 + i]}.csv"
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
if os.path.exists(path):
|
|
year_df = pd.read_csv(path)
|
|
combined_df = pd.concat([combined_df, year_df])
|
|
continue
|
|
folder = "./data" + path[8:-4]
|
|
year_df = pd.DataFrame()
|
|
for file in os.listdir(folder):
|
|
print(file)
|
|
data = balloon.read_data(os.path.join(folder, file))
|
|
try:
|
|
wave = balloon.extract_wave(data, lat, g)
|
|
except Exception:
|
|
wave = []
|
|
if len(wave) == 0:
|
|
continue
|
|
c = balloon.is_terrain_wave(data, lat, g)
|
|
wave.insert(0, c)
|
|
wave.insert(0, file)
|
|
line = pd.DataFrame([wave], columns=columns)
|
|
year_df = pd.concat([year_df, line])
|
|
combined_df = pd.concat([combined_df, year_df])
|
|
year_df.to_csv(path, index=False)
|
|
path = f"./output/探空气球/{self.dataStation}/{self.currentDate0[self.dataDate0]}_{self.dataDate1}.png"
|
|
if not balloon.plot_year(combined_df, path, lat, g):
|
|
self.pixmap_balloon_year = QPixmap()
|
|
self.on_resize()
|
|
return
|
|
|
|
self.pixmap_balloon_year = QPixmap(path)
|
|
self.label_balloon_year.setCursor(Qt.CursorShape.PointingHandCursor)
|
|
|
|
s = self.size()
|
|
self.resize(s.width() + 1, s.height() + 1)
|
|
self.resize(s)
|
|
|
|
def on_meteor_g_change(self):
|
|
self.on_resize()
|
|
|
|
def on_meteor_once_change(self):
|
|
self.on_resize()
|
|
|
|
def on_meteor_month_change(self):
|
|
self.on_resize()
|
|
|
|
def on_Saber_twice_change(self):
|
|
self.spin_Saber_twice_lat.setValue(0)
|
|
self.spin_Saber_twice_alt.setValue(90)
|
|
self.on_resize()
|
|
|
|
def on_Saber_g_once_change(self):
|
|
self.spin_Saber_g_once_lat.setValue(0)
|
|
self.spin_Saber_g_once_lon.setValue(0)
|
|
self.spin_Saber_g_once_alt.setValue(90)
|
|
self.on_resize()
|
|
|
|
def on_Saber_g_month_change(self):
|
|
self.spin_Saber_g_month_lat.setValue(0)
|
|
self.spin_Saber_g_month_alt.setValue(90)
|
|
self.on_resize()
|
|
|
|
def on_TIDI_twice_change(self):
|
|
self.spin_TIDI_twice_lat.setValue(0)
|
|
self.spin_TIDI_twice_alt.setValue(90)
|
|
self.on_resize()
|
|
|
|
def on_COSMIC_twice_change(self):
|
|
self.spin_COSMIC_twice_lat.setValue(0)
|
|
self.spin_COSMIC_twice_alt.setValue(40)
|
|
self.on_resize()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication(sys.argv)
|
|
window = MainWindow()
|
|
apply_stylesheet(app, theme="light_blue.xml", invert_secondary=True)
|
|
window.show()
|
|
sys.exit(app.exec())
|