基于ANUSPLIN的气象数据插值

这篇文章是对ANUSPLIN这个插值工具进行简单的介绍,项目demo可以参考:

https://github.com/leeyang1991/ANUSPLIN

这个项目已经把从数据转换到脚本运行等一系列工作都用python实现了。

至于ANUSPLIN中的一些细节和参数说明,参考自:

https://blog.csdn.net/weixin_42155937/article/details/120673718

零、ANUSPLIN 介绍

空间插值:将空间上离散点的测量数据转换为连续的数据曲面的过程

ArcGIS软件中,有趋势面法、自然邻域法、样条函数法、克里金法等插值方法,但不能引入协变量

协变量:温度插值引入高程数据、降水量引入海岸线

ANUSPLIN 基于薄盘样条函数理论 ,引入多个影响因子作为协变量进行气象要素空间插值 ,大大提高插值精度 ,且 能同时进行多个表面的空间插值, 对时间序列的气象要素更加适合。

——《专用气候数据空间插值软件ANUSPLIN 及其应用 》

将 ANUSPLIN 的局部薄盘样条插值结 果分别与反向距离权重法和普通克吕格法的插值结果进行对比 , 显示 ANUSPLIN 软件的插值误差最小 。 结果同样表明 , 适当增加站点数量、 提高DEM精度可进一 步提高 ANUSPLIN软件 的插值精度。

——《基于 ANUSPLIN 软件的逐日气象要素插值方法应用与评估 》

一、ANUSPLIN 模型说明

1.1 模型算法

ANUSPLIN 采用局部薄盘光滑样条法。其理论统计模型表达方法如下:

$z_i = f(x_i)+b^T y_i + e_i i = 1 , 2 , … , N $

\(z_i\)是位于空间 \(i\)点的因变量; \(x_i\)\(d\) 维样条独立变量,\(f\)是要估算的关于 \(x_i\)的未知光滑函数; \(yi\)\(p\)维独立协变量; \(b\)\(y_i\)\(p\)维系数; \(e_i\) 为具有期望值为 0 且方差为 $w_i σ_2 $的自变量随机误差; \(w_i\)是作为权重的已知局部相对变异系数,\(σ2\) 为误差协方差,在所有数据点上为常数,但通常未知。

\(p=0\),则模型简化为简化为薄盘光滑样条原型。函数\(f\)和系数\(b\)采用最小二乘法估计来确定:
\(\displaystyle\sum_{i=1}^{N}((z_i-f(x_i)-b^Ty_i)/w_i)^2 +ρJ_m(f)\)

\(J_m(f)\) 是函数 \(f(x_i)\) 的粗糙度测度函数(样条次数),定义为函数 \(f\) 的m阶偏导, ρ是正的光滑参数,通常由广义交叉验证 GCV 的最小化来确定。

其他更具体的参数计算参见 ANUSPLIN 说明文件。

1.2 模块描述

程序模块 描述
SPLINA 适用于站点数<2000 的任意个独立变量或多个协变量的薄盘样条函数。数据平滑度由 GCV 或 GML 决定。
SPLINB 功能与 SPLINA 类似,站点数>2000 数据利用 SELNOT 进行节点选择,最多 10000 个站点,2000 个节点。
SELNOT 为 SPLINB 添加初始节点
ADDNOT 为 SPLINB 添加数据节点
DELNO 为 SPLINB 删除数据节点
DELNOT 为 SPLINB 删除数据节点
GCVGML 计算每个表面的 GCV 或 GML,以及平滑参数范围内所有表面的平均GCV 或 GML。可用于样条优化参数。将 GCV 或 GML 值写入文件,以供检查和绘图。
LAPPNT 计算预测值或贝叶斯标准误差估计的点文件
LAPGRD 生成拟合曲面或贝叶斯标准误差曲面

1.3 ANUSPLIN 光滑样条函数模型选择

模型序号变量(协变量)样条次数模 型 缩写含义
1经度,纬度2BVTPS2双变量薄盘光滑样条函数
2经度,纬度3BVTPS3双变量薄盘光滑样条函数
3经度,纬度4BVTPS4双变量薄盘光滑样条函数
4经度,纬度(高程)2TVPTPS2三变量局部薄盘光滑样条函数
5经度,纬度(高程)3TVPTPS3三变量局部薄盘光滑样条函数
6经度,纬度(高程)4TVPTPS4三变量局部薄盘光滑样条函数
7经度,纬度,高程(m)2TVTPS2三变量薄盘光滑样条函数
8经度,纬度,高程(m)3TVTPS3三变量薄盘光滑样条函数
9经度,纬度,高程(m)4TVTPS4三变量薄盘光滑样条函数
10经度,纬度,高程(km)2TVTPS2三变量薄盘光滑样条函数
11经度,纬度,高程(km)3TVTPS3三变量薄盘光滑样条函数
12经度,纬度,高程(km)4TVTPS4三变量薄盘光滑样条函数
13经度,纬度,高程(dm)2TVTPS2三变量薄盘光滑样条函数

