如何在Python中將散亂數據插入到常規網格中?

如何在Python中將散亂數據插入到常規網格中?

我有來自英國分散氣象站的經度,緯度和溫度的三個txt文件(或者說三個列表lon,lat,temp)。我想首先插入這些數據,以獲得一個漂亮的彩色溫度圖。然后,我想在土地面具上繪制這個內插溫度層(因此在英國島上,而不是在海上)。這可能與Python有關嗎?

氣象 溫度 蟒蛇 插值

分享改善這個問題

8月2日19:19編輯

gansub

這聽起來像是一個GIS堆棧交換的問題 -  [farrenthorpe于](https://earthscience.stackexchange.com/users/543/farrenthorpe "聲譽8,780") [8月11日'17在18:21](https://earthscience.stackexchange.com/questions/12057/how-to-interpolate-scattered-data-to-a-regular-grid-in-python#comment21926_12057)

3答案

活躍的最老

使用,和numpy,這是直截了當的。這是一個例子:scipy.interpolate.griddata``matplotlib

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata

# data coordinates and values
x = np.random.random(100)
y = np.random.random(100)
z = np.random.random(100)

# target grid to interpolate to
xi = yi = np.arange(0,1.01,0.01)
xi,yi = np.meshgrid(xi,yi)

# set mask
mask = (xi > 0.5) & (xi < 0.6) & (yi > 0.5) & (yi < 0.6)

# interpolate
zi = griddata((x,y),z,(xi,yi),method='linear')

# mask out the field
zi[mask] = np.nan

# plot
fig = plt.figure()
ax = fig.add_subplot(111)
plt.contourf(xi,yi,zi,np.arange(0,1.01,0.01))
plt.plot(x,y,'k.')
plt.xlabel('xi',fontsize=16)
plt.ylabel('yi',fontsize=16)
plt.savefig('interpolated.png',dpi=100)
plt.close(fig)

結果:

如何使用:

  • x并且y是點的位置 - 這些點對應于您的站點lonlat值;
  • z 是點的值 - 這對應于站點的溫度觀測值;
  • xi并且yi是目標網格軸 - 這些將是您的目標經度和緯度坐標,它必須與您的landmask字段匹配;
  • zi 是結果;
  • 此示例包含一種掩蓋字段的簡單方法。您應該使用網格上的landmask替換此掩碼。

還要注意method參數griddata。此外linear,這也可以是cubicnearest。我建議你一起玩,看看是什么產生了你的數據集的最佳結果。

分享改善這個答案

milancurcic

  • 謝謝你。有沒有一種簡單的方法可以使用matplotlib僅在土地上繪圖?顯然我不能使用(mask =(xi> 0.5)&(xi <0.6)&(yi> 0.5)&(yi <0.6))來定義英國的土地面具, - Stavros Keppas, 17年8月12日在13:15

  • 您需要掩碼數據,例如2-d場,水上零和陸地上的零。如果你沒有,你可以根據地形數據制作一個,例如我經常用于此目的的ETOPO 01。 - 米蘭科西奇 2017年8月12日15:21

  • 因為我是python中的新手你能不能給我一個更詳細的描述怎么做? - Stavros Keppas, 17年8月13日12:18

    @StavrosKeppas在某些時候你必須自己嘗試。如果您在此處發布,或在GIS stackexchange中發布,或者在stackoverflow中發布,您應該盡可能地嘗試。“請寫下我需要的程序”問題通常沒有答案。學習使用python的最好方法是嘗試一段時間。如果它不起作用,那么您發布不起作用的代碼并尋求幫助。這顯示了努力,這是一個很大的優點,并可能鼓勵更多有用的答案。此外,您可以根據需要提出盡可能多的(好)問題,不要在評論中繼續提出問題。 - - 1817年 8月13日13:41

這個簡單任務的最簡單的解決方案是使用GIS軟件,例如免費的QGIS。添加分隔文本圖層并嘗試柵格插值。下載一個免費的海岸線矢量,并用海岸線剪輯你的光柵。如果您遇到困難,GIS SE上的一些搜索可以幫助您。使用GIS選項,還可以輕松繪制例如城市或繪制位置的插值溫度。

或者(根據您更新的問題),您可以使用Python。這將以某種方式讓您更好地控制您的工作流程。底圖是一個有用的包,請參閱本教程的開頭部分。Python也是免費的,SE和其他地方都有一個很棒的社區。numpy和scipy是插值和所有數組進程的好包。對于更復雜的空間過程(從矢量多邊形剪輯柵格,例如)GDAL是一個很棒的庫。

如果您打算稍后進行更苛刻的統計分析,也可以使用R,這可能是一個智能解決方案。有一些教程可以讓你走上正軌。

GMT還應該能夠滿足您的需求并且有一個python接口,至少在開發中。

您可能需要花費一些精力來選擇正確的插值方法,并確保您的網格是實際值的最佳估計值。

享受您的地圖制作!


更新:

我認為GIS將是第一種方法,但是當你要求一些Python命令時,這里有一個如何使用Python,底圖和scipy為你的應用程序的草率示例。通過從shapefile創建一個掩碼可以大大改善它,如上所述,它可以靈敏地使用插值方法。

import numpy as np
from scipy.interpolate import griddata
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

#Define mapframe
lllon = -11
lllat = 49
urlon = 2
urlat = 61

# Make some toy data, random points + corners
n = 10 # no of stations
lat = np.random.uniform(low=lllat+2, high=urlat-2, size=n)
lat = np.append(lat, [lllat, urlat, urlat, lllat]) 
lon = np.random.uniform(low=lllon+2, high=urlon-2, size=n)
lon = np.append(lon, [lllon, urlon, lllon, urlon])
temp = np.random.randn(n+4) + 8 # British summer?

# set up basemap chose projection!
m = Basemap(projection = 'merc', resolution='i', 
    llcrnrlon = lllon, llcrnrlat = lllat, urcrnrlon = urlon, urcrnrlat = urlat) 

# transform coordinates to map projection m
m_lon, m_lat = m(*(lon, lat))

# generate grid data
numcols, numrows = 240, 240
xi = np.linspace(m_lon.min(), m_lon.max(), numcols)
yi = np.linspace(m_lat.min(), m_lat.max(), numrows)
xi, yi = np.meshgrid(xi, yi)

# interpolate, there are better methods, especially if you have many datapoints
zi = griddata((m_lon,m_lat),temp,(xi,yi),method='cubic')

fig, ax = plt.subplots(figsize=(12, 12))

# draw map details
m.drawmapboundary(fill_color = 'skyblue', zorder = 1)

# Plot interpolated temperatures
m.contourf(xi, yi, zi, 500, cmap='magma', zorder = 2)

m.drawlsmask(ocean_color='skyblue', land_color=(0, 0, 0, 0), lakes=True, zorder = 3)

cbar = plt.colorbar()
plt.title('Temperature')

plt.show()

(這是修改后的代碼,用于其他內容。對于詳細問題,其他論壇更適合。)

分享改善這個答案
(https://earthscience.stackexchange.com/posts/12059/revisions "顯示對此帖子的所有修改")

Tactopoda

  • 謝謝你。但是,你能為python提供一些命令嗎? - Stavros Keppas 18年8月11日15:17

  • 那個底圖插值教程沒有做到Stavros正在尋找的東西。 - milancurcic 178月11日18:42

  • @milancurcic不,但它可以讓他走上正軌。numpy和scipy是插值和所有數組進程的好包,如您的示例所示。棘手的事情往往是讓底圖做一個打算做的事情。 - Tactopoda 2012年8月11日23:08

  • @StavrosKeppas我添加了一些代碼,但我首先要去GIS。 - Tactopoda 2017年8月13日15:43

  • 謝謝。真好。我也想繪制海岸線。我添加了這兩行:m.drawcoastlines()m.drawcountries()但是我得到的海岸線不是連續的線

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容