private TiePointGrid addTiePointGrid(int width, int height, Product product, String gridName, float[] tiePoints) { final TiePointGrid tiePointGrid = createTiePointGrid(gridName, 2, 2, 0, 0, width, height, tiePoints); product.addTiePointGrid(tiePointGrid); return tiePointGrid; }
private TiePointGrid addTiePointGrid(float subSamplingX, float subSamplingY, Product product, String gridName, float[] tiePoints) { int gridDim = (int) Math.sqrt(tiePoints.length); final TiePointGrid tiePointGrid = createTiePointGrid(gridName, gridDim, gridDim, 0, 0, subSamplingX, subSamplingY, tiePoints); product.addTiePointGrid(tiePointGrid); return tiePointGrid; } }
private void initProductTiePointGeoCoding(ImageMetadata imageMetadata, Product product) { float[][] cornerLonsLats = imageMetadata.getCornerLonsLats(); int sceneWidth = product.getSceneRasterWidth(); int sceneHeight = product.getSceneRasterHeight(); TiePointGrid latGrid = createTiePointGrid("latitude", 2, 2, 0, 0, sceneWidth , sceneHeight, cornerLonsLats[1]); product.addTiePointGrid(latGrid); TiePointGrid lonGrid = createTiePointGrid("longitude", 2, 2, 0, 0, sceneWidth, sceneHeight, cornerLonsLats[0]); product.addTiePointGrid(lonGrid); product.setSceneGeoCoding(new TiePointGeoCoding(latGrid, lonGrid)); }
private void initProductTiePointGeoCoding(ImageMetadata imageMetadata, Product product) { float[][] cornerLonsLats = imageMetadata.getCornerLonsLats(); int sceneWidth = product.getSceneRasterWidth(); int sceneHeight = product.getSceneRasterHeight(); TiePointGrid latGrid = createTiePointGrid("latitude", 2, 2, 0, 0, sceneWidth , sceneHeight, cornerLonsLats[1]); product.addTiePointGrid(latGrid); TiePointGrid lonGrid = createTiePointGrid("longitude", 2, 2, 0, 0, sceneWidth, sceneHeight, cornerLonsLats[0]); product.addTiePointGrid(lonGrid); product.setSceneGeoCoding(new TiePointGeoCoding(latGrid, lonGrid)); }
/** * Uses the 4 lat-lon corners of a detector to create the geocoding */ private GeoCoding getGeoCodingFromTileBandInfo(L1BBandInfo tileBandInfo, Map<String, Tile> tileList, Product product) { Objects.requireNonNull(tileBandInfo); Objects.requireNonNull(tileList); Objects.requireNonNull(product); Set<String> ourTileIds = tileBandInfo.getTileIdToPathMap().keySet(); List<Tile> aList = new ArrayList<>(ourTileIds.size()); List<Coordinate> coords = new ArrayList<>(); for (String tileId : ourTileIds) { Tile currentTile = tileList.get(tileId); aList.add(currentTile); } // sort tiles by position Collections.sort(aList, (Tile u1, Tile u2) -> u1.getTileGeometry(S2SpatialResolution.R10M).getPosition().compareTo(u2.getTileGeometry(S2SpatialResolution.R10M).getPosition())); coords.add(aList.get(0).corners.get(0)); coords.add(aList.get(0).corners.get(3)); coords.add(aList.get(aList.size() - 1).corners.get(1)); coords.add(aList.get(aList.size() - 1).corners.get(2)); float[] lats = convertDoublesToFloats(getLatitudes(coords)); float[] lons = convertDoublesToFloats(getLongitudes(coords)); TiePointGrid latGrid = addTiePointGrid(aList.get(0).getTileGeometry(S2SpatialResolution.R10M).getNumCols(), aList.get(0).getTileGeometry(S2SpatialResolution.R10M).getNumRowsDetector(), tileBandInfo.getDetectorId() + tileBandInfo.getBandInformation().getPhysicalBand() + ",latitude", lats); product.addTiePointGrid(latGrid); TiePointGrid lonGrid = addTiePointGrid(aList.get(0).getTileGeometry(S2SpatialResolution.R10M).getNumCols(), aList.get(0).getTileGeometry(S2SpatialResolution.R10M).getNumRowsDetector(), tileBandInfo.getDetectorId() + tileBandInfo.getBandInformation().getPhysicalBand() + ",longitude", lons); product.addTiePointGrid(lonGrid); return new TiePointGeoCoding(latGrid, lonGrid); }
/** * Creates geo-coding based on latitude/longitude {@code TiePointGrid}s</li> * * @param k2Metadata Kompsat2Metadata parameter * @param product Product to add TiePointGrid and TiePointGridGeoCoding */ private void initProductTiePointGeoCoding(Kompsat2Metadata k2Metadata, Product product) { float[][] cornerLonsLats = k2Metadata.getMetadataComponent().getTiePointGridPoints(); int sceneWidth = product.getSceneRasterWidth(); int sceneHeight = product.getSceneRasterHeight(); TiePointGrid latGrid = createTiePointGrid(Kompsat2Constants.LAT_DS_NAME, 2, 2, 0, 0, sceneWidth , sceneHeight, cornerLonsLats[0]); product.addTiePointGrid(latGrid); TiePointGrid lonGrid = createTiePointGrid(Kompsat2Constants.LON_DS_NAME, 2, 2, 0, 0, sceneWidth, sceneHeight, cornerLonsLats[1]); product.addTiePointGrid(lonGrid); if (latGrid != null && lonGrid != null) { product.setSceneGeoCoding(new TiePointGeoCoding(latGrid, lonGrid)); } }
private void addTiePointGrids(final Product product) { final int gridWidth = 11; final int gridHeight = 11; final int subSamplingX = product.getSceneRasterWidth() / (gridWidth - 1); final int subSamplingY = product.getSceneRasterHeight() / (gridHeight - 1); final BinaryRecord sceneRec = leaderFile.getSceneRecord(); final TiePointGrid slantRangeGrid = new TiePointGrid(OperatorUtils.TPG_SLANT_RANGE_TIME, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY); slantRangeGrid.setUnit(Unit.NANOSECONDS); product.addTiePointGrid(slantRangeGrid); if (isProductIPF) { setIPFTiePointGridRasterData(slantRangeGrid); //populate sR grid data } if (sceneRec != null) { final TiePointGrid incidentAngleGrid = new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY); incidentAngleGrid.setDiscontinuity(TiePointGrid.DISCONT_AUTO); incidentAngleGrid.setUnit(Unit.DEGREES); product.addTiePointGrid(incidentAngleGrid); } }
private void addShiftFile(final Product product, final String fileName) { try { final File level1ProductDir = getBaseDir(); final File shiftFile = new File(level1ProductDir, "COMMON_AUXRASTER" + File.separator + fileName); if (shiftFile.exists()) { final SunRasterReader sunRasterReader = new SunRasterReader(); final Product shiftProduct = sunRasterReader.readProductNodes(shiftFile, null); final Band band = shiftProduct.getBandAt(0); band.readRasterDataFully(ProgressMonitor.NULL); final int gridWidth = band.getRasterWidth(); final int gridHeight = band.getRasterHeight(); final float subSamplingX = product.getSceneRasterWidth() / (float) (gridWidth - 1); final float subSamplingY = product.getSceneRasterHeight() / (float) (gridHeight - 1); final TiePointGrid azShiftGrid = new TiePointGrid(fileName, gridWidth, gridHeight, 0.5f, 0.5f, subSamplingX, subSamplingY, (float[]) band.getData().getElems()); product.addTiePointGrid(azShiftGrid); } } catch (Exception e) { SystemUtils.LOG.severe("Unable to add " + fileName + " shift file " + e.getMessage()); } }
private void initTiePointGeoCoding(Product product) { TiePoint[] tiePoints = imageMetadata.getTiePoints(); if (tiePoints != null && tiePoints.length == 4) { float[] latPoints = new float[tiePoints.length]; float[] lonPoints = new float[tiePoints.length]; for (int i = 0; i < tiePoints.length; i++) { latPoints[(i != 2 ? (i != 3 ? i : 2) : 3)] = (float) tiePoints[i].getValueAt(4); lonPoints[(i != 2 ? (i != 3 ? i : 2) : 3)] = (float) tiePoints[i].getValueAt(3); } TiePointGrid latGrid = createTiePointGrid("latitude", 2, 2, 0, 0, metadata.getRasterWidth(), metadata.getRasterHeight(), latPoints); product.addTiePointGrid(latGrid); TiePointGrid lonGrid = createTiePointGrid("longitude", 2, 2, 0, 0, metadata.getRasterWidth(), metadata.getRasterHeight(), lonPoints); product.addTiePointGrid(lonGrid); GeoCoding geoCoding = new TiePointGeoCoding(latGrid, lonGrid); product.setSceneGeoCoding(geoCoding); } }
public static Product createProduct1() { Product product = new Product("Test_Product_1", "Test_Type_1", 2048, 1024); product.addTiePointGrid(new TiePointGrid("Grid_A", 32, 16, 0, 0, 2048f / 32, 1024f / 16, createRandomPoints(32 * 16))); product.addTiePointGrid(new TiePointGrid("Grid_B", 32, 16, 0, 0, 2048f / 32, 1024f / 16, createRandomPoints(32 * 16))); product.addBand("Band_A", "sin(4 * PI * sqrt( sq(X/1000.0 - 1) + sq(Y/500.0 - 1) ))"); product.addBand("Band_B", "sin(4 * PI * sqrt( 2.0 * abs(X/1000.0 * Y/500.0) ))"); product.addMask("Mask_A", "Band_A > 0.5", "I am Mask A", Color.ORANGE, 0.5); product.addMask("Mask_B", "Band_B < 0.0", "I am Mask B", Color.RED, 0.5); product.getMetadataRoot().addElement(new MetadataElement("Global_Attributes")); product.getMetadataRoot().addElement(new MetadataElement("Local_Attributes")); product.setModified(false); double sx = 40.0 / product.getSceneRasterWidth(); AffineTransform at = new AffineTransform(); at.translate(-80, -30); at.rotate(0.3, 20.0, 10.0); at.scale(sx, sx); product.setSceneGeoCoding(new ATGeoCoding(at)); return product; }
@Override protected void addTiePointGrids(final Product product) { final int gridWidth = 4; final int gridHeight = 4; final double subSamplingX = (double) product.getSceneRasterWidth() / (gridWidth - 1); final double subSamplingY = (double) product.getSceneRasterHeight() / (gridHeight - 1); if (subSamplingX == 0 || subSamplingY == 0) return; final float[] flippedSlantRangeCorners = new float[4]; final float[] flippedIncidenceCorners = new float[4]; getFlippedCorners(product, flippedSlantRangeCorners, flippedIncidenceCorners); if (product.getTiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE) == null) { final float[] fineAngles = new float[gridWidth * gridHeight]; ReaderUtils.createFineTiePointGrid(2, 2, gridWidth, gridHeight, flippedIncidenceCorners, fineAngles); final TiePointGrid incidentAngleGrid = new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, fineAngles); incidentAngleGrid.setUnit(Unit.DEGREES); product.addTiePointGrid(incidentAngleGrid); } final float[] fineSlantRange = new float[gridWidth * gridHeight]; ReaderUtils.createFineTiePointGrid(2, 2, gridWidth, gridHeight, flippedSlantRangeCorners, fineSlantRange); final TiePointGrid slantRangeGrid = new TiePointGrid(OperatorUtils.TPG_SLANT_RANGE_TIME, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, fineSlantRange); slantRangeGrid.setUnit(Unit.NANOSECONDS); product.addTiePointGrid(slantRangeGrid); addShiftFiles(product); }
private static void addIncidenceAnglesSlantRangeTime(final Product product, final MetadataElement bandElem) { if (bandElem == null) return; final int gridWidth = 11; final int gridHeight = 11; final float subSamplingX = product.getSceneRasterWidth() / (float) (gridWidth - 1); final float subSamplingY = product.getSceneRasterHeight() / (float) (gridHeight - 1); final double nearRangeAngle = bandElem.getAttributeDouble("Near_Incidence_Angle", 0); final double farRangeAngle = bandElem.getAttributeDouble("Far_Incidence_Angle", 0); final double firstRangeTime = bandElem.getAttributeDouble("Zero_Doppler_Range_First_Time", 0) * Constants.oneBillion; final double lastRangeTime = bandElem.getAttributeDouble("Zero_Doppler_Range_Last_Time", 0) * Constants.oneBillion; final float[] incidenceCorners = new float[]{(float) nearRangeAngle, (float) farRangeAngle, (float) nearRangeAngle, (float) farRangeAngle}; final float[] slantRange = new float[]{(float) firstRangeTime, (float) lastRangeTime, (float) firstRangeTime, (float) lastRangeTime}; final float[] fineAngles = new float[gridWidth * gridHeight]; final float[] fineTimes = new float[gridWidth * gridHeight]; ReaderUtils.createFineTiePointGrid(2, 2, gridWidth, gridHeight, incidenceCorners, fineAngles); ReaderUtils.createFineTiePointGrid(2, 2, gridWidth, gridHeight, slantRange, fineTimes); final TiePointGrid incidentAngleGrid = new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, fineAngles); incidentAngleGrid.setUnit(Unit.DEGREES); product.addTiePointGrid(incidentAngleGrid); final TiePointGrid slantRangeGrid = new TiePointGrid(OperatorUtils.TPG_SLANT_RANGE_TIME, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, fineTimes); slantRangeGrid.setUnit(Unit.NANOSECONDS); product.addTiePointGrid(slantRangeGrid); }
private static void addIncidenceAnglesSlantRangeTime(final Product product, final MetadataElement bandElem) { if (bandElem == null) return; final int gridWidth = 11; final int gridHeight = 11; final float subSamplingX = product.getSceneRasterWidth() / (float) (gridWidth - 1); final float subSamplingY = product.getSceneRasterHeight() / (float) (gridHeight - 1); final double nearRangeAngle = bandElem.getAttributeDouble("Near_Incidence_Angle", 0); final double farRangeAngle = bandElem.getAttributeDouble("Far_Incidence_Angle", 0); final double firstRangeTime = bandElem.getAttributeDouble("Zero_Doppler_Range_First_Time", 0) * Constants.oneBillion; final double lastRangeTime = bandElem.getAttributeDouble("Zero_Doppler_Range_Last_Time", 0) * Constants.oneBillion; final float[] incidenceCorners = new float[]{(float)nearRangeAngle, (float)farRangeAngle, (float)nearRangeAngle, (float)farRangeAngle}; final float[] slantRange = new float[]{(float)firstRangeTime, (float)lastRangeTime, (float)firstRangeTime, (float)lastRangeTime}; final float[] fineAngles = new float[gridWidth * gridHeight]; final float[] fineTimes = new float[gridWidth * gridHeight]; ReaderUtils.createFineTiePointGrid(2, 2, gridWidth, gridHeight, incidenceCorners, fineAngles); ReaderUtils.createFineTiePointGrid(2, 2, gridWidth, gridHeight, slantRange, fineTimes); final TiePointGrid incidentAngleGrid = new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, fineAngles); incidentAngleGrid.setUnit(Unit.DEGREES); product.addTiePointGrid(incidentAngleGrid); final TiePointGrid slantRangeGrid = new TiePointGrid(OperatorUtils.TPG_SLANT_RANGE_TIME, gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, fineTimes); slantRangeGrid.setUnit(Unit.NANOSECONDS); product.addTiePointGrid(slantRangeGrid); }
private void addTiePointGridsToProduct(final Variable[] variables) throws IOException { for (Variable variable : variables) { final int rank = variable.getRank(); final int gridWidth = variable.getDimension(rank - 1).getLength(); int gridHeight = variable.getDimension(rank - 2).getLength(); if (rank >= 3 && gridHeight <= 1) gridHeight = variable.getDimension(rank - 3).getLength(); final TiePointGrid tpg = NetCDFUtils.createTiePointGrid(variable, gridWidth, gridHeight, product.getSceneRasterWidth(), product.getSceneRasterHeight()); product.addTiePointGrid(tpg); } }
incidentAngleGrid.setUnit(Unit.DEGREES); product.addTiePointGrid(incidentAngleGrid); slantRangeTimeGrid.setUnit(Unit.NANOSECONDS); product.addTiePointGrid(slantRangeTimeGrid);
/** * @param w width * @param h height * @return the created product */ private static Product createTestProduct(int w, int h) { final Product testProduct = TestUtils.createProduct("ASA_APG_1P", w, h); // create a Band: band1 final Band band1 = testProduct.addBand("Amplitude", ProductData.TYPE_INT32); band1.setUnit(Unit.AMPLITUDE); final int[] intValues = new int[w * h]; for (int i = 0; i < w * h; i++) { intValues[i] = i + 1; } band1.setData(ProductData.createInstance(intValues)); final float[] incidence_angle = new float[64]; Arrays.fill(incidence_angle, 30.0f); testProduct.addTiePointGrid(new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, 16, 4, 0, 0, 1, 1, incidence_angle)); return testProduct; } }
/** * @param w width * @param h height * @return the created product */ private static Product createTestProduct(String name, String unit, int w, int h) { final Product testProduct = TestUtils.createProduct("ASA_APG_1P", w, h); // create a Band: band1 final Band band1 = testProduct.addBand(name, ProductData.TYPE_INT32); band1.setUnit(unit); final int[] intValues = new int[w * h]; for (int i = 0; i < w * h; i++) { intValues[i] = i + 1; } band1.setData(ProductData.createInstance(intValues)); final float[] incidence_angle = new float[64]; Arrays.fill(incidence_angle, 30.0f); testProduct.addTiePointGrid(new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, 16, 4, 0, 0, 1, 1, incidence_angle)); return testProduct; } }
public static Product createProduct2() { Product product = new Product("Test_Product_2", "Test_Type_2", 1024, 2048); product.addTiePointGrid(new TiePointGrid("Grid_1", 16, 32, 0, 0, 1024f / 16, 2048f / 32, createRandomPoints(32 * 16))); product.addTiePointGrid(new TiePointGrid("Grid_2", 16, 32, 0, 0, 1024f / 16, 2048f / 32, createRandomPoints(32 * 16))); product.addBand("Band_1", "cos(X/100)-sin(Y/100)"); product.addBand("Band_2", "sin(X/100)+cos(Y/100)"); product.addBand("Band_3", "cos(X/100)*cos(Y/100)"); product.addBand("Band_1_Unc", "cos(3*X/100)-sin(3*Y/100)"); product.addBand("Band_2_Unc", "sin(3*X/100)+cos(3*Y/100)"); product.addBand("Band_3_Unc", "cos(3*X/100)*cos(3*Y/100)"); product.getBand("Band_1").addAncillaryVariable(product.getBand("Band_1_Unc"), "uncertainty"); product.getBand("Band_2").addAncillaryVariable(product.getBand("Band_2_Unc"), "uncertainty"); product.getBand("Band_3").addAncillaryVariable(product.getBand("Band_3_Unc"), "uncertainty"); product.addMask("Mask_1", "Band_1 > 0.5", "I am Mask 1", Color.GREEN, 0.5); product.addMask("Mask_2", "Band_2 < 0.0", "I am Mask 2", Color.CYAN, 0.5); product.addMask("Mask_3", "Band_3 > -0.1 && Band_3 < 0.1", "I am Mask 3", Color.BLUE, 0.5); product.getMetadataRoot().addElement(new MetadataElement("Global_Attributes")); product.getMetadataRoot().addElement(new MetadataElement("Local_Attributes")); product.setModified(false); double sx = 20.0 / product.getSceneRasterWidth(); AffineTransform at = new AffineTransform(); at.scale(sx, sx); at.rotate(-0.2, 10.0, 10.0); product.setSceneGeoCoding(new ATGeoCoding(at)); product.addBand("A", "Band_1"); product.addBand("B", "Band_1 + Band_2 + Band_3"); product.addBand("C", "Band_1 / (2.3 + Band_2 + Band_3)"); product.addBand("D", "pow(Band_1, 3) / (pow(Band_1, 3) + pow(Band_3, 3))"); return product; }
TiePointGrid srcTPG = sourceProduct.getTiePointGridAt(i); if (!clonedProduct.containsTiePointGrid(srcTPG.getName())) { clonedProduct.addTiePointGrid(srcTPG.cloneTiePointGrid());
contextProduct.addTiePointGrid(new TiePointGrid(grid.getName(), 10, 10, 0, 0, 1, 1, new float[100]));