问题简述
一般如果要在ENVI上加载LANDSAT数据,只需要加载对应的MTL文件就可以实现同时加载所有波段文件。但是我从USGS上下载了几景LANDSAT8_OLI_L1数据,按照这个方法导入MTL文件后会报这个错。(从地理空间数据云上下载的数据不会出现这个问题)
上网搜了很久也没有找到清晰的解决方法。但从这篇博文上得知,可以通过修改MTL.txt的内容来解决这个问题。
问题分析
ENVI报错的原因还没有搞清楚,但通过对比地理空间数据云上下载到的MTL.txt和USGS上下载到的MTL.txt,可以找到解决这个问题的方法。目前猜测是因为ENVI不支持USGS版的MTL组织格式,具体的解决方法可以直接看‘解决方案‘。
对比
- 可以正常加载的MTL.txt结构是
GROUP = L1_METADATA_FILE
# group1 该文件的描述信息
GROUP = METADATA_FILE_INFO
END_GROUP = METADATA_FILE_INFO
# group2 位置信息和tif索引
GROUP = PRODUCT_METADATA
END_GROUP = PRODUCT_METADATA
# group3 图像的参数
GROUP = IMAGE_ATTRIBUTES
END_GROUP = IMAGE_ATTRIBUTES
# group4 各波段辐射量的最大最小值
GROUP = MIN_MAX_RADIANCE
END_GROUP = MIN_MAX_RADIANCE
# group5 各波段反射率的最大最小值
GROUP = MIN_MAX_REFLECTANCE
END_GROUP = MIN_MAX_REFLECTANCE
# group6 各波段的取值范围
GROUP = MIN_MAX_PIXEL_VALUE
END_GROUP = MIN_MAX_PIXEL_VALUE
# group7 各波段的辐射定标数据
GROUP = RADIOMETRIC_RESCALING
END_GROUP = RADIOMETRIC_RESCALING
# group8 几个热红外波段的参数
GROUP = TIRS_THERMAL_CONSTANTS
END_GROUP = TIRS_THERMAL_CONSTANTS
# group9 投影信息
GROUP = PROJECTION_PARAMETERS
END_GROUP = PROJECTION_PARAMETERS
END_GROUP = L1_METADATA_FILE
END
- 无法正常加载的MTL.txt结构是
GROUP = LANDSAT_METADATA_FILE
# group1 该文件的描述信息,包括各种文件索引及它们的数据格式
GROUP = PRODUCT_CONTENTS
END_GROUP = PRODUCT_CONTENTS
# group2 图像参数、航道信息和文件的描述信息
GROUP = IMAGE_ATTRIBUTES
END_GROUP = IMAGE_ATTRIBUTES
# group3 位置信息和投影信息
GROUP = PROJECTION_ATTRIBUTES
END_GROUP = PROJECTION_ATTRIBUTES
# group4 描述信息、图像参数和文件索引
GROUP = LEVEL1_PROCESSING_RECORD
END_GROUP = LEVEL1_PROCESSING_RECORD
# group5 各波段辐射量的最大最小值
GROUP = LEVEL1_MIN_MAX_RADIANCE
END_GROUP = LEVEL1_MIN_MAX_RADIANCE
# group6 各波段反射率的最大最小值
GROUP = LEVEL1_MIN_MAX_REFLECTANCE
END_GROUP = LEVEL1_MIN_MAX_REFLECTANCE
# group7 各波段的取值范围
GROUP = LEVEL1_MIN_MAX_PIXEL_VALUE
END_GROUP = LEVEL1_MIN_MAX_PIXEL_VALUE
# group8 各波段的辐射定标数据
GROUP = LEVEL1_RADIOMETRIC_RESCALING
END_GROUP = LEVEL1_RADIOMETRIC_RESCALING
# group9 几个热红外波段的参数
GROUP = LEVEL1_THERMAL_CONSTANTS
END_GROUP = LEVEL1_THERMAL_CONSTANTS
# group10 投影信息
GROUP = LEVEL1_PROJECTION_PARAMETERS
END_GROUP = LEVEL1_PROJECTION_PARAMETERS
END_GROUP = LANDSAT_METADATA_FILE
END
- 可以看出,USGS版的MTL是存在大量冗余的(应该是我还没有理解这样做的道理)。但不管怎么说,这说明了只要有USGS版的MTL,我们就可以重构出可以被ENVI识别的MTL结构。
一个可用MTL的模板
GROUP = L1_METADATA_FILE
GROUP = METADATA_FILE_INFO
ORIGIN = "Image courtesy of the U.S. Geological Survey"
REQUEST_ID = "0501508280281_00026"
LANDSAT_SCENE_ID = "LC81330332015240LGN00"
FILE_DATE = 2015-08-28T18:58:29Z
STATION_ID = "LGN"
PROCESSING_SOFTWARE_VERSION = "LPGS_2.5.1"
END_GROUP = METADATA_FILE_INFO
GROUP = PRODUCT_METADATA
DATA_TYPE = "L1T"
ELEVATION_SOURCE = "GLS2000"
OUTPUT_FORMAT = "GEOTIFF"
SPACECRAFT_ID = "LANDSAT_8"
SENSOR_ID = "OLI_TIRS"
WRS_PATH = 133
WRS_ROW = 33
NADIR_OFFNADIR = "NADIR"
TARGET_WRS_PATH = 133
TARGET_WRS_ROW = 33
DATE_ACQUIRED = 2015-08-28
SCENE_CENTER_TIME = "03:55:31.0001247Z"
CORNER_UL_LAT_PRODUCT = 39.96319
CORNER_UL_LON_PRODUCT = 99.51753
CORNER_UR_LAT_PRODUCT = 39.92019
CORNER_UR_LON_PRODUCT = 102.19890
CORNER_LL_LAT_PRODUCT = 37.85999
CORNER_LL_LON_PRODUCT = 99.50248
CORNER_LR_LAT_PRODUCT = 37.82009
CORNER_LR_LON_PRODUCT = 102.10604
CORNER_UL_PROJECTION_X_PRODUCT = 544200.000
CORNER_UL_PROJECTION_Y_PRODUCT = 4423800.000
CORNER_UR_PROJECTION_X_PRODUCT = 773400.000
CORNER_UR_PROJECTION_Y_PRODUCT = 4423800.000
CORNER_LL_PROJECTION_X_PRODUCT = 544200.000
CORNER_LL_PROJECTION_Y_PRODUCT = 4190400.000
CORNER_LR_PROJECTION_X_PRODUCT = 773400.000
CORNER_LR_PROJECTION_Y_PRODUCT = 4190400.000
PANCHROMATIC_LINES = 15561
PANCHROMATIC_SAMPLES = 15281
REFLECTIVE_LINES = 7781
REFLECTIVE_SAMPLES = 7641
THERMAL_LINES = 7781
THERMAL_SAMPLES = 7641
FILE_NAME_BAND_1 = "LC81330332015240LGN00_B1.TIF"
FILE_NAME_BAND_2 = "LC81330332015240LGN00_B2.TIF"
FILE_NAME_BAND_3 = "LC81330332015240LGN00_B3.TIF"
FILE_NAME_BAND_4 = "LC81330332015240LGN00_B4.TIF"
FILE_NAME_BAND_5 = "LC81330332015240LGN00_B5.TIF"
FILE_NAME_BAND_6 = "LC81330332015240LGN00_B6.TIF"
FILE_NAME_BAND_7 = "LC81330332015240LGN00_B7.TIF"
FILE_NAME_BAND_8 = "LC81330332015240LGN00_B8.TIF"
FILE_NAME_BAND_9 = "LC81330332015240LGN00_B9.TIF"
FILE_NAME_BAND_10 = "LC81330332015240LGN00_B10.TIF"
FILE_NAME_BAND_11 = "LC81330332015240LGN00_B11.TIF"
FILE_NAME_BAND_QUALITY = "LC81330332015240LGN00_BQA.TIF"
METADATA_FILE_NAME = "LC81330332015240LGN00_MTL.txt"
BPF_NAME_OLI = "LO8BPF20150828034431_20150828042558.02"
BPF_NAME_TIRS = "LT8BPF20150828034037_20150828042710.02"
CPF_NAME = "L8CPF20150701_20150930.02"
RLUT_FILE_NAME = "L8RLUT20150303_20431231v11.h5"
END_GROUP = PRODUCT_METADATA
GROUP = IMAGE_ATTRIBUTES
CLOUD_COVER = 3.79
CLOUD_COVER_LAND = 3.79
IMAGE_QUALITY_OLI = 9
IMAGE_QUALITY_TIRS = 9
TIRS_SSM_POSITION_STATUS = "NOMINAL"
ROLL_ANGLE = -0.001
SUN_AZIMUTH = 142.09548547
SUN_ELEVATION = 55.57261870
EARTH_SUN_DISTANCE = 1.0102265
GROUND_CONTROL_POINTS_VERSION = 2
GROUND_CONTROL_POINTS_MODEL = 406
GEOMETRIC_RMSE_MODEL = 7.313
GEOMETRIC_RMSE_MODEL_Y = 5.290
GEOMETRIC_RMSE_MODEL_X = 5.048
GROUND_CONTROL_POINTS_VERIFY = 104
GEOMETRIC_RMSE_VERIFY = 3.494
END_GROUP = IMAGE_ATTRIBUTES
GROUP = MIN_MAX_RADIANCE
RADIANCE_MAXIMUM_BAND_1 = 744.75226
RADIANCE_MINIMUM_BAND_1 = -61.50188
RADIANCE_MAXIMUM_BAND_2 = 762.63544
RADIANCE_MINIMUM_BAND_2 = -62.97868
RADIANCE_MAXIMUM_BAND_3 = 702.76202
RADIANCE_MINIMUM_BAND_3 = -58.03432
RADIANCE_MAXIMUM_BAND_4 = 592.60852
RADIANCE_MINIMUM_BAND_4 = -48.93781
RADIANCE_MAXIMUM_BAND_5 = 362.64688
RADIANCE_MINIMUM_BAND_5 = -29.94750
RADIANCE_MAXIMUM_BAND_6 = 90.18697
RADIANCE_MINIMUM_BAND_6 = -7.44767
RADIANCE_MAXIMUM_BAND_7 = 30.39784
RADIANCE_MINIMUM_BAND_7 = -2.51026
RADIANCE_MAXIMUM_BAND_8 = 670.66974
RADIANCE_MINIMUM_BAND_8 = -55.38413
RADIANCE_MAXIMUM_BAND_9 = 141.73062
RADIANCE_MINIMUM_BAND_9 = -11.70416
RADIANCE_MAXIMUM_BAND_10 = 22.00180
RADIANCE_MINIMUM_BAND_10 = 0.10033
RADIANCE_MAXIMUM_BAND_11 = 22.00180
RADIANCE_MINIMUM_BAND_11 = 0.10033
END_GROUP = MIN_MAX_RADIANCE
GROUP = MIN_MAX_REFLECTANCE
REFLECTANCE_MAXIMUM_BAND_1 = 1.210700
REFLECTANCE_MINIMUM_BAND_1 = -0.099980
REFLECTANCE_MAXIMUM_BAND_2 = 1.210700
REFLECTANCE_MINIMUM_BAND_2 = -0.099980
REFLECTANCE_MAXIMUM_BAND_3 = 1.210700
REFLECTANCE_MINIMUM_BAND_3 = -0.099980
REFLECTANCE_MAXIMUM_BAND_4 = 1.210700
REFLECTANCE_MINIMUM_BAND_4 = -0.099980
REFLECTANCE_MAXIMUM_BAND_5 = 1.210700
REFLECTANCE_MINIMUM_BAND_5 = -0.099980
REFLECTANCE_MAXIMUM_BAND_6 = 1.210700
REFLECTANCE_MINIMUM_BAND_6 = -0.099980
REFLECTANCE_MAXIMUM_BAND_7 = 1.210700
REFLECTANCE_MINIMUM_BAND_7 = -0.099980
REFLECTANCE_MAXIMUM_BAND_8 = 1.210700
REFLECTANCE_MINIMUM_BAND_8 = -0.099980
REFLECTANCE_MAXIMUM_BAND_9 = 1.210700
REFLECTANCE_MINIMUM_BAND_9 = -0.099980
END_GROUP = MIN_MAX_REFLECTANCE
GROUP = MIN_MAX_PIXEL_VALUE
QUANTIZE_CAL_MAX_BAND_1 = 65535
QUANTIZE_CAL_MIN_BAND_1 = 1
QUANTIZE_CAL_MAX_BAND_2 = 65535
QUANTIZE_CAL_MIN_BAND_2 = 1
QUANTIZE_CAL_MAX_BAND_3 = 65535
QUANTIZE_CAL_MIN_BAND_3 = 1
QUANTIZE_CAL_MAX_BAND_4 = 65535
QUANTIZE_CAL_MIN_BAND_4 = 1
QUANTIZE_CAL_MAX_BAND_5 = 65535
QUANTIZE_CAL_MIN_BAND_5 = 1
QUANTIZE_CAL_MAX_BAND_6 = 65535
QUANTIZE_CAL_MIN_BAND_6 = 1
QUANTIZE_CAL_MAX_BAND_7 = 65535
QUANTIZE_CAL_MIN_BAND_7 = 1
QUANTIZE_CAL_MAX_BAND_8 = 65535
QUANTIZE_CAL_MIN_BAND_8 = 1
QUANTIZE_CAL_MAX_BAND_9 = 65535
QUANTIZE_CAL_MIN_BAND_9 = 1
QUANTIZE_CAL_MAX_BAND_10 = 65535
QUANTIZE_CAL_MIN_BAND_10 = 1
QUANTIZE_CAL_MAX_BAND_11 = 65535
QUANTIZE_CAL_MIN_BAND_11 = 1
END_GROUP = MIN_MAX_PIXEL_VALUE
GROUP = RADIOMETRIC_RESCALING
RADIANCE_MULT_BAND_1 = 1.2303E-02
RADIANCE_MULT_BAND_2 = 1.2598E-02
RADIANCE_MULT_BAND_3 = 1.1609E-02
RADIANCE_MULT_BAND_4 = 9.7895E-03
RADIANCE_MULT_BAND_5 = 5.9907E-03
RADIANCE_MULT_BAND_6 = 1.4898E-03
RADIANCE_MULT_BAND_7 = 5.0215E-04
RADIANCE_MULT_BAND_8 = 1.1079E-02
RADIANCE_MULT_BAND_9 = 2.3413E-03
RADIANCE_MULT_BAND_10 = 3.3420E-04
RADIANCE_MULT_BAND_11 = 3.3420E-04
RADIANCE_ADD_BAND_1 = -61.51419
RADIANCE_ADD_BAND_2 = -62.99128
RADIANCE_ADD_BAND_3 = -58.04593
RADIANCE_ADD_BAND_4 = -48.94759
RADIANCE_ADD_BAND_5 = -29.95349
RADIANCE_ADD_BAND_6 = -7.44916
RADIANCE_ADD_BAND_7 = -2.51077
RADIANCE_ADD_BAND_8 = -55.39521
RADIANCE_ADD_BAND_9 = -11.70650
RADIANCE_ADD_BAND_10 = 0.10000
RADIANCE_ADD_BAND_11 = 0.10000
REFLECTANCE_MULT_BAND_1 = 2.0000E-05
REFLECTANCE_MULT_BAND_2 = 2.0000E-05
REFLECTANCE_MULT_BAND_3 = 2.0000E-05
REFLECTANCE_MULT_BAND_4 = 2.0000E-05
REFLECTANCE_MULT_BAND_5 = 2.0000E-05
REFLECTANCE_MULT_BAND_6 = 2.0000E-05
REFLECTANCE_MULT_BAND_7 = 2.0000E-05
REFLECTANCE_MULT_BAND_8 = 2.0000E-05
REFLECTANCE_MULT_BAND_9 = 2.0000E-05
REFLECTANCE_ADD_BAND_1 = -0.100000
REFLECTANCE_ADD_BAND_2 = -0.100000
REFLECTANCE_ADD_BAND_3 = -0.100000
REFLECTANCE_ADD_BAND_4 = -0.100000
REFLECTANCE_ADD_BAND_5 = -0.100000
REFLECTANCE_ADD_BAND_6 = -0.100000
REFLECTANCE_ADD_BAND_7 = -0.100000
REFLECTANCE_ADD_BAND_8 = -0.100000
REFLECTANCE_ADD_BAND_9 = -0.100000
END_GROUP = RADIOMETRIC_RESCALING
GROUP = TIRS_THERMAL_CONSTANTS
K1_CONSTANT_BAND_10 = 774.8853
K1_CONSTANT_BAND_11 = 480.8883
K2_CONSTANT_BAND_10 = 1321.0789
K2_CONSTANT_BAND_11 = 1201.1442
END_GROUP = TIRS_THERMAL_CONSTANTS
GROUP = PROJECTION_PARAMETERS
MAP_PROJECTION = "UTM"
DATUM = "WGS84"
ELLIPSOID = "WGS84"
UTM_ZONE = 47
GRID_CELL_SIZE_PANCHROMATIC = 15.00
GRID_CELL_SIZE_REFLECTIVE = 30.00
GRID_CELL_SIZE_THERMAL = 30.00
ORIENTATION = "NORTH_UP"
RESAMPLING_OPTION = "CUBIC_CONVOLUTION"
END_GROUP = PROJECTION_PARAMETERS
END_GROUP = L1_METADATA_FILE
END
重构思路
- USGS版的MTL中group5 ~ group10是可以照抄到可用版本的group4 ~ group9。
- 可用版本的group3内容可以从USGS版的group2和group4中找到。
- 可用版本的group2内容可以从USGS版的group3和group1/group4中找到。
- 可用版本的group1内容可以从USGS版的group4中找到。
解决方案
- 经过试验,重构MTL这个方案可行,但我发现了另一种简单的解决方案,就是将第一行顶左的
GROUP = LANDSAT_METADATA_FILE
改为GROUP = L1_METADATA_FILE
,倒数第二行的END_GROUP也一并修改。这么修改后ENVI就可以识别了,看来是ENVI定死了元数据的名称,而USGS没有同步这个规定。如果是二级数据应该也可以类似修改。
结语
- 这篇博文分析了该如何重构MTL文件以达到可以被ENVI加载的目的,但实际手动操作还是太麻烦,本来计划写一个程序来实现,但后面又发现了简单的解决方法。
- 第一次遇到网上还没有明确解决方案的问题,就写了这篇博文记录一下思考过程,如果没有帮助还请见谅。