在使用HDF的数据时,首先要对其进行校正处理。比如MODIS数据中,有个去除蝴蝶结现象。一般出现这种情况会在低分辨率卫星数据中(个人理解),比如气象卫星,海洋卫星等,这类数据一般的数据分辨率都很低,几百米到几公里,主要用于大范围的检测。
下面以MODIS数据为例,简单说明一下蝴蝶结现象出现的原因。

MODIS图像在其扫描线宽度方向由扫描条带组成,条带宽度为10(1000米分辨率)、20(500米分辨率)和40个象素(250米分辨率),所以地球的球面特性会导致扫描带两端产生数据的重叠现象,将扫描带组成遥感图像后即形成所谓的“蝴蝶结”效应(bowtie现象),如以1公里分辨率为例,每条扫描线1354个象素,其象素尺寸在星下点为1╳1公里,而随着扫描角的增大和地球曲率的影响象素尺寸逐渐增大,当扫描角为55度,其象素尺寸变为沿扫描方向4.83公里 、沿轨道方向2.01公里的大小,象素尺寸随扫描角的变化规律如图-1所示。这种象素尺寸的几何形变造成两个现象,一是边沿象素对象区域的重叠现象,而且越靠近边沿,象素重叠现象越严重;二是沿扫描方向图象的压缩失真,如图2所示。

图1 MODIS数据蝴蝶结现象产生的原因

图2 MODIS蝴蝶结现象

蝴蝶结的处理一般有两种:Bowtie处理算法主要有“星历表法”和“非星历表法”两种。“星历表法”是根据卫星的星历表生成标准地理网格,将数据按照其地理坐标投影到该网格上来进行匹配,在地理定标的同时消除bowtie现象。International MODIS/AIRS Processing Package (IMAPP)和NASA GSFC MODIS Level 1均使用的这种方法。
Terra卫星的星历表由TDRSS 星上导航系统(TDRSS Onboard Navigation System,TONS)生成,随着科学数据流的第二类工程组包(Type 2 Engineering Group packets)广播到地面站。
Aqua卫星没有星上导航系统,因此星历表需要通过地面控制站上传到卫星然后再下传给其他地面站,或者使用估计的星历表(精确的星历表在几个小时的延迟之后才可能获得)。
由于Terra和Aqua的MODIS L1B数据产品均不包含星历表,因此,用户无法使用星历表对MODIS L1B数据进行bowtie处理。对于Aqua卫星的MODIS数据,使用估计的星历表进行数据处理会影响bowtie处理的准确性,使用精确的星历表则无法实现实时处理。

对于气象卫星(静止卫星)、海洋卫星的数据的校正,一般也是使用的“星历表法”进行处理。对于HDF数据来说,这个星历表其实是两幅单波段的浮点型数据,其像元值是经度或者纬度值。下面以一个MODIS的数据为例(MOD021KM.A2010287.0250.005.2010287121743.hdf)进行说明。

首先我们使用gdalinfo工具查看这个MODIS数据的信息,输出的信息如下:

