[gdal-dev] NITF2.1 complex data type

Even Rouault even.rouault at spatialys.com
Thu Mar 26 11:32:09 PDT 2015


Le jeudi 26 mars 2015 19:23:28, Shawn Gong a écrit :
> Hello Even,
> 
> To where can I submit the code?

Assuming you intend to contribute that upstream ultimately, ticket with patch 
attached / github branch / ...

> 
> Thanks,
> Shawn
> ________________________________________
> From: Even Rouault [even.rouault at spatialys.com]
> Sent: March-26-15 12:52 PM
> To: gdal-dev at lists.osgeo.org
> Cc: Shawn Gong
> Subject: Re: [gdal-dev] NITF2.1 complex data type
> 
> Shawn,
> 
> > We receive SAR SLC (single look complex) images in NITF2.1. But the I and
> > O bands are separate (HH_I, HH_Q, VV_I, VV_Q, etc)
> > 
> > My colleague modified the gdal NITF driver nitfdataset.cpp to rewrite
> > them as NITFComplexRasterBand (see below) It works with a single-pol SLC
> > and outputs as I+jQ. However dual- and quad-pol don't work. All three
> > RGB bands show the same HH_I + j*HH_Q
> > 
> > Are we doing it wrong, or NITF2.1 doesn't allow multi-pol Complex data
> > type?
> 
> If you can read all the bands with the unmodified driver, then it comes
> from your changes.
> 
> > Thanks,
> > Shawn
> > GDALDataset *NITFDataset::OpenInternal( GDALOpenInfo * poOpenInfo,
> > 
> >                                 GDALDataset *poWritableJ2KDataset,
> >                                 int bOpenForCreate)
> > 
> > {
> > .....
> > .....
> > 
> >     GDALDataType dt = bandList[0]->GetRasterDataType();
> >     if (EQUAL(psImage->szICAT,"SAR")    //SAR image...
> >     
> >         && nUsableBands==psImage->nBands && nUsableBands%2==0    
> >         //...with
> > 
> > 2 bands ... (modified to allow an even number - spec seems to indicate
> > only 2 bands allowed?) && dt==bandList[1]->GetRasterDataType()  
> > //...that have the same datatype... && !GDALDataTypeIsComplex(dt)  
> > //...and are not complex... && (dt==GDT_Int16 || dt==GDT_Int32 ||
> > dt==GDT_Float32 || dt==GDT_Float64))      //..and can be mapped directly
> > to a complex type {
> > 
> >   bool allBandsIQ = true;
> >   for (int i = 0; i < nUsableBands; i+=2)
> >   {
> >   
> >    NITFBandInfo *psBandInfo1 = psImage->pasBandInfo + i;
> >    NITFBandInfo *psBandInfo2 = psImage->pasBandInfo + i + 1;
> >    //check that the ISUBCAT is labelled "I" and "Q" on the 2 bands
> >    if (!EQUAL(psBandInfo1->szISUBCAT, "I") ||
> > 
> > !EQUAL(psBandInfo2->szISUBCAT, "Q")) {
> > 
> >     allBandsIQ = false;
> >     break;
> >    
> >    }
> >   
> >   }
> >   if (allBandsIQ)
> >   {
> >   
> >    nUsableBands /= 2;
> >    for (int i = 0; i < nUsableBands; i++)
> >    {
> >    
> >     //wrap the I and Q bands into a single complex band
> >     bandList[i] = new NITFComplexRasterBand(poDS, bandList[2 * i],
> > 
> > bandList[2 * i + 1], i+1); }
> 
> -->This looks a bit suspicious as you're modifying the array you're
> iterating over, but I think that must be still be OK, although as you show
> only part of the code, it is difficult to tell for sure.
> 
> Best regards,
> 
> Even
> 
> --
> Spatialys - Geospatial professional services
> http://www.spatialys.com

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com


More information about the gdal-dev mailing list