代 斌,施 藝
(四川省成都水文水資源勘測中心,成都 611130)
水文學是研究水資源、水循環(huán)和水環(huán)境的科學,涉及大量的水文數據。隨著信息技術的快速發(fā)展和數據采集技術的成熟,水文學領域也迎來了大數據時代。在目前的大數據環(huán)境下,水文數據的數據量呈現(xiàn)爆炸式增長,傳統(tǒng)的數據處理方式已經無法滿足需求,數據抽稀成為了處理數據的一種關鍵技術,也是現(xiàn)在水文數據管理和分析的必要手段。
水文數據抽稀是指在保持水文數據重要特征的同時,從原始水文數據中有選擇地減少數據點的數量,以達到減少數據量、提高計算效率、降低存儲成本和提高數據質量的目的。
目前來說抽稀較為常用的算法有:等步長法、線段過濾法、垂距限值法及Douglas-Peuker算法。
水文數據是按時間順序排列的數據點集合。等步長法是按照一定的間隔距離對點集進行抽取,其余點全部壓縮掉,在相鄰抽取點間用直線連續(xù);線段過濾法是從點集的第一點開始,若連續(xù)兩個點組成的線段長度比給定的閾值小時,刪除這兩點,并將這兩點的中點插入兩點原來的位置;垂距限值法是從點集的第一點開始,根據中間點到前、后兩個相鄰點連線的距離,來確定是否保留該點的一種抽稀算法,當距離大于給定的閾值時保留該點,否則刪除該點;Douglas-Peukcer算法是計算點集中除頭尾兩個端點外的每個點與頭尾兩點直線之間的垂直距離,若這些距離的最大值小于給定的閾值就刪除這一組點,若大于給定的閾值,則從最大距離處將點集分為兩部分,繼續(xù)以上步驟,該算法以遞歸方式應用于這兩個部分,直到達到所需的簡化級別[1]。
將水文數據的點集看作是以時間為x軸、數據值為y軸的一條連續(xù)曲線,在以上四種抽稀方法中,等步長法在這四種方法中顯然是相對較差的一種方法,因為它完全不關心原始曲線的數據是什么,只是按照給定的步長去抽取數據。若步長較小,抽稀效果不明顯;若步長較大,則原始曲線嚴重失真[1]。
另外三種方法與等步長法有明顯的不同,因為它們的抽稀都會關系原始曲線中數據之間的聯(lián)系。而從它們觀察的對象來看,線段過濾法觀察的是兩個點之間的距離,垂距限值法觀察的是三個點之間的關系,而Douglas-Peukcer算法觀察的是整條曲線中各個點的關系。從設計思路上來看,Douglas-Peukcer算法的抽稀效果是相對較好的,線段過濾法的抽稀效果是相對較差的[1]。
垂距法較等步長法與線段過濾法精度更高,同樣具有算法簡單和易于實現(xiàn)等優(yōu)點,但它是一個局部的算法,無法從整體上考慮線要素的變化形態(tài)。因此,當各相鄰點起伏變化不大時,即使給定的閾值較小,也可能會刪除掉構成大彎曲形態(tài)上的所有中間點,造成線要素形態(tài)失真[2]。
Douglas-Peukcer算法的優(yōu)點是它是一個整體算法,能做到在刪除與保留之間達到較好的平衡,即能充分減少點的數量,又能盡量保留特征點[2]。但Douglas-Peukcer算法較其余算法更復雜,實現(xiàn)時需要采用遞歸方法,有一定的難度。本文選取Douglas-Peukcer算法進行水文數據的抽稀,并對其在編程中的實現(xiàn)進行了分析探討。
目前遙測技術已經得到廣泛應用和普及,動輒5 min甚至1 min一個的數據雖然可以幫助我們更及時地掌握水文信息以及更精細化地進行水資源管理,但在數據存儲的成本、數據的分析整編、計算所需的時間和資源、數據可視化效果上都帶來了不少的麻煩,需要先對數據進行抽稀處理后再進行應用。因此,本文以遙測水位數據為例,對Douglas-Peukcer抽稀算法的實現(xiàn)進行分析探討。
為方便普通職工在EXCEL中調用該過程,本文采用VBA語言進行編譯,實現(xiàn)代碼如下:
Function Compr_DP(Arr_COMPR, Arr_TEMP, Start_Index, End_Index)
If Start_Index Dim Start_X#, Start_Y@, End_X#, End_Y@ Start_X = Arr_COMPR(Start_Index, 1): Start_Y = Arr_COMPR(Start_Index, 2) End_X = Arr_COMPR(End_Index, 1): End_Y = Arr_COMPR(End_Index, 2) Dim i&, Index&, Dist@, Max_Dist@, Point_X#, Point_Y@ For i = Start_Index + 1 To End_Index - 1 Point_X = Arr_COMPR(i, 1): Point_Y = Arr_COMPR(i, 2) Dist = Calc_DIST (Start_X, Start_Y, End_X, End_Y, Point_X, Point_Y) If Dist >Max_Dist Then Index = i: Max_Dist = Dist Next i If Max_Dist >3 Then Arr_TEMP(Index, 1) = Arr_COMPR(Index, 1) Arr_TEMP(Index, 2) = Arr_COMPR(Index, 2) Call Compr_DP(Arr_COMPR, Arr_TEMP, Start_Index, Index) Call Compr_DP(Arr_COMPR, Arr_TEMP, Index, End_Index) End If End If End Function Function Calc_DIST#(Start_X, Start_Y, End_X, End_Y, Point_X, Point_Y) Dim a, b, c, p, S a = Abs(Sqr((Abs(Start_X - End_X) ^ 2) + (Abs(Start_Y - End_Y) ^ 2))) b = Abs(Sqr((Abs(Start_X - Point_X) ^ 2) + (Abs(Start_Y - Point_Y) ^ 2))) c = Abs(Sqr((Abs(Point_X - End_X) ^ 2) + (Abs(Point_Y - End_Y) ^ 2))) p = (a + b + c) / 2 S = Sqr(Abs(p * (p - a) * (p - b) * (p - c))) Calc_DIST = S * 2 / a End Function 其中Function Compr_DP是主過程,閾值設定為3(cm),根據曲線上所有點的坐標依次計算各點到Start、End兩點所在直線的垂直距離(通過調用Function Calc_DIST),得到最大距離Max_Dist,若Max_Dist小于閾值3,則將這條曲線上的中間點全部舍去,以直線段作為曲線的近似,該段曲線處理完畢,若Max_Dist小于閾值3,保留Max_Dist對應的坐標點,并以該點為界,把曲線分為兩部分,對這兩部分重復使用該方法,直到所有Max_Dist均小于閾值3,即完成對曲線的抽稀;Function Calc_DIST是子過程,通過3個點的坐標求得各點到Start、End兩點所在直線的垂直距離。 圖1 Douglas-Peukcer算法示意 上一章節(jié)中,我們計算得到的距離是各目標點到Start、End兩點所在直線的垂直距離,即目標點與Start、End兩點形成的三角形的高,而與大部分其他類型的數據集是以空間為坐標進行分布不同,水文數據基本上都是以時間為序列進行分布,我們可以將各目標點到Start、End兩點所在直線在同一坐標軸(即以同一時間為參考)的距離代替垂直距離,這樣既能減輕計算量(將三角運算變?yōu)榧訙p乘除),又更符合水文數據以時間為序列進行分布的特征。由于在VBA中默認的時間運算以d為單位,而水文計算中水位默認以m為單位,我們以更精細的刻度來保證計算的準確性,以 min為時間單位、以cm為水位單位。通過修改子過程Function Calc_DIST的代碼完成以上內容,實現(xiàn)代碼如下: Function Calc_DIST@(Start_X, Start_Y, End_X, End_Y, Point_X, Point_Y) Dim a1&, a2&, b1&, b2& a1 = (End_X - Start_X) * 1440 If a1 = 0 Then Calc_DIST = 0: Exit Function a2 = (Point_X - Start_X) * 1440 b1 = (End_Y - Start_Y) * 100 b2 = (Point_Y - Start_Y) * 100 Calc_DIST = Abs(b2 - b1 * a2 / a1) End Function 圖2 Douglas-Peukcer算法(改進后)示意 為驗證以上代碼的實際運行效果,本次分析以石堤堰水文站實測水位資料為實例樣本,對Douglas-Peukcer算法改進前后的效果,以及跟四川省水旱災害防御決策支持系統(tǒng)的抽稀處理進行對比(閾值均設置為3 cm)。 抽稀算法的優(yōu)劣,一般通過數據處理時間、數據抽稀率、數據偏差來評價。數據處理的速度(時間復雜度)主要以運行時間來評價;數據抽稀率(空間復雜度)是抽稀掉的數據點數與原始數據點數之比。數據偏差依據《水文資料整編規(guī)范》(SL/T 247-2020)要求,處理后的水位變化過程完整,經處理以后計算的日平均水位與采用所有數據計算的日平均水位相差不宜超過2 cm[3]。我們分別對抽稀前后的水位數據進行整編,通過對比抽稀前后得到的日平均水位及月最大、最小、平均水位進行數據偏差評價。 對石堤堰水文站2022年全年共98 488個水位數據進行抽稀處理(見表1),四川省水旱災害防御決策支持系統(tǒng)的抽稀用時14.9 s,抽稀數據81927條,抽稀率83.2 %;Douglas-Peukcer算法(改進前)用時12.7 s,抽稀數據87108條,抽稀率88.4 %;Douglas-Peukcer算法(改進后)用時3.47 s,抽稀數據86707條,抽稀率88.0 %。通過對比,四川省水旱災害防御決策支持系統(tǒng)抽稀用時最長,抽稀率最低,改進前的Douglas-Peukcer算法抽稀率最高,但數據處理的用時較長,改進后的Douglas-Peukcer算法數據處理的速度明顯更快,且抽稀率與改進前相差不大,在時間復雜度與空間復雜度上均能達到比較滿意的效果,效率最佳。 表1 抽稀算法實際運行效率比較 由于全年遙測數據量較為龐大,對未抽稀的原始數據進行整編難度較大,因此本文采用單月數據進行數據偏差比較,以石堤堰水文站2023年5月水位資料為樣本,各算法與未抽稀前的整編成果對比見表2。 表2 抽稀算法實測數據偏差比較 通過與原始數據的整編成果進行對比,各算法的成果均能滿足《水文資料整編規(guī)范》(SL/T 247-2020)要求,Douglas-Peukcer算法較四川省水旱災害防御決策支持系統(tǒng)稍好,算法改進后效果與改進前基本一致。 將抽稀前后的水位過程線進行對比,選取5月1日8時至5月2日8時的時間段,可以看出,在大部分時間,Douglas-Peukcer算法的水位變化過程都更貼合原始數據,算法改進后效果與改進前基本一致。 圖3 水位過程線對比 本文對Douglas-Peukcer抽稀算法及其與其他抽稀算法的優(yōu)劣進行了簡要的分析,通過編程實現(xiàn)了Douglas-Peukcer抽稀算法在水文中的應用,并根據水文數據的特性對算法進行了優(yōu)化。本文根據石堤堰水文站實測資料為實例樣本對算法進行了運行效率測試與數據偏差分析,Douglas-Peukcer抽稀算法在各方面均領先于四川省水旱災害防御決策支持系統(tǒng)的抽稀處理算法,改進后的Douglas-Peukcer抽稀算法在處理效果上與改進前基本一致,但在運行效率上較改進前有較大提升,實現(xiàn)了高效率、高抽稀率與保真效果之間的平衡。2.2 算法優(yōu)化
2.3 實例計算與分析
3 結語