Driver: HDF4/Hierarchical Data Format Release 4
Files: F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf
Size is 512, 512
Coordinate System is `'
Metadata:% Dead Detector EV Data=0, ……此处省略…… ,0, 0% EV Data Not Calibrated=0, 0, ……此处省略……, 0, 0% EV Data Where Cannot Compute BG DN=0, 0, ……此处省略……, 0, 0% EV Data Where Nadir Door Closed=0, 0, ……此处省略……, 0, 0% L1A EV All Scan Data are Missing=0……此处省略一大长串……SHORTNAME=MOD021KMSolar Irradiance on RSB Detectors over pi=511.46, ……此处省略……116.183, 116.183SOUTHBOUNDINGCOORDINATE=27.4153536499348VERSIONID=5WESTBOUNDINGCOORDINATE=106.240739628195
Subdatasets:SUBDATASET_1_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_RefSBSUBDATASET_1_DESC=[15x2030x1354] EV_1KM_RefSB MODIS_SWATH_Type_L1B (16-bit unsigned integer)SUBDATASET_2_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_RefSB_Uncert_IndexesSUBDATASET_2_DESC=[15x2030x1354] EV_1KM_RefSB_Uncert_Indexes MODIS_SWATH_Type_L1B (8-bit unsigned integer)SUBDATASET_3_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_EmissiveSUBDATASET_3_DESC=[16x2030x1354] EV_1KM_Emissive MODIS_SWATH_Type_L1B (16-bit unsigned integer)SUBDATASET_4_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_Emissive_Uncert_IndexesSUBDATASET_4_DESC=[16x2030x1354] EV_1KM_Emissive_Uncert_Indexes MODIS_SWATH_Type_L1B (8-bit unsigned integer)SUBDATASET_5_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_250_Aggr1km_RefSBSUBDATASET_5_DESC=[2x2030x1354] EV_250_Aggr1km_RefSB MODIS_SWATH_Type_L1B (16-bit unsigned integer)SUBDATASET_6_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_250_Aggr1km_RefSB_Uncert_IndexesSUBDATASET_6_DESC=[2x2030x1354] EV_250_Aggr1km_RefSB_Uncert_Indexes MODIS_SWATH_Type_L1B (8-bit unsigned integer)SUBDATASET_7_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_250_Aggr1km_RefSB_Samples_UsedSUBDATASET_7_DESC=[2x2030x1354] EV_250_Aggr1km_RefSB_Samples_Used MODIS_SWATH_Type_L1B (8-bit integer)SUBDATASET_8_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_500_Aggr1km_RefSBSUBDATASET_8_DESC=[5x2030x1354] EV_500_Aggr1km_RefSB MODIS_SWATH_Type_L1B (16-bit unsigned integer)SUBDATASET_9_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_500_Aggr1km_RefSB_Uncert_IndexesSUBDATASET_9_DESC=[5x2030x1354] EV_500_Aggr1km_RefSB_Uncert_Indexes MODIS_SWATH_Type_L1B (8-bit unsigned integer)SUBDATASET_10_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_500_Aggr1km_RefSB_Samples_UsedSUBDATASET_10_DESC=[5x2030x1354] EV_500_Aggr1km_RefSB_Samples_Used MODIS_SWATH_Type_L1B (8-bit integer)SUBDATASET_11_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:HeightSUBDATASET_11_DESC=[406x271] Height MODIS_SWATH_Type_L1B (16-bit integer)SUBDATASET_12_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:SensorZenithSUBDATASET_12_DESC=[406x271] SensorZenith MODIS_SWATH_Type_L1B (16-bit integer)SUBDATASET_13_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:SensorAzimuthSUBDATASET_13_DESC=[406x271] SensorAzimuth MODIS_SWATH_Type_L1B (16-bit integer)SUBDATASET_14_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:RangeSUBDATASET_14_DESC=[406x271] Range MODIS_SWATH_Type_L1B (16-bit unsigned integer)SUBDATASET_15_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:SolarZenithSUBDATASET_15_DESC=[406x271] SolarZenith MODIS_SWATH_Type_L1B (16-bit integer)SUBDATASET_16_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:SolarAzimuthSUBDATASET_16_DESC=[406x271] SolarAzimuth MODIS_SWATH_Type_L1B (16-bit integer)SUBDATASET_17_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:gflagsSUBDATASET_17_DESC=[406x271] gflags MODIS_SWATH_Type_L1B (8-bit unsigned integer)SUBDATASET_18_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_Band26SUBDATASET_18_DESC=[2030x1354] EV_Band26 MODIS_SWATH_Type_L1B (16-bit unsigned integer)SUBDATASET_19_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_Band26_Uncert_IndexesSUBDATASET_19_DESC=[2030x1354] EV_Band26_Uncert_Indexes MODIS_SWATH_Type_L1B (8-bit unsigned integer)SUBDATASET_20_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":0SUBDATASET_20_DESC=[406x271] Latitude (32-bit floating-point)SUBDATASET_21_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":1SUBDATASET_21_DESC=[406x271] Longitude (32-bit floating-point)SUBDATASET_22_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":2SUBDATASET_22_DESC=[15x2030x1354] EV_1KM_RefSB (16-bit unsigned integer)SUBDATASET_23_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":3SUBDATASET_23_DESC=[15x2030x1354] EV_1KM_RefSB_Uncert_Indexes (8-bit unsigned integer)SUBDATASET_24_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":4SUBDATASET_24_DESC=[16x2030x1354] EV_1KM_Emissive (16-bit unsigned integer)SUBDATASET_25_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":5SUBDATASET_25_DESC=[16x2030x1354] EV_1KM_Emissive_Uncert_Indexes (8-bit unsigned integer)SUBDATASET_26_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":6SUBDATASET_26_DESC=[2x2030x1354] EV_250_Aggr1km_RefSB (16-bit unsigned integer)SUBDATASET_27_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":7SUBDATASET_27_DESC=[2x2030x1354] EV_250_Aggr1km_RefSB_Uncert_Indexes (8-bit unsigned integer)SUBDATASET_28_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":8SUBDATASET_28_DESC=[2x2030x1354] EV_250_Aggr1km_RefSB_Samples_Used (8-bit integer)SUBDATASET_29_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":9SUBDATASET_29_DESC=[5x2030x1354] EV_500_Aggr1km_RefSB (16-bit unsigned integer)SUBDATASET_30_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":10SUBDATASET_30_DESC=[5x2030x1354] EV_500_Aggr1km_RefSB_Uncert_Indexes (8-bit unsigned integer)SUBDATASET_31_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":11SUBDATASET_31_DESC=[5x2030x1354] EV_500_Aggr1km_RefSB_Samples_Used (8-bit integer)SUBDATASET_32_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":12SUBDATASET_32_DESC=[406x271] Height (16-bit integer)SUBDATASET_33_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":13SUBDATASET_33_DESC=[406x271] SensorZenith (16-bit integer)SUBDATASET_34_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":14SUBDATASET_34_DESC=[406x271] SensorAzimuth (16-bit integer)SUBDATASET_35_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":15SUBDATASET_35_DESC=[406x271] Range (16-bit unsigned integer)SUBDATASET_36_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":16SUBDATASET_36_DESC=[406x271] SolarZenith (16-bit integer)SUBDATASET_37_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":17SUBDATASET_37_DESC=[406x271] SolarAzimuth (16-bit integer)SUBDATASET_38_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":18SUBDATASET_38_DESC=[406x271] gflags (8-bit unsigned integer)SUBDATASET_39_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":19SUBDATASET_39_DESC=[2030x1354] EV_Band26 (16-bit unsigned integer)SUBDATASET_40_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":20SUBDATASET_40_DESC=[2030x1354] EV_Band26_Uncert_Indexes (8-bit unsigned integer)SUBDATASET_41_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":21SUBDATASET_41_DESC=[16x10] Noise in Thermal Detectors (8-bit unsigned integer)SUBDATASET_42_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":22SUBDATASET_42_DESC=[16x10] Change in relative responses of thermal detectors (8-bit unsigned integer)SUBDATASET_43_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":23SUBDATASET_43_DESC=[203x16x10] DC Restore Change for Thermal Bands (8-bit integer)SUBDATASET_44_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":24SUBDATASET_44_DESC=[203x2x40] DC Restore Change for Reflective 250m Bands (8-bit integer)SUBDATASET_45_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":25SUBDATASET_45_DESC=[203x5x20] DC Restore Change for Reflective 500m Bands (8-bit integer)SUBDATASET_46_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":26SUBDATASET_46_DESC=[203x15x10] DC Restore Change for Reflective 1km Bands (8-bit integer)
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0,  512.0)
Upper Right (  512.0,    0.0)
Lower Right (  512.0,  512.0)
Center      (  256.0,  256.0)

上面的元数据有很多,全部贴出来太多,省略了很多。在下面的子数据集中,可以发现有两个子数据集比较特别,第20个和第21个。如下:

  SUBDATASET_20_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":0SUBDATASET_20_DESC=[406x271] Latitude (32-bit floating-point)SUBDATASET_21_NAME=HDF4_SDS:UNKNOWN:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":1SUBDATASET_21_DESC=[406x271] Longitude (32-bit floating-point)

从上面的描述信息中就可以看到,这两个分别就是经度查找表和纬度查找表,通过这两个坐标查找表就可以对每个行列号的数据进行定位。在GDAL中,对使用位置查找表进行校正的算法已经进行了封装。具体的算法有空再写,今天只是怎么使用GDAL提供的工具来对MODIS的数据进行处理做个说明。

我们还是以上面的这个数据为例。对里面的第一个子数据集进行校正处理。使用的工具是gdalwarp(PS,这个工具在我的博客中出现的频率很高,另外还有一个是gdalinfo)。

 SUBDATASET_1_NAME=HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_RefSBSUBDATASET_1_DESC=[15x2030x1354] EV_1KM_RefSB MODIS_SWATH_Type_L1B (16-bit unsigned integer)

上面就是第一个子数据集的路径和描述信息。HDF数据的子数据集路径,就是SUBDATASET_X_NAME=后面的部分,全部都是。比如我要查看这个子数据集的信息,使用下面的代码:

gdalinfo "HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_RefSB"

输出的信息如下,一共有15个波段,使用Envi打开显示的图像如图3所示(使用R:15,G:14, B:13彩色组合显示)。

Driver: HDF4Image/HDF4 Dataset
Files: F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdfF:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf.aux.xml
Size is 1354, 2030
Coordinate System is `'
GCP Projection =
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]]
GCP[  0]: Id=, Info=(2.5,2.5) -> (108.323760986328,48.8070602416992,0)
GCP[  1]: Id=, Info=(122.5,2.5) -> (113.807312011719,48.6253700256348,0)
GCP[  2]: Id=, Info=(242.5,2.5) -> (117.034530639648,48.3954010009766,0)……此处省略很多个点……
GCP[143]: Id=, Info=(1322.5,1982.5) -> (128.73503112793,28.1821708679199,0)
Metadata:% Dead Detector EV Data=0,  ……此处省略……, 0, 0, 0% EV Data Not Calibrated=0, 0,  ……此处省略……0, 0, 0% EV Data Where Cannot Compute BG DN=0,  ……此处省略……, 0, 0, 0% EV Data Where Nadir Door Closed=0, 0, 0,  ……此处省略…… 0, 0, 0……此处省略一大长串……units=nonevalid_range=0, 32767VERSIONID=5WESTBOUNDINGCOORDINATE=106.240739628195
Geolocation:LINE_OFFSET=2LINE_STEP=5PIXEL_OFFSET=2PIXEL_STEP=5SRS=GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","4326"]]X_BAND=1X_DATASET=HDF4_EOS:EOS_SWATH_GEOL:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:LongitudeY_BAND=1Y_DATASET=HDF4_EOS:EOS_SWATH_GEOL:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:Latitude
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0, 2030.0)
Upper Right ( 1354.0,    0.0)
Lower Right ( 1354.0, 2030.0)
Center      (  677.0, 1015.0)
Band 1 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 2 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 3 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 4 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 5 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 6 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 7 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 8 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 9 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 10 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 11 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 12 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 13 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 14 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
Band 15 Block=1354x738 Type=UInt16, ColorInterp=GrayDescription = Earth View 1KM Reflective Solar Bands Scaled IntegersNoData Value=65535Unit Type: none
图3 第一个子数据集未校正前(R:15,G:14, B:13)

