HDF ファイルにいくつかの MODIS データ (MOD17A2) があります。データはすべて、1 つの同じグリッド (1200*1200 ピクセル) を 1 年間表示しています。HDF ファイルごとに 1 つのピクセル データ (ターゲット ポイント) のみを取得する必要があり、最終的にターゲット ポイントの 1 年間の時系列データを作成します。これで、matlab で 1200*1200 の行列データを表示し、4 つのグリッドコーナーとグリッドセンターの緯度/経度を知ることができます。1200*1200 マトリックスでターゲット ポイント (既知の緯度/経度) を見つけるにはどうすればよいですか?
clear all; clc;
%Opening the HDF-EOS2 Grid File
FILE_NAME='MOD17A2.A2012273.h09v04.005.2013230033352.hdf';
file_id = hdfgd('open', FILE_NAME, 'rdonly');
%Reading Data from a Data Field
GRID_NAME='MOD_Grid_MOD17A2';
grid_id = hdfgd('attach', file_id, GRID_NAME);
DATAFIELD_NAME='Gpp_1km';
[data1, fail] = hdfgd('readfield', grid_id, DATAFIELD_NAME, [], [], []);
%Convert M-D data to 2-D data
data=data1;
%Convert the data to double type for plot
data=double(data);
% This file contains coordinate variables that will not properly plot.
% To properly display the data, the latitude/longitude must be remapped.
[xdimsize, ydimsize, upleft, lowright, status] = hdfgd('gridinfo', grid_id);
%Reading attributes from the data field
SD_id = hdfsd('start',FILE_NAME, 'rdonly');
DATAFIELD_NAME='Gpp_1km';
sds_index = hdfsd('nametoindex', SD_id, DATAFIELD_NAME);
sds_id = hdfsd('select',SD_id, sds_index);
%Reading filledValue from the data field
fillvalue_index = hdfsd('findattr', sds_id, '_FillValue');
[fillvalue, status] = hdfsd('readattr',sds_id, fillvalue_index);
%The _FillValue in the file contains value 32767 but the actual value
%observed from the data is 32766.
fillvalue = 32761:32767;
%Reading valid_range from the data field
valid_range_index = hdfsd('findattr', sds_id, 'valid_range');
[valid_range, status] = hdfsd('readattr',sds_id, valid_range_index);
%Reading units from the data field
units_index = hdfsd('findattr', sds_id, 'units');
[units, status] = hdfsd('readattr',sds_id, units_index);
%Reading scale_factor from the data field
scale_index = hdfsd('findattr', sds_id, 'scale_factor');
[scale, status] = hdfsd('readattr',sds_id, scale_index);
%Reading add_offset from the data field
offset_index = hdfsd('findattr', sds_id, 'add_offset');
[offset, status] = hdfsd('readattr',sds_id, offset_index);
% Reading long_name from the data field
long_name_index = hdfsd('findattr', sds_id, 'long_name');
[long_name, status] = hdfsd('readattr',sds_id, long_name_index);
%Terminate access to the corresponding data set
hdfsd('endaccess', sds_id);
%Closing the File
hdfsd('end', SD_id);
%Replacing the filled value with NaN
for i=1:length(fillvalue)
data(data==fillvalue(i)) = NaN;
end
%Replacing the out of range values with NaN
data(data < valid_range(1)) = NaN;
data(data > valid_range(2)) = NaN;
%Multiplying scale and adding offset, the equation is scale *(data-offset).
data = (data-offset) * scale*1000;