python中离散数据插到格点_如何在Python中将散乱数据插⼊
到常规⽹格中?
我有来⾃英国分散⽓象站的经度,纬度和温度的三个txt⽂件(或者说三个列表lon,lat,temp)。我想⾸先插⼊这些数据,以获得⼀个漂亮的彩⾊温度图。然后,我想在⼟地⾯具上绘制这个内插温度层(因此在英国岛上,⽽不是在海上)。这可能与Python有关吗?
3答案
使⽤,和numpy,这是直截了当的。这是⼀个例⼦:iddata``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
sendmessages# plot
fig = plt.figure()
ax = fig.add_subplot(111)
11的补码是多少
plt.plot(x,y,'k.')
plt.xlabel('xi',fontsize=16)
plt.ylabel('yi',fontsize=16)
plt.savefig('interpolated.png',dpi=100)
plt.close(fig)
结果:
如何使⽤:
tcpip是什么意思啊
x并且y是点的位置 - 这些点对应于您的站点lon和lat值;
z 是点的值 - 这对应于站点的温度观测值;
xi并且yi是⽬标⽹格轴 - 这些将是您的⽬标经度和纬度坐标,它必须与您的landmask字段匹配;
zi 是结果;
此⽰例包含⼀种掩盖字段的简单⽅法。您应该使⽤⽹格上的landmask替换此掩码。
还要注意method参数griddata。此外linear,这也可以是cubic或nearest。我建议你⼀起玩,看看是什么产⽣了你的数据集的最佳结果。
谢谢你。有没有⼀种简单的⽅法可以使⽤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
java手机应用下载jar下载
xi = np.linspace(m_lon.min(), m_lon.max(), numcols)
yi = np.linspace(m_lat.min(), m_lat.max(), numrows)
气象python零基础入门教程xi, yi = np.meshgrid(xi, yi)
# interpolate, there are better methods, especially if you have many datapoints
sort函数怎么排序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.drawlsmask(ocean_color='skyblue', land_color=(0, 0, 0, 0), lakes=True, zorder = 3)
cbar = lorbar()
plt.title('Temperature')
plt.show()
(这是修改后的代码,⽤于其他内容。对于详细问题,其他论坛更适合。)
那个底图插值教程没有做到Stavros正在寻的东西。 - milancurcic17年 8⽉11⽇18:42
@milancurcic不,但它可以让他⾛上正轨。numpy和scipy是插值和所有数组进程的好包,如您的⽰例所⽰。棘⼿的事情往往是让底图做⼀个打算做的事情。 - Tactopoda于2012年8⽉11⽇23:08
@StavrosKeppas我添加了⼀些代码,但我⾸先要去GIS。 - Tactopoda于2017年8⽉13⽇15:43
谢谢。真好。我也想绘制海岸线。我添加了这两⾏:m.drawcoastlines()m.drawcountries()但是我得到的海岸线不是连续的线

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。