接下来我们使用gdalwarp来对上面这个子数据集进行处理。由于坐标查找表是使用经纬度的,所以处理的结果数据也是WGS84的经纬度数据。在使用gdalwarp是需要指定输出图像的投影,我们手动指定为WGS84(EPSG:EPSG:4326)。处理的命令行代码如下:

gdalwarp.exe --config GDAL_DATA "C:\gdal\data" -geoloc -t_srs EPSG:4326 "HDF4_EOS:EOS_SWATH:"F:\Data\HDF\MOD021KM.A2010287.0250.005.2010287121743.hdf":MODIS_SWATH_Type_L1B:EV_1KM_RefSB" F:\Data\HDF\MOD021KM.tif

上面的--config GDAL_DATA "C:\gdal\data"就是这是GDAL的data目录,也可以使用环境变量进行设置。主要目的是为了将后面的坐标系EPSG代码转为GDAL认识的wkt格式。执行的过程如图4所示。

图4 gdalwarp处理hdf数据处理过程

使用Envi打开上面处理的结果,截图如图5所示,依旧使用RGB(15,14,13)波段组合显示。可以看到,输出的图像已经有投影信息了,是一个WGS84的坐标。Envi中显示的效果如图6所示,在ArcMap中打开,并和全球的shp图层叠加显示的效果如图7所示。从图7中可以看出,gdal处理的结果的准确性还是蛮高的,尤其是在渤海湾处可以很明显的看出来。

