""" PySWMM越水結果を2次元氾濫解析向け点源CSVへ変換するサンプル。 出力CSV形式: datetime, elapsed_min, node_id, x, y, overflow_m3s このCSVをANUGA等の2D浅水流モデル側で読み込み、 各マンホール位置に時系列の流入境界・点源として与えます。 """ from __future__ import annotations import argparse from pathlib import Path import pandas as pd def export_overflow_sources(timeseries_csv: Path, coord_csv: Path, out_csv: Path) -> pd.DataFrame: ts = pd.read_csv(timeseries_csv) coords = pd.read_csv(coord_csv) nodes = ts[ts["object_type"] == "node"].copy() nodes = nodes.rename(columns={"object_id": "node_id"}) nodes["flooding_m3s"] = nodes["flooding_m3s"].fillna(0.0) nodes = nodes[nodes["flooding_m3s"] > 0.0] merged = nodes.merge(coords, on="node_id", how="left") out = merged[[ col for col in ["datetime", "elapsed_min", "node_id", "x", "y", "ground_elevation_m", "flooding_m3s"] if col in merged.columns ]].copy() out = out.rename(columns={"flooding_m3s": "overflow_m3s"}) out_csv.parent.mkdir(parents=True, exist_ok=True) out.to_csv(out_csv, index=False) return out def main() -> None: parser = argparse.ArgumentParser(description="PySWMM越水結果を2D氾濫解析用点源CSVへ変換します。") parser.add_argument("--timeseries", default="../outputs/pyswmm_timeseries.csv") parser.add_argument("--coords", default="../data/manhole_coordinates.csv") parser.add_argument("--out", default="../outputs/overflow_sources_for_2d.csv") args = parser.parse_args() base = Path(__file__).resolve().parent out = export_overflow_sources( (base / args.timeseries).resolve(), (base / args.coords).resolve(), (base / args.out).resolve(), ) print(f"2D点源CSVを出力しました: {(base / args.out).resolve()}") print(out.head().to_string(index=False)) if __name__ == "__main__": main()