标准降水指数(SPI)、标准化降水蒸发蒸腾指数(SPEI)和帕尔默干旱指数(PDSI)的下载、读取和可视化

news2024/10/7 6:46:05

数据下载网址:WWDT Data (dri.edu)icon-default.png?t=N7T8https://wrcc.dri.edu/wwdt/data/PRISM/

以SPI为例说明,

标准化降水指数(Standardized Precipitation Index, SPI)是由Mckee et al(.1993)分析美国科罗拉多干旱时,发现降水服从偏态分布,基于此提出了标准化降水指数。标准化降水指数通过计算给定时间内降雨量的累计概率,比较客观地表述了多时间尺度下的降水概率,反映降水因素对干旱的影响。Mckee et al.(1993)认为降水量的减少是导致干旱的主要因素,其他气候因子一般变化较小,对干旱产生的影响不大,因此SPI使用降水量作为唯一参数。SPI能较好表达因降水量的大小反映干旱状况,操作简单,所需资料仅为降水量,同时该干旱指数在各个地区和各个时段都具有良好的计算稳定性,是继PDSI之后另一种被广泛应用的干旱指数。
标准化降水指数介绍_标准化降水指数spipython-CSDN博客

 下载数据时间跨度为从2002年4月至2014年6月,共147个月。提前准备好如下形式的控制文件:

 读取SPI数据,并绘制加州中央山谷区域的SPI-6、SPI-12和SPI-24指标时间序列图

clearvars -except Time02_14
info6 = ncinfo('E:\RSE\data\PRISM\SPI\6\spi6_2003_1_PRISM.nc');
fid6=fopen('E:\RSE\data\PRISM\SPI\6\Contr_spi6.txt','r');
fid12=fopen('E:\RSE\data\PRISM\SPI\12\Contr_spi12.txt','r');
fid24=fopen('E:\RSE\data\PRISM\SPI\24\Contr_spi24.txt','r');
load E:\RSE\Result1\Time02_14.mat;
num_file= fscanf(fid6,'%d',1); fig=1;
dir_in6=fscanf(fid6,'%s',1);dir_in12=fscanf(fid12,'%s',1);dir_in24=fscanf(fid24,'%s',1);
for i = 1:num_file 
    file_name{i,1} = fscanf(fid6,'%s',1);
    file_name{i,2} = fscanf(fid12,'%s',1);
    file_name{i,3} = fscanf(fid24,'%s',1);
end
for k=1:num_file
    data6(:,:,k)=rot90(ncread(strcat(dir_in6,file_name{k,1}),'data')); 
    data12(:,:,k)=rot90(ncread(strcat(dir_in12,file_name{k,2}),'data'));
    data24(:,:,k)=rot90(ncread(strcat(dir_in24,file_name{k,3}),'data'));
end

lon = 360-125:0.041666:360-66.5;  lat =50:-0.041666:24.13;[LON,LAT]=meshgrid(lon,lat);
mask = 'E:\RSE\data\Basin\studyregion.vec';rows=3932;
spi6_serie=gmt_grid2regionserie(data6,mask,rows,lon,lat);
spi12_serie=gmt_grid2regionserie(data12,mask,rows,lon,lat);
spi24_serie=gmt_grid2regionserie(data24,mask,rows,lon,lat);
% save SPI6_24.mat spi6_serie spi12_serie spi24_serie

figure(fig)
plot(Time02_14,spi6_serie,'color',[0 0 0],'Linewidth',1.5);hold on;
plot(Time02_14,spi12_serie,'color',[0 1 0],'Linewidth',1.5);
plot(Time02_14,spi24_serie,'--','color',[1 0 1],'Linewidth',1.5);
title('','FontName','Time New Roman','Fontsize',30);
yline(0,'LineStyle','-','Color','red','LabelVerticalAlignment','middle','LabelHorizontalAlignment','center','LineWidth',1.5);
xlim([2002 2015]);
xticks([2002 2004 2006 2008 2010 2012 2014]);
xlabel('Time (year)','Fontname','Time New Roman',"FontSize",10);
ylabel('Index','Fontname','Time New Roman',"FontSize",10);
l1=legend('SPI6','SPI12','SPI24','location','northeast');
set(l1,'box','off',"FontSize",10,'Fontname','Time New Roman');
box on;grid on;fig=fig+1;

 值得说明滴是,“Time02_14”为以年为单位的时间变量;函数“gmt_grid2regionserie”如下:

