|
|
616783fb52
|
feat(reporting.py): 将 Plotly 图表转换为内嵌 HTML 并嵌入报告
mass_balance_report() 函数:
1. 图表→HTML 转换:
- 原代码: 所有 plot_htmls 值为空字符串(图表禁用)
- 修复: 新增 _fig_to_html() 辅助函数,通过 fig.to_html(full_html=False,
include_plotlyjs=True) 将 5 个 Plotly Figure 对象分别转换为
HTML div+script 片段,内嵌完整 Plotly.js 库(~3MB)
对应映射: threed_fig→"3D", krig_fig→"krig",
windrose_fig→"windrose", wind_fig→"wind",
background_fig→"background"
2. CDN→内嵌: include_plotlyjs='cdn' 改为 include_plotlyjs=True,
解决了离线打开 HTML 报告时 'Plotly is not defined' 的 JavaScript 错误,
以及 file:// 协议下无法加载外部 CDN 资源的安全限制
影响范围:HTML 报告大小从 ~170KB 增至 ~15MB,支持完全离线查看,5 张交互式图表均可正常渲染
|
2026-07-10 14:49:30 +08:00 |
|
|
|
4ec46208dd
|
feat(processing_pipelines.py): 启用 3D散点/风玫瑰/风速时序图表创建
两处修改:
1. InSituSensorStrategy.process():
- 原代码: scatter_3d[gas]=None, windrose=None, wind_timeseries=None
- 修复: 调用 plotting.scatter_3d()/windrose()/time_series() 创建实际图表,
每个调用独立 try/except 保护,失败时回退至 blank_figure()
2. 模块导入:
- 新增 import plotly.graph_objects as go
供 Curtain/Spiral 空间策略中的 fig.add_trace(go.Scatter3d(...)) 使用
(该代码此前存在但从未执行,因为 fig 始终为 None)
影响范围:HTML 报告中 3D 飞行轨迹图、风玫瑰图、风速时序图从空白变为正常显示
|
2026-07-10 14:49:22 +08:00 |
|
|
|
5609a8d708
|
feat(pre_processing.py): 启用异常值检测图表生成
remove_outliers() 函数:
- 原代码: fig = None # plotting disabled
- 修复: 调用 plotting.outliers(df, column, name) 生成箱线图,
显示 IQR 方法的异常值检测结果
异常保护:try/except 包裹,绘图失败时回退至 None
|
2026-07-10 14:49:14 +08:00 |
|
|
|
e5f43f0297
|
fix(interpolation.py): 修复 krig_variables 变量先使用后定义的 NameError
ordinary_kriging() 函数存在两个问题:
1. krig_variables 先使用后定义(NameError 被 try/except 静默吞掉):
- 原代码: 第103-114行绘图调用引用了 krig_variables,
但该字典在第121-133行才创建
- 修复: 将 krig_variables 字典构造移至绘图调用之前(第103行之前),
确保 contour_krig()、heatmap_krig()、semivariogram_plot() 可正常获取数据
2. 启用克里金图表输出:
- 原代码: contour_plot = None; grid_plot = None; semivariogram_plot = None
- 修复: 分别调用 plotting.contour_krig()、plotting.heatmap_krig()、
plotting.semivariogram_plot(),每个调用独立 try/except 保护
影响范围:克里金等高线图和热力图从永远空白变为正常显示
|
2026-07-10 14:49:09 +08:00 |
|
|
|
408e1660fc
|
feat(background.py): 启用背景校正图表生成
algorithmic_baseline() 函数:
- 原代码: fig = None # plotting disabled
- 修复: 调用 plotting.background_plotting(df, gas) 生成交互式图表,
显示原始浓度、拟合基线、信号点(红色)和背景点(蓝色圆圈)
异常保护:try/except 包裹,绘图失败时回退至 None
|
2026-07-10 14:49:01 +08:00 |
|
|
|
e3acd46da9
|
feat(plotting.py): 从空壳重写为完整的 Plotly 图表实现
原代码为轻量级存根,所有函数返回 None 以禁用可视化依赖。
本次重写实现了 10 个图表函数:
1. blank_figure() - 返回空占位图(含 'Plot not available' 文本)
2. scatter_3d() - 3D 散点图(飞行轨迹 + 气体浓度着色)
3. scatter_2d() - 2D 散点图
4. time_series() - 时序折线图(风速等)
5. background_plotting() - 背景校正可视化(原始数据/拟合基线/信号点/背景点)
6. windrose() - 风玫瑰图(16 扇区 bar_polar)
7. outliers() - 异常值检测箱线图(IQR 方法)
8. contour_krig() - 克里金插值等高线图(go.Contour + RdBu_r 色标)
注意:np.mgrid 生成 (x_nodes,y_nodes) 形状的数组,xx 沿 axis=0 变化,yy 沿 axis=1 变化,
field 需转置 (.T) 后方可与 Plotly 的 z[y][x] 索引匹配
9. heatmap_krig() - 克里金网格热力图(go.Heatmap + zmid=0 对称色标)
10. semivariogram_plot() - 半变异函数图(实验值散点 + 拟合模型曲线)
11. create_kml_file() - KML 文件生成(保持返回 None,未实现)
所有图表使用 plotly.graph_objects,数据通过参数传入,异常时优雅降级
|
2026-07-10 14:48:55 +08:00 |
|
|
|
d755367df0
|
fix(app.py): 移除异步任务中的全局 Config 状态覆盖
process_data_async() 函数:
- 原代码:调用 Config.update_directories_from_config(config_path) 全局覆盖
Config.UPLOAD_FOLDER 和 Config.OUTPUT_FOLDER 类属性,
然后同步到 app.config 字典
- 问题:多用户并发上传时,任务 A 的 YAML 配置可能覆盖任务 B 正在使用的目录路径,
造成输出文件写入错误目录的竞争条件
- 修复:移除对 Config 类属性的全局覆盖调用,每个任务直接使用
INI 配置的基础目录 + task_id 构建独立的任务目录 (job_upload_dir / job_output_dir),
任务间目录完全隔离
影响范围:并发上传场景下的文件路径安全性
|
2026-07-10 14:48:44 +08:00 |
|
|
|
e16bd2976f
|
fix(data_processor.py): 修复气压 NaN 值未填充导致验证失败的问题
calculate_pressure() 函数:
- 原逻辑:只在 max_samples 截断模式下用平均值填充剩余行的 NaN 气压值,
正常全量计算时若某些高度档位 API 失败(返回 None),NaN 直接传播至数据验证器,
触发 'Column pressure contains NaN values' ValueError,导致任务失败
- 修复:将 NaN 填充逻辑从条件分支中提取为通用处理,
任何时候只要有有效气压值就用其平均值填充所有 NaN 行,
并在统计信息中明确报告填充行数
影响范围:消除因 Open-Meteo API 波动导致的整任务失败
|
2026-07-10 14:48:35 +08:00 |
|
|
|
b7e389c3d7
|
refactor(qiya.py): 重构 Open-Meteo API 网络容错机制
修复连接频繁重置(ConnectionResetError/SSLEOFError)导致气压数据大面积缺失的问题:
1. TCP 连接复用:使用全局 requests.Session() 替代每次新建连接,
避免频繁 SSL 握手导致的 SSLEOFError
2. 指数退避重试:实现 _exponential_backoff_request() 函数,
首次失败后延迟 1s→2s→4s→8s 逐步重试(最多4次),
超时从 30s 递增至 45→60→75→90s
3. LRU 缓存:新增 @lru_cache(maxsize=256) 缓存 _get_pressure_cached(),
坐标四舍五入至4位小数作为缓存键,相邻高度档位的重复请求直接命中缓存
4. 时间回退:当 API 返回数据中无精确匹配时间时,自动取最近小时的
气压值作为回退(替代直接返回 None)
5. 日志改进:区分 ConnectionError/SSLError/HTTPError,失败时明确记录重试信息
效果:预处理耗时从 ~185s 降至 ~25s,气压获取成功率从 83% 升至 100%
|
2026-07-10 14:48:26 +08:00 |
|
|
|
72a20adc87
|
fix(gas.py): 修复理想气体定律温度项重复相加错误
gas_density() 函数第 36 行:
- 原代码: (local_temperature_kelvin + standard_temperature) / standard_temperature
物理错误:T_K 已在第32行完成 °C→K 转换(+273.15),这里又加了一次 273.15,
导致体积修正因子偏大约 2 倍(对 7.4°C 数据:553.7/273.15≈2.03 而非正确的 280.55/273.15≈1.03)
- 修复: local_temperature_kelvin / standard_temperature
符合理想气体定律 V₂ = V₁ × (P₁/P₂) × (T₂/T₁)
影响范围:所有通过 gas_flux_column() 计算的通量值,修复后通量约为原值的 2 倍
|
2026-07-10 14:48:17 +08:00 |
|
|
|
202eb238c7
|
交接修正
|
2026-04-20 14:44:27 +08:00 |
|
|
|
dd47ab5f44
|
常规更新
|
2026-04-20 09:43:21 +08:00 |
|
|
|
729b283f29
|
精简打包之前
|
2026-02-25 11:50:30 +08:00 |
|
|
|
af56c94efe
|
失败任务定时删除
|
2026-02-11 16:28:51 +08:00 |
|
|
|
b9828a1b13
|
重构: 切换存储至SQLite,启用INI配置与API Key校验
|
2026-02-09 17:10:11 +08:00 |
|
|
|
d5edbc0723
|
增加web_api
|
2026-02-05 15:13:54 +08:00 |
|
|
|
443ec09c5c
|
修改readme
|
2026-01-05 09:45:34 +08:00 |
|
|
|
f085d7c5fe
|
Initial commit: GasFlux project with core processing pipelines
|
2026-01-05 09:33:27 +08:00 |
|