目录
0 MODIS数据介绍
Level 1B Calibrated Radiances - 1km - LAADS DAAC
热红外数据集:Earth View 1KM Emissive Bands Scaled Integers
radiance_scales和radiance_offset这两项参数代表波段的增益和偏移量,是辐射定标的系数。
MODIS辐射定标通用公式:Radiance = scales*(DATA-offset)
1 数据处理
import os
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
from pyhdf.SD import SD, SDC
FILE_NAME = 'MOD021KM.A2015002.1410.006.2015003034910.hdf'
DATAFIELD_NAME = 'EV_1KM_Emissive'
hdf = SD(FILE_NAME, SDC.READ)
attrs = hdf.attributes(full=1)
nsa = attrs["Number of Scans"]
number_of_Scans = nsa[0]
# Read dataset.
data2D = hdf.select(DATAFIELD_NAME)
data = data2D[0,:,:].astype(np.double)
# Read geolocation dataset from MOD03 product.
lat = hdf.select('Latitude')
latitude = lat[:,:]
lon = hdf.select('Longitude')
longitude = lon[:,:]
attrs=lat.attributes(full=1)
fna = attrs["frame_numbers"]
frame_numbers = fna[0][0]
lna = attrs["line_numbers"]
line_numbers = lna[0][0]
# Retrieve attributes.
attrs = data2D.attributes(full=1)
lna=attrs["long_name"]
long_name = lna[0]
aoa=attrs["radiance_offsets"]
add_offset = aoa[0][0]
sfa=attrs["radiance_scales"]
scale_factor = sfa[0][0]
fva=attrs["_FillValue"]
_FillValue = fva[0]
vra=attrs["valid_range"]
valid_min = vra[0][0]
valid_max = vra[0][1]
ua=attrs["units"]
units = ua[0]
invalid = np.logical_or(data > valid_max,
data < valid_min)
invalid = np.logical_or(invalid, data == _FillValue)
data[invalid] = np.nan
data = (data - add_offset) * scale_factor
data = np.ma.masked_array(data, np.isnan(data))
# Find middle location.
lat_m = np.nanmean(latitude)
lon_m = np.nanmean(longitude)
# Render the plot in a lambert equal area projection.
m = Basemap(projection='laea', resolution='l', lat_ts=65,
lat_0=lat_m, lon_0=lon_m,
width=3000000, height=2500000)
m.drawcoastlines(linewidth=0.5)
m.drawparallels(np.arange(50., 91., 10.), labels=[1, 0, 0, 0])
m.drawmeridians(np.arange(-180, 181., 30), labels=[0, 0, 0, 1])
data0 = data[:number_of_Scans*2,:271]
for i in range(0,number_of_Scans*2):
for j in range(0,271):
newi = i*5 + int(line_numbers)
newj = j*5 + int(frame_numbers)
# print(newi,newj)
data0[i,j] = data[newi,newj]
m.pcolormesh(longitude, latitude, data0, latlon=True)
cb=m.colorbar()
cb.set_label(units, fontsize=8)
# Long name value is really long.
# print long_name
basename = os.path.basename(FILE_NAME)
# Split display of long name.
plt.title('{0}\n{1}\n{2}\n{3}'.format(basename,
long_name[0:81],
long_name[81:158],
long_name[158:]),
fontsize=8)
fig = plt.gcf()
pngfile = "{0}.py.png".format(basename)
fig.savefig(pngfile)
官网图片:
参考
1、EOS-MODIS官网 LAADS DAAC
2、MODIS热红外数据辐射亮度值的计算 MODIS热红外数据辐射亮度值的计算_David_jiang-CSDN博客