Class TiePointGrid

All Implemented Interfaces:
Extensible, Scaling, SceneTransformProvider

public class TiePointGrid extends RasterDataNode
A tie-point grid contains the data for geophysical parameter in remote sensing data products. Tie-point grid are two-dimensional images which hold their pixel values (samples) in a float array.

Usually, tie-point grids are a sub-sampling of a data product's scene resolution.

  • Field Details

    • DISCONT_AUTO

      public static final int DISCONT_AUTO
      The discontinuity of the tie point values shall be detected automatically.
      See Also:
    • DISCONT_NONE

      public static final int DISCONT_NONE
      Tie point values are assumed to have none discontinuities.
      See Also:
    • DISCONT_AT_180

      public static final int DISCONT_AT_180
      Tie point values have angles in the range -180...+180 degrees and may comprise a discontinuity at 180 (resp. -180) degrees.
      See Also:
    • DISCONT_AT_360

      public static final int DISCONT_AT_360
      Tie point values have are angles in the range 0...+360 degrees and may comprise a discontinuity at 360 (resp. 0) degrees.
      See Also:
  • Constructor Details

    • TiePointGrid

      public TiePointGrid(String name, int gridWidth, int gridHeight, double offsetX, double offsetY, double subSamplingX, double subSamplingY)
      Constructs a new TiePointGrid with the given tie point grid properties.
      Parameters:
      name - the name of the new object
      gridWidth - the width of the tie-point grid in pixels
      gridHeight - the height of the tie-point grid in pixels
      offsetX - the X co-ordinate of the first (upper-left) tie-point in pixels
      offsetY - the Y co-ordinate of the first (upper-left) tie-point in pixels
      subSamplingX - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      subSamplingY - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
    • TiePointGrid

      public TiePointGrid(String name, int gridWidth, int gridHeight, double offsetX, double offsetY, double subSamplingX, double subSamplingY, float[] tiePoints)
      Constructs a new TiePointGrid with the given tie point grid properties.
      Parameters:
      name - the name of the new object
      gridWidth - the width of the tie-point grid in pixels
      gridHeight - the height of the tie-point grid in pixels
      offsetX - the X co-ordinate of the first (upper-left) tie-point in pixels
      offsetY - the Y co-ordinate of the first (upper-left) tie-point in pixels
      subSamplingX - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      subSamplingY - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      tiePoints - the tie-point data values, must be an array of the size gridWidth * gridHeight
    • TiePointGrid

      public TiePointGrid(String name, int gridWidth, int gridHeight, double offsetX, double offsetY, double subSamplingX, double subSamplingY, float[] tiePoints, boolean containsAngles)
      Constructs a new TiePointGrid with the given tie point grid properties.
      Parameters:
      name - the name of the new object
      gridWidth - the width of the tie-point grid in pixels
      gridHeight - the height of the tie-point grid in pixels
      offsetX - the X co-ordinate of the first (upper-left) tie-point in pixels
      offsetY - the Y co-ordinate of the first (upper-left) tie-point in pixels
      subSamplingX - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      subSamplingY - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      tiePoints - the tie-point data values, must be an array of the size gridWidth * gridHeight
      containsAngles - if true, the angular discontinuity is derived from the provided tie-point data values
    • TiePointGrid

      public TiePointGrid(String name, int gridWidth, int gridHeight, double offsetX, double offsetY, double subSamplingX, double subSamplingY, float[] tiePoints, int discontinuity)
      Constructs a new TiePointGrid with the given tie point grid properties.
      Parameters:
      name - the name of the new object
      gridWidth - the width of the tie-point grid in pixels
      gridHeight - the height of the tie-point grid in pixels
      offsetX - the X co-ordinate of the first (upper-left) tie-point in pixels
      offsetY - the Y co-ordinate of the first (upper-left) tie-point in pixels
      subSamplingX - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      subSamplingY - the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to. Must not be less than one.
      tiePoints - the tie-point data values, must be an array of the size gridWidth * gridHeight
      discontinuity - the discontinuity mode, can be either DISCONT_NONE, DISCONT_AUTO, DISCONT_AT_180 or DISCONT_AT_360
  • Method Details

    • getGridWidth

      public int getGridWidth()
      Returns:
      The grid's width (= number of columns).
    • getGridHeight

      public int getGridHeight()
      Returns:
      The grid's height (= number of rows).
    • getOffsetX

      public double getOffsetX()
      Retrieves the x co-ordinate of the first (upper-left) tie-point in pixels.
    • getOffsetY

      public double getOffsetY()
      Retrieves the y co-ordinate of the first (upper-left) tie-point in pixels.
    • getSubSamplingX

      public double getSubSamplingX()
      Returns the sub-sampling in X-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      Returns:
      the sub-sampling in X-direction, never less than one.
    • getSubSamplingY

      public double getSubSamplingY()
      Returns the sub-sampling in Y-direction given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      Returns:
      the sub-sampling in Y-direction, never less than one.
    • getTiePoints

      public float[] getTiePoints()
      Returns:
      The data array representing the single tie-points.
    • getGridData

      public ProductData getGridData()
      Returns:
      The data buffer representing the single tie-points.
    • getRasterWidth

      public int getRasterWidth()
      Specified by:
      getRasterWidth in class RasterDataNode
      Returns:
      The native width of the raster in pixels.
    • getRasterHeight

      public int getRasterHeight()
      Specified by:
      getRasterHeight in class RasterDataNode
      Returns:
      The native height of the raster in pixels.
    • getDiscontinuity

      public static int getDiscontinuity(float[] tiePoints)
      Determines the angular discontinuity of the given tie point values.
      Returns:
      the angular discontinuity, will always be either DISCONT_AT_180 or DISCONT_AT_360
    • getDiscontinuity

      public int getDiscontinuity()
      Gets the angular discontinuity.
      Returns:
      the angular discontinuity, will always be either DISCONT_NONE, DISCONT_AUTO, DISCONT_AT_180 or DISCONT_AT_360
    • setDiscontinuity

      public void setDiscontinuity(int discontinuity)
      Sets the angular discontinuity.
      Parameters:
      discontinuity - angular discontinuity, can be either DISCONT_NONE, DISCONT_AUTO, DISCONT_AT_180 or DISCONT_AT_360
    • isFloatingPointType

      public boolean isFloatingPointType()
      Returns true
      Overrides:
      isFloatingPointType in class RasterDataNode
      Returns:
      true
    • getGeophysicalDataType

      public int getGeophysicalDataType()
      Returns the geophysical data type of this RasterDataNode. The value returned is always one of the ProductData.TYPE_XXX constants.
      Overrides:
      getGeophysicalDataType in class RasterDataNode
      Returns:
      the geophysical data type
      See Also:
    • setData

      public void setData(ProductData data)
      Description copied from class: DataNode
      Sets the data of this data node.
      Overrides:
      setData in class DataNode
    • getRasterData

      public ProductData getRasterData()
      Gets the linear interpolated raster data containing rasterWidth x rasterHeight samples.
      Overrides:
      getRasterData in class RasterDataNode
      Returns:
      The raster data for this tie-point grid.
    • setRasterData

      public void setRasterData(ProductData rasterData) throws UnsupportedOperationException
      The method will always fail on tie-point grids as they are read-only.
      Overrides:
      setRasterData in class RasterDataNode
      Parameters:
      rasterData - The raster data whose reference will be stored.
      Throws:
      UnsupportedOperationException
      See Also:
    • getPixelInt

      public int getPixelInt(int x, int y)
      Gets the interpolated sample for the pixel located at (x,y) as an integer value.

      If the pixel co-ordinates given by (x,y) are not covered by this tie-point grid, the method extrapolates.

      Specified by:
      getPixelInt in class RasterDataNode
      Parameters:
      x - The X co-ordinate of the pixel location
      y - The Y co-ordinate of the pixel location
      Returns:
      the pixel value at (x,y)
      Throws:
      ArrayIndexOutOfBoundsException - if the co-ordinates are not in bounds
    • dispose

      public void dispose()
      Description copied from class: RasterDataNode
      Releases all of the resources used by this object instance and all of its owned children. Its primary use is to allow the garbage collector to perform a vanilla job.

      This method should be called only if it is for sure that this object instance will never be used again. The results of referencing an instance of this class after a call to dispose() are undefined.

      Overrides of this method should always call super.dispose(); after disposing this instance.

      Overrides:
      dispose in class RasterDataNode
    • getPixelFloat

      public float getPixelFloat(int x, int y)
      Computes the interpolated sample for the pixel located at (x,y).

      If the pixel co-ordinates given by (x,y) are not covered by this tie-point grid, the method extrapolates.

      Specified by:
      getPixelFloat in class RasterDataNode
      Parameters:
      x - The X co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      y - The Y co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      Returns:
      the pixel value at (x,y)
      Throws:
      ArrayIndexOutOfBoundsException - if the co-ordinates are not in bounds
    • getPixelFloat

      public final float getPixelFloat(float x, float y)
      Computes the interpolated sample for the pixel located at (x,y) given as floating point co-ordinates.

      If the pixel co-ordinates given by (x,y) are not covered by this tie-point grid, the method extrapolates.

      Parameters:
      x - The X co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      y - The Y co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      Throws:
      ArrayIndexOutOfBoundsException - if the co-ordinates are not in bounds
    • getPixelDouble

      public double getPixelDouble(int x, int y)
      Gets the interpolated sample for the pixel located at (x,y) as a double value.

      If the pixel co-ordinates given by (x,y) are not covered by this tie-point grid, the method extrapolates.

      Specified by:
      getPixelDouble in class RasterDataNode
      Parameters:
      x - The X co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      y - The Y co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      Returns:
      the pixel value at (x,y)
      Throws:
      ArrayIndexOutOfBoundsException - if the co-ordinates are not in bounds
    • getPixelDouble

      public double getPixelDouble(double x, double y)
      Gets the interpolated sample for the pixel located at (x,y) as a double value.

      If the pixel co-ordinates given by (x,y) are not covered by this tie-point grid, the method extrapolates.

      Parameters:
      x - The X co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      y - The Y co-ordinate of the pixel location, given in the pixel co-ordinates of the data product to which this tie-point grid belongs to.
      Throws:
      ArrayIndexOutOfBoundsException - if the co-ordinates are not in bounds
    • setPixelInt

      public void setPixelInt(int x, int y, int pixelValue)
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      setPixelInt in class RasterDataNode
      Parameters:
      x - the X co-ordinate of the pixel location
      y - the Y co-ordinate of the pixel location
      pixelValue - the new pixel value at (x,y)
    • setPixelFloat

      public void setPixelFloat(int x, int y, float pixelValue)
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      setPixelFloat in class RasterDataNode
      Parameters:
      x - the X co-ordinate of the pixel location
      y - the Y co-ordinate of the pixel location
      pixelValue - the new pixel value at (x,y)
    • setPixelDouble

      public void setPixelDouble(int x, int y, double pixelValue)
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      setPixelDouble in class RasterDataNode
      Parameters:
      x - the X co-ordinate of the pixel location
      y - the Y co-ordinate of the pixel location
      pixelValue - the new pixel value at (x,y)
    • getPixels

      public int[] getPixels(int x, int y, int w, int h, int[] pixels, ProgressMonitor pm)
      Retrieves an array of tie point data interpolated to the product with and height as integer array. If the given array is null a new one was created and returned.
      Specified by:
      getPixels in class RasterDataNode
      Parameters:
      x - the x coordinate of the array to be read
      y - the y coordinate of the array to be read
      w - the width of the array to be read
      h - the height of the array to be read
      pixels - the integer array to be filled with data
      pm - a monitor to inform the user about progress
      Throws:
      IllegalArgumentException - if the length of the given array is less than w*h.
    • getPixels

      public double[] getPixels(int x, int y, int w, int h, double[] pixels, ProgressMonitor pm)
      Retrieves an array of tie point data interpolated to the product width and height as float array. If the given array is null a new one is created and returned.
      Specified by:
      getPixels in class RasterDataNode
      Parameters:
      x - the x coordinate of the array to be read
      y - the y coordinate of the array to be read
      w - the width of the array to be read
      h - the height of the array to be read
      pixels - the float array to be filled with data
      pm - a monitor to inform the user about progress
      Throws:
      IllegalArgumentException - if the length of the given array is less than w*h.
    • getPixels

      public float[] getPixels(int x, int y, int w, int h, float[] pixels, ProgressMonitor pm)
      Retrieves an array of tie point data interpolated to the product with and height as double array. If the given array is null a new one was created and returned.
      Specified by:
      getPixels in class RasterDataNode
      Parameters:
      x - the x coordinate of the array to be read
      y - the y coordinate of the array to be read
      w - the width of the array to be read
      h - the height of the array to be read
      pixels - the double array to be filled with data
      pm - a progress monitor
      Throws:
      IllegalArgumentException - if the length of the given array is less than w*h.
    • setPixels

      public void setPixels(int x, int y, int w, int h, int[] pixels)
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      setPixels in class RasterDataNode
      Parameters:
      x - x offset into the band
      y - y offset into the band
      w - width of the pixel array to be written
      h - height of the pixel array to be written.
      pixels - integer array to be written
    • setPixels

      public void setPixels(int x, int y, int w, int h, float[] pixels)
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      setPixels in class RasterDataNode
      Parameters:
      x - x offset into the band
      y - y offset into the band
      w - width of the pixel array to be written
      h - height of the pixel array to be written.
      pixels - float array to be written
    • setPixels

      public void setPixels(int x, int y, int w, int h, double[] pixels)
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      setPixels in class RasterDataNode
      Parameters:
      x - x offset into the band
      y - y offset into the band
      w - width of the pixel array to be written
      h - height of the pixel array to be written.
      pixels - double array to be written
    • readPixels

      public int[] readPixels(int x, int y, int w, int h, int[] pixels, ProgressMonitor pm) throws IOException
      Retrieves an array of tie point data interpolated to the product with and height as float array. If the given array is null a new one was created and returned.
      Specified by:
      readPixels in class RasterDataNode
      Parameters:
      x - the x coordinate of the array to be read
      y - the y coordinate of the array to be read
      w - the width of the array to be read
      h - the height of the array to be read
      pixels - the integer array to be filled with data
      pm - a progress monitor
      Returns:
      the pixels read
      Throws:
      IllegalArgumentException - if the length of the given array is less than w*h.
      IOException - if an /IO error occurs
    • readPixels

      public float[] readPixels(int x, int y, int w, int h, float[] pixels, ProgressMonitor pm) throws IOException
      Retrieves an array of tie point data interpolated to the product with and height as float array. If the given array is null a new one was created and returned. *
      Specified by:
      readPixels in class RasterDataNode
      Parameters:
      x - the x coordinate of the array to be read
      y - the y coordinate of the array to be read
      w - the width of the array to be read
      h - the height of the array to be read
      pixels - the float array to be filled with data
      pm - a monitor to inform the user about progress
      Returns:
      the pixels read
      Throws:
      IllegalArgumentException - if the length of the given array is less than w*h.
      IOException
    • readPixels

      public double[] readPixels(int x, int y, int w, int h, double[] pixels, ProgressMonitor pm) throws IOException
      Retrieves an array of tie point data interpolated to the product with and height as double array. If the given array is null a new one was created and returned.
      Specified by:
      readPixels in class RasterDataNode
      Parameters:
      x - the x coordinate of the array to be read
      y - the y coordinate of the array to be read
      w - the width of the array to be read
      h - the height of the array to be read
      pixels - the double array to be filled with data
      pm - a monitor to inform the user about progress
      Returns:
      the pixels read
      Throws:
      IllegalArgumentException - if the length of the given array is less than w*h.
      IOException
    • writePixels

      public void writePixels(int x, int y, int w, int h, int[] pixels, ProgressMonitor pm) throws IOException
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      writePixels in class RasterDataNode
      Parameters:
      x - x offset into the band
      y - y offset into the band
      w - width of the pixel array to be written
      h - height of the pixel array to be written
      pixels - array of pixels to write
      pm - a progress monitor
      Throws:
      IOException - if an I/O error occurs
    • writePixels

      public void writePixels(int x, int y, int w, int h, float[] pixels, ProgressMonitor pm) throws IOException
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      writePixels in class RasterDataNode
      Parameters:
      x - x offset into the band
      y - y offset into the band
      w - width of the pixel array to be written
      h - height of the pixel array to be written
      pixels - array of pixels to write
      pm - a progress monitor
      Throws:
      IOException - if an I/O error occurs
    • writePixels

      public void writePixels(int x, int y, int w, int h, double[] pixels, ProgressMonitor pm) throws IOException
      This method is not implemented because pixels are read-only in tie-point grids.
      Specified by:
      writePixels in class RasterDataNode
      Parameters:
      x - x offset into the band
      y - y offset into the band
      w - width of the pixel array to be written
      h - height of the pixel array to be written
      pixels - array of pixels to write
      pm - a progress monitor
      Throws:
      IOException - if an I/O error occurs
    • readRasterData

      public void readRasterData(int offsetX, int offsetY, int width, int height, ProductData rasterData, ProgressMonitor pm) throws IOException
      Reads raster data from this dataset into the user-supplied raster data buffer.

      This method always directly (re-)reads this tie-point grid's data from its associated data source into the given data buffer.

      Specified by:
      readRasterData in class RasterDataNode
      Parameters:
      offsetX - the X-offset in the raster co-ordinates where reading starts
      offsetY - the Y-offset in the raster co-ordinates where reading starts
      width - the width of the raster data buffer
      height - the height of the raster data buffer
      rasterData - a raster data buffer receiving the pixels to be read
      pm - a monitor to inform the user about progress
      Throws:
      IOException - if an I/O error occurs
      IllegalArgumentException - if the raster is null
      IllegalStateException - if this product raster was not added to a product so far, or if the product to which this product raster belongs to, has no associated product reader
      See Also:
    • readRasterDataFully

      public void readRasterDataFully(ProgressMonitor pm) throws IOException
      Reads the complete underlying raster data.

      After this method has been called successfully, hasRasterData() should always return true and getRasterData() should always return a valid ProductData instance with at least getRasterWidth()*getRasterHeight() elements (samples).

      In opposite to the loadRasterData method, the readRasterDataFully method always reloads the data of this product raster, independently of whether its has already been loaded or not.

      Specified by:
      readRasterDataFully in class RasterDataNode
      Parameters:
      pm - a monitor to inform the user about progress
      Throws:
      IOException - if an I/O error occurs
      See Also:
    • writeRasterData

      public void writeRasterData(int offsetX, int offsetY, int width, int height, ProductData rasterData, ProgressMonitor pm) throws IOException
      Writes data from this product raster into the specified region of the user-supplied raster.

      It is important to know that this method does not change this product raster's internal state nor does it write into this product raster's internal raster.

      Specified by:
      writeRasterData in class RasterDataNode
      Parameters:
      offsetX - the X-offset in raster co-ordinates where reading starts
      offsetY - the Y-offset in raster co-ordinates where reading starts
      width - the width of the raster data buffer
      height - the height of the raster data buffer
      rasterData - a raster data buffer receiving the pixels to be read
      pm - a monitor to inform the user about progress
      Throws:
      IOException - if an I/O error occurs
      See Also:
    • writeRasterDataFully

      public void writeRasterDataFully(ProgressMonitor pm) throws IOException
      Writes the complete underlying raster data.
      Specified by:
      writeRasterDataFully in class RasterDataNode
      Parameters:
      pm - a monitor to inform the user about progress
      Throws:
      IOException - if an I/O error occurs
    • createSourceImage

      protected RenderedImage createSourceImage()
      Description copied from class: RasterDataNode
      Creates the source image associated with this RasterDataNode. This shall preferably be a MultiLevelImage instance which recognises this raster data node's imageToModelTransform property, if set.
      Specified by:
      createSourceImage in class RasterDataNode
      Returns:
      A new source image instance.
    • acceptVisitor

      public void acceptVisitor(ProductVisitor visitor)
      Accepts the given visitor. This method implements the well known 'Visitor' design pattern of the gang-of-four. The visitor pattern allows to define new operations on the product data model without the need to add more code to it. The new operation is implemented by the visitor.

      The method simply calls visitor.visit(this).

      Specified by:
      acceptVisitor in class RasterDataNode
      Parameters:
      visitor - the visitor
    • cloneTiePointGrid

      public TiePointGrid cloneTiePointGrid()
    • createZenithFromElevationAngleTiePointGrid

      public static TiePointGrid createZenithFromElevationAngleTiePointGrid(TiePointGrid elevationAngleGrid)
    • ensureMinLengthArray

      protected static int[] ensureMinLengthArray(int[] array, int length)
    • ensureMinLengthArray

      protected static float[] ensureMinLengthArray(float[] array, int length)
    • ensureMinLengthArray

      protected static double[] ensureMinLengthArray(double[] array, int length)
    • createSubset

      public static TiePointGrid createSubset(TiePointGrid sourceTiePointGrid, ProductSubsetDef subsetDef)