Более удобный способ получить данные VIIRS (спутник NPP) – посредством системы предоставления спутниковых данных NOAA - CLASS:
http://www.class.ngdc.noaa.gov/saa/prod ... submit.y=7
Система интуитивно понятна, и никаких проблем с заказом данных у меня не возникло. Данные предоставляются бесплатно, но необходимо зарегистрироваться.
Я заказал измерения VIIRS в режиме DNB (Day-Night-Band) - излучение от Земли в ночное время. Файл занимает около 574 Мб.
Обращаясь к возможностям MATLAB, продемонстрированным GGG, функцией h5disp вывожу структуру файла с перечнем массивов данных.
HDF5 GDNBO-SVDNB_npp_d20130125_t1709492_e1715295_b06460_c20130308001653859057_noaa_ops.h5
Group '/'
Group '/All_Data'
Group '/All_Data/VIIRS-DNB-GEO_All'
Dataset 'Height'
Dataset 'Latitude'
Dataset 'Longitude'
Dataset 'LunarAzimuthAngle'
Dataset 'LunarZenithAngle'
Dataset 'MidTime'
Dataset 'ModeGran'
Dataset 'ModeScan'
Dataset 'MoonIllumFraction'
Dataset 'MoonPhaseAngle'
Dataset 'NumberOfScans'
Dataset 'PadByte1'
Dataset 'QF1_SCAN_VIIRSSDRGEO'
Dataset 'QF2_SCAN_VIIRSSDRGEO'
Dataset 'QF2_VIIRSSDRGEO'
Dataset 'SCAttitude'
Dataset 'SCPosition'
Dataset 'SCSolarAzimuthAngle'
Dataset 'SCSolarZenithAngle'
Dataset 'SCVelocity'
Dataset 'SatelliteAzimuthAngle'
Dataset 'SatelliteRange'
Dataset 'SatelliteZenithAngle'
Dataset 'SolarAzimuthAngle'
Dataset 'SolarZenithAngle'
Dataset 'StartTime'
Group '/All_Data/VIIRS-DNB-SDR_All'
Dataset 'ModeGran'
Dataset 'ModeScan'
Dataset 'NumberOfBadChecksums'
Dataset 'NumberOfDiscardedPkts'
Dataset 'NumberOfMissingPkts'
Dataset 'NumberOfScans'
Dataset 'PadByte1'
Dataset 'QF1_VIIRSDNBSDR'
Dataset 'QF2_SCAN_SDR'
Dataset 'QF3_SCAN_RDR'
Dataset 'Radiance'
Group '/Data_Products'
Group '/Data_Products/VIIRS-DNB-GEO'
Dataset 'VIIRS-DNB-GEO_Aggr'
Dataset 'VIIRS-DNB-GEO_Gran_0'
Dataset 'VIIRS-DNB-GEO_Gran_1'
Dataset 'VIIRS-DNB-GEO_Gran_2'
Dataset 'VIIRS-DNB-GEO_Gran_3'
Group '/Data_Products/VIIRS-DNB-SDR'
Dataset 'VIIRS-DNB-SDR_Aggr'
Dataset 'VIIRS-DNB-SDR_Gran_0'
Dataset 'VIIRS-DNB-SDR_Gran_1'
Dataset 'VIIRS-DNB-SDR_Gran_2'
Dataset 'VIIRS-DNB-SDR_Gran_3'
Среди прочих выделю основные массивы данных :
Dataset 'Latitude' - широта;
Dataset 'Longitude' – долгота;
Dataset 'Radiance' – Энергетическая яркость (лучистость), [Вт/(м2*ср)]
Далее код на MATLAB’е (не раньше версии R2011b), конвертирующий поле энергетической яркости в geoTIFF:
%-----------------------------------------------------------------------
clc
clear all
res=750 % resolution, meters
res=km2deg(res*1E-3);
% путь к исходному файлу, вместе с названием
fn='d:\science\data\VIIRS\GDNBO-SVDNB_npp_d20130125_t1709492_e1715295_b06460_c20130308001653859057_noaa_ops.h5';
VIIRS.lt = h5read(fn,'/All_Data/VIIRS-DNB-GEO_All/Latitude')';
ln = h5read(fn,'/All_Data/VIIRS-DNB-GEO_All/Longitude')';
%ln(ln<0)=ln(ln<0)+360;
VIIRS.ln = ln;
clear ln
ltmin=min(min(VIIRS.lt));
ltmax=max(max(VIIRS.lt));
lnmin=min(min(VIIRS.ln));
lnmax=max(max(VIIRS.ln));
ltReg=[floor(ltmin) ceil(ltmax)];
lnReg=[floor(lnmin) ceil(lnmax)];
StepLt=1;
StepLn=1;
Z = h5read(fn,'/All_Data/VIIRS-DNB-SDR_All/Radiance')';
Z(:,[1, end])=nan;
Z([1, end],:)=nan;
if min(min(Z))<0
Z=Z-min(min(Z));
end
Z=int16(log10(Z)*1E3);
VIIRS.Z=Z;
clear Z
Zgrid=int16([]);
Z1=int16([]);
ltRange=[ltReg(1):StepLt:ltReg(2)];
lnRange=[lnReg(1):StepLn:lnReg(2)];
for i=ltRange(1:end-1)
latlim1=[i i+StepLt];
for j=lnRange(1:end-1)
lonlim1=[j j+StepLt];
[x,y]=meshgrid([lonlim1(1):res:lonlim1(2)],[latlim1(1):res:latlim1(2)]);
indOK=find(VIIRS.lt>=latlim1(1)&VIIRS.lt<latlim1(2)&VIIRS.ln>=lonlim1(1)&VIIRS.ln<lonlim1(2));
if isempty(indOK)
tmp=nan*ones(size(x));
else
F=TriScatteredInterp(double(VIIRS.ln(indOK)),double(VIIRS.lt(indOK)),double(VIIRS.Z(indOK)));
tmp=F(double(x),double(y));
end
Z1=[Z1 tmp];
%lt1=[lt1 y];
%ln1=[ln1 x];
end
Zgrid=[Zgrid;Z1];
%ltgrid=[ltgrid;lt1];
%lngrid=[lngrid;ln1];
%lt1=single([]);
%ln1=single([]);
Z1=int16([]);
[num2str(i) ' / ' num2str(ltReg(2))]
end
R = georasterref('RasterSize', [size(Zgrid)], ...
'RasterInterpretation', 'cells', ...
'Latlim', double(ltReg), 'Lonlim',...
double(lnReg), ...
'ColumnsStartFrom', 'south','RowsStartFrom','west');
f2s=[fn '.tif'];
geotiffwrite(f2s,Zgrid,R);
%-----------------------------------------------------------------------
Размер файла получается приличный (5960х3725), поэтому следует запастись терпением. У меня время выполнения функции составило около 12 мин. В качестве примера привожу фрагмент полученного geoTIFF’а, Ляодунский залив, расположенный на севере Бохайского моря. Напоминаю, что это ночной снимок, на котором виден свет от отдельных судов; сушу, лед и облачность видно благодаря лунному свету, чувствительность датчика просто потрясающая!