【SWAT水文模型】SWAT水文模型建立及应用第四期: 气象数据的准备(传统气象站)(含MATLAB数据整理代码)

本博客主要介绍气象数据的准备,分为数据下载和数据处理两部分。

1 简介

SWAT模型需要的气象数据主要包括流域的日降水量、最高/最低气温、太阳辐射、风速和相对湿度。这些数据可以是统计数据,也可以通过SWAT模型的天气模拟程序(Weather Generator)生成,或者是统计和模拟生产数据的结合。
理想情况下SWAT模型需要至少20年的天气资料,如果缺少必要的资料则可用天气发生器进行补充。
在时间尺度上,模型的模拟时间步长可以为年、月、日。

1.1 数据来源

降水、日最高/最低气温以及风速、相对湿度、太阳辐射等气象数据由中国气象数据共享服务网提供。

此案例研究区域为洮河流域(甘肃省),其周边气象站点分布如下:
在这里插入图片描述
数据系列长度为整个研究期(包括率定期和检验期):1970-2020年。站点信息如下:
在这里插入图片描述

2 气象数据的准备(传统气象站)

气象数据对水文过程的重要性是不言而喻的。在SWAT 模型建立过程中有三个数据是模型所必须得,即天气发生器、降水数据、气温数据、相对湿度、风速和日照(可选),前者因其可以弥补气象数据的缺失,是SWAT 模型内置的,必须在建模之前提前建立好数据库信息,后两者可以从气象站点获取数据。

关键步骤 :

  • 天气发生器各参数的计算
  • 降水及气温输入数据的准备

2.1 天气发生器各参数的计算

天气发生器可以根据多年逐月气象资料模拟生产逐日气象资料,但该数据库要求输入的参数较多,其主要输入数据有月平均最高气温、月平均最低气温、最高气温标准偏差、月平均降雨量、降雨量标准偏差、月内干日日数、露点温度、月平均太阳辐射量等。
天气发生器参数的计算公式如下:
在这里插入图片描述
天气发生器的详细介绍可参见另一博客-【SWAT水文模型】SwatWeather软件使用教程

打开SWAT2012.mdb数据库,WGEN_user表,如下:
在这里插入图片描述
将其导出为excel表,并将研究区域内的站点资料整理进去。
在这里插入图片描述
随后,将整理好的表WGEN_user导入到SWAT2012.mdb数据库中的WGEN_user表中。在导入表时,选择【我自己选择主键】,如下图:
在这里插入图片描述

2.2 降水及气温输入数据的准备

在模型的气象输入文件中,降水与气温数据是必须的文件。降水所需尽可能的长时间序列实测数据,其格式如下图所示分为两列,时间序列必须为连续的,没有测值用-99代替,存储为.DBF格式。因为降水直接对径流有着重要的影响,虽然天气发生器可以模拟日降水数据,但强烈建议模型使用者直接输入实测的日尺度降水数据。
如果降水、气温的站点与天气发生器站点为同一个,可以由SwatWeather.exe直接生成所需格式的输入文件,如果有更多的站点,需要自行转化成相应格式的输入文件,建议降水与气温数据采用尽可能多的站点。

2.2.1 降水数据准备

SWAT模型气象数据的输入格式可以在软件安装后自带的案例中查看。
以降水为例,每一个站点的降水数据要形成一个单独的文本文件,文件命名为站点的名称,降水的索引文件和站点数据必须要在同一个文件夹下面,在SWAT输入中只需要输入索引文件,它会在同一个文件夹下面自动寻找站点数据。
在这里插入图片描述
具体的格式:每一种类型的数据需要有一个站点的索引文件,比如降水,需要有一个降水站点的索引文件,索引文件中需要包含站点的名称(具体表头的样子参考自带的案例),索引文件具体的样子如下:一定要严格按照格式输入,后三者为纬度、经度和高程。
每一个站点的数据要注意的点:

  • 必须从模拟的第一天到最后一天,每天都要有一个数据,即便数据缺失也要用-99代替,一定要确保数据没有缺失,每个站点的数据长度都是相同的;
  • 每个站点名称一定要与站点索引文件中的站点名称(NAME)字段对应起来;
  • 注意异常值处理,网上下载的数据通常都有异常值,比如9999之类的,都必须替换为-99

PCPfork文件的MATLAB实现代码如下:

clc
close all
clear
%% 基本设置
pathFiles= '.\DataFiles\' ;

%% 导入数据

load('StationYT.mat');
nStation = length( StationYT );

