基於Python等語言的Kriging、IDW空間插值對比分析

2021-03-02 氣象雜貨鋪

氣象水文科研貓公眾號交流郵箱:leolovehydrometeor@hotmail.com歡迎投稿&批評指正如有侵權且本公眾號未能正確引用原文,請聯繫刪除,謝謝理解、謝謝配合。

猶記得研三那年,中山大學某博士建議我棄用Matlab,轉戰R語言和Python。故本文將對Matlab的地圖白化絕口不提,畢竟當年我真的沒搞明白如何利用m_map工具箱。

1 我的m_map學習成果:

註:我未能學到精髓,不敢班門弄斧耍大刀。

2 MeteoInfo的idw插值:

註:MeteoInfo的Kriging模塊尚未添加。

fn = 'F:/RMeteoInfo/data/AQI3.txt'ncol = numasciicol(fn)nrow = numasciirow(fn)a = asciiread(fn,shape=(nrow,ncol))lon = a[:,0]lat = a[:,1]pm= a[:,2]x = arange(113, 120, 0.05)y = arange(36, 43, 0.05)gtemp,gx,gy = griddata((lon, lat), pm, xi=(x, y), method='idw', radius=1.6)axesm()bou1_layer = shaperead('F:/Rpeng/31/data3/bound/bound.shp')mlayer = shaperead('F:/Rpeng/31/data3/bound/bound.shp')geoshow(bou1_layer, edgecolor='lightgray')geoshow(mlayer, visible=False)levs = [0, 25, 35, 50, 75, 95, 115, 130, 150,200]cols = [(255,255,255),(0,255,0),(127,255,0),(255,255,0),(255,215,0),(255,128,0),(255,97,0),(255,0,0),(176,23,31),(135,38,87),(255,0,255)]layer = contourfm(x, y, gtemp,levs,colors=cols)slayer = scatterm(lon, lat,pm,levs,colors=cols, size=8)masklayer(mlayer, [layer])xlim(113, 120)ylim(36, 43) colorbar(layer, orientation='horizontal',ticklen=0,extendrect=False, shrink=1, aspect=30)yaxis(tickvisible=False,location='right')xaxis(tickvisible=False,location='top') savefig('F:/RMeteoInfo/plot34.png', dpi=600)

3 我的ArcGis成果:

註:繪圖很漂亮但操作較為繁瑣。

4 R語言的Kriging、IDW往期推文超連結:

R語言基礎地圖構建(12)

5 Python—Kriging、IDW空間插值:

註:本文僅以basemap為例,如同布朗尼和布萊斯的關係,故cartopy請讀者自行修改。

5.1 Python—Kriging空間插值:

import numpy as npimport pandas as pdfrom pykrige.ok import OrdinaryKrigingfrom pykrige.kriging_tools import write_asc_gridimport pykrige.kriging_tools as ktimport matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemapfrom matplotlib.colors import LinearSegmentedColormapfrom matplotlib.patches import Path, PathPatchimport maskout2shp_path=r'F:/Rpython/lp3/guangxi/map/guangxi.shp'filename=r'F:/Rpython/lp16/data/ex3.xlsx'df=pd.read_excel(filename)lons=df['lon']lats=df['lat']data=df['temp2']extent=[104,113,21,27]grid_space = 0.01grid_lon = np.arange(104,113,0.01)grid_lat = np.arange(21,27,0.01)OK = OrdinaryKriging(lons, lats, data, variogram_model='gaussian', verbose=True, enable_plotting=False,nlags=5)z1, ss1 = OK.execute('grid', grid_lon, grid_lat)xintrp, yintrp = np.meshgrid(grid_lon, grid_lat)fig, ax = plt.subplots(figsize=(10,10))m=Basemap(llcrnrlon=104-0.1,llcrnrlat=21-0.1,urcrnrlon=113+0.1,urcrnrlat=27+0.1,projection = 'cyl')m.readshapefile('F:/Rpython/lp3/guangxi/map/guangxi','whatevername',color='k',linewidth=1)x,y=m(xintrp, yintrp)cs1=ax.contourf(x, y, z1,levels=np.arange(1300,2000,100),extend='both',cmap='gist_rainbow') cs2= ax.contour(x, y, z1,colors='red',linewidths=0.6)b=plt.colorbar(cs1,shrink=0.55,orientation='vertical',extend='both',pad=0.035,aspect=20) parallels = np.arange(21,27.1,1)m.drawparallels(parallels,labels=[True,False,False,False],linewidth=0.2,color='red',dashes=[1,4],size=12)meridians = np.arange(104,113.1,1)m.drawmeridians(meridians,labels=[False,False,False,True],linewidth=0.2,color='red',dashes=[1,4],size=12)plt.yticks(parallels,len(parallels)*[''])ax.tick_params(axis="y",which="both",direction="in")plt.xticks(meridians,len(meridians)*[''])ax.tick_params(axis="x",which="both",direction="in")clip1=maskout2.shp2clip(cs1,ax,r'F:/Rpython/lp3/guangxi/map/guangxi.shp') clip2=maskout2.shp2clip(cs2,ax,r'F:/Rpython/lp3/guangxi/map/guangxi.shp') plt.savefig(r"F:/Rpython/lp27/plot65.1.2.1.png",dpi=600)plt.show()

