【SWAT水文模型】SWAT水文模型建立及应用第四期: 气象数据的准备(传统气象站)(含MATLAB数据整理代码)
时间:2024-05-04 19:35:22 来源:网络cs 作者:晨起 栏目:卖家故事 阅读:
降水、日最高/最低气温以及风速、相对湿度、太阳辐射等气象数据由中国气象数据共享服务网提供。
此案例研究区域为洮河流域(甘肃省),其周边气象站点分布如下:
数据系列长度为整个研究期(包括率定期和检验期):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输入中只需要输入索引文件,它会在同一个文件夹下面自动寻找站点数据。
具体的格式:每一种类型的数据需要有一个站点的索引文件,比如降水,需要有一个降水站点的索引文件,索引文件中需要包含站点的名称(具体表头的样子参考自带的案例),索引文件具体的样子如下:一定要严格按照格式输入,后三者为纬度、经度和高程。
每一个站点的数据要注意的点:
PCPfork文件的MATLAB实现代码如下:
clcclose allclear%% 基本设置pathFiles= '.\DataFiles\' ;%% 导入数据load('StationYT.mat');nStation = length( StationYT );%% 导出数据 ID NAME LATITUDE LONGITUDE ELEVATIONnVariable = 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 endend
输出文件格式如下:
各站点日降水数据的处理如下:
clcclose allclear%% 基本设置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 endend% 降水数据处理% 32700表示降水"微量"% 32XXXXXX为纯雾露霜% 31XXXXXX为雨和雪的总量% 30XXXXXX为雪量(仅包括雨夹雪,雪暴)% ------------------------------------------------------------------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 endend% 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) ); endend
输出文件夹如下所示:
2.2.2 气温数据准备
气温数据输入格式如下:
TMPfork.txt文件储存各站点信息各子文件夹存储气温数据MATLAB处理代码与降水处理代码类似,如下:
clcclose allclear%% 基本设置pathFiles= '.\DataFiles\' ;%% 导入数据load('StationYT.mat');nStation = length( StationYT );%% 导出数据 ID NAME LATITUDE LONGITUDE ELEVATIONnVariable = 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 endend
根据此MATLAB代码,即可得到所需输入txt文件。
3 SWAT模型中气象数据的导入
SWAT模型中气象数据的导入见下表:
参考
1、CSDN博客-SWAT模型教程—土地利用、土壤数据、气象数据的处理
2、CSDN博客–SWAT模型气象数据处理(一)
本文链接:https://www.kjpai.cn/gushi/2024-05-04/164896.html,文章来源:网络cs,作者:晨起,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!