随笔 - 14, 文章 - 0, 评论 - 0, 阅读 - 209

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

swmm.api学习

Posted on   小熊_努力学习版  阅读(72)  评论(0编辑  收藏  举报

api: 应用程序编程接口(application programming interface)。
swmm.api:是一个开源的模块,主要作用是实现python与swmm的交互作用,通过swmm.api对swmm的输入(inp)、输出(out)和报告文件(rpt)文件进行提取和处理。
1. inp文件操作
对swmm的模型文件(.inp)进行读取操作(manipulate),将可运行的inp文件进行读取操作,然后获取输入文件中的信息。


  • 获取管道长度
  • 获取节点管道拓扑关系连接关系
  • 获取节点高程空间数据
  • 获取子汇水区域的面积
  • ...............
    swmm_api中主要两种方式读取inp文件(如果没有从swmm_api中导入下面两个函数,则需要加上前缀swmm_api.SwmmInput(),swmm_api.read_inp_file())

  • SwmmInput('inp_path')
  • read_inp_file('inp_path')

2. Swmm交互运行
可以通过swmm5_run('inp_path','rpt_path','out_path')直接在python中运行swmm模型#inp地址、报告文件地址、输出文件地址。


在python中直接运行(run)swmm文件,然后对输出文件rpt、out文件进行指定位置保存,以便后续的数据读取和处理,可以良好的实现python与swmm的交互。
其中有一个两个问题,1.swmm_toolkit模块安装问题。2. swmm5_run('inp_path')的地址问题。3.采用try:except来抓取运行错误,保证代码的稳定性


  • 运行swmm5_run('')会出现错误,大概率是由于swmm_toolkit模块未安装,而swmm_toolkit安装又会出错,这个是时候大概率是该模块不兼容当前python版本,可以采用较低版本的python如python3.10即可解决。
  • swmm5_run('inp_path')inp的地址必须采用绝对地址,否则出现无法打开inp文件的情况。
  • 增强代码稳健性
try:
swmm5_run(r'绝对地址')
print('成功运行swmm模型')
except Exception as e
print(f'错误为:{e}')

可以采用这种方式增强代码稳健性,其中Exception为python所有的错误类型,意思为抓取所有出现的错误。

3.Out文件操作
Out文件为二进制文件,采用python对其中的数据进行提取处理和计算非常的方便。out文件中储存了inp模型的全部运行结果,按照设定的输出时间步长,在给定模拟时间范围内的全部结果,包括节点水深时间序列,管道水深时间序列。通常对out读取的文件转换为pandas的frame数据类型,也就是二维数据表格(类似excel),再进行处理更为方便。与读取inp文件相同,主要有两种操作方式SwmmOutput和read_out_flie()


from swmm_api import SwmmOutput, read_out_file
out1 = SwmmOutput(out_path)
df = out1.to_frame()# 转换成DataFrame格式(pandas的二维数据表格形式、类似excel表格,后续能够很好的对其进行处理、比如筛选、计算和可视化。)
print('节点22的水深时间序列为:\n',out1.get_part('node','N22','depth'))# 对输出文件的节点22水深进行读取

4. rpt报告文件操作
报告文件是swmm模型生成的总结报告,而out文件是对模型的详细输出(步长为设定的1min或者其他步长),因此rpt报告文件的内容要比out输出文件的内容要少

  • SwmmReport(rpt_path)
  • read_rpt_file(rpt_path)

from swmm_api import SwmmReport, read_rpt_file
rpt1 = SwmmReport(rpt_path)
rpt1_flooding_summary = rpt1.node_flooding_summary # 读取报告文件中节点的洪峰信息

完整示例代码

点击查看代码
## 读取inp文件SwmmInput 或 read_inp_file,
"""
可以从inp文件中读取输入数据,包括:节点[JUNCTIONS]坐标、高程;时间序列数据[TIMESERIES],比如降雨数据、水泵数据,
子catchment的面积[SUBCATCHMENTS]、
"""
from swmm_api.input_file.section_labels import JUNCTIONS # 导入包swmm.api每部分标签中的JUNCTIONS标签。
import swmm_api as sw
from swmm_api import swmm5_run
inp1 = sw.SwmmInput('swmm/Xaut_SWMM_LID.inp')
inp2 = sw.SwmmInput.read_file('swmm/Xaut_SWMM_LID.inp')
inp3 = sw.read_inp_file("swmm/Xaut_SWMM_LID.inp")
print(inp1.keys())
# 读取某节点的高程,同样也可以通过这样的方式对节点的高程进行写入,同理,对于inp文件中的任何Section都可以进行相同的操作,
Junction_22_elevation = inp1[JUNCTIONS]['N22'].elevation
# 也可以这样写Junction_22_elevation = inp1.JUNCTIONS['NodeName'].elevation
# 还可以写成Junction_22_elevation = inp1.JUNCTIONS['NodeName'][elevation]
print(Junction_22_elevation)
## 运行swmm的inp文件,可以直接在python中,直接运行swmm模型文件。
"""
特别注意在python中交互运行swmm的inp文件时,如果采用swmm5_run很容易出现提醒报错,未安装swmm-tookit文件,这个时候
在安装该模块的时候,会很容易出错,这个模块暂时不支持python3.13版本,可以采用python3.10或者采用下面的子线程subprocess来运行文件
"""
import os
print(os.getcwd())
from swmm_api import swmm5_run
import subprocess
# 这里特别有问题,如果采用的是相对路径,那么会报错,采用绝对路径就可以了,分别是inp、rpt、out的路径、其中inp必须存在
# rpt和out文件可以不写,写出路径,可以自动根据运行结果生成文件到对应路径
inp_path = r"D:\1.softwares\PyCharm 2024.1\1.Myproject\code\swmm\Xaut_SWMM_LID.inp"
rpt_path = r"D:\1.softwares\PyCharm 2024.1\1.Myproject\code\swmm\Xaut_SWMM_LID.rpt"
out_path = r"D:\1.softwares\PyCharm 2024.1\1.Myproject\code\swmm\Xaut_SWMM_LID.out"
swmmExe = r"D:\1.softwares\1.SWMM-english 5.2.4 (64-bit)\epaswmm5.exe"
#subprocess.run([swmmExe,'swmm/Xaut_SWMM_LID.inp'], check = True)
try:
swmm5_run(inp_path, rpt_path, out_path)
except Exception as e
print(f'运行出错:{e}')
## 读取swmm输出文件OUT
"""
由于SWMM的Out文件采用的是二进制文件,无法直接用记事本打开采用excel或者采用与读取inp文件相同的函数来操作,因此需要
区别于读取inp文件的函数来读取out文件。与read_inp_file函数一样,也可以采用swmm_api中的SwmmOutput函数和read_out_file
两个函数来读取out文件。
"""
from swmm_api import SwmmOutput, read_out_file
out1 = SwmmOutput(out_path)
df = out1.to_frame()# 转换成DataFrame格式(pandas的二维数据表格形式、类似excel表格,后续能够很好的对其进行处理、比如筛选、计算和可视化。)
print(out1.get_part('node','N22','depth'))# 对输出文件的节点22水深进行读取
## 对报告文件进行读取
"""
报告文件是swmm模型生成的总结报告,而out文件是对模型的详细输出(步长为设定的1min或者其他步长),
因此报告文件的内容要比out文件的内容要少。
"""
from swmm_api import SwmmReport, read_rpt_file
rpt1 = SwmmReport(rpt_path)
rpt1_flooding_summary = rpt1.node_flooding_summary # 读取报告文件中节点的洪峰信息

5. swmm_api中模块总结(持续更新ing)

  • swmm_api.input_file.section_labels: swmm.api包中的input_file模块包含子模块section_labels,这个子模块主要是对inp文件中的各个部分数据进行结构化,通过字典的方式储存,键采用节点、子汇水区域名字,值为对应数值。在使用时建议导入所需的inp文件中各个部分的常量,例如:
# 导入JUNCTION常量
from swmm_api.input_file.section_labels import JUNCTIONS
node_section1 = inp[JUNCTIONS]
# 不导入JUNCTION常量也可以采用字符串"JUNCTIONS"对inp中的节点部分数据进行操作,但这样可读性差。
from swmm_api import read_inp_file
inp = read_inp_file(r"inp文件地址")
node_section2 = inp['JUNCTIONS']
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示