[gdal-dev] NITF2.1 complex data type
Shawn Gong
SGONG at mdacorporation.com
Thu Mar 26 11:23:28 PDT 2015
Hello Even,
To where can I submit the code?
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
More information about the gdal-dev
mailing list