材料
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
经过偏移调整之后,其实每个点对应的就是补丁的”中心“