diff --git a/Code/IO/otbWorldView2ImageMetadataInterface.cxx b/Code/IO/otbWorldView2ImageMetadataInterface.cxx index 0d1d14490ef9cd38373c161e3417bc9cbe751586..5ceb8697c021d7db14671ff77f2acdbc0dc4cebf 100644 --- a/Code/IO/otbWorldView2ImageMetadataInterface.cxx +++ b/Code/IO/otbWorldView2ImageMetadataInterface.cxx @@ -497,13 +497,46 @@ WorldView2ImageMetadataInterface if (keywordStringBId == panchro) { - outputValuesVariableLengthVector[0] = 1.0 / outputValuesVariableLengthVector[0]; + // In the case of WorldView-2, we need to divide the absolute calibration + // factor by the effective bandwidth see for details: + // http://www.digitalglobe.com/downloads/Radiometric_Use_of_WorldView-2_Imagery.pdf + // These values are not retrieved by the ossimQuickBirdMetadata class as + // there are specific to WV2 We did not retrieve those values in the ossim + // class and consider them as constant values + + const double effectiveBandWidthPan = 2.846000e-01; + outputValuesVariableLengthVector[0] = effectiveBandWidthPan / outputValuesVariableLengthVector[0]; } else { + // Also need to divide by the effective bandwidth available + // We consider the 2 cases with 4 or 8 bands in WV2 multispectral product + VariableLengthVectorType effectiveBandwidthVariableLengthVector; + effectiveBandwidthVariableLengthVector.SetSize(bandNameList.size()); + effectiveBandwidthVariableLengthVector.Fill(1.); + + if (bandNameList.size() == 8) + { + effectiveBandwidthVariableLengthVector[0] = 4.730000e-02; + effectiveBandwidthVariableLengthVector[1] = 5.430000e-02; + effectiveBandwidthVariableLengthVector[2] = 6.300000e-02; + effectiveBandwidthVariableLengthVector[3] = 3.740000e-02; + effectiveBandwidthVariableLengthVector[4] = 5.740000e-02; + effectiveBandwidthVariableLengthVector[5] = 3.930000e-02; + effectiveBandwidthVariableLengthVector[6] = 9.890000e-02; + effectiveBandwidthVariableLengthVector[7] = 9.960000e-02; + } + else if (bandNameList.size() == 4) + { + effectiveBandwidthVariableLengthVector[0] = 5.430000e-02; + effectiveBandwidthVariableLengthVector[1] = 6.300000e-02; + effectiveBandwidthVariableLengthVector[2] = 5.740000e-02; + effectiveBandwidthVariableLengthVector[3] = 9.890000e-02; + } + for(unsigned int i = 0; i < bandNameList.size(); ++i) { - outputValuesVariableLengthVector[i] = 1.000 / outputValuesVariableLengthVector[i]; + outputValuesVariableLengthVector[i] = effectiveBandwidthVariableLengthVector[i] / outputValuesVariableLengthVector[i]; } }