1.4 ANUSPLIN 插值模型选择

气象要素模型独立变量独立协变量数据转换方式样条次数
月平均最高气温TVPTPS经度,纬度高程2,3
月平均最低气温TVPTPS经度,纬度高程2,3
月平均风速TVPTPS经度,纬度高程2
月降雨量BVTPS经度,纬度-平方根转换2
水汽压TVPTPS经度,纬度高程2
月日照时数TVPTPS经度,纬度月温度范围2,3
净辐射SRAD+TVPTS经度,纬度年辐射,地表覆盖,地形等2,3
蒸发皿蒸发QVPTPS经度,纬度净辐射,水气压差,风速2,3,4

降水的空间插值由于数据范围大以及不确定性强,所以采用平方根变换来降低数据的值域范围,最后再运用普通双变量的薄盘样条函数。

*注:对于日、年等数据,也可尝试选择以上模型。

image-20220829103156562

二、ANUSPLIN 使用方法

2.1 splina.cmd脚本

rainsp
1
2
1
0
0
140 150 0 5
-45 -39 0 5
2 5000 1 1
1000.0
2
2
12
0
1
1
rainn.dat
300
6
(a6,f8.3,f8.3,f8.1/12f9.2)
04-P-04-splina.res
04-P-04-splina.opt
04-P-04-splina.sur
04-P-04-splina.lis
04-P-04-splina.cov



注:每个参数为一行。

[splina.cmd]编写说明

参数(例)说明解释
rainsp表面文件名
1插值数据的单位0-未定义
1-米
2-英尺
3-千米
4-英里
5-度
6-弧度
7-毫米
8-兆焦耳
2变量独立样条变量0-10
1独立协变量0-7
0表面样条变量0-7
0表面协变量0-7
140 150 0 5第1个变量(经度)的参数含义:
  前两个数字:经纬度和高程的边界信息。
  第三个数字:表示经纬度和高程(变量)是否进行转换和转换方法。
  第四个数字:表示单位。
  如果有,第五个数字代表边距。
①经纬度和高程的边界(大于DEM中的范围)
  [140 150]-经度的西东边界
  [-45 -39]-纬度南北边界
  [2 5000]-高程的下上边界
②经纬度 (变量)的变换方法
  0-不进行变换
  1-X/A
  2-X*A
  3-A*LOG(X + B)
  4-(X/B)**A
  5-A*EXP(X/B)
  6-A*TANH(X/B)
  7-取异向角值
  8-取异向角系数
③单位定义可参考[插值数据的单位]
④当第3个变量为高程时,可将单位m变换为km,可提高拟合效果。
-45 -39 0 5第2个变量(纬度)的参数
2 5000 1 1第3个变量(协变量-高程)的参数
1000.0变换系数AA=1000.0
2因变量转换0-不转换
1-转换为自然对数
2-转换为平方根
2样条次数≥2
12输出表面数≥1
0误差权重选择0-所有数据点采用统一的权重
1-所有的表面采用统一的权重
12(输出表面数)-为每个表面采用不同的权重
1优化参数指标(通常为1)0-每个表面采用相同的平滑参数
1-每个表面采用相同的平滑算法
2-每个表面采用不同的平滑算法
1平滑方法选择 (通常为1)0-采用表面平滑参数-参数大小
1-最小化GCV法
2-使用所提供的误差标准偏差估计最小化真实均方误差(MSE)
3-采用固定自由度-固定值大小
4-最小化GML法
rainn.dat插值数据文件
300数据点个数≥数据点真实值
6站点标签字符数
(a6,f8.3,f8.3,f8.1/12f9.2)数据格式 a6-标签类型为字符串,6字符。
f8.3-变量数据,3位小数,8个字符。
/-换行。
12f9.2-12个9个字符保留两位小数的数据。
若有:
x-空格。
48x, f8.1,40x-数据为8个字符1位小数,除去前6(48/8)列数据和后5(40/8)列数据,只保留第7列数据。
(注意:定义的数据数量与站点标签、变量个数与需要插值的数据数量总和尽量一致。例如根据 <表1.2.1 ANUSPLIN插值数据格式示例> 的示例数据,我们可以定义 (a5, 2f8.2, f8.1, 4f8.0),表示1个5字符的站点标签,2个8字符2位小数的变量(经度、纬度),1个8字符1位小数的协变量(高程),4个8字符无小数的数据。)
若有,此处可以为导入导出数据节点文件和坏数据标志文件。若无,则忽略,不需空行。(脚本示例中为 忽略)
04-P-04-splina.res输出残差文件不需要可不填,需空行。
04-P-04-splina.opt光滑参数文件不需要可不填,需空行。
04-P-04-splina.sur表面文件LAPGRD的输入数据
04-P-04-splina.lis列表文件观测数据、预测数据、误差数据。不需要可不填,需空行。
04-P-04-splina.cov拟合表面系数的误差协方差文件不需要可不填,需空行。
(建议空两行作为结尾)