5.2 Python—IDW空間插值:

讀者可嘗試定義idw(本文先不給出idw)。

import numpy as npimport matplotlib.pyplot as pltfrom scipy.interpolate import Rbfdef main():    n = 10    nx, ny = 50, 50    x, y, z = map(np.random.random, [n, n, n])    xi = np.linspace(x.min(), x.max(), nx)    yi = np.linspace(y.min(), y.max(), ny)    xi, yi = np.meshgrid(xi, yi)    xi, yi = xi.flatten(), yi.flatten()    grid1 = simple_idw(x,y,z,xi,yi)    grid1 = grid1.reshape((ny, nx))    grid2 = scipy_idw(x,y,z,xi,yi)    grid2 = grid2.reshape((ny, nx))    grid3 = linear_rbf(x,y,z,xi,yi)    grid3 = grid3.reshape((ny, nx))    plot(x,y,z,grid1)    plt.title('Homemade IDW')    plot(x,y,z,grid2)    plt.title("Scipy's Rbf with function=linear")    plot(x,y,z,grid3)    plt.title('Homemade linear Rbf')    plt.show()def simple_idw(x, y, z, xi, yi):    dist = distance_matrix(x,y, xi,yi)    weights = 1.0 / dist    weights /= weights.sum(axis=0)    zi = np.dot(weights.T, z)    return zidef linear_rbf(x, y, z, xi, yi):    dist = distance_matrix(x,y, xi,yi)    internal_dist = distance_matrix(x,y, x,y)    weights = np.linalg.solve(internal_dist, z)    zi =  np.dot(dist.T, weights)    return zidef scipy_idw(x, y, z, xi, yi):    interp = Rbf(x, y, z, function='linear')    return interp(xi, yi)def distance_matrix(x0, y0, x1, y1):    obs = np.vstack((x0, y0)).T    interp = np.vstack((x1, y1)).T    d0 = np.subtract.outer(obs[:,0], interp[:,0])    d1 = np.subtract.outer(obs[:,1], interp[:,1])    return np.hypot(d0, d1)def plot(x,y,z,grid):    plt.figure()    plt.imshow(grid, extent=(x.min(), x.max(), y.max(), y.min()))    plt.hold(True)    plt.scatter(x,y,c=z)    plt.colorbar()if __name__ == '__main__':    main()

func=Rbf(lon,lat,tem,function='linear')

func=Rbf(lon,lat,tem,function='cubic')

綜上所述,不同的插值軟體(本文僅選用五種)、不同的插值方法(本文僅選用Kriging、IDW、Rbf三種)所得到的插值結果的差異還是很大的!具體是什麼原因造成的呢?做研究時我們應該選用哪種方法呢?大家一起在留言區討論下吧,因筆者時間有限,本期暫不做深入探討,下期我們再一起探討、交流、學習吧。

