private void writeEnviHeader(TiePointGrid tiePointGrid) throws IOException { EnviHeader.createPhysicalFile(getEnviHeaderFile(tiePointGrid), tiePointGrid, tiePointGrid.getRasterWidth(), tiePointGrid.getRasterHeight()); }
/** * Returns the height in pixels of the scene represented by this tie-point grid. The value returned is * <code>(getRasterHeight() - 1) * getSubSamplingY() + 1</code> * * @return the scene height in pixels */ @Override public int getSceneRasterHeight() { if (getProduct() != null) { return getProduct().getSceneRasterHeight(); } else { return Math.round((getRasterHeight() - 1) * getSubSamplingY() + 1); } }
private int findStart(int x) { int increaseDecreaseCount = 0; final float[] latPoints = _latGrid.getTiePoints(); int latWidth = _latGrid.getRasterWidth(); for(int i=1; i<_latGrid.getRasterHeight(); i++) { float p0 = latPoints[(i - 1) * latWidth + x]; float p1 = latPoints[i * latWidth + x]; if (Float.isNaN(p0) || p0 > 90.0 || p0 < -90.0 || Float.isNaN(p1) || p1 > 90.0 || p1 < -90.0) { continue; } int change = 0; if((p0 - p1) < -0.001) { // increase change = +1; } else if((p1 - p0) < -0.001) { // decrease change = -1; } if (increaseDecreaseCount > 1 && change == -1) { return (int)(i*_latGrid.getSubSamplingY()); } else if (increaseDecreaseCount < -1 && change == +1) { return (int)(i*_latGrid.getSubSamplingY()); } else { increaseDecreaseCount += change; } } return -1; }
@Override public void preEncode(ProfileWriteContext ctx, Product p) throws IOException { final HashMap<String, String> dimMap = new HashMap<String, String>(); final NFileWriteable ncFile = ctx.getNetcdfFileWriteable(); for (TiePointGrid tiePointGrid : p.getTiePointGrids()) { final String key = "" + tiePointGrid.getRasterHeight() + " " + tiePointGrid.getRasterWidth(); String dimString = dimMap.get(key); if (dimString == null) { final int size = dimMap.size(); final String suffix = size > 0 ? "" + (size + 1) : ""; ncFile.addDimension("tp_y" + suffix, tiePointGrid.getRasterHeight()); ncFile.addDimension("tp_x" + suffix, tiePointGrid.getRasterWidth()); dimString = "tp_y" + suffix + " " + "tp_x" + suffix; dimMap.put(key, dimString); } String variableName = ReaderUtils.getVariableName(tiePointGrid); final NVariable variable = ncFile.addVariable(variableName, DataType.FLOAT, null, dimString); variable.addAttribute(OFFSET_X, tiePointGrid.getOffsetX()); variable.addAttribute(OFFSET_Y, tiePointGrid.getOffsetY()); variable.addAttribute(SUBSAMPLING_X, tiePointGrid.getSubSamplingX()); variable.addAttribute(SUBSAMPLING_Y, tiePointGrid.getSubSamplingY()); } }
/** * Constructs geo-coding based on two given tie-point grids. * * @param latGrid the latitude grid * @param lonGrid the longitude grid * @param datum the geodetic datum */ public TiePointGeoCoding(TiePointGrid latGrid, TiePointGrid lonGrid, Datum datum) { Guardian.assertNotNull("latGrid", latGrid); Guardian.assertNotNull("lonGrid", lonGrid); Guardian.assertNotNull("datum", datum); if (latGrid.getRasterWidth() != lonGrid.getRasterWidth() || latGrid.getRasterHeight() != lonGrid.getRasterHeight() || latGrid.getOffsetX() != lonGrid.getOffsetX() || latGrid.getOffsetY() != lonGrid.getOffsetY() || latGrid.getSubSamplingX() != lonGrid.getSubSamplingX() || latGrid.getSubSamplingY() != lonGrid.getSubSamplingY()) { throw new IllegalArgumentException("latGrid is not compatible with lonGrid"); } this.latGrid = latGrid; this.lonGrid = lonGrid; this.datum = datum; approximationsComputed = false; }
final int tpRasterHeight = lonGrid.getRasterHeight(); final int sceneHeight = lonGrid.getSceneRasterHeight(); final int stripeH;
private void initDiscont() { TiePointGrid base = this; final float[] tiePoints = base.getTiePoints(); final float[] sinTiePoints = new float[tiePoints.length]; final float[] cosTiePoints = new float[tiePoints.length]; for (int i = 0; i < tiePoints.length; i++) { float tiePoint = tiePoints[i]; sinTiePoints[i] = (float) Math.sin(MathUtils.DTOR * tiePoint); cosTiePoints[i] = (float) Math.cos(MathUtils.DTOR * tiePoint); } sinGrid = new TiePointGrid(base.getName(), base.getRasterWidth(), base.getRasterHeight(), base.getOffsetX(), base.getOffsetY(), base.getSubSamplingX(), base.getSubSamplingY(), sinTiePoints); cosGrid = new TiePointGrid(base.getName(), base.getRasterWidth(), base.getRasterHeight(), base.getOffsetX(), base.getOffsetY(), base.getSubSamplingX(), base.getSubSamplingY(), cosTiePoints); }
@Override public void encode(ProfileWriteContext ctx, Product p) throws IOException { for (TiePointGrid tiePointGrid : p.getTiePointGrids()) { final int y = tiePointGrid.getRasterHeight(); final int x = tiePointGrid.getRasterWidth(); final int[] shape = new int[]{y, x}; final Array values = Array.factory(DataType.FLOAT, shape, tiePointGrid.getDataElems()); String variableName = ReaderUtils.getVariableName(tiePointGrid); ctx.getNetcdfFileWriteable().findVariable(variableName).writeFully(values); } } }
/** * Constructs geo-coding based on two given tie-point grids. * * @param latGrid the latitude grid, must not be <code>null</code> * @param lonGrid the longitude grid, must not be <code>null</code> * @param scanlineHeight the number of detectors in a scan */ public BowtieTiePointGeoCoding(TiePointGrid latGrid, TiePointGrid lonGrid, int scanlineHeight) { super(); Guardian.assertNotNull("latGrid", latGrid); Guardian.assertNotNull("lonGrid", lonGrid); if (latGrid.getRasterWidth() != lonGrid.getRasterWidth() || latGrid.getRasterHeight() != lonGrid.getRasterHeight() || latGrid.getOffsetX() != lonGrid.getOffsetX() || latGrid.getOffsetY() != lonGrid.getOffsetY() || latGrid.getSubSamplingX() != lonGrid.getSubSamplingX() || latGrid.getSubSamplingY() != lonGrid.getSubSamplingY()) { throw new IllegalArgumentException("latGrid is not compatible with lonGrid"); } _latGrid = latGrid; _lonGrid = lonGrid; setGridOwner(_lonGrid.getOwner()); _scanlineHeight = scanlineHeight; _scanlineOffset = 0; try { init(); } catch (IOException e) { throw new IllegalArgumentException("can not init geocode", e); } }
/** * Constructs geo-coding based on two given tie-point grids. * * @param latGrid the latitude grid, must not be <code>null</code> * @param lonGrid the longitude grid, must not be <code>null</code> * @param datum the datum (f.e. WGS84) */ public ModisTiePointGeoCoding(TiePointGrid latGrid, TiePointGrid lonGrid, final Datum datum) { Guardian.assertNotNull("latGrid", latGrid); Guardian.assertNotNull("lonGrid", lonGrid); Guardian.assertNotNull("datum", datum); if (latGrid.getRasterWidth() != lonGrid.getRasterWidth() || latGrid.getRasterHeight() != lonGrid.getRasterHeight() || latGrid.getOffsetX() != lonGrid.getOffsetX() || latGrid.getOffsetY() != lonGrid.getOffsetY() || latGrid.getSubSamplingX() != lonGrid.getSubSamplingX() || latGrid.getSubSamplingY() != lonGrid.getSubSamplingY()) { throw new IllegalArgumentException("latGrid is not compatible with lonGrid"); } latgrid = latGrid; this.lonGrid = lonGrid; this.datum = datum; lastCenterLineIndex = 0; init(); }
private Approximation[] initApproximations(TiePointGrid normalizedLonGrid) { final int numPoints = latGrid.getRasterData().getNumElems(); final int w = latGrid.getRasterWidth(); final int h = latGrid.getRasterHeight();
float fj = (y - offsetY) / subSamplingY; final int i = MathUtils.floorAndCrop(fi, 0, getRasterWidth() - 2); final int j = MathUtils.floorAndCrop(fj, 0, getRasterHeight() - 2); return interpolate(fi - i, fj - j, i, j);
public static TiePointGrid createZenithFromElevationAngleTiePointGrid(TiePointGrid elevationAngleGrid) { final float[] elevationAngles = elevationAngleGrid.getTiePoints(); final float[] zenithAngles = new float[elevationAngles.length]; for (int i = 0; i < zenithAngles.length; i++) { zenithAngles[i] = 90.0f - elevationAngles[i]; } return new TiePointGrid(elevationAngleGrid.getName(), elevationAngleGrid.getRasterWidth(), elevationAngleGrid.getRasterHeight(), elevationAngleGrid.getOffsetX(), elevationAngleGrid.getOffsetY(), elevationAngleGrid.getSubSamplingX(), elevationAngleGrid.getSubSamplingY(), zenithAngles); }
public TiePointGrid cloneTiePointGrid() { final float[] srcTiePoints = this.getTiePoints(); final float[] destTiePoints = new float[srcTiePoints.length]; System.arraycopy(srcTiePoints, 0, destTiePoints, 0, srcTiePoints.length); TiePointGrid clone = new TiePointGrid(this.getName(), this.getRasterWidth(), this.getRasterHeight(), this.getOffsetX(), this.getOffsetY(), this.getSubSamplingX(), this.getSubSamplingY(), destTiePoints, this.getDiscontinuity()); clone.setUnit(getUnit()); clone.setDescription(getDescription()); return clone; }
"RasterWidth of TiePointGrid " + i + " expected <" + expTPGrid.getRasterWidth() + "> but was <" + currentTPGrid.getRasterWidth() + ">\r\n"); if (expTPGrid.getRasterHeight() != currentTPGrid.getRasterHeight()) { diff.append( "RasterHeight of TiePointGrid " + i + " expected <" + expTPGrid.getRasterHeight() + "> but was <" + currentTPGrid.getRasterHeight() + ">\r\n");
private void writeTiePointGrid(TiePointGrid grid, String path) throws IOException { final int w = grid.getRasterWidth(); final int h = grid.getRasterHeight(); long[] dims = new long[]{h, w}; int dataTypeID = -1; createScalarAttribute(datasetID, "raster_height", grid.getRasterHeight()); createScalarAttribute(datasetID, "unit", grid.getUnit()); createScalarAttribute(datasetID, "description", grid.getDescription());
JDomHelper.addElement(DimapProductConstants.TAG_TIE_POINT_NCOLS, tiePointGrid.getRasterWidth(), tiePointGridInfo); JDomHelper.addElement(DimapProductConstants.TAG_TIE_POINT_NROWS, tiePointGrid.getRasterHeight(), tiePointGridInfo); JDomHelper.addElement(DimapProductConstants.TAG_TIE_POINT_OFFSET_X, tiePointGrid.getOffsetX(),
ProductData.getTypeString(tiePointGrid.getDataType())); printLine(indent + 2, DimapProductConstants.TAG_TIE_POINT_NCOLS, tiePointGrid.getRasterWidth()); printLine(indent + 2, DimapProductConstants.TAG_TIE_POINT_NROWS, tiePointGrid.getRasterHeight()); printLine(indent + 2, DimapProductConstants.TAG_TIE_POINT_OFFSET_X, tiePointGrid.getOffsetX()); printLine(indent + 2, DimapProductConstants.TAG_TIE_POINT_OFFSET_Y, tiePointGrid.getOffsetY());
public void testAttributeQueries() { TiePointGrid grid = new TiePointGrid("x", 3, 5, 0, 0, 4, 2, _tiePoints); assertEquals("x", grid.getName()); assertEquals(3, grid.getRasterWidth()); assertEquals(5, grid.getRasterHeight()); assertEquals(9, grid.getSceneRasterHeight()); assertEquals(9, grid.getSceneRasterWidth()); assertEquals(9, grid.getSceneRasterHeight()); assertEquals(0, grid.getOffsetX(), 1e-6F); assertEquals(0, grid.getOffsetY(), 1e-6F); assertEquals(4, grid.getSubSamplingX(), 1e-6F); assertEquals(2, grid.getSubSamplingY(), 1e-6F); assertNotNull(grid.getTiePoints()); assertSame(grid.getTiePoints(), _tiePoints); assertEquals(15, grid.getTiePoints().length); for (int i = 0; i < 15; i++) { assertEquals(_tiePoints[i], grid.getTiePoints()[i], 1e-10F); } }
public void testClone() { TiePointGrid grid = new TiePointGrid("abc", 2, 2, 0.1f, 0.2f, 0.3f, 0.4f, new float[]{1.2f, 2.3f, 3.4f, 4.5f}); grid.setDescription("Aha!"); grid.setDiscontinuity(TiePointGrid.DISCONT_AT_180); TiePointGrid gridClone = grid.cloneTiePointGrid(); assertEquals("abc", gridClone.getName()); assertEquals("Aha!", gridClone.getDescription()); assertEquals(TiePointGrid.DISCONT_AT_180, gridClone.getDiscontinuity()); assertEquals(2, gridClone.getRasterWidth()); assertEquals(2, gridClone.getRasterHeight()); assertEquals(0.1f, gridClone.getOffsetX()); assertEquals(0.2f, gridClone.getOffsetY()); assertEquals(0.3f, gridClone.getSubSamplingX()); assertEquals(0.4f, gridClone.getSubSamplingY()); assertNotNull(gridClone.getData()); assertEquals(true, gridClone.getData().getElems() instanceof float[]); float[] dataClone = (float[]) gridClone.getData().getElems(); assertEquals(4, dataClone.length); assertEquals(1.2f, dataClone[0]); assertEquals(2.3f, dataClone[1]); assertEquals(3.4f, dataClone[2]); assertEquals(4.5f, dataClone[3]); assertNotSame(grid.getData().getElems(), dataClone); } }