Esempio n. 1
0
  public void computeLatLonBandData(
      int height,
      int width,
      Band latBand,
      Band lonBand,
      final float[] latRawData,
      final float[] lonRawData,
      final int[] colPoints) {

    float[] latFloats = new float[height * width];
    float[] lonFloats = new float[height * width];
    final int rawWidth = colPoints.length;

    int colPointIdx = 0;
    int p1 = colPoints[colPointIdx] - 1;
    int p2 = colPoints[++colPointIdx] - 1;

    for (int x = 0; x < width; x++) {
      if (x == p2 && colPointIdx < rawWidth - 1) {
        p1 = p2;
        p2 = colPoints[++colPointIdx] - 1;
      }
      final int steps = p2 - p1;
      final double step = 1.0 / steps;
      final double weight = step * (x - p1);
      for (int y = 0; y < height; y++) {
        final int rawPos2 = y * rawWidth + colPointIdx;
        final int rawPos1 = rawPos2 - 1;
        final int pos = y * width + x;
        latFloats[pos] = computeGeoPixel(latRawData[rawPos1], latRawData[rawPos2], weight);
        lonFloats[pos] = computeGeoPixel(lonRawData[rawPos1], lonRawData[rawPos2], weight);
      }
    }

    latBand.setDataElems(latFloats);
    lonBand.setDataElems(lonFloats);
  }
  public static Product createDummySourceProduct(int width, int height) {
    Product product = new Product("dummy", "dummy", width, height);
    Band b = product.addBand("b1", ProductData.TYPE_FLOAT32);

    float[] bData = new float[width * height];
    for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
        bData[i * width + j] = 1.0f;
      }
    }
    b.setDataElems(bData);

    product.setPreferredTileSize(product.getSceneRasterWidth(), 45);

    return product;
  }
Esempio n. 3
0
  // Don't do this...it hurts.  Too much of a memory hog...
  private void addBandsBinMap(Product product) throws IOException, InvalidRangeException {
    String[] bandList = product.getBandNames();
    if (rowInfo == null) {
      rowInfo = createRowInfos();
    }

    final int height = sceneHeight;
    final int width = sceneWidth;
    final ISINGrid grid = this.grid;

    // loop over lines
    try {
      int[] lineOffsets = new int[1];
      int[] lineLengths = new int[1];
      int[] stride = new int[1];
      stride[0] = 1;

      //            for (int y = sourceOffsetY; y < sourceOffsetY + sourceHeight; y++) {
      for (String name : bandList) {
        if (name.endsWith("mean") || name.endsWith("stdev")) continue;
        Band band = product.getBand(name);
        ProductData buffer;
        final Variable variable = variableMap.get(band);
        DataType prodtype = variable.getDataType();
        float[] fbuffer = new float[width * height];
        short[] sbuffer = new short[width * height];
        int[] ibuffer = new int[width * height];
        byte[] bbuffer = new byte[width * height];

        if (prodtype == DataType.FLOAT) {
          Arrays.fill(fbuffer, Float.NaN);
          buffer = ProductData.createInstance(fbuffer);
        } else if (prodtype == DataType.SHORT) {
          Arrays.fill(sbuffer, (short) -999);
          buffer = ProductData.createInstance(sbuffer);
        } else if (prodtype == DataType.BYTE) {
          Arrays.fill(bbuffer, (byte) 255);
          buffer = ProductData.createInstance(bbuffer);
        } else {
          Arrays.fill(ibuffer, -999);
          buffer = ProductData.createInstance(ibuffer);
        }

        for (int y = 0; y < height; y++) {

          final int rowIndex = (height - 1) - y;
          final RowInfo rowInfo = this.rowInfo[rowIndex];
          if (rowInfo != null) {
            final Array bindata;

            final int lineOffset = rowInfo.offset;
            final int lineLength = rowInfo.length;

            lineOffsets[0] = lineOffset;
            lineLengths[0] = lineLength;

            synchronized (ncFile) {
              bindata =
                  variable
                      .read()
                      .section(lineOffsets, lineLengths, stride); // .copyTo1DJavaArray();
            }
            int lineIndex0 = 0;
            for (int x = 0; x < width; x++) {
              final double lon = x * 360.0 / width;
              final int binIndex = grid.getBinIndex(rowIndex, lon);
              int lineIndex = -1;
              for (int i = lineIndex0; i < lineLength; i++) {
                int binidx = bins[lineOffset + i];
                if (binidx >= binIndex) {
                  if (binidx == binIndex) {
                    lineIndex = i;
                  }
                  lineIndex0 = i;
                  break;
                }
              }

              if (lineIndex >= 0) {
                final int rasterIndex = width * y + x;
                final Array elem;
                elem = Array.factory(bindata.copyTo1DJavaArray());
                for (int i = 0; i < elem.getSize(); i++) {
                  if (prodtype == DataType.FLOAT) {

                    buffer.setElemFloatAt(rasterIndex, elem.getFloat(i));
                  } else {
                    buffer.setElemIntAt(rasterIndex, elem.getInt(i));
                  }
                  //                                System.arraycopy(bindata, lineIndex, buffer,
                  // rasterIndex, 1);
                }
              }
            }
          }
        }
        band.setDataElems(buffer);
      }
    } catch (IOException e) {
      throw new IOException("Could not map product " + product.getName(), e);
    }
  }