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