Ticket #4141: envisat_meris_L2_bands.patch

File envisat_meris_L2_bands.patch, 2.4 KB (added by antonio, 5 years ago)

Patch to read all MERIS L2 bands

  • frmts/envisat/envisatdataset.cpp

     
    836836
    837837            poDS->GetRasterBand(iBand)->SetDescription( pszDSName );
    838838        }
     839/* -------------------------------------------------------------------- */
     840/*       Handle MERIS Level 2 datasets with data type different from    */
     841/*       the one declared in the SPH                                    */
     842/* -------------------------------------------------------------------- */
     843        else if( EQUAL(pszDSType,"M") && num_dsr2 == num_dsr &&
     844                 EQUALN(pszProduct,"MER",3) && (pszProduct[8] == '2') )
     845        {
     846            CPLDebug("ESAT", "Handle MERIS Level 2 datasets");
     847            CPLDebug("ESAT", "pszDSName: %s", pszDSName);
     848            int nPrefixBytes2, nSubBands, nSubBandIdx, nSubBandOffset;
     849            char szBandName[128];
     850
     851            int nPixelSize = 1;
     852            GDALDataType eDataType2 = GDT_Byte;
     853
     854            CPLDebug("ESAT", "dsr_size2: %d", dsr_size2);
     855            CPLDebug("ESAT", "poDS->nRasterXSize: %d", poDS->nRasterXSize);
     856
     857            nSubBands = dsr_size2 / poDS->nRasterXSize;
     858            CPLDebug("ESAT", "nSubBands: %d", nSubBands);
     859            if( (nSubBands < 1) || (nSubBands > 3) )
     860                nSubBands = 0;
     861
     862            nPrefixBytes2 = dsr_size2 -
     863                (nSubBands * nPixelSize * poDS->nRasterXSize);
     864
     865            for (nSubBandIdx = 0; nSubBandIdx < nSubBands; ++nSubBandIdx)
     866            {
     867                nSubBandOffset =
     868                    ds_offset + nPrefixBytes2 + nSubBandIdx * nPixelSize;
     869                poDS->SetBand( iBand+1,
     870                        new RawRasterBand( poDS, iBand+1, poDS->fpImage,
     871                                           nSubBandOffset, nPixelSize,
     872                                           dsr_size2, eDataType2, bNative ) );
     873                iBand++;
     874
     875                if (nSubBands > 1)
     876                {
     877                    sprintf( szBandName, "%s (%d)", pszDSName, nSubBandIdx );
     878                    poDS->GetRasterBand(iBand)->SetDescription( szBandName );
     879                }
     880                else
     881                    poDS->GetRasterBand(iBand)->SetDescription( pszDSName );
     882            }
     883        }
    839884    }
    840885   
    841886/* -------------------------------------------------------------------- */