%% 导出数据 ID NAME LATITUDE LONGITUDE ELEVATION
nVariable = 5;
Title = 'PCPfork';
fid = fopen([pathFiles,'PCPfork.txt'],'wt');
fprintf(fid,'%s\n','ID,NAME,LAT,LONG,ELEVATION');
for iStation=1:nStation
    for iVariable=1:nVariable
        switch iVariable
            case 1
                fprintf(fid,'%s',num2str( StationYT(iStation,1) ) );
                fprintf(fid,'%c',',');
            case 2
                fprintf(fid,'%s','PCP');
                fprintf(fid,'%s',num2str( StationYT(iStation,1) ) );
                fprintf(fid,'%c',',');
            case 3
                fprintf(fid,'%0.4f',StationYT(iStation,2));
                fprintf(fid,'%c',',');
            case 4
                fprintf(fid,'%0.4f',StationYT(iStation,3));
                fprintf(fid,'%c',',');
            case 5
                fprintf(fid,'%0.2f\n',StationYT(iStation,4));
        end
    end
end

输出文件格式如下:
在这里插入图片描述
各站点日降水数据的处理如下:

clc
close all
clear
%% 基本设置
pathFigure= '.\Figures\' ;
pathFiles= '.\DataFiles\' ;

%% 站点数据资料处理
load('StationID.mat');                                % 840个站点的站点信息                      
load('StationIDSSQ.mat');                          % 研究区内站点信息(区站号 X Y 位置)
nStation = length(StationIDSSQ);

load('Prec.mat');                   % 降水
Datamiss = -99;

% 截取实际采用数据(1970-2020年 共51年数据)18628% ------------------------------------------------------------------
nDay = datenum(2020,12,31)-datenum(1970,1,1)+1;
ii = datenum('01-Jan-1970');
jj = datenum('31-Dec-2020');
% 数据说明:分闰年/平年
if (jj-ii+1)~=nDay
    sprintf("数据有误!")
end

%% 研究区内降水数据处理 日降水资料PRE

% 根据研究区内站点ID得到相应降水数据
% ------------------------------------------------------------------
ID = StationIDSSQ;
PrecSSQ = zeros( length(ID) , length( Prec(1,:)) );
for ilength = 1:length( ID )
    for jlength = 1:length( StationID )
        if ID(ilength)==StationID(jlength)
            PrecSSQ(ilength,:) = Prec(jlength,:);
        end
    end
end

% 降水数据处理
% 32700	表示降水"微量"
% 32XXX	XXX为纯雾露霜
% 31XXX	XXX为雨和雪的总量
% 30XXX	XXX为雪量(仅包括雨夹雪,雪暴)
% ------------------------------------------------------------------
PSSQ = zeros( nStation ,  nDay );
for iStation=1:nStation
    for iday=1:nDay
        if isnan( PrecSSQ( iStation,iday) )
            PSSQ( iStation,iday) = Datamiss;
        elseif PrecSSQ( iStation,iday)==999990
            PSSQ( iStation,iday) = 0;
        elseif PrecSSQ( iStation,iday)==32700
            PSSQ( iStation,iday) = 0;
        elseif PrecSSQ( iStation,iday)>32000
            PSSQ( iStation,iday) = PrecSSQ( iStation,iday)-32000;
        elseif PrecSSQ( iStation,iday)>31000
            PSSQ( iStation,iday) = PrecSSQ( iStation,iday)-31000;
        elseif PrecSSQ( iStation,iday)>30000
            PSSQ( iStation,iday) = PrecSSQ( iStation,iday)-30000;
        else
            PSSQ( iStation,iday) = PrecSSQ( iStation,iday);
        end
    end
end

% txt格式数据导出   起始数据年月日  各日降水量(mm)
% ------------------------------------------------------------------

