以在线设备拓扑关系为基础的污染溯源算法

概述

在水质分析过程中,污染溯源是无法绕开的部分,当一个在线设备表现出污染特征时,我们往往希望快速知道是什么原因造成的。日常数据分析往往利用在设备、水文网络基础上,往上溯源,逐一找到相关的站点或者排污口,从而判断出污染来源,这种方式适用于点源或者上游有在线监测的断面,这种方法虽然有效,但效率低下,那么如何将其自动化呢?

为了实现高效的水质污染溯源,首要任务是建立一个详细的河流与在线监测设备的数字模型。这一模型由两部分组成:首先是河流关系表,它记录了河流的上下游关系、干支流等级等信息,为理解水流路径提供了基础;其次是在线设备关系表,该表详细列出了不同类型的监测设备(如水质监测站、排污口监测点)与河流的具体关联,有助于识别潜在的污染来源。

本文档介绍了如何使用 Python 实现水质溯源算法。通过构建河流和在线设备拓扑关系表,利用算法,我们能够根据任意站点的信息,追踪其上游相关的设备。在通过滞后相关分析可初步实现追踪溯源。
这是污染溯源的第一步,今天先介绍是如何实现的,如果你有更好的方法,也请留言指正。

河流网络与在线设备关系概化图

河流和在线设备拓扑构建关系

关系框架

需要构建 2 张表,包含 2 种设备类型,一张河流关系表,表示河流的上下游关系,岸线关系,干支流关系;一张设备表,表示河道在线监测设备、排污口在线监测设备这两种设备与河流的关联关系。

河流关系表

参数 描述
序号 记录编号
Mn 河流唯一编码
Name 河流名称
河流级别 明确干支流关系,干流为 0,一级支流为 1,以此类推
上级河流 进一步明确干支流关系,便于理解较深的层次关系
同级顺序 明确同一河流级别下的上下游关系,从 1 往后排序
流域名称 同一流域才能进行分析
类型 河流为 river
岸线 明确左右岸位置
河流关系 与站点类型对应,河流为 base、排污口为 to、河流站点为 on

在线设备关系表

参数 描述
序号 记录编号
Mn 唯一编码
站点名称 设备名称
所在河流 设备所在的河流名称
河流关系 设备与河流的关系
同级顺序 在同一条河流上,用同级顺序表示上下游关系
上方支流 在线设备上有最近的支流名称,结合同级顺序可以定义在线设备在水文关系中的位置
流域名称 同一流域才能进行分析
岸线关系 明确左右岸位置
站点类型 设备类型
所在河流ID 设备所在的河流唯一编码

溯源逻辑

步骤

  1. 获取目标站点信息
    • 根据站点名称查找目标站点的所有信息。
    • 获取站点所在的河流ID和上方支流。
  2. 获取上方支流的河流信息
    • 获取上方支流的河流级别和同级顺序。
  3. 获取所有同级且同级顺序小于等于上方支流的河流
    • 查找所有与上方支流同级别且同级顺序小于等于上方支流的河流。
  4. 递归获取下一级支流
    • 对于每条找到的河流,递归地查找其下级河流,直到找到所有相关河流。
  5. 获取所有相关支流上的站点
    • 根据找到的所有相关河流ID,获取这些河流上的站点信息,形成列表A。
  6. 获取同一条河流上同级顺序小于目标站点的站点
    • 查找同一条河流上同级顺序小于目标站点的站点,形成列表B。
  7. 合并列表A和列表B
    • 去除重复项,得到最终的相关站点列表C。
  8. 匹配列表C与在线设备关系表
    • 获取最终相关在线设备表,输出所有参数。

