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); }
/** * Get Earth radius (in m) for given pixel. * * @param x The x coordinate of the given pixel. * @param y The y coordinate of the given pixel. * @return The earth radius. */ private double getEarthRadius(final int x, final int y) { // use linear rather than quadratic interpolation for subset because quadratic interpolation // does not give accurate result in this case int i = (int) ((latMax - latitude.getPixelDouble(x, y)) / delLat + 0.5); if (i < 0) { i = 0; } else if (i >= earthRadius.length) { i = earthRadius.length - 1; } return earthRadius[i]; }
private boolean isNearRangeOnLeft(final Product product) { TiePointGrid incidenceAngle = OperatorUtils.getIncidenceAngle(product); if (incidenceAngle != null) { final double incidenceAngleToFirstPixel = incidenceAngle.getPixelDouble(0, 0); final double incidenceAngleToLastPixel = incidenceAngle.getPixelDouble(currentWindow.pixhi - 1, 0); return (incidenceAngleToFirstPixel < incidenceAngleToLastPixel); } return true; }
public double applyRetroCalibration(int x, int y, double v, String bandPolar, final Unit.UnitType bandUnit, int[] subSwathIndex) { if (incidenceAngleSelection.contains(USE_INCIDENCE_ANGLE_FROM_DEM)) { return v / FastMath.sin(incidenceAngle.getPixelDouble(x, y) * Constants.DTOR); } else { // USE_INCIDENCE_ANGLE_FROM_ELLIPSOID return v; } }
public double applyRetroCalibration(int x, int y, double v, String bandPolar, final Unit.UnitType bandUnit, int[] subSwathIndex) { if (incidenceAngleSelection.contains(USE_INCIDENCE_ANGLE_FROM_DEM)) { return v / FastMath.sin(incidenceAngle.getPixelDouble(x, y) * Constants.DTOR); } else { // USE_INCIDENCE_ANGLE_FROM_ELLIPSOID return v; } }
public double applyRetroCalibration(int x, int y, double v, String bandPolar, final Unit.UnitType bandUnit, int[] subSwathIndex) { if (incidenceAngleSelection.contains(USE_INCIDENCE_ANGLE_FROM_DEM)) { return v / FastMath.sin(incidenceAngle.getPixelDouble(x, y) * Constants.DTOR); } else { // USE_INCIDENCE_ANGLE_FROM_ELLIPSOID return v; } }
public double applyRetroCalibration(int x, int y, double v, String bandPolar, final Unit.UnitType bandUnit, int[] subSwathIndex) { if (incidenceAngleSelection.contains(USE_INCIDENCE_ANGLE_FROM_DEM)) { return v / FastMath.sin(incidenceAngle.getPixelDouble(x, y) * Constants.DTOR); } else { // USE_INCIDENCE_ANGLE_FROM_ELLIPSOID return v; } }
private static void setLatLongMetadata(Product product, TiePointGrid latGrid, TiePointGrid lonGrid) { final MetadataElement absRoot = AbstractMetadata.getAbstractedMetadata(product); final int w = product.getSceneRasterWidth(); final int h = product.getSceneRasterHeight(); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_lat, latGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_long, lonGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_lat, latGrid.getPixelDouble(w - 1, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_long, lonGrid.getPixelDouble(w - 1, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_lat, latGrid.getPixelDouble(0, h - 1)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_long, lonGrid.getPixelDouble(0, h - 1)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_lat, latGrid.getPixelDouble(w - 1, h - 1)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_long, lonGrid.getPixelDouble(w - 1, h - 1)); }
private static void setLatLongMetadata(Product product, TiePointGrid latGrid, TiePointGrid lonGrid) { final MetadataElement absRoot = AbstractMetadata.getAbstractedMetadata(product); final int w = product.getSceneRasterWidth(); final int h = product.getSceneRasterHeight(); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_lat, latGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_long, lonGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_lat, latGrid.getPixelDouble(w - 1, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_long, lonGrid.getPixelDouble(w - 1, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_lat, latGrid.getPixelDouble(0, h - 1)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_long, lonGrid.getPixelDouble(0, h - 1)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_lat, latGrid.getPixelDouble(w - 1, h - 1)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_long, lonGrid.getPixelDouble(w - 1, h - 1)); }
private static void setLatLongMetadata(Product product, TiePointGrid latGrid, TiePointGrid lonGrid) { final MetadataElement absRoot = AbstractMetadata.getAbstractedMetadata(product); final int w = product.getSceneRasterWidth(); final int h = product.getSceneRasterHeight(); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_lat, latGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_long, lonGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_lat, latGrid.getPixelDouble(w, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_long, lonGrid.getPixelDouble(w, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_lat, latGrid.getPixelDouble(0, h)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_long, lonGrid.getPixelDouble(0, h)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_lat, latGrid.getPixelDouble(w, h)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_long, lonGrid.getPixelDouble(w, h)); }
private static void setLatLongMetadata(Product product, TiePointGrid latGrid, TiePointGrid lonGrid) { final MetadataElement absRoot = AbstractMetadata.getAbstractedMetadata(product); final int w = product.getSceneRasterWidth(); final int h = product.getSceneRasterHeight(); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_lat, latGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_near_long, lonGrid.getPixelDouble(0, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_lat, latGrid.getPixelDouble(w, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.first_far_long, lonGrid.getPixelDouble(w, 0)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_lat, latGrid.getPixelDouble(0, h)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_near_long, lonGrid.getPixelDouble(0, h)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_lat, latGrid.getPixelDouble(w, h)); AbstractMetadata.setAttribute(absRoot, AbstractMetadata.last_far_long, lonGrid.getPixelDouble(w, h)); }
/** * Compute noise for the whole range lines corresponding to the noise records for all polarizations. */ private void computeNoiseForRangeLines() { Set<Map.Entry<String, NoiseRecord[]>> set = noiseRecord.entrySet(); for (Map.Entry<String, NoiseRecord[]> elem : set) { final String pol = elem.getKey(); final NoiseRecord[] record = elem.getValue(); final int numOfNoiseRecords = record.length; double[][] noise = new double[numOfNoiseRecords][sourceImageWidth]; int[] index = new int[numOfNoiseRecords]; for (int i = 0; i < numOfNoiseRecords; ++i) { index[i] = (int) ((record[i].timeUTC - firstLineUTC) / lineTimeInterval + 0.5); for (int j = 0; j < sourceImageWidth; ++j) { final double slantRgTime = slantRangeTime.getPixelDouble(j, index[i]) / 1.0e9; // ns to s if (slantRgTime >= record[i].validityRangeMin && slantRgTime <= record[i].validityRangeMax) { noise[i][j] = Maths.computePolynomialValue( slantRgTime - record[i].referencePoint, record[i].coefficient); } else { noise[i][j] = 0.0; } } } rangeLineIndex.put(pol, index); rangeLineNoise.put(pol, noise); } }
private double getElevation(final int x, final int y) throws Exception { final GeoPos geoPos = new GeoPos(); double alt; geoPos.setLocation(latitudeTPG.getPixelDouble(x, y), longitudeTPG.getPixelDouble(x, y)); if (externalDEMFile == null) { alt = dem.getElevation(geoPos); } else { alt = fileElevationModel.getElevation(geoPos); } return alt; }
/** * Get incidence angle at centre range pixel (in radian). * * @return The incidence angle. * @throws OperatorException The exceptions. */ private double getIncidenceAngleAtCentreRangePixel() throws OperatorException { final int x = sourceImageWidth / 2; final int y = sourceImageHeight / 2; final TiePointGrid incidenceAngle = OperatorUtils.getIncidenceAngle(sourceProduct); if (incidenceAngle == null) { throw new OperatorException("incidence_angle tie point grid not found in product"); } return incidenceAngle.getPixelDouble(x, y) * Constants.DTOR; }
private synchronized void computeLookAngles() { double[] senPos = new double[3]; getSensorPosition(firstLineUTC, senPos); final double ht = Math.sqrt(senPos[0] * senPos[0] + senPos[1] * senPos[1] + senPos[2] * senPos[2]); // satelliteHeight final double er = computeEarthRadius(senPos[2], ht); // earthRadius lookAngles = new double[sourceImageWidth]; for (int x = 0; x < sourceImageWidth; x++) { final double sr = slantRangeTimeTPG.getPixelDouble(x, 0) / Constants.oneBillion * Constants.halfLightSpeed; lookAngles[x] = FastMath.acos((sr * sr + ht * ht - er * er) / (2.0 * sr * ht)); } }
private GeoPoint computeLatLon(final int x, final int y) throws Exception { final double[] ell = new double[3]; ell[0] = latitudeTPG.getPixelDouble(x, y) * Constants.DTOR; ell[1] = longitudeTPG.getPixelDouble(x, y) * Constants.DTOR; ell[2] = 0; Point posPixSrc = targetOrbit.ell2lp(ell, sourceMeta); Point posXYZSrc = targetOrbit.lp2xyz(posPixSrc, sourceMeta); Point posPixTgt = targetOrbit.xyz2lp(posXYZSrc, targetMeta); double[] posGeoTgt = targetOrbit.lp2ell(posPixTgt, targetMeta); return new GeoPoint(posGeoTgt[0] * Constants.RTOD, posGeoTgt[1] * Constants.RTOD); }
/** * Get incidence angle at centre range pixel (in radian). * * @param srcProduct The source product. * @return The incidence angle. * @throws OperatorException The exceptions. */ private static double getIncidenceAngleAtCentreRangePixel(final Product srcProduct) throws OperatorException { final int sourceImageWidth = srcProduct.getSceneRasterWidth(); final int sourceImageHeight = srcProduct.getSceneRasterHeight(); final int x = sourceImageWidth / 2; final int y = sourceImageHeight / 2; final TiePointGrid incidenceAngle = OperatorUtils.getIncidenceAngle(srcProduct); if (incidenceAngle == null) { throw new OperatorException("incidence_angle tie point grid not found in product"); } return incidenceAngle.getPixelDouble(x, y) * Constants.DTOR; }
return tpg.getPixelDouble(x, y);
for (int x = 0; x < sourceImageWidth; x++) { final double alpha = incidenceAngleTiePointGrid.getPixelDouble(x + 0.5, y + 0.5) * Constants.DTOR; // in radian final double time = slantRangeTimeTiePointGrid.getPixelDouble(x + 0.5, y + 0.5) / Constants.oneBillion; //convert ns to s final double r = time * Constants.halfLightSpeed; // in m final double theta = alpha - FastMath.asin(FastMath.sin(alpha) * r / rSat); // in radian
public static void getDerivedParameters(Product srcProduct, DerivedParams param) throws Exception { final MetadataElement abs = AbstractMetadata.getAbstractedMetadata(srcProduct); double rangeSpacing = abs.getAttributeDouble(AbstractMetadata.range_spacing, 1); double azimuthSpacing = abs.getAttributeDouble(AbstractMetadata.azimuth_spacing, 1); final boolean srgrFlag = AbstractMetadata.getAttributeBoolean(abs, AbstractMetadata.srgr_flag); double groundRangeSpacing = rangeSpacing; if (rangeSpacing == AbstractMetadata.NO_METADATA) { azimuthSpacing = 1; groundRangeSpacing = 1; } else if (!srgrFlag) { final TiePointGrid incidenceAngle = OperatorUtils.getIncidenceAngle(srcProduct); if (incidenceAngle != null) { final int sourceImageWidth = srcProduct.getSceneRasterWidth(); final int sourceImageHeight = srcProduct.getSceneRasterHeight(); final int x = sourceImageWidth / 2; final int y = sourceImageHeight / 2; final double incidenceAngleAtCentreRangePixel = incidenceAngle.getPixelDouble(x, y); groundRangeSpacing /= FastMath.sin(incidenceAngleAtCentreRangePixel * Constants.DTOR); } } final double cohWinAz = param.cohWinRg * groundRangeSpacing / azimuthSpacing; if (cohWinAz < 1.0) { param.cohWinAz = 2; param.cohWinRg = (int) Math.round(azimuthSpacing / groundRangeSpacing); } else { param.cohWinAz = (int) Math.round(cohWinAz); } }