public static boolean isNearRangeOnLeft(final TiePointGrid incidenceAngle, final int sourceImageWidth) { // for products without incidence angle tpg just assume left facing if (incidenceAngle == null) return true; final double incidenceAngleToFirstPixel = incidenceAngle.getPixelDouble(0, 0); final double incidenceAngleToLastPixel = incidenceAngle.getPixelDouble(sourceImageWidth - 1, 0); return (incidenceAngleToFirstPixel < incidenceAngleToLastPixel); }
incidenceAngleTPG = OperatorUtils.getIncidenceAngle(sourceProduct); targetTPGWidth = latitudeTPG.getGridWidth(); targetTPGHeight = latitudeTPG.getGridHeight(); targetIncidenceAngleTiePoints[k] = (float)incidenceAngleTPG.getPixelDouble(x, y); targetSlantRangeTimeTiePoints[k] = (float)slantRangeTimeTPG.getPixelDouble(x, y); final TiePointGrid angleGrid = new TiePointGrid(OperatorUtils.TPG_INCIDENT_ANGLE, targetTPGWidth, targetTPGHeight, 0.0f, 0.0f, subSamplingX, subSamplingY, targetIncidenceAngleTiePoints); angleGrid.setUnit(Unit.DEGREES); final TiePointGrid slrgtGrid = new TiePointGrid(OperatorUtils.TPG_SLANT_RANGE_TIME, targetTPGWidth, targetTPGHeight, 0.0f, 0.0f, subSamplingX, subSamplingY, targetSlantRangeTimeTiePoints); slrgtGrid.setUnit(Unit.NANOSECONDS); final TiePointGrid latGrid = new TiePointGrid(OperatorUtils.TPG_LATITUDE, targetTPGWidth, targetTPGHeight, 0.0f, 0.0f, subSamplingX, subSamplingY, targetLatTiePoints); latGrid.setUnit(Unit.DEGREES); final TiePointGrid lonGrid = new TiePointGrid(OperatorUtils.TPG_LONGITUDE, targetTPGWidth, targetTPGHeight, 0.0f, 0.0f, subSamplingX, subSamplingY, targetLonTiePoints, TiePointGrid.DISCONT_AT_180); lonGrid.setUnit(Unit.DEGREES);
public QuadInterpolator(final TiePointGrid tpg) { final int imageWidth = tpg.getRasterWidth(); subSamplinX = tpg.getSubSamplingX(); subSamplinY = tpg.getSubSamplingY(); final int width = tpg.getGridWidth(); final int height = tpg.getGridHeight(); final float[] tiePoints = tpg.getTiePoints(); final String tiePointGridName = tpg.getName(); boolean imageFlipped = false; if ((tiePointGridName.equals(OperatorUtils.TPG_INCIDENT_ANGLE) ||
public TiePointInterpolator(final TiePointGrid tpg) { this.tpg = tpg; this.tiePoints = tpg.getTiePoints(); this.rasterWidth = tpg.getRasterWidth(); }
private String createToolTip(final TiePointGrid tiePointGrid) { StringBuilder tooltip = new StringBuilder(); append(tooltip, tiePointGrid.getDescription()); append(tooltip, String.format("%d x %d --> %d x %d pixels", tiePointGrid.getGridWidth(), tiePointGrid.getGridHeight(), tiePointGrid.getRasterWidth(), tiePointGrid.getRasterHeight())); if (tiePointGrid.getUnit() != null) { append(tooltip, String.format(" (%s)", tiePointGrid.getUnit())); } return tooltip.toString(); } }
private static float[][] getTiePointGridData(final TiePointGrid tpg) { int gridWidth = tpg.getGridWidth(); int gridHeight = tpg.getGridHeight(); final float[][] data = new float[gridHeight][gridWidth]; final ProductData gridData = tpg.getGridData(); for (int y = 0; y < gridHeight; ++y) { final int stride = y * gridWidth; for (int x = 0; x < gridWidth; ++x) { data[y][x] = gridData.getElemFloatAt(stride + x); } } return data; }
@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); }
} else if (getRaster() instanceof TiePointGrid) { final TiePointGrid grid = (TiePointGrid) getRaster(); addEntry("Name:", grid.getName(), ""); addEntry("Type:", "Tie Point Grid", ""); addEntry("Description:", grid.getDescription(), ""); addEntry("Geophysical unit:", grid.getUnit(), ""); addEntry("Geophysical data type:", ProductData.getTypeString(grid.getGeophysicalDataType()), ""); addEntry("Grid width:", String.valueOf(grid.getGridWidth()), "tie points"); addEntry("Grid height:", String.valueOf(grid.getGridHeight()), "tie points"); addEntry("Offset X:", String.valueOf(grid.getOffsetX()), "pixels"); addEntry("Offset Y:", String.valueOf(grid.getOffsetY()), "pixels"); addEntry("Sub-sampling X:", String.valueOf(grid.getSubSamplingX()), "pixels"); addEntry("Sub-sampling Y:", String.valueOf(grid.getSubSamplingY()), "pixels"); addEntry("Raster width:", String.valueOf(grid.getRasterWidth()), "pixels"); addEntry("Raster height:", String.valueOf(grid.getRasterHeight()), "pixels");
final double slrgTime = slantRangeTime.getPixelDouble(x, y) / Constants.oneBillion; // ns to s; final GeoPos geoPos = computeLatLon(latMid, lonMid, slrgTime, data); targetLatTiePoints[k] = (float)geoPos.lat; final TiePointGrid latGrid = new TiePointGrid(OperatorUtils.TPG_LATITUDE, gridWidth, gridHeight, 0.0f, 0.0f, subSamplingX, subSamplingY, targetLatTiePoints); final TiePointGrid lonGrid = new TiePointGrid(OperatorUtils.TPG_LONGITUDE, gridWidth, gridHeight, 0.0f, 0.0f, subSamplingX, subSamplingY, targetLonTiePoints, TiePointGrid.DISCONT_AT_180);
final String name = tpg.getName(); netCDFWriteable.addDimension(name + 'x', tpg.getGridWidth()); netCDFWriteable.addDimension(name + 'y', tpg.getGridHeight()); netCDFWriteable.addVariable(name, DataType.FLOAT, new Dimension[]{rootGroup.findDimension(name + 'y'), rootGroup.findDimension(name + 'x')}); if (tpg.getDescription() != null) netCDFWriteable.addVariableAttribute(name, "description", tpg.getDescription()); if (tpg.getUnit() != null) netCDFWriteable.addVariableAttribute(name, "unit", tpg.getUnit()); if (sourceGeoCoding instanceof TiePointGeoCoding) { final TiePointGeoCoding geoCoding = (TiePointGeoCoding) sourceGeoCoding; latGridName = geoCoding.getLatGrid().getName(); lonGridName = geoCoding.getLonGrid().getName(); netCDFWriteable.write(tpg.getName(), tpgArray);
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()); } }
public static TiePointGrid createTiePointGrid(final Variable variable, final int gridWidth, final int gridHeight, final int sceneWidth, final int sceneHeight) throws IOException { final NcAttributeMap attMap = NcAttributeMap.create(variable); final double subSamplingX = (double) sceneWidth / (double) (gridWidth - 1); final double subSamplingY = (double) sceneHeight / (double) (gridHeight - 1); final Array data = variable.read(); final float[] dataArray = new float[(int) data.getSize()]; //(float[])data.copyTo1DJavaArray(); for (int i = 0; i < data.getSize(); ++i) { dataArray[i] = data.getFloat(i); } final TiePointGrid tpg = new TiePointGrid(variable.getShortName(), gridWidth, gridHeight, 0, 0, subSamplingX, subSamplingY, dataArray); tpg.setDescription(getDescription(variable, attMap)); tpg.setUnit(getUnit(variable, attMap)); tpg.setScalingFactor(getScalingFactor(attMap)); tpg.setScalingOffset(getAddOffset(attMap)); final Number noDataValue = getNoDataValue(attMap); if (noDataValue != null) { tpg.setNoDataValue(noDataValue.doubleValue()); tpg.setNoDataValueUsed(true); } return tpg; }
final int w = tpg.getGridWidth(); final int h = tpg.getGridHeight(); final int n = w * h; final int y = (int) (i * tpg.getSubSamplingY()); final double yy = y * y; final int iw = i * w; for (int j = 0; j < w; j++) { final int k = iw + j; final int x = (int) (j * tpg.getSubSamplingX()); sampleIndexArray[k][0] = 1.0; sampleIndexArray[k][1] = (double) (x); final float[] tiePoints = tpg.getTiePoints();
return tpg.getPixelDouble(x, y); computeQuadraticInterpCoeffs(); int r = (int) ((y - tpg.getOffsetY()) / tpg.getSubSamplingY()); if (r >= quadraticInterpCoeffs.length) { r = quadraticInterpCoeffs.length - 1;
/** * Compute polynomial coefficients for quadratic interpolation. For each tie point record, 3 coefficients * are computed. The 3 coefficients are saved in a row in _quadraticInterpCoeffs as {a0, a1, a2}. The * quadratic polynomial is given as f(x) = a0 + a1*x + a2*x^2. */ private synchronized void computeQuadraticInterpCoeffs() { if (quadraticInterpCoeffs != null) return; final int numCoeff = 3; final int width = tpg.getGridWidth(); final int height = tpg.getGridHeight(); final double[][] sampleIndexArray = new double[width][numCoeff]; for (int c = 0; c < width; c++) { final int x = (int) (tpg.getOffsetX() + c * tpg.getSubSamplingX()); sampleIndexArray[c][0] = 1.0; sampleIndexArray[c][1] = (double) (x); sampleIndexArray[c][2] = (double) (x * x); } final Matrix A = new Matrix(sampleIndexArray); quadraticInterpCoeffs = new double[height][numCoeff]; final double[] tiePointArray = new double[width]; for (int r = 0; r < height; r++) { final int rwidth = r * width; for (int c = 0; c < width; c++) { tiePointArray[c] = (double) (tiePoints[rwidth + c]); } final Matrix b = new Matrix(tiePointArray, width); final Matrix x = A.solve(b); quadraticInterpCoeffs[r] = x.getColumnPackedCopy(); } }
contextProduct.addTiePointGrid(new TiePointGrid(grid.getName(), 10, 10, 0, 0, 1, 1, new float[100]));
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); } }
protected String[] collectNamesOfRastersOfSameSize() { final Product product = getMaskForm().getProduct(); //todo [multisize_products] do not compare raster sizes final RasterDataNode referenceRaster = getMaskForm().getRaster(); final List<String> rangeRasterNames = new ArrayList<>(); final Band[] bands = product.getBands(); for (Band band : bands) { if (band.getRasterHeight() == referenceRaster.getRasterHeight() && band.getRasterWidth() == referenceRaster.getRasterWidth()) { rangeRasterNames.add(band.getName()); } } final TiePointGrid[] tiePointGrids = product.getTiePointGrids(); for (TiePointGrid tiePointGrid : tiePointGrids) { if (tiePointGrid.getRasterHeight() == referenceRaster.getRasterHeight() && tiePointGrid.getRasterWidth() == referenceRaster.getRasterWidth()) { rangeRasterNames.add(tiePointGrid.getName()); } } return rangeRasterNames.toArray(new String[rangeRasterNames.size()]); } }
final Point2D modelCoords; try { modelCoords = grid.getSceneToModelTransform().transform(sceneCoords, new Point2D.Double()); modelToImageTransform = grid.getImageToModelTransform().createInverse(); } catch (NoninvertibleTransformException | TransformException e) { return "Indeterminate"; final int x = MathUtils.floorInt(rasterPos.getX()); final int y = MathUtils.floorInt(rasterPos.getY()); final int width = grid.getRasterWidth(); final int height = grid.getRasterHeight(); value = grid.readPixels(x, y, 1, 1, value, ProgressMonitor.NULL); return value[0]; } catch (IOException ignored) {