日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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–》下載地址。

    - 使用方法

  • 直接運行/制作菜單快捷方式
    這個就不需要說太多了。
  • ./area_cal.bin
  • 界面
    運行后,可以看到工具的界面,主要通過三個tab來設置參數,第一個參數是必須填的,后面兩個tab的參數可以選擇開啟。
    基本參數:
    這里需要設置shp文件位置、選擇濃度字段、輸入需要統計的濃度梯度值。濃度梯度值可以通過右側的‘+’、‘-’、‘清空’三個按鈕來設置,也可以直接在文本框中輸入濃度梯度參數,濃度值之間用英文的逗號, 來間隔。可以把濃度梯度參數復制到Excel或其他文本文件中,方便下次快速使用。

    分段統計參數:

    分段統計是為了在統計時,區分上下游,這樣統計的結果將分為上游和下游兩塊,一般選擇一條經過排污口,且與岸線或者水流方向垂直的分割線。
    分段統計的計算原理是 將網格中心點與分割線兩點分別計算向量,再將兩個向量進行叉乘,因為叉乘結果滿足右手法則。所以可以根據叉乘結果的正負形來判定是上游還是下游。
    長寬計算參數:

    長寬統計需要定義 長度 和寬度 兩個統計方向向量,也可以只定義長度方向,然寬度方向直接垂直與長度方向即可。
    例如,可以在gis軟件中,查看一個低濃度的污染帶范圍,選擇兩個點坐標,輸入進去。參數文本框的用法與前面一致。

    點擊計算,稍加等待就可以得到數據了。

    在Excel的空白處,右鍵粘貼就可以看到統計好的數據結果了。

    稍加整理,就可以顯示完美了。
  • 另外
    該工具能夠保存上一次的參數,方便下次使用的時候直接調用。
  • 總結

    以上是生活随笔為你收集整理的DHI Mike 后处理工具——污染带面积、长度、宽度统计工具的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。