0

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;
4

1 に答える 1

1

HDF-EOS2 ダンパー ツールを使用して、最初に ASCII テキスト ファイルで緯度/経度を生成し、MATLAB で読み戻すことができます。この手法を利用する完全なコードは、次の Web サイトで入手できます。

http://hdfeos.org/zoo/LPDAAC/MOD17A2_PsnNet_1km.m

上記のコードは、次の HDF-EOS2 ダンパー ツール オプションを使用して、MOD17A2 から緯度と経度を ASCII でダンプします。

$eos2dump -c1 MOD17A2.A2007113.h11v09.005.2007136163924.hdf > lat_MOD17A2.A2007113.h11v09.005.2007136163924.output
$eos2dump -c2 MOD17A2.A2007113.h11v09.005.2007136163924.hdf > lon_MOD17A2.A2007113.h11v09.005.2007136163924.output

次に、下のプロットから関心のある場所を確認するか、ASCII ファイルを読み取って作成された MATLAB 配列から緯度/経度の値を検索できます。

上記の MATLAB コードのプロット

于 2013-12-19T04:54:58.780 に答える