DHI Mike 后处理工具——污染带面积、长度、宽度统计工具
- 需求
在用Mike21 或者Mike3 做完模型計算之后,經常需要統計污染帶的面積、長度、寬度。最初都是在ArcGIS中手動統計,費時費力。之前已經分別用c#、python實現過數據的導出、累計,以及面積統計功能,但是長寬統計一直沒想好怎么實現。
最近因為疫情,封控在家,突然想到有時間更新一波統計工具了。
- 實現
模型計算結果是一堆帶濃度值的三角形(或多邊形),而污染帶一般都是隨著水流輸移的,所以一般都是平行于岸線,所以只需要定義一個平行于岸線的直線,將所有大于指定濃度值的三角形投影到直線上(即三角形頂點到直線的垂足集合),再將所有投影線段合并成若干個互不覆蓋的線段,再統計線段長度即可。
- 準備知識
由于不想import大量的包,所以我打算自己編寫一個Point類,一個Line 類、一個Polygon類、一個Vector類。導入太多的包,而實際只使用一小部分,但是打包的時候會被全部塞進去,導致最終的包非常臃腫、低效。目前的包由于PyQT5已經變得比較臃腫了。
從維基百科中可以找到相關的公式,改成python很簡單,也有很多人已經實現了。
內容在上面已經實現了。需要注意的是,由于面積的結果受到多邊形點的順序影響,可能會出現負值,所以在輸出的時候需要添加abs(),以獲取絕對值。但是在幾何中心計算時,需要跟面積保持一樣的點順序,所以這里的面積需要直接用前面的計算結果,而不是絕對值。
網上的方法大多是先求出直線的方程 y=ax+b中的a、b值,再利用公式計算垂足。但是這里最大的問題是,可能存在y=b,a不存在的情況。所以需要分情況討論,比較繁瑣。其實可以利用向量來計算,規避斜率不存在的特殊情況。
如下圖所示,要求出P3 到過P1、P2的直線的垂足P0,只需要計算出向量 P1P2→?P1P3→=∣P1P2→∣?∣P1P3→∣?cos?θ=∣P1P2→∣?∣P1P0→∣\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}|P1?P2???P1?P3??=∣P1?P2??∣?∣P1?P3??∣?cosθ=∣P1?P2??∣?∣P1?P0??∣
P1P0→=∣P1P0→∣∣P1P2→∣?P1P2→=(P1P2→?P1P3→)∣P1P2→∣2?P1P2→\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}P1?P0??=∣P1?P2??∣∣P1?P0??∣??P1?P2??=∣P1?P2??∣2(P1?P2???P1?P3??)??P1?P2??
4. 判斷上下游(向量法)
一般網絡上的判斷上下游的方法也是通過計算直線的方程y=ax+b,再將待計算點帶入y=a x0+b,然后將計算的y與y0比較大小,這樣也面臨斜率不存在問題。
利用向量叉積可以計算判斷上下游。還是用上圖中的例子。
P3P1→×P3P2→=(0,0,z3)\overrightarrow{P_3P_1} \times \overrightarrow{P_3P_2} =(0,0,z_3)P3?P1??×P3?P2??=(0,0,z3?)
由于點與線都在z=0z=0z=0的平面,所以向量叉積的結果只有z3z_3z3?,叉積計算方法見維基百科。所以如果z3>0z_3>0z3?>0,則表示在上游,反之在下游。
- 成果
經過幾天的Python代碼編寫,以及編譯,最終實現了自己的想法。由于筆記本裝的是deepin系統,沒有辦法打包成exe,只能打包成Linux上可以運行的appimage–》下載地址。
- 使用方法
這個就不需要說太多了。
運行后,可以看到工具的界面,主要通過三個tab來設置參數,第一個參數是必須填的,后面兩個tab的參數可以選擇開啟。
基本參數:
這里需要設置shp文件位置、選擇濃度字段、輸入需要統計的濃度梯度值。濃度梯度值可以通過右側的‘+’、‘-’、‘清空’三個按鈕來設置,也可以直接在文本框中輸入濃度梯度參數,濃度值之間用英文的逗號, 來間隔。可以把濃度梯度參數復制到Excel或其他文本文件中,方便下次快速使用。
分段統計參數:
分段統計是為了在統計時,區分上下游,這樣統計的結果將分為上游和下游兩塊,一般選擇一條經過排污口,且與岸線或者水流方向垂直的分割線。
分段統計的計算原理是 將網格中心點與分割線兩點分別計算向量,再將兩個向量進行叉乘,因為叉乘結果滿足右手法則。所以可以根據叉乘結果的正負形來判定是上游還是下游。
長寬計算參數:
長寬統計需要定義 長度 和寬度 兩個統計方向向量,也可以只定義長度方向,然寬度方向直接垂直與長度方向即可。
例如,可以在gis軟件中,查看一個低濃度的污染帶范圍,選擇兩個點坐標,輸入進去。參數文本框的用法與前面一致。
點擊計算,稍加等待就可以得到數據了。
在Excel的空白處,右鍵粘貼就可以看到統計好的數據結果了。
稍加整理,就可以顯示完美了。
該工具能夠保存上一次的參數,方便下次使用的時候直接調用。
總結
以上是生活随笔為你收集整理的DHI Mike 后处理工具——污染带面积、长度、宽度统计工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地摊赚钱秘籍(视频)+地摊攻略玩法(新鲜
- 下一篇: 小D课堂-nexus