/** This method creates the target product */ private void createTargetProduct() { final String productType = synergyProduct.getProductType(); final String productName = synergyProduct.getName(); final int sceneWidth = synergyProduct.getSceneRasterWidth(); final int sceneHeight = synergyProduct.getSceneRasterHeight(); final int downscaledRasterWidth = (int) (Math.ceil((float) (sceneWidth / scalingFactor) - 0.5)); final int downscaledRasterHeight = (int) (Math.ceil((float) (sceneHeight / scalingFactor) - 0.5)); targetProduct = new Product(productName, productType, downscaledRasterWidth, downscaledRasterHeight); // targetProduct.setPreferredTileSize(128, 128); ProductUtils.copyGeoCoding(synergyProduct, targetProduct); ProductUtils.copyMetadata(synergyProduct, targetProduct); AerosolHelpers.copyDownscaledTiePointGrids(synergyProduct, targetProduct, scalingFactor); AerosolHelpers.copyDownscaledFlagBands(synergyProduct, targetProduct, scalingFactor); // AerosolHelpers.addAerosolFlagBand(targetProduct, downscaledRasterWidth, // downscaledRasterHeight); final BandMathsOp bandArithmeticOp = BandMathsOp.createBooleanExpressionBand(INVALID_EXPRESSION, synergyProduct); invalidBand = bandArithmeticOp.getTargetProduct().getBandAt(0); setTargetBands(); }
private static void addFlagCoding(Product product, FlagCoding flagCoding) { final FlagCoding targetFlagCoding = new FlagCoding(flagCoding.getName()); targetFlagCoding.setDescription(flagCoding.getDescription()); ProductUtils.copyMetadata(flagCoding, targetFlagCoding); product.getFlagCodingGroup().add(targetFlagCoding); }
private Product createProduct() { Product sourceProduct = getSourceProduct(); Debug.assertNotNull(sourceProduct); Debug.assertTrue(getSceneRasterWidth() > 0); Debug.assertTrue(getSceneRasterHeight() > 0); final String newProductName; if (this.newProductName == null || this.newProductName.length() == 0) { newProductName = sourceProduct.getName(); } else { newProductName = this.newProductName; } final Product product = new Product( newProductName, sourceProduct.getProductType(), getSceneRasterWidth(), getSceneRasterHeight(), this); product.setPointingFactory(sourceProduct.getPointingFactory()); if (newProductDesc == null || newProductDesc.length() == 0) { product.setDescription(sourceProduct.getDescription()); } else { product.setDescription(newProductDesc); } if (!isMetadataIgnored()) { ProductUtils.copyMetadata(sourceProduct, product); addTiePointGridsToProduct(product); addFlagCodingsToProduct(product); addIndexCodingsToProduct(product); } addBandsToProduct(product); if (!isMetadataIgnored()) { addGeoCodingToProduct(product); } ProductUtils.copyVectorData(sourceProduct, product); ProductUtils.copyMasks(sourceProduct, product); ProductUtils.copyOverlayMasks(sourceProduct, product); ProductUtils.copyPreferredTileSize(sourceProduct, product); setSceneRasterStartAndStopTime(product); addSubsetInfoMetadata(product); return product; }
@Override public void initialize() throws OperatorException { if (computeErrorBands) { deactivateComputeTileMethod(); } if (endmemberFile != null) { loadEndmemberFile(); } if (sourceBandNames == null || sourceBandNames.length == 0) { Band[] bands = sourceProduct.getBands(); ArrayList<String> bandNameList = new ArrayList<String>(); for (Band band : bands) { if (band.getSpectralWavelength() > 0) { bandNameList.add(band.getName()); } } sourceBandNames = bandNameList.toArray(new String[bandNameList.size()]); } validateParameters(); sourceBands = new Band[sourceBandNames.length]; for (int i = 0; i < sourceBandNames.length; i++) { String sourceBandName = sourceBandNames[i]; Band sourceBand = sourceProduct.getBand(sourceBandName); if (sourceBand == null) { throw new OperatorException("Source band not found: " + sourceBandName); } if (sourceBand.getSpectralWavelength() <= 0) { throw new OperatorException("Source band without spectral wavelength: " + sourceBandName); } sourceBands[i] = sourceBand; } int numSourceBands = sourceBands.length; int numEndmembers = endmembers.length; if (numSourceBands < numEndmembers) { throw new OperatorException("Number of source bands must be >= number of endmembers."); } double[][] lsuMatrixElements = new double[numSourceBands][numEndmembers]; for (int j = 0; j < numEndmembers; j++) { Endmember endmember = endmembers[j]; double[] wavelengths = endmember.getWavelengths(); double[] radiations = endmember.getRadiations(); for (int i = 0; i < numSourceBands; i++) { Band sourceBand = sourceBands[i]; float wavelength = sourceBand.getSpectralWavelength(); float bandwidth = sourceBand.getSpectralBandwidth(); int k = findEndmemberSpectralIndex(wavelengths, wavelength, Math.max(bandwidth, minBandwidth)); if (k == -1) { throw new OperatorException( String.format( "Band %s: No matching endmember wavelength found (%f nm)", sourceBand.getName(), wavelength)); } lsuMatrixElements[i][j] = radiations[k]; } } if (UC_LSU.equals(unmixingModelName)) { spectralUnmixing = new UnconstrainedLSU(lsuMatrixElements); } else if (C_LSU.equals(unmixingModelName)) { spectralUnmixing = new ConstrainedLSU(lsuMatrixElements); } else if (FC_LSU.equals(unmixingModelName)) { spectralUnmixing = new FullyConstrainedLSU(lsuMatrixElements); } else if (unmixingModelName == null) { spectralUnmixing = new UnconstrainedLSU(lsuMatrixElements); } int width = sourceProduct.getSceneRasterWidth(); int height = sourceProduct.getSceneRasterHeight(); targetProduct = new Product(sourceProduct.getName() + "_unmixed", "SpectralUnmixing", width, height); abundanceBands = new Band[numEndmembers]; for (int i = 0; i < numEndmembers; i++) { abundanceBands[i] = targetProduct.addBand( endmembers[i].getName() + abundanceBandNameSuffix, ProductData.TYPE_FLOAT32); } if (computeErrorBands) { errorBands = new Band[numSourceBands]; for (int i = 0; i < errorBands.length; i++) { final String erroBandName = sourceBands[i].getName() + errorBandNameSuffix; errorBands[i] = targetProduct.addBand(erroBandName, ProductData.TYPE_FLOAT32); ProductUtils.copySpectralBandProperties(sourceBands[i], errorBands[i]); } summaryErrorBand = targetProduct.addBand("summary_error", ProductData.TYPE_FLOAT32); summaryErrorBand.setDescription("Root mean square error"); } ProductUtils.copyMetadata(sourceProduct, targetProduct); ProductUtils.copyTiePointGrids(sourceProduct, targetProduct); ProductUtils.copyGeoCoding(sourceProduct, targetProduct); }
@Override public void copyMetadata() { ProductUtils.copyMetadata(getSourceProduct(), getTargetProduct()); }