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']
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统