修改GDAL库支持IRSP6数据

      使用GDAL库发现不能打开IRSP6的数据,不过看GDAL提供的文件格式里面却是支持IRSP6的数据的,具体可以参考网页http://www.gdal.org/frmt_fast.html。下面图1是一个IRSP6数据的目录结构,由一个hdr和四个ges数据组成,hdr是FAST格式的主文件,ges就是每个波段的裸数据。


图1  P6数据目录结构

首先使用gdalinfo工具输出看看能不能读取。gdalinfo输出的结果如图2所示,可以看出gdal是不支持这种数据的。


图2 gdalinfo打开查看信息

下面是hdr文件中的内容,

PRODUCT ID =ID201104-01 LOCATION =134/03000F        ACQUISITION DATE =20090101 
SATELLITE =IRS P6     SENSOR =AWIFS      SENSOR MODE =PLD    LOOK ANGLE =  0.00
                        LOCATION =                  ACQUISITION DATE =         
SATELLITE =           SENSOR =           SENSOR MODE =       LOOK ANGLE =      
                        LOCATION =                  ACQUISITION DATE =         
SATELLITE =           SENSOR =           SENSOR MODE =       LOOK ANGLE =      
                        LOCATION =                  ACQUISITION DATE =         
SATELLITE =           SENSOR =           SENSOR MODE =       LOOK ANGLE =      
PRODUCT TYPE =MAP ORIENTED       PRODUCT SIZE =FULL SCENE                      
TYPE OF PROCESSING =SYSTEMATIC  RESAMPLING =CC                                 
VOLUME #/# IN SET =01/01 PIXELS PER LINE =18284 LINES PER BAND =17248/17248    
START LINE # =    1 BLOCKING FACTOR = 1 RECORD LENGTH =36568 PIXEL SIZE = 56.00
OUTPUT BITS PER PIXEL =10 ACQUIRED BITS PER PIXEL =10                          
BANDS PRESENT =2345                            PRODUCT CODE =STLC00GBD         
VERSION NO =IRSP6DPSV1R2        ACQUISITION TIME =02:52:16:357                 
GENERATING COUNTRY =CHINA          GENERATING AGENCY =RSGS                     
GENERATING FACILITY =DPFP6   PRODUCT ENDIAN =LITTLE                            
                                                                               
                                                                               
REV            CBIASES AND GAINS IN THE BAND ORDER AS ON THIS TAPE                             
       0.000000000000000       52.340000000000003                              
       0.000000000000000       40.750000000000000                              
       0.000000000000000       28.425000000000001                              
       0.000000000000000        4.645000000000000                              
       0.000000000000000        0.000000000000000                              
       0.000000000000000        0.000000000000000                              
       0.000000000000000        0.000000000000000                              
       0.000000000000000        0.000000000000000                              
                                                                               
SENSOR GAIN STATE =   8   9   8   9                                            
SENSOR STATE =GOOD                                                             
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
               
GEOMETRIC DATA MAP PROJECTION =LCC  ELLIPSOID =WGS_84             DATUM =WGS_84
USGS PROJECTION PARAMETERS =  6378137.000000000000000  6356752.314199999906123 
      55.209495199333482       51.035107167553996      129.000000000000000     
      10.000000000000000        0.000000000000000        0.000000000000000     
       0.000000000000000        0.000000000000000        0.000000000000000     
       0.000000000000000        0.000000000000000        0.000000000000000     
       0.000000000000000                                                       
UL = 1174202.5250E 571139.1862N   -681580.807   5708788.219                    
UR = 1344237.7839E 573316.7699N    342323.193   5708788.219                    
LR = 1333947.1849E 485402.4658N    342323.193   4742900.219                    
LL = 1194514.8374E 483619.3269N   -681580.807   4742900.219                    
CENTER = 1262709.6744E 531850.3922N   -169628.807   5225844.219  9142  8624    
OFFSET =   128 ORIENTATION ANGLE =  0.00                                       
SUN ELEVATION ANGLE =13.1 SUN AZIMUTH ANGLE =169.7 ALTITUDE =829002.00000      
HEADING ANGLE =    207.006210                                                  
                                                                               
                                                                               
                                                                               
                                                                               
               

仔细查看帮助文档,发现对于IRS数据,由于hdr文件中没有记录波段数据的文件名称,所以只能猜测可能的波段数据名称,GDAL目前猜的规则是:

<header>.<ext>
<header>.1.<ext>
<header>.2.<ext>
...

or

<header>.<ext>
band1.<ext>
band2.<ext>
...

or

<header>.<ext>
band1.dat
band2.dat
...

or

<header>.<ext>
imagery1.<ext>
imagery2.<ext>
...

or

<header>.<ext>
imagery1.dat
imagery2.dat
...

从上面可以看出,猜测的几种数据就是没有<header>_1.ges这种类型,于是就ges修改对应的源码,源码位于GDAL_HOMEfrmts aw/fastdataset.cpp。主要修改下面几个方面:

1、Open函数中,数据的生产单位原来是写死的“GENERATING AGENCY =EUROMAP”,而这个数据却是"GENERATING AGENCY =EUROMAP"。所以将原来的

		if (strstr(pszHeader, "GENERATING AGENCY =EUROMAP")!= NULL) 

修改为:

		if ((strstr(pszHeader, "GENERATING AGENCY =EUROMAP")!= NULL) ||
			(strstr(pszHeader, "GENERATING AGENCY =RSGS")!= NULL))
2、Open函数中最下面,原来只判断了WGS84,而这个数据里面是WGS_84,所以再加上这个判断。修改后的代码如下:

            if ( EQUAL( pszTemp, "WGS84" ) || EQUAL( pszTemp, "WGS_84" ) )
3、FOpenChannel函数中,加上我们这个数据的波段数据类型,即<header>_1.ges。在原来的default后面加上一个,如下所示:
	default:
            pszChannelFilename = CPLFormFilename( pszDirname,
                CPLSPrintf( "%s.%d", pszPrefix, iFASTBand ), pszSuffix );
            if ( OpenChannel( pszChannelFilename, iBand ) )
                break;
	    pszChannelFilename = CPLFormFilename( pszDirname,
		CPLSPrintf( "%s_%d.ges", pszPrefix, iFASTBand ), NULL );
	    if ( OpenChannel( pszChannelFilename, iBand ) )
		break;
保存上面的内容,然后重新编译,使用gdalinfo输出的信息为:


图3 gdalinfo工具查看输出的信息

原文地址:https://www.cnblogs.com/xiaowangba/p/6313918.html