?

Python在水位-流量關系曲線中的運用

2022-05-23 07:47方壽軍
中國應急管理科學 2022年2期
關鍵詞:水位流量

方壽軍

摘 要:天然河道水位-流量關系曲線計算方法和計算過程都比較簡單,主要是采用曼寧公式進行計算,其關鍵工作是量取不同水位下的面積和濕周,通過面積和濕周計算出天然河槽的水力半徑。傳統計算過程中需要每個水位量取一次過水面積和對應的濕周,人工量取過程比較繁瑣,工作量和計算密度有很大關系,人工量取過程都是重復的機械式操作,利用當下比較流行的Python語言結合pyautocad庫,將這個繁瑣過程交給計算機來處理,實現水位-流量關系曲線的自動計算。

關鍵詞:水位;流量;水力半徑;Python

引言:天然河道水位流量關系曲線計算比較簡單,主要就是量取不同水位下的面積和濕周,但是過程比較繁瑣,工作量和計算密度有很大關系,傳統計算過程中需要每個水位量取一次過水面積和濕周[1],利用計算機編程可以將這個繁瑣過程交給計算機來處理,本文采用當下較流行的Python語言來實現這個過程,和C#語言做比較,更簡單、更高效、更實用。

Python是由荷蘭數學和計算機科學研究學會的吉多·范羅蘇姆于1990 年代初設計。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平臺上寫腳本和快速開發應用的編程語言 2021年10月,語言流行指數的編譯器Tiobe將Python加冕為最受歡迎的編程語言,20年來首次將其置于Java、C和JavaScript之上,Python廣泛開源的第三方庫是其開發效率高的主要原因[2]。

此次天然河道水位流量關系曲線計算的開發語言選擇也是由于Python語言的熱度以及其開發的高效性。采用Python對CAD進行二次開發,可用的庫不多,主要有pyautocad、pywin32、ezdxf、dxfgrabber、dxfwrite以及gdal,其中pyautocad通用性、易用性較好一些,pyautocad庫由俄羅斯工程師Roman Haritonov開發,用于簡化使用 Python 語言書寫 AutoCAD ActiveX Automation 腳本,但是,這個庫從2015年至今沒有更新過。

天然河道水位流量關系曲線計算采用的是重繪法進行計算,主要思路是先讀取已知的河槽斷面,然后根據河槽判斷最高點和最低點以及倒數第二高點,從最低點開始計算,直到計算至倒數第二高點,這樣保證河槽有效斷面上都能循環到,然后判斷河槽寬度,按照河槽寬度來確定重繪河槽的范圍[3]。

獲取已知河槽的坐標信息采用pyautocad庫也很簡單,拾取河槽線,這個線可以是多段線(Polyline),也可以是三維多段線(AcDb3dPolyline),通過線的屬性ObjectName獲取其類型進行判別和過濾,然后通過Coordinates屬性獲取其頂點集合,Polyline和AcDb3dPolyline不同之處在于前者的每一個點只有兩個元素(X坐標和Y坐標),而后者每一個點只有三個元素(X坐標、Y坐標和Z坐標)。

值得一提是采用C#、VB等語言編程時,線段沒有ObjectName屬性,其類型的判別需要用DxfCode編碼組的邏輯運算來實現選擇集過濾,線段沒有Coordinates屬性,用C#語言編寫時,多段線(Polyline)可通過GetPoint3dAt()方法獲取點坐標集合,但是三維多段線(AcDb3dPolyline)就沒有GetPoint3dAt()方法,需要先得到三維多段線的Position點集合,然后把集合放進一個新的列表里面,下文提到的直線或線段的IntersectWith方法在C#、VB等語言里面也是沒有的[4]。所以pyautocad庫能把多段線、三維多段線(直線也可以)的頂點屬性統一,從頂層引用,確實簡化了很多代碼工作量,邏輯上更符合我們的慣性思維。