代码实现

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
# @Time : 2024/10/29 下午4:57
# @Author : 陈文茂
# @File : traceability.py
# @Software: PyCharm
# @tags : 水质溯源 水文分析
# @Desc : 水质溯源算法
"""
import pandas as pd

# 确保站点ID和河流ID为文本格式
def preprocess_data(rivers_df, stations_df):
rivers_df['mn'] = rivers_df['mn'].astype(str)
rivers_df['上级河流'] = rivers_df['上级河流'].astype(str)
stations_df['mn'] = stations_df['mn'].astype(str)
stations_df['所在河流ID'] = stations_df['所在河流ID'].astype(str)
return rivers_df, stations_df


def get_upstream_stations(station_name, rivers_df, stations_df):
# 获取目标站点信息
target_station = stations_df[stations_df['站点名称'] == station_name]
if target_station.empty:
return "No station found with the provided name."

target_station = target_station.iloc[0]
target_river_id = target_station['所在河流ID']
up_tributary = target_station['上方支流']
# 获取上方支流的河流信息
up_tributary_info = rivers_df[rivers_df['name'] == up_tributary].iloc[0]
up_tributary_level = up_tributary_info['河流级别']
up_tributary_order = up_tributary_info['同级顺序']

# 获取所有同级且同级顺序小于等于上方支流的河流
upstream_rivers = rivers_df[
(rivers_df['河流级别'] == up_tributary_level) &
(rivers_df['同级顺序'] <= up_tributary_order)
]

# 获取所有相关支流的集合
related_rivers = set()
for _, row in upstream_rivers.iterrows():
related_rivers.add(row['mn'])
# 递归获取下一级支流
related_rivers.update(get_downstream_rivers(row['mn'], rivers_df))

# 获取所有相关支流上的站点
related_stations_a = stations_df[stations_df['所在河流ID'].isin(related_rivers)]

# 获取同一条河流上同级顺序小于目标站点的站点
same_river_stations = stations_df[
(stations_df['所在河流ID'] == target_river_id) &
(stations_df['同级顺序'] < target_station['同级顺序'])
]

# 合并列表A和列表B
related_stations_c = pd.concat([related_stations_a, same_river_stations]).drop_duplicates()

# 返回结果
return related_stations_c


def get_downstream_rivers(river_id, rivers_df):
downstream_rivers = rivers_df[rivers_df['上级河流'] == river_id]
downstream_ids = set(downstream_rivers['mn'])

for _, row in downstream_rivers.iterrows():
downstream_ids.update(get_downstream_rivers(row['mn'], rivers_df))

return downstream_ids


if __name__ == '__main__':
rivers_df = pd.read_excel('河流设备拓补关系.xlsx', sheet_name='河流关系表')
stations_df = pd.read_excel('河流设备拓补关系.xlsx', sheet_name='在线设备关系表')
rivers_df, stations_df = preprocess_data(rivers_df, stations_df)

# 示例:查找影响“凤凰湖工业园区污水处理厂排口下游”的设备
result1 = get_upstream_stations("设备a", rivers_df, stations_df)
print(result1)

结果

结果预览

总结

通过上述方法,我们已经能够有效地识别出与目标站点水质变化相关的上游设备。一旦建立了详尽的设备清单,就可以迅速锁定潜在的污染源。为进一步提高溯源精度,后续还将通过相关性分析筛选出与水质异常关联度最高的设备。此外,利用GIS技术进行的空间分析也是一种有效的补充手段,它可以直观地展示各站点间的地理位置关系,帮助我们更准确地评估站点间的影响程度。
需要注意的是,本文所介绍的方法侧重于基于网络结构的溯源分析,可能未能充分反映站点间的实际距离因素。因此,在某些情况下,如果污染源与受影响站点相距甚远,本方法可能难以直接揭示二者之间的关联。然而,这并不意味着该方法不具备价值;相反,它为污染溯源提供了一种新的视角和解决方案。
除了溯源分析之外,污染扩散路径的追踪同样重要。借助已构建的设备拓扑关系表,我们可以通过算法模拟污染物在水系中的传播过程,预测其可能的影响范围。这不仅有助于事前预防,也能为事后处理提供科学依据。未来的工作中,我们将继续深入研究并完善这些算法,以期为水质管理和环境保护提供更为强大的技术支持。

BY

纯个人经验,如有帮助,请收藏点赞,如需转载,请注明出处。
微信公众号:环境猫 er
CSDN : 细节处有神明
个人博客: https://maoyu92.github.io/


以在线设备拓扑关系为基础的污染溯源算法
https://maoyu92.github.io/2024/10/29/02 生态环境/以设备网络关系为基础的水质在线设备溯源算法/
作者
陈文茂
发布于
2024年10月29日
许可协议