2.2 lapgrd.cmd脚本

04-P-04-splina.sur
1
1
1
04-P-04-splina.cov
2

1
1
144.5 148.5 0.25
2
-44.0 -40.0 0.25
0
2
tas4.txt
2
-99.0
rain1.grd
(f8.2)
2
-99.0
cov_rain1.grd
(f8.2)



[lapgrd.cmd]编写说明

参数(例)说明解释
04-P-04-splina.sur输入表面名
1表面个数0-全部输出
1-12([splina.cmd]中的输出表面数)-输出指定个数的表面,与最后输出的*.grd个数一致。
1表面类型计算0-只统计摘要信息
1-拟合表面值
1表面值转换,不一定需要。依[splina.cmd]中的因变量转换确定。没有则忽略,不需空行。0-不进行转换
1-应用转换
04-P-04-splina.cov误差协方差文件名,没有则忽略,不需空行。
2误差协方差类型。没有则忽略,不需空行。0-只计算平均表面值的标准误差
1-模型标准误差
2-预测标准误差
3-95%模型置信区间
4-95%预测置信区间
最大标准误差,可不填,需空行。
1栅格位置0-栅格边角
1-栅格中心
1第1个变量的索引(经度)数据中第1数字类型的数据列
144.5 148.5 0.25边界与分辨率,小于[splina.cmd]中纬度的边界范围,与DEM的范围一致。[144.5 148.5]-西东边界
0.25-分辨率
2第2个变量的索引(纬度)数据中第2数字类型的数据列
-44.0 -40.0 0.25边界与分辨率。小于[splina.cmd]中纬度的边界范围,与DEM的范围一致。[-44.0 -40.0]-南北边界
0.25-分辨率
0掩膜方式0-无掩膜
1-通用掩膜
2-ARCGIS掩膜
3-Idrisi掩膜
若有掩膜,此处可以为掩膜文件名。若没有,则忽略,不需空行。(脚本示例中为忽略)
2独立协变量数据格式0-固定常数
1-通用栅格格式
2-ArcGIS格式
3-Idrisi格式
tas4.txt独立协变量数据文件名。若为常量,此处为常量值。此处为ArcGIS导出以ASCII码保存的纯文本dem数据。
2输出文件格式0-X,Y,Z网格文件
1-以行的形式保存通用栅格文件
2-ARCGIS栅格文件
3- Idrisi影像文件
-99.0输出文件无效值定义设置值与DEM中无效值相同。
rain1.grd输出文件名输出文件个数与[表面个数]一致。每个文件名占一行。
(1f8.2)输出文件数量(1,为1时可忽略)和数据格式(f8.2)空白表示以二进制形式输出。
*注意:如果输出文件无效值设置过大,建议增加输出文件字符宽度。
2输出误差表面格式同[输出文件格式]。
-99.0输出误差文件无效值定义同[输出文件无效值定义]。
cov_rain1.grd输出误差文件名同[输出文件名]。
(1f8.2)输出误差文件数量(1,为1时可忽略)和数据格式(f8.2)同[输出文件数量和数据格式]。
(建议空两行作为结尾)

2.3 grd转tif文件

import arcpy
from arcpy.sa import *
import sys, string, os

idx = 'Avst'
dir = r'E:\projects\weather\ANUSPLIN\mapdata\\'
path = dir + idx
files = os.listdir(path)
for f in files:
    if os.path.splitext(f)[1] == '.grd':
        Input_raster_file = path + os.sep + f
        Raster_Format = "TIFF"
        Output_Workspace = path
        basename = os.path.splitext(f)[0]
        Output_raster = Output_Workspace + os.sep + basename + '.tif'
        arcpy.RasterToOtherFormat_conversion(Input_raster_file, Output_Workspace, Raster_Format)
        print(Output_raster)
        os.remove(Input_raster_file)

2.4 负值问题

有些气象要素如降水、辐射等插值完后会可能会存在着负值,不符合逻辑,可以将出现的负值的地方设为0,方法可参考下面文章。
https://www.jianshu.com/p/e7ae1e367f8a

import arcpy
from arcpy.sa import *
arcpy.env.workspace = "I:\\climate\\vpd\\tif_02_05" #工作空间(文件夹)
output_path = "I:\\climate\\vpd\\tif05\\" #输出地址
rasterlist = arcpy.ListRasters("*","tif") #遍历文件夹下所有的tif格式的文件
for raster in rasterlist:
  out = output_path + raster
  outCon = Con(Raster(raster) < 0, 0,raster)
  outCon.save(out)
posted @ 2022-09-01 18:02  王陸  阅读(2275)  评论(0编辑  收藏  举报