@Override public void initialize() throws OperatorException { targetProduct = masterProduct; validateSourceProducts(); if (includes == null || includes.length == 0) { List<NodeDescriptor> nodeDescriptorList = new ArrayList<NodeDescriptor>(); for (final Product sourceProduct : sourceProducts) { if (sourceProduct != targetProduct) { for (String bandName : sourceProduct.getBandNames()) { final NodeDescriptor nodeDescriptor = new NodeDescriptor(); nodeDescriptor.name = bandName; nodeDescriptor.productId = getSourceProductId(sourceProduct); nodeDescriptorList.add(nodeDescriptor); } } } includes = nodeDescriptorList.toArray(new NodeDescriptor[nodeDescriptorList.size()]); } if (!(excludes == null || excludes.length == 0)) { throw new OperatorException("Defining excludes is not supported yet."); } Set<Product> allSrcProducts = new HashSet<Product>(); for (NodeDescriptor nodeDescriptor : includes) { Product srcProduct = getSourceProduct(nodeDescriptor.productId); if (srcProduct == targetProduct) { continue; } if (StringUtils.isNotNullAndNotEmpty(nodeDescriptor.name)) { if (StringUtils.isNotNullAndNotEmpty(nodeDescriptor.newName)) { copyBandWithFeatures(srcProduct, nodeDescriptor.name, nodeDescriptor.newName); } else { copyBandWithFeatures(srcProduct, nodeDescriptor.name, nodeDescriptor.name); } allSrcProducts.add(srcProduct); } else if (StringUtils.isNotNullAndNotEmpty(nodeDescriptor.namePattern)) { Pattern pattern = Pattern.compile(nodeDescriptor.namePattern); for (String bandName : srcProduct.getBandNames()) { Matcher matcher = pattern.matcher(bandName); if (matcher.matches()) { copyBandWithFeatures(srcProduct, bandName, bandName); allSrcProducts.add(srcProduct); } } } } for (Product srcProduct : allSrcProducts) { if (srcProduct != targetProduct) { mergeAutoGrouping(srcProduct); ProductUtils.copyMasks(srcProduct, targetProduct); ProductUtils.copyOverlayMasks(srcProduct, targetProduct); } } }
/** Create target product. */ private void createTargetProduct() { targetProduct = new Product( sourceProduct.getName(), sourceProduct.getProductType(), sourceImageWidth, sourceImageHeight); ProductUtils.copyProductNodes(sourceProduct, targetProduct); addSelectedBands(); final MetadataElement absTgt = AbstractMetadata.getAbstractedMetadata(targetProduct); if (externalDEMFile != null) { // if external DEM file is specified by user AbstractMetadata.setAttribute(absTgt, AbstractMetadata.DEM, externalDEMFile.getPath()); } else { AbstractMetadata.setAttribute(absTgt, AbstractMetadata.DEM, demName); } absTgt.setAttributeString("DEM resampling method", demResamplingMethod); if (externalDEMFile != null) { absTgt.setAttributeDouble("external DEM no data value", externalDEMNoDataValue); } sourceGeoCoding = sourceProduct.getSceneGeoCoding(); targetProduct.setPreferredTileSize(targetProduct.getSceneRasterWidth(), tileSize); }
@Override public boolean validatePage() { try { crsSelectionPanel.getCrs( ProductUtils.getCenterGeoPos(SnapApp.getDefault().getSelectedProduct())); } catch (FactoryException ignored) { return false; } return true; }
private ImageInfo createDefaultImageInfo() { try { return ProductUtils.createImageInfo(getFormModel().getRasters(), false, ProgressMonitor.NULL); } catch (IOException e) { JOptionPane.showMessageDialog( getContentPanel(), "Failed to create default image settings:\n" + e.getMessage(), "I/O Error", JOptionPane.ERROR_MESSAGE); return null; } }
private void copyBandWithFeatures(Product sourceProduct, String oldBandName, String newBandName) { Band sourceBand = sourceProduct.getBand(oldBandName); if (sourceBand == null) { final String msg = String.format( "Source product [%s] does not contain a band with name [%s]", sourceProduct.getName(), oldBandName); throw new OperatorException(msg); } if (targetProduct.containsBand(newBandName)) { return; } ProductUtils.copyBand(oldBandName, sourceProduct, newBandName, targetProduct, true); }
@Override public AbstractLayerSourceAssistantPage getNextPage() { final LayerSourcePageContext context = getContext(); try { final Product product = SnapApp.getDefault().getSelectedProduct(); final GeoPos referencePos = ProductUtils.getCenterGeoPos(product); final CoordinateReferenceSystem crs = crsSelectionPanel.getCrs(referencePos); context.setPropertyValue(ShapefileLayerSource.PROPERTY_NAME_FEATURE_COLLECTION_CRS, crs); return new ShapefileAssistantPage3(); } catch (FactoryException e) { e.printStackTrace(); context.showErrorDialog("Could not create CRS:\n" + e.getMessage()); } return null; }
private void addSelectedBands() { // add selected source bands if (sourceBandNames == null || sourceBandNames.length == 0) { final Band[] bands = sourceProduct.getBands(); final List<String> bandNameList = new ArrayList<>(sourceProduct.getNumBands()); for (Band band : bands) { String unit = band.getUnit(); if (unit == null || unit.contains(Unit.INTENSITY)) { bandNameList.add(band.getName()); } } sourceBandNames = bandNameList.toArray(new String[bandNameList.size()]); } final Band[] sourceBands = new Band[sourceBandNames.length]; for (int i = 0; i < sourceBandNames.length; i++) { final String sourceBandName = sourceBandNames[i]; final Band sourceBand = sourceProduct.getBand(sourceBandName); if (sourceBand == null) { throw new OperatorException("Source band not found: " + sourceBandName); } sourceBands[i] = sourceBand; } for (Band srcBand : sourceBands) { final Band targetBand = ProductUtils.copyBand(srcBand.getName(), sourceProduct, targetProduct, false); targetBand.setSourceImage(srcBand.getSourceImage()); } // add latitude and longitude bands Band latBand = new Band(LATITUDE_BAND_NAME, ProductData.TYPE_FLOAT64, sourceImageWidth, sourceImageHeight); Band lonBand = new Band( LONGITUDE_BAND_NAME, ProductData.TYPE_FLOAT64, sourceImageWidth, sourceImageHeight); targetProduct.addBand(latBand); targetProduct.addBand(lonBand); targetProduct.setSceneGeoCoding(new PixelGeoCoding(latBand, lonBand, null, 6)); }
/** * Initializes this operator and sets the one and only target product. * * <p>The target product can be either defined by a field of type {@link Product} annotated with * the {@link TargetProduct TargetProduct} annotation or by calling {@link #setTargetProduct} * method. * * <p>The framework calls this method after it has created this operator. Any client code that * must be performed before computation of tile data should be placed here. * * @throws OperatorException If an error occurs during operator initialisation. * @see #getTargetProduct() */ @Override public void initialize() throws OperatorException { try { targetProduct = new Product( sourceProduct.getName(), sourceProduct.getProductType(), sourceProduct.getSceneRasterWidth(), sourceProduct.getSceneRasterHeight()); ProductUtils.copyProductNodes(sourceProduct, targetProduct); dataType = ProductData.getType(targetDataType); targetScaling = getScaling(targetScalingStr); addSelectedBands(); } catch (Throwable e) { throw new OperatorException(e); } }
private void addGeoTiffTags(final Product product) { final GeoTIFFMetadata geoTIFFMetadata = ProductUtils.createGeoTIFFMetadata(product); if (geoTIFFMetadata == null) { return; } // for debug purpose // geoTIFFMetadata.dump(); final int numEntries = geoTIFFMetadata.getNumGeoKeyEntries(); final TiffShort[] directoryTagValues = new TiffShort[numEntries * 4]; final ArrayList<TiffDouble> doubleValues = new ArrayList<>(); final ArrayList<String> asciiValues = new ArrayList<>(); for (int i = 0; i < numEntries; i++) { final GeoTIFFMetadata.KeyEntry entry = geoTIFFMetadata.getGeoKeyEntryAt(i); final int[] data = entry.getData(); for (int j = 0; j < data.length; j++) { directoryTagValues[i * 4 + j] = new TiffShort(data[j]); } if (data[1] == TiffTag.GeoDoubleParamsTag.getValue()) { directoryTagValues[i * 4 + 3] = new TiffShort(doubleValues.size()); final double[] geoDoubleParams = geoTIFFMetadata.getGeoDoubleParams(data[0]); for (double geoDoubleParam : geoDoubleParams) { doubleValues.add(new TiffDouble(geoDoubleParam)); } } if (data[1] == TiffTag.GeoAsciiParamsTag.getValue()) { int sizeInBytes = 0; for (String asciiValue : asciiValues) { sizeInBytes += asciiValue.length() + 1; } directoryTagValues[i * 4 + 3] = new TiffShort(sizeInBytes); asciiValues.add(geoTIFFMetadata.getGeoAsciiParam(data[0])); } } setEntry(new TiffDirectoryEntry(TiffTag.GeoKeyDirectoryTag, directoryTagValues)); if (!doubleValues.isEmpty()) { final TiffDouble[] tiffDoubles = doubleValues.toArray(new TiffDouble[doubleValues.size()]); setEntry(new TiffDirectoryEntry(TiffTag.GeoDoubleParamsTag, tiffDoubles)); } if (!asciiValues.isEmpty()) { final String[] tiffAsciies = asciiValues.toArray(new String[asciiValues.size()]); setEntry(new TiffDirectoryEntry(TiffTag.GeoAsciiParamsTag, new GeoTiffAscii(tiffAsciies))); } double[] modelTransformation = geoTIFFMetadata.getModelTransformation(); if (!isZeroArray(modelTransformation)) { setEntry( new TiffDirectoryEntry( TiffTag.ModelTransformationTag, toTiffDoubles(modelTransformation))); } else { double[] modelPixelScale = geoTIFFMetadata.getModelPixelScale(); if (!isZeroArray(modelPixelScale)) { setEntry( new TiffDirectoryEntry(TiffTag.ModelPixelScaleTag, toTiffDoubles(modelPixelScale))); } final int numModelTiePoints = geoTIFFMetadata.getNumModelTiePoints(); if (numModelTiePoints > 0) { final TiffDouble[] tiePoints = new TiffDouble[numModelTiePoints * 6]; for (int i = 0; i < numModelTiePoints; i++) { final GeoTIFFMetadata.TiePoint modelTiePoint = geoTIFFMetadata.getModelTiePointAt(i); final double[] data = modelTiePoint.getData(); for (int j = 0; j < data.length; j++) { tiePoints[i * 6 + j] = new TiffDouble(data[j]); } } setEntry(new TiffDirectoryEntry(TiffTag.ModelTiepointTag, tiePoints)); } } }