jimmy60504 commited on
Commit
cbfa1d2
·
1 Parent(s): 0a69129

add user-defined Vs30 input to intensity prediction and update related functions

Browse files
Files changed (1) hide show
  1. app.py +23 -7
app.py CHANGED
@@ -22,6 +22,9 @@ else:
22
  # 載入 Vs30 資料集(從 Hugging Face 下載)
23
  from huggingface_hub import hf_hub_download
24
 
 
 
 
25
  try:
26
  logger.info("從 Hugging Face 載入 Vs30 資料...")
27
  vs30_file = hf_hub_download(
@@ -38,7 +41,8 @@ try:
38
  tree = cKDTree(vs30_table[["lat", "lon"]])
39
  logger.info("Vs30 資料載入完成")
40
  except Exception as e:
41
- logger.error(f"Vs30 資料載入失敗: {e}")
 
42
 
43
  # 載入目標測站
44
  target_file = "station/eew_target.csv"
@@ -367,9 +371,14 @@ def signal_processing(waveform):
367
  return data
368
 
369
 
370
- def get_vs30(lat, lon):
 
 
 
 
371
  distance, i = tree.query([float(lat), float(lon)])
372
  vs30 = vs30_table.iloc[i]["Vs30"]
 
373
  return float(vs30)
374
 
375
 
@@ -454,7 +463,7 @@ def plot_intensity_map(pga_list, target_names):
454
  return fig
455
 
456
 
457
- def predict_intensity(event_name, start_time, end_time, lon, lat):
458
  # 1. 載入波形
459
  times, data, sampling_rate = load_waveform(event_name)
460
 
@@ -472,8 +481,8 @@ def predict_intensity(event_name, start_time, end_time, lon, lat):
472
  [[waveform_processed, waveform_processed, waveform_processed]])
473
  waveform_3c = waveform_3c.transpose(0, 2, 1) # (1, 3000, 3)
474
 
475
- # 準備測站資訊
476
- vs30 = get_vs30(lat, lon)
477
  station_info_input = np.array([[lat, lon, 100, vs30]]) # elevation 假設 100m
478
 
479
  # 準備目標測站資訊
@@ -482,7 +491,7 @@ def predict_intensity(event_name, start_time, end_time, lon, lat):
482
  for target in target_dict[:25]: # 限制25個目標
483
  target_list.append([target["latitude"], target["longitude"],
484
  target["elevation"],
485
- get_vs30(target["latitude"], target["longitude"])])
486
  target_names.append(target["station"])
487
 
488
  # 組合成 tensor
@@ -535,6 +544,13 @@ with gr.Blocks(title="TTSAM 震度預測系統") as demo:
535
  lon_input = gr.Number(value=121.5, label="經度")
536
  lat_input = gr.Number(value=24.0, label="緯度")
537
 
 
 
 
 
 
 
 
538
  predict_btn = gr.Button("🔮 執行預測", variant="primary")
539
 
540
  # 右側:震度分布圖
@@ -552,7 +568,7 @@ with gr.Blocks(title="TTSAM 震度預測系統") as demo:
552
  # 綁定事件
553
  predict_btn.click(
554
  fn=predict_intensity,
555
- inputs=[event_dropdown, start_slider, end_slider, lon_input, lat_input],
556
  outputs=[waveform_plot, intensity_plot, stats_output]
557
  )
558
 
 
22
  # 載入 Vs30 資料集(從 Hugging Face 下載)
23
  from huggingface_hub import hf_hub_download
24
 
25
+ tree = None
26
+ vs30_table = None
27
+
28
  try:
29
  logger.info("從 Hugging Face 載入 Vs30 資料...")
30
  vs30_file = hf_hub_download(
 
41
  tree = cKDTree(vs30_table[["lat", "lon"]])
42
  logger.info("Vs30 資料載入完成")
43
  except Exception as e:
44
+ logger.warning(f"Vs30 資料載入失敗: {e}")
45
+ logger.warning("將使用預設 Vs30 值 (600 m/s)")
46
 
47
  # 載入目標測站
48
  target_file = "station/eew_target.csv"
 
371
  return data
372
 
373
 
374
+ def get_vs30(lat, lon, user_vs30=600):
375
+ if tree is None or vs30_table is None:
376
+ # 如果 Vs30 資料未載入,使用使用者輸入的值
377
+ logger.info(f"使用使用者輸入的 Vs30 值 ({user_vs30} m/s) for ({lat}, {lon})")
378
+ return float(user_vs30)
379
  distance, i = tree.query([float(lat), float(lon)])
380
  vs30 = vs30_table.iloc[i]["Vs30"]
381
+ logger.info(f"從資料庫查詢到 Vs30 值 ({vs30} m/s) for ({lat}, {lon})")
382
  return float(vs30)
383
 
384
 
 
463
  return fig
464
 
465
 
466
+ def predict_intensity(event_name, start_time, end_time, lon, lat, vs30_input):
467
  # 1. 載入波形
468
  times, data, sampling_rate = load_waveform(event_name)
469
 
 
481
  [[waveform_processed, waveform_processed, waveform_processed]])
482
  waveform_3c = waveform_3c.transpose(0, 2, 1) # (1, 3000, 3)
483
 
484
+ # 準備測站資訊(使用使用者輸入的 Vs30 或資料庫值)
485
+ vs30 = get_vs30(lat, lon, vs30_input)
486
  station_info_input = np.array([[lat, lon, 100, vs30]]) # elevation 假設 100m
487
 
488
  # 準備目標測站資訊
 
491
  for target in target_dict[:25]: # 限制25個目標
492
  target_list.append([target["latitude"], target["longitude"],
493
  target["elevation"],
494
+ get_vs30(target["latitude"], target["longitude"], vs30_input)])
495
  target_names.append(target["station"])
496
 
497
  # 組合成 tensor
 
544
  lon_input = gr.Number(value=121.5, label="經度")
545
  lat_input = gr.Number(value=24.0, label="緯度")
546
 
547
+ with gr.Row():
548
+ vs30_input = gr.Number(
549
+ value=600,
550
+ label="Vs30 (m/s)",
551
+ info="剪力波速度(預設 600 m/s,若有 Vs30 資料會自動覆蓋)"
552
+ )
553
+
554
  predict_btn = gr.Button("🔮 執行預測", variant="primary")
555
 
556
  # 右側:震度分布圖
 
568
  # 綁定事件
569
  predict_btn.click(
570
  fn=predict_intensity,
571
+ inputs=[event_dropdown, start_slider, end_slider, lon_input, lat_input, vs30_input],
572
  outputs=[waveform_plot, intensity_plot, stats_output]
573
  )
574