function [plot_region]=gmt_grid2regionserie(grid,dir_msk,rows,lon,lat)
fid         = fopen(dir_msk,'r');
num_points  = rows;
        river_name  = fscanf(fid,'%s',1);
        xv          = zeros(num_points,1);
        yv          = zeros(num_points,1);
        for i=1:num_points
            a       = fscanf(fid,'%f %f',[1 2]);
            xv(i)   = a(1);
            yv(i)   = a(2);
        end
        fclose(fid);
lon_min=min(xv);lon_max=max(xv);
lat_min=min(yv);lat_max=max(yv);
ii=size(grid,2);jj=size(grid,1);num_file=size(grid,3);
if ii==1405 && jj==621
    load E:\RSE\result\lg_msk.mat;%%加州区域的掩膜,区域内为1区域外为0
else
        lg_msk = zeros(jj,ii);
        for j=1:jj
            for i=1:ii
                if lon(i)>=lon_min && lon(i)<=lon_max && lat(j)>=lat_min && lat(j)<=lat_max
                    in =inpolygon(lon(i),lat(j),xv,yv);
                    if in==1
                        lg_msk(j,i) = 1;
                    end
                end
            end
        end
end
grid_weight=zeros(jj,ii);
for j=1:jj
    for i=1:ii
        grid_weight(j,i)=cos(lat(j)*pi/180);
    end
end
grid_weight=grid_weight.*lg_msk;
tmmp=zeros(jj,ii);
% grid(logical(isnan(grid)))=0; % set possible NaNs to zeros
for k=1:num_file
    tmmp(:,:)=grid(:,:,k);
    grid_weight_new=grid_weight;
    tmmppp=tmmp.*grid_weight_new;
    tmmppp(logical(isnan(tmmppp)))=0;% in case, there are NaNs
    grid_sum=sum(sum(tmmppp));
    grid_weight_new(logical(isnan(tmmp)))=0;
    weight_sum=sum(sum(grid_weight_new));
    plot_region(k,1)=grid_sum/weight_sum;
end
end

结果:

SPEI、PDSI和sc-PDSI类似于上述操作方式,此处省略。如有任何问题,尽情批评指正,欢迎交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

gitlab设置保护分支

gitlab设置保护分支方法 进入代码仓库首页&#xff0c;找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮&#xff0c;并点击展开 可以看到已经存在默认的保护分支&#xff0c;通常是master/main分支&#xff0c;也可以添加新的保护分支 新建保护分…

使用idm下载百度云被限速 idm下载大文件后要整合 idm下载百度网盘有限制最新解决办法教程 idm限速解除方法

Internet Download Manager简称IDM,是一款Windows系统专业下载加速工具,IDM下载器支持多种类型文件下载,并能完美恢复各种中断的下载任务,是一款Windows平台下的多线程下载器&#xff0c;支持浏览器自动嗅探功能下载资源文件&#xff0c;包括视频、音频以及图片等类型文件&…

BUUCTF:Web 解析(一)

一、[极客大挑战 2019] EasySQL 点击链接进入靶场 登录页面&#xff0c;查看页面源代码发现没留注释 先输入 admin or 11# 提交看看&#xff08;根据题意猜测考察的 SQL 注入&#xff09; 显示 Flag 二、[极客大挑战 2019] Havefun 打开靶场 页面只有一只猫&#xff0c;打开…

区块链 | IPFS:Merkle DAG(进阶版)

&#x1f98a;原文&#xff1a;Merkle DAGs: Structuring Data for the Distributed Web &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时&#xff0c;必须通过提供节点和边的具体表示来编码我们的数据…

