学习插值(一)

关于MeteoInfoLab

MeotoInfoLab对于处理气象相关的工作是十分有用且高效的。MeotoInfoLab是使用的jython脚本进行开发,是一个好消息但仔细想想也很难让人接受。可以使用基本Python3的语法但无法使用丰富的cpython包,但也MatLab、Numpy、Matplotlib实现了一些函数,可以满足部分的需求。具体的信息以及学习的脚本可以看气象家园相关内容。

使用关于MeteoInfoLab实现插值

在这里借助气象家园的插值脚本进行改写,可以多看看的原始脚本=》》

分析脚本

原始脚本中最关键的函数就是插值函数griddata(),主要需要两个参数:坐标的经度和坐标的纬度组成的坐标点(list),以及坐标相对应的特征值,比如温度、风速、降水等信息(array_like)。除外还需要插值的目标点坐标,插值的方法(idw | cressman | nearest | inside | inside_min| inside_max | inside_count | surface | barnes)以及插值的方式对应所需要的参数。但调好这些参数确实需要一些经验,对于我这种小白就用默认的值吧。

具体实现

数据点经度是以范围为73.03125, 136.96875以0.0625间距的点,数据点纬度是以范围为18.03125, 55.96875以0.0625间距的点。对应的点坐标数据存储在txt文件中以空格分隔。

lat = arange(18.03125, 55.96875+0.0625,0.0625,'float64')  #纬度
lon = arange(73.03125, 136.96875+0.0625,0.0625,'float64') #经度
lon_repeat=[val for i in range(lat.size) for val in lon]
lat_repeat=[val for val in lat for i in range(lon.size)]
with open("/home/qianh/workspace/share/linhuo/20200521.txt","r") as f:
    data = f.readlines()
    temdata=[line.strip() for line in data]
finalData=[float(i) for temp in temdata for i in temp.split(' ') if len(i)>0]
x = arange(75, 135, 0.0625)
y = arange(18, 55, 0.0625)
prg = griddata((NDArray(lon_repeat),NDArray(lat_repeat)), NDArray(finalData), xi=(x, y), method='idw', radius=0.1)[0]
#prg = griddata((NDArray(lon_repeat),NDArray(lat_repeat)), NDArray(finalData), xi=(x, y), method='cressman', radius=[0.1])[0]
figure(newfig=True)#每次运行可以添加一个新的figure
bou1_layer = geoshow('cn_border', facecolor=(0,0,255))
china_layer = geoshow('china', visible=False)
levs = [0.1, 1, 2, 4, 6, 8, 10, 20, 50,100]
cols = [(255,255,255),(206,255,255),(37,255,252),(36,183,255),(3,120,180),(21,81,203),(9,47,210), (136,23,240),(106,21,159),(76,15,105)]
layer = contourfm(x, y, prg, levs, colors=cols)
masklayer(china_layer, [layer])
colorbar(layer)
xlim(72, 136)
ylim(16, 55)

其中要注意将list格式数据转换为NDArray类型的,不然会报错 。其中的插值目标点的间距可以自行修改,本脚本采用的是0.0625。cressman和idw的对应参数(radius)也可以进行调整。levs是图例的范围和下面的cols一一对应。