用 pcolor + shp 画补丁图

材料

1. shp文件(最好是polyline)
2. Matlab 中 pcolor 函数

举例说明问题 (两种方式显示的结果类似)
>> data = magic(4)
data =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
>> pcolor(data)
data = magic(4)
data =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
>> xx =[1 2 3 4];
>> yy = [1 2 3 4];
>> [xv, yv] = meshgrid(xx, yy);
>> pcolor(xv, yv, data)

在这里插入图片描述
在这里插入图片描述
问题:

这里的横(纵)坐标都是1,2,3,4;是网格的交点,而非中心

默认情况下,横(纵)坐标都是以维度个数为刻度进行画图的。这样如果我们的图就会出现整体的偏移。经研究发现,其实每个作图点对应的都是”补丁“的左下角。

为此,解决方法也是比较简单。只需将整个图形向着左下方平移1/2个步长间隔就能满足要求了!


记录用 shp 和 pcolor 画图并修正的过程
clear
clc
% read shp information
deltD = 0.25;
shpf = shaperead('I:\博士\Research\guangdong_polyline.shp');
for i = 1:length(shpf)
    LonWestSet(i)  = min(shpf(i).BoundingBox(:,1));
    LonEastSet(i)  = max(shpf(i).BoundingBox(:,1));
    latSouthSet(i) = min(shpf(i).BoundingBox(:,2));
    latNorthSet(i) = max(shpf(i).BoundingBox(:,2));
end

lonWest  = floor(min(LonWestSet)) - deltD/2;
lonEast  = ceil(max(LonEastSet))  + deltD/2;
latSouth = floor(min(latSouthSet)) - deltD/2;
latNorth = ceil(max(latNorthSet))  + deltD/2;

rangeLon = lonWest : deltD : lonEast;
rangeLat = latSouth: deltD : latNorth;
[mhLon, mhLat] = meshgrid(rangeLon, rangeLat);

% make mask, 0 = nan, 1 = no nan
mask = zeros(size(mhLon));
for i = 1:length(shpf)
    xv = shpf(i).X;
    yv = shpf(i).Y;
    maskcell{i} = inpolygon(mhLon, mhLat, xv, yv);
    mask = mask + maskcell{i};
end
mask(mask == 0) = nan;

% read nc, the lon is [-180, 180]
inDir = ('D:\GLEAM_Monthly');
inFile = ('E_1980_2018_GLEAM_v3.3a_MO.nc');
inDirFile = [inDir, '\', inFile];
E = ncread(inDirFile, 'E');
E = flip(E, 1);  % 注意,这里是否需要镜像,不同数据有差异

ilonWest  = (lonWest + 179.875)./deltD + 1;
ilonEast  = (lonEast + 179.875)./deltD + 1;
ilatSouth = (latSouth + 89.875)./deltD + 1; 
ilatNorth = (latNorth + 89.875)./deltD + 1; 

gd_E = E(ilatSouth:ilatNorth, ilonWest:ilonEast, :);

gd_data = gd_E(:, :, 1) .* mask;
h = pcolor(mhLon-deltD/2, mhLat-deltD/2, gd_data); % 这里非常重要,将偏移量还原回去;
h.LineStyle = 'none';
colormap(winter)
colorbar
hold on

% draw shp bounding line (可选,建议不画)
for i = 1:length(shpf)
    xv = shpf(i).X;
    yv = shpf(i).Y;
    plot(xv, yv, 'k-');
    hold on
end

在这里插入图片描述

经过偏移调整之后,其实每个点对应的就是补丁的”中心

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大雨海深

感谢您的支持和鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值