Changeset 13373

Show
Ignore:
Timestamp:
12/18/07 19:56:43 (7 months ago)
Author:
pvachon
Message:

Add support for RADARSAT-2 Scansar detected products (#2104) and expose a subdataset representative of uncalibrated DNs (#2105)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/frmts/rs2/rs2dataset.cpp

    r13367 r13373  
    209209                                  GDT_UInt16, 
    210210                                  1, NULL, 2, nBlockXSize * 2, 0 ); 
     211    else if ( eDataType == GDT_Byte )  
     212        /* Ticket #2104: Support for ScanSAR products */ 
     213        return 
     214            poBandFile->RasterIO( GF_Read, 
     215                                  nBlockXOff * nBlockXSize, 
     216                                  nBlockYOff * nBlockYSize, 
     217                                  nBlockXSize, nRequestYSize, 
     218                                  pImage, nBlockXSize, nRequestYSize, 
     219                                  GDT_Byte, 
     220                                  1, NULL, 1, nBlockXSize, 0 ); 
    211221    else 
    212222    { 
     
    246256 
    247257/************************************************************************/ 
    248 /*                            ReadLUT()                                    */ 
     258/*                            ReadLUT()                                 */ 
    249259/************************************************************************/ 
    250260/* Read the provided LUT in to m_ndTable                                */ 
     
    274284 
    275285/************************************************************************/ 
    276 /*                        RS2CalibRasterBand()                            */ 
     286/*                        RS2CalibRasterBand()                          */ 
    277287/************************************************************************/ 
    278288 
     
    308318 
    309319/************************************************************************/ 
    310 /*                        ~RS2CalibRasterBand()                            */ 
     320/*                       ~RS2CalibRasterBand()                          */ 
    311321/************************************************************************/ 
    312322 
     
    323333 
    324334/************************************************************************/ 
    325 /*                        IReadBlock()                                    */ 
     335/*                        IReadBlock()                                  */ 
    326336/************************************************************************/ 
    327337 
     
    330340{ 
    331341    CPLErr eErr; 
    332     GInt16 *pnImageTmp; 
    333342    int nRequestYSize; 
    334343 
     
    350359 
    351360    if (this->m_eType == GDT_CInt16) { 
     361        GInt16 *pnImageTmp; 
    352362        /* read in complex values */ 
    353363        pnImageTmp = (GInt16 *)CPLMalloc(2 * nBlockXSize * nBlockYSize *  
     
    394404            } 
    395405        } 
    396     } 
    397     else { 
     406        CPLFree(pnImageTmp); 
     407    } 
     408    else if (this->m_eType == GDT_Int16) { 
     409        GInt16 *pnImageTmp; 
    398410        /* read in detected values */ 
    399411        pnImageTmp = (GInt16 *)CPLMalloc(nBlockXSize * nBlockYSize * 
     
    417429            } 
    418430        } 
    419     } 
    420     free(pnImageTmp); 
     431        CPLFree(pnImageTmp); 
     432    } /* Ticket #2104: Support for ScanSAR products */ 
     433    else if (this->m_eType == GDT_Byte) { 
     434        GByte *pnImageTmp; 
     435        pnImageTmp = (GByte *)CPLMalloc(nBlockXSize * nBlockYSize * 
     436            GDALGetDataTypeSize( GDT_Byte ) / 8); 
     437        eErr = m_poBandDataset->RasterIO( GF_Read, 
     438                            nBlockXOff * nBlockXSize, 
     439                            nBlockYOff * nBlockYSize, 
     440                            nBlockXSize, nRequestYSize, 
     441                            pnImageTmp, nBlockXSize, nRequestYSize, 
     442                            GDT_Byte, 
     443                            1, NULL, 1, 1, 0); 
     444 
     445        /* iterate over detected values */ 
     446        for (int i = 0; i < nBlockYSize; i++) { 
     447            for (int j = 0; j < nBlockXSize; j++) { 
     448                int nPixOff = (i * nBlockYSize) + j; 
     449 
     450                ((float *)pImage)[nPixOff] = ((pnImageTmp[nPixOff] * 
     451                    pnImageTmp[nPixOff]) + 
     452                    this->m_nfOffset)/m_nfTable[nBlockXOff + j]; 
     453            } 
     454        } 
     455    } 
     456    else { 
     457        CPLAssert( FALSE ); 
     458        return CE_Failure; 
     459    } 
    421460    return eErr; 
    422461} 
     
    425464/************************************************************************/ 
    426465/* ==================================================================== */ 
    427 /*                RS2Dataset                */ 
     466/*                              RS2Dataset                              */ 
    428467/* ==================================================================== */ 
    429468/************************************************************************/ 
     
    679718                sBuf.Printf("RADARSAT_2_CALIB:GAMMA:%s", pszFilename); 
    680719                papszSubdatasets = CSLSetNameValue( papszSubdatasets, 
    681                     "SUBDATASET_1_NAME", sBuf ); 
     720                    "SUBDATASET_4_NAME", sBuf ); 
    682721                papszSubdatasets = CSLSetNameValue( papszSubdatasets, 
    683                     "SUBDATASET_1_DESC", "Gamma calibrated" ); 
     722                    "SUBDATASET_4_DESC", "Gamma calibrated" ); 
    684723            } 
    685724            continue; 
     
    746785 
    747786    if (papszSubdatasets != NULL) { 
     787        papszSubdatasets = CSLSetNameValue( papszSubdatasets, 
     788            "SUBDATASET_1_NAME", pszFilename ); 
     789        papszSubdatasets = CSLSetNameValue( papszSubdatasets, 
     790            "SUBDATASET_1_DESC", "Uncalibrated digital numbers" ); 
     791 
    748792        poDS->GDALMajorObject::SetMetadata( papszSubdatasets, "SUBDATASETS" ); 
    749793        CSLDestroy( papszSubdatasets ); 
     
    759803        poDS->SetMetadataItem( "MATRIX_REPRESENTATION", "SCATTERING" ); 
    760804    } 
     805  
     806/* -------------------------------------------------------------------- */ 
     807/*      Collect a few useful metadata items                             */ 
     808/* -------------------------------------------------------------------- */ 
     809 
     810 
    761811 
    762812/* -------------------------------------------------------------------- */