- 积分
- 1104
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2016-9-23
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 毕业两年的小白 于 2021-2-19 16:02 编辑
下载到的.nc数据,有时候需要筛选出指定省市的数据进行作图。网上搜了一圈,MATLAB主要用inpolygon这个函数,但是没有详细教程。
这里分享一下自己的学习成果。
目标:绘制黑吉辽三省9月的降雨总量
- clear % 清除变量
- clc % 清屏
- %% 1、读取数据
- info = ncinfo('precip_hourly_Sep.nc'); % 查看变量
- lon = ncread('precip_hourly_Sep.nc','longitude'); % 读取经度
- lat = ncread('precip_hourly_Sep.nc','latitude'); % 读取纬度
- time = ncread('precip_hourly_Sep.nc','time'); % 读取时间
- pr = ncread('precip_hourly_Sep.nc','tp'); % 读取9月的数据
- % shp = shaperead('D:\Work\My_MATLABTools\basic_map\bou2_4p.shp');
- % 注意这里要对原始shp手动处理,删掉不想要的省市。我这里只保留了黑吉辽三省,并另存成了shpPart。
- load('shpPart.mat')
- %% 2、数据筛选
- % 创建cLon cLat两个二维数组,用于存储经纬度,注意,都是二维的。
- [cLat,cLon]=meshgrid(lat,lon);
- % 获取shpPart内的点
- [hide]% in = inpolygon(xq,yq,xv,yv),xq yq是坐标点矩阵,二者大小一致;xv yv是边界矩阵,也要大小一致
- % 返回的in是一个布尔值矩阵,与xq yq大小一致,即每个点是否在xv yv组成的图形内
- % 这只是最基础的用法。更多奇技淫巧参考 https://ww2.mathworks.cn/help/matlab/ref/inpolygon.html
- boolIn=false(length(lon),length(lat));
- for i=1:length(shpPart)
- in=inpolygon(cLon,cLat,shpPart(i).X, shpPart(i).Y);
- % shpPart里其实有多组图形范围文件,用循环进行布尔值累加,获得所有东三省范围内的点
- % 注意这里的boolIn经过加减运算自动转换成了double型,但其值仍然只有0/1
- boolIn=boolIn+in;
- end[/hide]
- % 求降水的话,用下面办法很简单,直接利用布尔值false即为0的特点,将区外数值变成0即可
- % 但最好的办法还是变成nan,否则0值也会带来麻烦,尤其是温度等跨零数据
- sumPr=zeros(length(lat),length(lon));
- for i=1:length(time)
- pr1(:,:,i)=pr(:,:,i).*boolIn*1000; %放大1000倍,由“米”转换为“毫米”
- sumPr=sumPr+(pr1(:,:,i))';
- end
-
- %将shpPart外的值设为nan
- sumPr2=zeros(length(lat),length(lon));
- for i=1:length(time)
- for j=1:size(pr,1)
- for k=1:size(pr,2)
- if boolIn(j,k)==0
- pr2(j,k,i)=nan;
- else
- pr2(j,k,i)=pr(j,k,i)*1000;%放大1000倍,由“米”转换为“毫米”
- end
- end
- end
- sumPr2=sumPr2+(pr2(:,:,i))';
- end
复制代码
效果图,没有美化,只是验证一下数据
效果图,没有细调,只是看看数据区域对不对
最后说说官方文档中的xq(in)算法
xq(in) yq(in) 直接获取了xq yq中的区内点坐标,但是,其弊端在于:
如果xq yq是二维数组,xq(in) yq(in)返回的不是二维数组,而是将xq yq 按 列 重 组 成的一维数组
对于本例,pr数据和lat lon数据是割裂的三个变量,用in方法只能判断lat lon是否在区内,无法判断pr
所以,为了理解简单,上面采用了逐点判断的方法
当然,用in方法把pr lat lon 都转换为一维数组的方法肯定是可行的,只要保证一一对应即可
原创不易,点个赞再走呗
转载请注明出处。
|
评分
-
查看全部评分
|