for iStation=1:nStation
    Title = ['PCP',num2str( StationIDSSQ(iStation,1) )];
    fid = fopen([pathFiles,'PCP\',Title,'.txt'],'wt');
    fprintf(fid,'%s\n','19700101');
    for iday=1:nDay
        fprintf(fid,'%0.2f\n', PSSQ( iStation,iday) );
    end
end

输出文件夹如下所示:
在这里插入图片描述

2.2.2 气温数据准备

气温数据输入格式如下:

  • TMPfork.txt文件储存各站点信息
  • 各子文件夹存储气温数据
    在这里插入图片描述
    MATLAB处理代码与降水处理代码类似,如下:
clc
close all
clear
%% 基本设置
pathFiles= '.\DataFiles\' ;

%% 导入数据

load('StationYT.mat');
nStation = length( StationYT );


%% 导出数据 ID NAME LATITUDE LONGITUDE ELEVATION
nVariable = 5;
Title = 'TEMPfork';
fid = fopen([pathFiles,'TEMPfork.txt'],'wt');
fprintf(fid,'%s\n','ID,NAME,LAT,LONG,ELEVATION');
for iStation=1:nStation
    for iVariable=1:nVariable
        switch iVariable
            case 1
                fprintf(fid,'%s',num2str( StationYT(iStation,1) ) );
                fprintf(fid,'%c',',');
            case 2
                fprintf(fid,'%s','TEMP');
                fprintf(fid,'%s',num2str( StationYT(iStation,1) ) );
                fprintf(fid,'%c',',');
            case 3
                fprintf(fid,'%0.4f',StationYT(iStation,2));
                fprintf(fid,'%c',',');
            case 4
                fprintf(fid,'%0.4f',StationYT(iStation,3));
                fprintf(fid,'%c',',');
            case 5
                fprintf(fid,'%0.2f\n',StationYT(iStation,4));
        end
    end
end

根据此MATLAB代码,即可得到所需输入txt文件。

3 SWAT模型中气象数据的导入

SWAT模型中气象数据的导入见下表:
在这里插入图片描述

参考

1、CSDN博客-SWAT模型教程—土地利用、土壤数据、气象数据的处理
2、CSDN博客–SWAT模型气象数据处理(一)

  • 14
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
SWAT模型气象数据的计算翻译By:94527257 The Program pcpSTAT User’s Manual Stefan Liersch, Berlin, August 12, 2003 [email protected] 下载地址:http://www.brc.tamus.edu/swat/pcpSTAT.zip 引言 pcpSTAT.exe 程序用来计算SWAT 模型气象发生器所需要的每日降水数据的统计 参数(userwgn.dbf)。表1 中列出的一些参数能毫不费力地利用MICROSOFT EXCEL 等 工具计算出来,而PR_W1 和 PR_W2 比较难计算。 表 1:SWAT 所用的降水统计参数 PCPMM(mon) = average or mean total monthly precipitation PCPSTD(mon) = standard deviation for daily precipitation in month PCPSKW(mon) = skew coefficient for daily precipitation in month PR_W1(mon) = probability of a wet day following a dry day PR_W2(mon) = probability of a wet day following a wet day PCPD(mon) = average number of days of precipitation in month 输入文件 存储着每日降水数据的输入文件必须是只有一列数字的 ASCII 码文本文件(图1)。 观测期必须是开始于1 月1 日,结束于12 月31 日。换句话说,第一个数据值是1 月1 日的,最后一个是12 月31 日的。虽然对利用的总年数没有限制,但每一次的计算都 必须是基于一整年。 若是有缺失的数据,需要用空值(必须是数字)来填充这些缺失的数据值。程序 会询问这些值,并用整个系列的平均值取代空值。 图1: Example of a Precipitation Input File 翻译By:94527257 创建输入文件 降水数据文件通常是文本文件,一列是日期,一列为降水值。用EXCEL 打开数据 文件,若有必要可以缩减日期,以使其从1 月1 日开始,12 月31 日结束。随后,删除 日期列,只剩降水数据列,并保存为文本文件(filename.txt)。 若是使用其它软件创建输入文件或是之后使用文本编辑器操作文件,确保最后存 在一个空行。若是没有空行或是超过一个空行,程序将会中断并弹出消息“End of file during read”,且将会产生错误的输出数据 运行 pcpSTAT.exe 程序 将程序和输入文件放在同一个目录,双击 pcpSTAT.exe 或是从DOS 窗口中启动程 序(图2)。键入输入、输出文件的名字(包括其扩展名),至于输出文件,可以任意命 名。下一步,需要输入起始年份,用来判断一个年份是否是闰年。只要键入第一年(4 位数字)回车。此后,需要输入无数据值,若降水数据有缺测,需要输入一个并不存 在的数字,例如“999”。 图2: Program pcpSTAT.exe 在计算结束后,输出文件(图3)会自动保存在程序目录中。此外,还会生成2 个文件:totalpcp.sta 和mean_pcp.sta。totalpcp.sta(图4)包了每年每个月的总降水, mean_pcp.sta 则包每年每个月的平均每日降水。 翻译By:94527257 图3: Example of an Output File 翻译By:94527257 图4: Example of the File totalpcp.sta

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WW、forever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值