單河槽河道判斷很簡單,從左岸到右岸,順序重繪就行,但是多河槽河道需要判斷哪些河槽是有效河道斷面,需要判斷河槽斷面的上凸或下凹,只有下凹并且左右兩岸都能跟水平面閉合才是有效河槽斷面,河槽有效斷面的判斷是重點,首先根據pyautocad提供的方法IntersectWith求取兩條線的交點,獲得計算水平面和河槽交點(得到的交點是一個點集合,每個點有三個元素,后續使用需要按順序取用),根據交點數量初步判斷河槽是單河槽還是多河槽,不大于三個交點就是單河槽。

多河槽的另外一個難點是判斷有效河槽范圍,按點依次判斷當前點的X坐標是否在第i個和第i+1個點中間,如果在,那么這一段必定是一個河槽,但是不一定是有效河槽,然后再判斷當前點是否低于當前計算高程,低于的話當前點一定處于下凹的河槽斷面上,這個點就是有效河槽的點,否則就是上凸的無效河槽或河灘。通過循環,得到所有的有效河槽原河槽坐標,加上之前求得的前后兩個交點進行重繪,得到有效河槽新斷面,利用線段的length屬性,得到河槽的濕周,然后利用線段的Closed()方法將重繪得到的線段閉合,閉合后的線段就有了準確的面積屬性,通過線段的area屬性得到河槽的過水面積,這兩個機械性的重復工作完成后,其他就簡單了,采用曼寧公式進行河道流量計算,將計算結果寫入excel文件即可(寫入Excel這里用openpyxl庫,Excel可用的庫很多,根據實際選用)[5]。

Python在程序編寫方面確實有著獨特優勢,效率高是公認的,但是其在運行速度上的弊端也是很明顯的,因為Python屬于解釋型語言,另外,GIL鎖(全局解釋器鎖,全稱GlobalInterpreterLock) 限制并發,對多處理器支持不好[6]。當python的默認解釋器要執行字節碼時,都需要先申請這個鎖。如果試圖通過多線程擴展應用程序,將總是被這個全局解釋器鎖限制。所以其在運行速度上和其他語言對比起來要慢得多,特別是循環次數較多時候更突出,也有很多提高Python運行速度的方法,例如使用多進程、使用Cpython、數據處理時盡量使用csv替代xlsx、使用Numba編譯、使用哈希表的數據結構、矢量化取代循環等等,但是小型項目對運行速度要求不高時候其實也沒必要花那么多心思去提高運行速度,大型項目或者對運行速度要求較高時可以選擇其他語言。另一方面,Python代碼不能加密,對于想要實現代碼加密的也只能選擇其他語言。

通過采用不同編程語言對天然河道水位-流量關系曲線的自動化計算實現過程的對比,Python在小型項目中運用具有開發效率高,開發周期短的特性[7],對工程設計人員實現自動化輔助設計有著較大幫助。

參考文獻:

[1]王衡,劉啟和.水位流量關系曲線表批量計算[J].東北水利水電,2007,25(9).

[2]張楠.Python語言及其應用領域研究[J].科技創新導報,2019,16(17).

[3]胡艷嬌,黃琦,田長濤.水位流量關系曲線繪制方法實例分析[J].科技創新與應用,2019(21).

[4]王月明,宮帥良,呂曉琪,等.基于AutoCAD二次開發實現測繪橫斷面處理的方法.

[5]曾晨,沈宮新.基于Python的線性回歸性能分析[J].大眾科技,2019,21(11).

[6]王學慶.基于Python的計算機軟件應用技術研究[J].2022(4).

[7]孫運平,高玉春.AutoCAD二次開發及應用研究[J].商場現代化,2012(10):2.

猜你喜歡
水位流量
過去的一年開啟了“流量”明星的凜冬時代?
流量大變局
三大運營商聯手阿里巴巴醞釀推出“流量錢包”
七年級數學期中測試題(B)
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合