图5 处理后的数据以及RGB波段组合

图6 经过gdal处理后的数据
图7 处理后的数据和全球的矢量叠加显示的效果

参考资料:

1、http://liangshzh0816.blog.163.com/blog/static/3477676200892010294314/

2、http://wenku.baidu.com/view/7491f6fb700abb68a982fb9e.html

3、http://trac.osgeo.org/gdal/wiki/rfc4_geolocate

使用GDAL对HDF数据进行校正相关推荐

  1. 使用GDAL对HDF数据进行geoloc校正

    在上一篇博客中,大概说了下怎么使用gdal提供的gdalwarp工具来进行校正处理.其实质与envi的glt校正应该是一样的.我把gdalwarp的代码封装了一下,写了一个类来进行geoloc处理.希 ...

  2. 【C++】GDAL读取HDF数据

    (45条消息) VS2019c++配置GDAL和HDF库新手入门_程程gg酱的博客-CSDN博客_gdal vs2019 (45条消息) 使用GDAL获取HDF等数据集中的图像_箜_Kong的博客-C ...

  3. 使用GDAL对静止卫星圆盘数据进行校正(以FY2为例子)

    前言 使用GDAL对静止卫星数据的校正的方式与之前写的校正MODIS数据一样,只不过对于静止卫星的圆盘数据而言,经纬度查找是固定的,不会发生变化. 经纬度查找表数据 对于FY2气象卫星而言,经纬度查找 ...

  4. 使用GDAL获取HDF等数据集中的图像

    使用GDAL读取HDF,NetCDF等数据集中的数据时,一般需要两个步骤,第一,获取数据集中的子数据集:第二,通过第一步获取的子数据集读取图像数据.一般的HDF图像中会有很多个子数据集,比如常用的MO ...

  5. 使用GDAL工具对FY3系列卫星数据进行校正

    本文档主要对如何使用GDAL提供的工具对FY3系列卫星数据进行校正处理.FY3系列卫星提供的数据一般是以HDF5格式下发,一个典型的FY3A和FY3B的数据文件名如下: FY3A_MERSI_GBAL ...

  6. VS2019c++配置GDAL和HDF库新手入门

    VS2019c++配置GDAL和HDF库新手入门 1.准备 下载 2.编译和安装 2.1编译SQLite 2.2编译PROJ 2.3安装 编译GDAL 2.4编译GEOS库 2.5集成GEOS+HDF ...

  7. python gdal:hdf转tif

    比较多的人用arcpy转换hdf文件(https://blog.csdn.net/Orange_GISer/article/details/122978951?spm=1001.2101.3001.6 ...

  8. GDAL对于raw数据支持的一个bug

    下面的GDAL版本针对最新的1.10.0而言,对于GDAL1.9.2问题依旧. 最近在处理卫星的长条带数据,图像的行数差不多200w行左右,格式的raw格式.可以使用VRT文件来很方便的对raw数据进 ...

  9. GDAL使用DEM数据计算山体阴影(Hillshade)

    零.        前言 说起Hillshade,其实就是模拟太阳光照射地形所引起的明暗对比,然后来对地形图进行渲染,使之看起来具有立体效果的一种方式,常用于地图的渲染,如表1所示,具体的可以参考文献 ...

最新文章

  1. 快节奏的多人游戏同步 - 示例代码和在线演示
  2. SAP S/4HANA Central Procurement – 采购的未来
  3. checkbox管理
  4. Velocity的中文问题
  5. boost::mpl模块实现inherit相关的测试程序
  6. 前端遮罩层实现_css遮罩层怎么做?
  7. 简单解释什么是 依赖注入 和 控制反转
  8. C语言入门基础——Brute-Force算法
  9. JavaScript基础知识必知!
  10. 时光就是一颗巨大的牛轧糖
  11. 淮海工学院期末考试Oracle,【2017年整理】淮海工学院物理化学下册期末试题.doc...
  12. 一个好的桌面图标的网站
  13. 【SAP-FICO详细教程】
  14. 为什么越来越多的企业选择云数据存储而放弃本地数据存储?
  15. 小程序 字号设置 slider滚动改变大小_Snipaste(滚动截图软件)app下载|Snipaste(滚动截图软件) 1.15.2 绿色版(32/64位)...
  16. 提高谷歌浏览器下载速度
  17. 木马手工查杀和隐藏控制技术分析
  18. 【技术贴】解决打开程序出错,提示错误429,activex部件不能创建对象,不用重装系统。...
  19. WiFi Tethering Usb Tethering
  20. Python爬取京东商品评论和图片下载

热门文章

  1. 王者荣耀服务器维护中有什么漏洞,王者荣耀:排位惊现漏洞,利用这个BUG一天上王者,三天登荣耀...
  2. MTK:socket通信
  3. Maven配置文件无法被导出或者生效的问题【已解决】
  4. 2D 转换之 scale
  5. linux的manual手册不存在,在 Linux 命令行下使用“原力”
  6. linux内核系列远程拒绝服务漏洞,预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响...
  7. python绘制三维图散点图_python 绘制三维图形、三维数据散点图
  8. Android Graphviz 安装
  9. zookeeper-大数据Week6-DAY1-1-Zookeeper
  10. Springmvc Get请求Tomcat、WebLogic中文乱码问题