汇哥全球后援会
学而不思则罔,思而不学则殆。

学习插值(一)

发布于June 04, 2020

关于MeteoInfoLab

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

使用关于MeteoInfoLab实现插值

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

分析脚本

原始脚本中最关键的函数就是插值函数griddata(),主要需要两个参数:坐标的经度和坐标的纬度组成的坐标点(list),以及坐标相对应的特征值,比如温度、风速、降水等信息(array_like)。除外还需要插值的目标点坐标,插值的方法(idw | cressman | nearest | inside | insidemin| insidemax | 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一一对应。最后展示运行数据图 全国降水图