DHI Mike 后处理工具——污染带面积、长度、宽度统计工具

- 需求

在用Mike21 或者Mike3 做完模型计算之后,经常需要统计污染带的面积、长度、宽度。最初都是在ArcGIS中手动统计,费时费力。之前已经分别用c#、python实现过数据的导出、累计,以及面积统计功能,但是长宽统计一直没想好怎么实现。

最近因为疫情,封控在家,突然想到有时间更新一波统计工具了。

- 实现

模型计算结果是一堆带浓度值的三角形(或多边形),而污染带一般都是随着水流输移的,所以一般都是平行于岸线,所以只需要定义一个平行于岸线的直线,将所有大于指定浓度值的三角形投影到直线上(即三角形顶点到直线的垂足集合),再将所有投影线段合并成若干个互不覆盖的线段,再统计线段长度即可。

- 准备知识

由于不想import大量的包,所以我打算自己编写一个Point类,一个Line 类、一个Polygon类、一个Vector类。导入太多的包,而实际只使用一小部分,但是打包的时候会被全部塞进去,导致最终的包非常臃肿、低效。目前的包由于PyQT5已经变得比较臃肿了。

  1. 多边形面积计算
    维基百科中可以找到相关的公式,改成python很简单,也有很多人已经实现了。
  2. 多边形行心(几何中心)计算
    内容在上面已经实现了。需要注意的是,由于面积的结果受到多边形点的顺序影响,可能会出现负值,所以在输出的时候需要添加abs(),以获取绝对值。但是在几何中心计算时,需要跟面积保持一样的点顺序,所以这里的面积需要直接用前面的计算结果,而不是绝对值。
  3. 点到直线的垂足计算(向量法)
    网上的方法大多是先求出直线的方程 y=ax+b中的a、b值,再利用公式计算垂足。但是这里最大的问题是,可能存在y=b,a不存在的情况。所以需要分情况讨论,比较繁琐。其实可以利用向量来计算,规避斜率不存在的特殊情况。
    如下图所示,要求出P3 到过P1、P2的直线的垂足P0,只需要计算出向量 P 1 P 2 → ⋅ P 1 P 3 → = ∣ P 1 P 2 → ∣ ⋅ ∣ P 1 P 3 → ∣ ⋅ cos ⁡ θ = ∣ P 1 P 2 → ∣ ⋅ ∣ P 1 P 0 → ∣ \overrightarrow{P_1P_2} \cdot \overrightarrow{P_1P_3} =| \overrightarrow{P_1P_2} |\cdot |\overrightarrow{P_1P_3}|\cdot \cos\theta=| \overrightarrow{P_1P_2} |\cdot |\overrightarrow{P_1P_0}| P1P2 P1P3 =P1P2 P1P3 cosθ=P1P2 P1P0
    P 1 P 0 → = ∣ P 1 P 0 → ∣ ∣ P 1 P 2 → ∣ ⋅ P 1 P 2 → = ( P 1 P 2 → ⋅ P 1 P 3 → ) ∣ P 1 P 2 → ∣ 2 ⋅ P 1 P 2 → \overrightarrow{P_1P_0}=\frac{|\overrightarrow{P_1P_0}|}{|\overrightarrow{P_1P_2}|}\cdot\overrightarrow{P_1P_2}=\frac{(\overrightarrow{P_1P_2} \cdot \overrightarrow{P_1P_3})}{|\overrightarrow{P_1P_2}|^2}\cdot\overrightarrow{P_1P_2} P1P0 =P1P2 P1P0 P1P2 =P1P2 2(P1P2 P1P3 )P1P2

在这里插入图片描述
4. 判断上下游(向量法)
一般网络上的判断上下游的方法也是通过计算直线的方程y=ax+b,再将待计算点带入y=a x0+b,然后将计算的y与y0比较大小,这样也面临斜率不存在问题。
利用向量叉积可以计算判断上下游。还是用上图中的例子。
P 3 P 1 → × P 3 P 2 → = ( 0 , 0 , z 3 ) \overrightarrow{P_3P_1} \times \overrightarrow{P_3P_2} =(0,0,z_3) P3P1 ×P3P2 =(0,0,z3)
由于点与线都在 z = 0 z=0 z=0的平面,所以向量叉积的结果只有 z 3 z_3 z3,叉积计算方法见维基百科。所以如果 z 3 > 0 z_3>0 z3>0,则表示在上游,反之在下游。

- 成果

经过几天的Python代码编写,以及编译,最终实现了自己的想法。由于笔记本装的是deepin系统,没有办法打包成exe,只能打包成Linux上可以运行的appimage–》下载地址

- 使用方法

  1. 直接运行/制作菜单快捷方式
    这个就不需要说太多了。
./area_cal.bin 
  1. 界面
    运行后,可以看到工具的界面,主要通过三个tab来设置参数,第一个参数是必须填的,后面两个tab的参数可以选择开启。
    基本参数:
    这里需要设置shp文件位置、选择浓度字段、输入需要统计的浓度梯度值。浓度梯度值可以通过右侧的‘+’、‘-’、‘清空’三个按钮来设置,也可以直接在文本框中输入浓度梯度参数,浓度值之间用英文的逗号, 来间隔。可以把浓度梯度参数复制到Excel或其他文本文件中,方便下次快速使用。
    在这里插入图片描述
    分段统计参数:
    在这里插入图片描述
    分段统计是为了在统计时,区分上下游,这样统计的结果将分为上游和下游两块,一般选择一条经过排污口,且与岸线或者水流方向垂直的分割线。
    分段统计的计算原理是 将网格中心点与分割线两点分别计算向量,再将两个向量进行叉乘,因为叉乘结果满足右手法则。所以可以根据叉乘结果的正负形来判定是上游还是下游。
    长宽计算参数:
    在这里插入图片描述
    长宽统计需要定义 长度 和宽度 两个统计方向向量,也可以只定义长度方向,然宽度方向直接垂直与长度方向即可。
    例如,可以在gis软件中,查看一个低浓度的污染带范围,选择两个点坐标,输入进去。参数文本框的用法与前面一致。
    在这里插入图片描述
    点击计算,稍加等待就可以得到数据了。
    在这里插入图片描述
    在Excel的空白处,右键粘贴就可以看到统计好的数据结果了。
    在这里插入图片描述
    稍加整理,就可以显示完美了。
    在这里插入图片描述
  2. 另外
    该工具能够保存上一次的参数,方便下次使用的时候直接调用。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值