jenkins 部署springboot 项目

文章目录 持续集成指定tag发布 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 持续集成 为了让程序代码可以自动推送到测试环境基于Docker服务运行…

服务网关GateWay原理

文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…

C语言二叉树和堆

二叉树基础知识&#xff1a; 1.栈、队列和顺序表都是线性结构 但是二叉树不是&#xff0c;二叉树是多分支结构 2.任何一棵树都可以拆分为子树和根节点&#xff0c;许多二叉树的相关问题都是用分治的思想进行函数的递归进行解决。 例&#xff1a;前序&#xff0c;中序&#x…

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

【牛客网】排列计算

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 如果直接涂色来计算单点权重&#xff0c;2e5*2e5必然超时。 所以用差分进行优化。 3. 代码实现 #include<bits/stdc.h> using name…

漏洞扫描神器:Nessus 保姆级教程(附破解步骤)

一、介绍 Nessus是一款广泛使用的网络漏洞扫描工具&#xff0c;用于发现和评估计算机系统和网络中的安全漏洞。它是一款功能强大的商业工具&#xff0c;由Tenable Network Security开发和维护。 以下是Nessus的一些主要特点和功能&#xff1a; 1. 漏洞扫描&#xff1a;Nessu…

来一篇错题集(虽然简单吧)

一.Assembly via Remainders #include<bits/stdc.h> using namespace std; typedef long long ll; int a[2000]; int b[2000]; int main(){int t;cin>>t;while(t--){int n;cin>>n;for(int i1;i<n-1;i){cin>>b[i];}int x1000000000;//使用1000000000…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

uniapp实现点击事件跳转页面

首先定义一个点击事件 这里采用的vue3的写法&#xff0c;然后写上触发事件后要跳转的路径 function jump() {uni.switchTab({url:/pages/bangong/index})} 到这里就简单的实现uniapp的点击跳转页面了

类和对象【四】运算符重载

文章目录 运算符重载的概念运算符重载&#xff08;函数&#xff09;返回值类型&#xff1a;任意类型函数名&#xff1a;operator已有操作符 运算符重载&#xff08;函数&#xff09;的特点和注意点3个比较特殊的运算符重载赋值运算符&#xff08;&#xff09;重载返回值类型和返…

C++奇迹之旅:C++内存管理的机制(进阶篇)

文章目录 &#x1f4dd;new和delete操作自定义类型&#x1f320; operator new与operator delete函数&#x1f309;operator new与operator delete函数 &#x1f320;new和delete的实现原理&#x1f309;内置类型&#x1f309;自定义类型 &#x1f320;定位new表达式(placement…

【CTF MISC】XCTF GFSJ0512 give_you_flag Writeup(图像处理+QR Code识别)

give_you_flag 菜狗找到了文件中的彩蛋很开心&#xff0c;给菜猫发了个表情包 解法 图片的最后一帧好像闪过了什么东西。 用 Photoshop 打开&#xff0c;检查时间轴。 找到一张二维码&#xff0c;但是缺了三个角&#xff08;定位图案&#xff09;&#xff0c;无法识别。 找一…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…

学习经验分享【34】目标检测算法常见疑问(持续更新)

很多同学在学习深度学习算法过程中会遇到各种各样的问题,本博文对大家普遍存在的问题进行答疑,包括写论文常需要的指标FPS如何计算得到,怎么判断模型是否收敛等问题。如有问题可通过以下方式联系我。 一、Fuse指的是什么 Fuse是指模型的一些模块进行融合,最常见的就是conv和…

AI图书推荐:如何使用ChatGPT来提升逻辑分析能力

在一个日益由数据和技术驱动的世界中&#xff0c;进行逻辑思考和做出明智决策的能力比以往任何时候都更为关键。逻辑分析构成了理性思考的基础&#xff0c;引导我们穿越复杂问题&#xff0c;并帮助我们得出合理的结论。随着人工智能&#xff08;AI&#xff09;的出现&#xff0…