氣象水文科研貓公眾號一起交流學習吧.

只要你點右下方 】   在看

我們就是好朋友,Thanks♪(・ω・)ノ

相關焦點

  • Python-plotnine 核密度空間插值可視化繪製
    從本期開始,我會陸續推出系列空間插值的推文教程,包括常見的「Kriging(克裡金插值法)、Nearest Neighbor(最近鄰點插值法)、Polynomial Regression(多元回歸法)、Radial Basis Function(徑向基函數法)」 等多種空間插值方法,探索空間可視化帶給我們的視覺魅力
  • python數據分析專題 (7):python數據分析模塊
    python是一門優秀的程式語言,而是python成為數據分析軟體的是因為python強大的擴展模塊。
  • 木蘭重生:與 Python 生態的兼容問題;字符串插值 - OSCHINA - 中文...
    本項目旨在重現「木蘭」程式語言的語法和功能,已開源在碼雲。
  • Go語言和Java、Python等其他語言的對比分析
    三、對比其他語言Go的很多語言特性借鑑與它的三個祖先:C,Pascal和CSP。Go的語法、數據類型、控制流等繼承於C,Go的包、面對對象等思想來源於Pascal分支,而Go的語言特色,基於管道通信的協程並發模型,則借鑑於CSP分支。
  • 一個簡單的例子學明白用Python插值
    這篇文章嘗試通過一個簡單的例子來為讀者講明白怎樣使用Python實現數據插值。總共分3部分來介紹:為什麼需要做插值這種事?通過拉格朗日插值法來看看插值這個事的理論要怎麼理解?好比我們說歐幾裡得空間,聽著挺高大上的,讓人望而生畏,其實它也就是種向量空間而已。同樣的,拉格朗日插值法實質上就是一種多項式插值法。而多項式插值法說的是,如果有n個點,每個點都有個x值對應的y值。那就必然能找到一個n-1次多項式使得這n個點的(x,y)值代入這個多項式成立。
  • Python 腳本案例:為流域插值雨量計
    Python是一種解釋型腳本語言。作為全球公認的「膠水語言」,擁有強大的第三方庫,可以將其他語言製作的各種模塊輕鬆連接到一起。Python自誕生之日起,便有類、函數、異常處理,並且可以調用很多C語言庫文件。隨著人工智慧大數據的快速發展,Python一路綠燈,備受關注。
  • python推薦 | 面向地學領域的Python庫匯總
    •二進位:numpy可以處理二進位數據,同時藉助python內置struct模塊可以非常方便的處理二進位格式數據。上述介紹的一些庫,很多僅支持簡單的數據讀取和寫入操作,不支持更多計算操作。如果要對空間數據進行插值,可能就無法滿足了。
  • Python-Plotnine包: 類別插值地圖
    今天這篇推文,我們繼續空間數據可視化的最後一個系列-類別插值(categorical-spatial-interpolation) 可視化繪製的推文教程,這期我們使用Python進行繪製,涉及的知識點如下:sklearn.KNeighborsClassifier()機器學習應用
  • 【免費直播課程】R-GIS:R語言地統計與空間製圖實踐技術 應用
    R語言在數據分析、挖掘和可視化中發揮著重要的作用,其中在空間分析方面扮演著重要角色,與空間相關的包的數量也達到130多個。(多水平/層次/嵌套)模型實踐應用技術精品視頻課程組合優惠E類:本課程+原價2399元的基於R語言的貝葉斯網絡模型的實踐技術應用高級視頻課程組合優惠F類:本課程+原價2580元的基於R語言的結構方程模型分析及應用精品視頻課程組合優惠G類:本課程+原價2680元的R語言與作物模型高級應用實戰技術(獨孤九劍)組合優惠H類:本課程+原價2180元的R
  • 乾貨 | Go/Python/Erlang程式語言對比分析及示例
    隨著Docker、k8s等應用的火熱,其開發語言Go也受到越來越多的關注。本文對Go和Python、Erlang做了一些有趣的分析對比,相信大家能從中感受到Go語言的強大和與眾不同。本文主要是介紹Go,從語言對比分析的角度切入。之所以選擇與Python、Erlang對比,是因為做為高級語言,它們語言特性上有較大的相似性,不過最 主要的原因是這幾個我比較熟悉。
  • 基於FPGA實現的FFT插值正弦波頻率估計
    摘要:在分析雙線幅度法(Rife)、修正雙線幅度法(MRife)、傅立葉係數插值迭代3種算法的基礎上,結合FPGA的並行處理優勢,將迭代變為並行運算,由此得出了一種快速頻率估計算法。並將新算法進行FPGA設計,給出了算法流程圖。
  • 推薦: 一本「高顏值」的Python語言數據可視化圖書
    現在python語言越來越流行,尤其是在機器視覺、機器學習與深度學習等領域。但是數據可視化一直是其短板,特別相比較R語言而言。R語言以ggplot2包及其拓展包人性化的繪圖語法大受用戶的喜愛,特別是生物信息與醫學研究者。
  • 量化投資-為什麼選擇Python?
    全面、平衡是對Python這門語言最好的介紹。誕生之初Python被譽為世界上最容易上手的程式語言。進入AI人工智慧時代,靠其功能強大、高效靈活、對數據分析提供良好的支持,成為人工智慧,數據分析領域不可或缺的程式語言。
  • Python語言是什麼?python框架有哪些?Python基礎教程
    自2010年以來,編程榜單上超越了C、C#、Java和JavaScript,已成為當下最火的程式語言之一。Google公布的程式語言流行指數中,Python繼續蟬聯全球範圍內最受歡迎的技術語言,隨後是Java和Javascript。學習它有什麼好處?
  • 【免費領取】R語言空間分析與數字製圖R-GIS專題視頻課程
    免費視頻課程領取,資料領取:1、R語言空間分析與數字製圖R-GIS專題視頻課程 100分鐘精彩視頻講解
  • 數據分析中的插值與擬合(3) —— 基於Matlab的實現
    本文將簡單介紹基於
  • 基於標定和插值的壓裝系統誤差補償
    因此,本文在不改變原有半閉環方式的基礎上,提出了一種基於系統標定和插值的誤差補償方法。1 半閉環伺服壓裝系統誤差分析1.1 系統模型圖1為常見的半閉環伺服壓裝系統:上位機通過向伺服控制器給定控制速度和位置,控制運動機構進行軸向的壓裝動作,同時上位機通過監控運動機構的位移和壓力進行實時控制調整。
  • 如何使用python完成數學建模常見算法
    在數學建模中主流的程式語言是MATLAB,但隨著python/R中數學軟體包的不斷完善,熟悉這兩種程式語言的同學也可以快速數學建模的編程環節。後面我們將介紹幾種常見數學建模算法的python實現,旨在展示python在本領域的強大威力。
  • MetDig 用Python打造天氣診斷分析利器
    選擇Python,帶來意外和驚喜  計算機語言的種類很多,不同語言之間存在種種技術壁壘。而GrADS、Fortran、NCL、IDL等常用氣象分析計算機語言專業性更強,所以技術交流困難、重複勞動頻繁、技術實現標準難以統一等諸多問題無法避免。  MetDig是用Python語言寫成的。
  • 10種插值方法在物探數據處理中的對比
    該法綜合了泰森多邊形的鄰近點法和多元回歸法的長處,通過權 重調整空間插值結構;缺點是在格網區域內要產生圍繞觀測點的「牛眼」,給電法與磁法數據解釋帶來 不便,因此,實際應用較少。2克裡金(Kriging)插值法又稱空間自協方差最佳插值法,是一種特定的滑動加權平均法,廣泛地應用於地下水模擬、土壤製圖、礦床中金屬品位估計等領域。