sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] branch geoapi-4.0 updated: Provides a default accuracy value when no accuracy is explicitly given in a NTv2 file. https://issues.apache.org/jira/browse/SIS-432
Date Sat, 13 Oct 2018 21:22:23 GMT
This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new c50df4d  Provides a default accuracy value when no accuracy is explicitly given in
a NTv2 file. https://issues.apache.org/jira/browse/SIS-432
c50df4d is described below

commit c50df4d283ff23c7f9ad907b7452ecfeba7da8be
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Sat Oct 13 23:15:37 2018 +0200

    Provides a default accuracy value when no accuracy is explicitly given in a NTv2 file.
    https://issues.apache.org/jira/browse/SIS-432
---
 .../referencing/provider/DatumShiftGridFile.java   |  6 ++--
 .../provider/FranceGeocentricInterpolation.java    |  2 +-
 .../sis/internal/referencing/provider/NTv2.java    | 39 +++++++++++++++++-----
 .../operation/builder/LocalizationGridBuilder.java | 14 +++++---
 .../operation/builder/ResidualGrid.java            |  4 ++-
 5 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridFile.java
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridFile.java
index 7cc2603..cf1439d 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridFile.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/DatumShiftGridFile.java
@@ -104,6 +104,7 @@ public abstract class DatumShiftGridFile<C extends Quantity<C>,
T extends Quanti
 
     /**
      * The best translation accuracy that we can expect from this file.
+     * The unit of measurement depends on {@link #isCellValueRatio()}.
      *
      * <p>This field is initialized to {@link Double#NaN}. It is loader responsibility
      * to assign a value to this field after {@code DatumShiftGridFile} construction.</p>
@@ -235,13 +236,14 @@ public abstract class DatumShiftGridFile<C extends Quantity<C>,
T extends Quanti
 
     /**
      * Suggests a precision for the translation values in this grid.
-     * The default implementation returns a value smaller than the accuracy.
+     * This information is used for deciding when to stop iterations in inverse transformations.
+     * The default implementation returns the {@linkplain #accuracy} divided by an arbitrary
value.
      *
      * @return a precision for the translation values in this grid.
      */
     @Override
     public double getCellPrecision() {
-        return accuracy / 10;   // Division by 10 is arbitrary.
+        return accuracy / 10;               // Division by 10 is arbitrary.
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
index 7f7d8f3..347c78e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/FranceGeocentricInterpolation.java
@@ -475,7 +475,7 @@ public class FranceGeocentricInterpolation extends GeodeticOperation {
             tX[p] = -parseFloat(t.nextToken());     // See javadoc for the reason why we
reverse the sign.
             tY[p] = -parseFloat(t.nextToken());
             tZ[p] = -parseFloat(t.nextToken());
-            final double accuracy = ACCURACY[Math.min(ACCURACY.length-1,
+            final double accuracy = ACCURACY[Math.min(ACCURACY.length - 1,
                     Math.max(0, Integer.parseInt(t.nextToken()) - 1))];
             if (!(accuracy >= grid.accuracy)) {     // Use '!' for replacing the initial
NaN.
                 grid.accuracy = accuracy;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NTv2.java
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NTv2.java
index e87f2fc..baf0c4c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NTv2.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/NTv2.java
@@ -60,7 +60,7 @@ import org.apache.sis.measure.Units;
  *
  * @author  Simon Reynard (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.7
  * @module
  */
@@ -277,7 +277,8 @@ public final class NTv2 extends AbstractProvider {
          * Current SIS implementation does not yet handle the above-cited hierarchy of grids.
          * For now we just take the first one.
          *
-         * <p>NTv2 grids contain also information about shifts accuracy. This is not
yet handled by SIS.</p>
+         * <p>NTv2 grids contain also information about shifts accuracy. This is not
yet handled by SIS,
+         * except for determining an approximate grid cell resolution.</p>
          */
         final DatumShiftGridFile<Angle,Angle> readGrid() throws IOException, FactoryException,
NoninvertibleTransformException {
             if (--remainingGrids < 0) {
@@ -321,12 +322,12 @@ public final class NTv2 extends AbstractProvider {
                 throw new FactoryException(Errors.format(Errors.Keys.UnexpectedValueInElement_2,
"GS_COUNT", declared));
             }
             /*
-             * Construct the grid with the sign of longitude values reversed, in order to
have longitude values
-             * increasing toward East. We set isCellValueRatio = true (by the arguments given
to the constructor)
-             * because this is required by our InterpolatedTransform implementation. This
setting implies that we
-             * divide translation values by dx or dy at reading time. Note that this free
us from reversing the
-             * sign of longitude translations; instead, this reversal will be handled by
grid.coordinateToGrid
-             * MathTransform and its inverse.
+             * Construct the grid. The sign of longitude translations will need to be reversed
in order to have
+             * longitudes increasing toward East. We set isCellValueRatio = true (by the
arguments given to the
+             * DatumShiftGridFile constructor) because this is required by InterpolatedTransform
implementation.
+             * This setting implies that we divide translation values by dx or dy at reading
time. Note that this
+             * free us from reversing the sign of longitude translations in the code below;
instead, this reversal
+             * will be handled by grid.coordinateToGrid MathTransform and its inverse.
              */
             final DatumShiftGridFile.Float<Angle,Angle> grid = new DatumShiftGridFile.Float<>(2,
                     unit, unit, true, -xmin, ymin, -dx, dy, width, height, PARAMETERS, file);
@@ -338,9 +339,29 @@ public final class NTv2 extends AbstractProvider {
                 tx[i] = (float) (buffer.getFloat() / dx);
                 final double accuracy = Math.min(buffer.getFloat() / dy, buffer.getFloat()
/ dx);
                 if (accuracy > 0 && !(accuracy >= grid.accuracy)) {   // Use
'!' for replacing the initial NaN.
-                    grid.accuracy = accuracy;
+                    grid.accuracy = accuracy;                         // Smallest non-zero
accuracy.
                 }
             }
+            /*
+             * We need an estimation of translation accuracy, in order to decide when to
stop iterations
+             * during inverse transformations. If we did not found that information in the
file, compute
+             * an arbitrary default accuracy derived from the variations found in actual
values.
+             */
+            if (Double.isNaN(grid.accuracy)) {
+                double txmin = Double.POSITIVE_INFINITY;
+                double txmax = Double.NEGATIVE_INFINITY;
+                double tymin = Double.POSITIVE_INFINITY;
+                double tymax = Double.NEGATIVE_INFINITY;
+                for (int i=Math.min(tx.length, ty.length); --i >= 0;) {
+                    double x = tx[i];
+                    double y = ty[i];
+                    if (x < txmin) txmin = x;
+                    if (x > txmax) txmax = x;
+                    if (y < tymin) tymin = y;
+                    if (y > tymax) tymax = y;
+                }
+                grid.accuracy = Math.min(txmax - txmin, tymax - tymin) / 1000;
+            }
             header.keySet().retainAll(Arrays.asList(overviewKeys));   // Keep only overview
records.
             return DatumShiftGridCompressed.compress(grid, null, precision / Math.max(dx,
dy));
         }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
index 7fc6e80..6b15576 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java
@@ -96,12 +96,17 @@ public class LocalizationGridBuilder extends TransformBuilder {
 
     /**
      * The desired precision of inverse transformations in unit of source coordinates, or
0 in unspecified.
-     * If no {@link #sourceToGrid} transform has been specified, than this is in unit of
grid cell.
+     * If no {@link #sourceToGrid} transform has been specified, then this is in unit of
grid cells
+     * (i.e. a value of 1 is the size of one grid cell).
+     *
+     * @see #setDesiredPrecision(double)
      */
     private double precision;
 
     /**
-     * Arbitrary default {@link #precision} value. May change in any future SIS version.
+     * Arbitrary default {@link #precision} value, in unit of grid cells. Used if no explicit
inverse transform
+     * precision has been specified. The {@code sourceToGrid} transform shall not be applied
on this value.
+     * This default precision may change in any future SIS version.
      */
     static final double DEFAULT_PRECISION = 1E-7;
 
@@ -246,7 +251,8 @@ public class LocalizationGridBuilder extends TransformBuilder {
     /**
      * Sets the desired precision of <em>inverse</em> transformations, in units
of source coordinates.
      * If a conversion from "real world" to grid coordinates {@linkplain #setSourceToGrid
has been specified},
-     * then the given precision is in "real world" units. Otherwise the precision is in units
of grid cells.
+     * then the given precision is in "real world" units. Otherwise the precision is in units
of grid cells
+     * (i.e. a value of 1 is the size of one grid cell).
      *
      * <div class="note"><b>Note:</b>
      * there is no method for setting the desired target precision because forward transformations
<em>precision</em>
@@ -433,7 +439,7 @@ public class LocalizationGridBuilder extends TransformBuilder {
         boolean isLinear = true;
         for (final double c : linear.correlation()) {
             isExact &= (c == 1);
-            if (c < 0.9999) {                               // Empirical threshold (may
need to be revisited).
+            if (!(c >= 0.9999)) {                           // Empirical threshold (may
need to be revisited).
                 isLinear = false;
                 break;
             }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
index f9e222b..7d99315 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java
@@ -73,6 +73,7 @@ final class ResidualGrid extends DatumShiftGridFile<Dimensionless,Dimensionless>
      * @param gridToTarget  conversion from grid coordinates to the final "real world" coordinates.
      * @param numDim        number of dimension of target coordinates.
      * @param residuals     the residual data, as translations to apply on the result of
affine transform.
+     * @param precision     desired precision of inverse transformations in unit of grid
cells.
      */
     ResidualGrid(final LinearTransform sourceToGrid, final LinearTransform gridToTarget,
             final int nx, final int ny, final int numDim, final double[] residuals, final
double precision)
@@ -131,7 +132,8 @@ final class ResidualGrid extends DatumShiftGridFile<Dimensionless,Dimensionless>
 
     /**
      * Returns the desired precision in iterative calculation performed by inverse transform.
-     * The returned value is in unit of grid cell.
+     * The returned value is in unit of grid cell, i.e. a value of 1 is the size of one cell.
+     * This unit of measurement is fixed by {@link #isCellValueRatio()} = {@code true}.
      */
     @Override
     public double getCellPrecision() {


Mime
View raw message