Author: desruisseaux
Date: Tue Dec 18 08:22:43 2012
New Revision: 1423316

URL: http://svn.apache.org/viewvc?rev=1423316&view=rev
Log:
Formats the points and envelopes as 'float' numbers when the ordinate seems to 
only have simple precision.
This avoid the printing decimal digits having no real signification (e.g. 
"0.3333333432674408" instead of "0.33333334").
Note that this approach is not strictly correct since parsing such values in 
double precision will not produce exactly
the same result. We should put a warning in the 'toString()' method with a link 
to a method providing control on this
behavior (to be comitted later in the Envelopes utility class).

Modified:
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition1D.java
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
    
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
    
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
    
sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/math/MathFunctionsTest.java

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractDirectPosition.java
 Tue Dec 18 08:22:43 2012
@@ -176,15 +176,39 @@ public abstract class AbstractDirectPosi
      */
     @Override
     public String toString() {
-        final StringBuilder buffer = new StringBuilder(32).append("POINT(");
-        final int dimension = getDimension();
-        for (int i=0; i<dimension; i++) {
-            if (i != 0) {
-                buffer.append(' ');
+        return toString(this, false);
+    }
+
+    /**
+     * Implementation of the public {@link #toString()} and {@link 
Envelope2D#toString()} methods
+     * for formatting a {@code POINT} element from a direct position in 
<cite>Well Known Text</cite>
+     * (WKT) format.
+     *
+     * @param  position The position to format.
+     * @param  isSimplePrecision {@code true} if every ordinate values can be 
casted to {@code float}.
+     * @return The point as a {@code POINT} in WKT format.
+     */
+    static String toString(final DirectPosition position, final boolean 
isSimplePrecision) {
+        final StringBuilder buffer = new StringBuilder(32).append("POINT");
+        final int dimension = position.getDimension();
+        if (dimension == 0) {
+            buffer.append("()");
+        } else {
+            char separator = '(';
+            for (int i=0; i<dimension; i++) {
+                buffer.append(separator);
+                final double ordinate = position.getOrdinate(i);
+                if (isSimplePrecision) {
+                    buffer.append((float) ordinate);
+                } else {
+                    buffer.append(ordinate);
+                }
+                trimFractionalPart(buffer);
+                separator = ' ';
             }
-            trimFractionalPart(buffer.append(getOrdinate(i)));
+            buffer.append(')');
         }
-        return buffer.append(')').toString();
+        return buffer.toString();
     }
 
     /**

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
 Tue Dec 18 08:22:43 2012
@@ -914,7 +914,7 @@ public abstract class AbstractEnvelope i
      */
     @Override
     public String toString() {
-        return toString(this);
+        return toString(this, false);
     }
 
     /**
@@ -922,28 +922,37 @@ public abstract class AbstractEnvelope i
      * for formatting a {@code BOX} element from an envelope in <cite>Well 
Known Text</cite> (WKT) format.
      *
      * @param  envelope The envelope to format.
+     * @param  isSimplePrecision {@code true} if every lower and upper corner 
values can be casted to {@code float}.
      * @return The envelope as a {@code BOX2D} or {@code BOX3D} (most typical 
dimensions) in WKT format.
      *
      * @see GeneralEnvelope#GeneralEnvelope(String)
      * @see org.apache.sis.measure.CoordinateFormat
      * @see org.apache.sis.io.wkt
      */
-    static String toString(final Envelope envelope) {
-        final int            dimension   = envelope.getDimension();
-        final DirectPosition lowerCorner = envelope.getLowerCorner();
-        final DirectPosition upperCorner = envelope.getUpperCorner();
-        final StringBuilder  buffer = new 
StringBuilder(64).append("BOX").append(dimension).append("D(");
-        for (int i=0; i<dimension; i++) {
-            if (i != 0) {
-                buffer.append(' ');
-            }
-            trimFractionalPart(buffer.append(lowerCorner.getOrdinate(i)));
-        }
-        buffer.append(',');
-        for (int i=0; i<dimension; i++) {
-            trimFractionalPart(buffer.append(' 
').append(upperCorner.getOrdinate(i)));
+    static String toString(final Envelope envelope, final boolean 
isSimplePrecision) {
+        final int dimension = envelope.getDimension();
+        final StringBuilder buffer = new 
StringBuilder(64).append("BOX").append(dimension).append('D');
+        if (dimension == 0) {
+            buffer.append("()");
+        } else {
+            final DirectPosition lowerCorner = envelope.getLowerCorner();
+            final DirectPosition upperCorner = envelope.getUpperCorner();
+            boolean isUpper = false;
+            do { // Executed exactly twice.
+                for (int i=0; i<dimension; i++) {
+                    buffer.append(i == 0 && !isUpper ? '(' : ' ');
+                    final double ordinate = (isUpper ? upperCorner : 
lowerCorner).getOrdinate(i);
+                    if (isSimplePrecision) {
+                        buffer.append((float) ordinate);
+                    } else {
+                        buffer.append(ordinate);
+                    }
+                    trimFractionalPart(buffer);
+                }
+                buffer.append(isUpper ? ')' : ',');
+            } while ((isUpper = !isUpper) == true);
         }
-        return buffer.append(')').toString();
+        return buffer.toString();
     }
 
     /**

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
 Tue Dec 18 08:22:43 2012
@@ -38,6 +38,7 @@ import org.apache.sis.referencing.CRS;
 import static org.apache.sis.util.Arrays.resize;
 import static org.apache.sis.util.ArgumentChecks.*;
 import static org.apache.sis.math.MathFunctions.isNegative;
+import static org.apache.sis.math.MathFunctions.isSimplePrecision;
 import static org.apache.sis.internal.referencing.Utilities.isPoleToPole;
 
 // Related to JDK7
@@ -474,4 +475,12 @@ scanNumber: while ((i += Character.charC
         }
         return false;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return toString(this, isSimplePrecision(ordinates));
+    }
 }

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition1D.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition1D.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition1D.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition1D.java
 Tue Dec 18 08:22:43 2012
@@ -27,6 +27,8 @@ import org.opengis.geometry.DirectPositi
 import org.opengis.geometry.MismatchedDimensionException;
 import org.apache.sis.util.resources.Errors;
 
+import static org.apache.sis.math.MathFunctions.isSimplePrecision;
+
 
 /**
  * Holds the coordinates for a one-dimensional position within some coordinate 
reference system.
@@ -205,6 +207,22 @@ public class DirectPosition1D extends Ab
     }
 
     /**
+     * Formats this position in the <cite>Well Known Text</cite> (WKT) format.
+     * The output is like below:
+     *
+     * {@preformat wkt
+     *   POINT(ordinate)
+     * }
+     *
+     * The string returned by this method can be {@linkplain 
#DirectPosition1D(CharSequence) parsed}
+     * by the {@code DirectPosition1D} constructor.
+     */
+    @Override
+    public String toString() {
+        return toString(this, isSimplePrecision(ordinate));
+    }
+
+    /**
      * Returns a copy of this position.
      */
     @Override

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/DirectPosition2D.java
 Tue Dec 18 08:22:43 2012
@@ -25,7 +25,7 @@ import org.apache.sis.util.resources.Err
 
 import static java.lang.Double.doubleToLongBits;
 import static org.apache.sis.util.ArgumentChecks.ensureNonNull;
-import static org.apache.sis.util.StringBuilders.trimFractionalPart;
+import static org.apache.sis.math.MathFunctions.isSimplePrecision;
 
 // Following imports are needed because we can't extend AbstractDirectPosition.
 // We want to write this class as if it was an AbstractDirectPosition subclass.
@@ -296,10 +296,7 @@ public class DirectPosition2D extends Po
      */
     @Override
     public String toString() {
-        final StringBuilder buffer = new StringBuilder(32);
-        trimFractionalPart(buffer.append("POINT(").append(x));
-        trimFractionalPart(buffer.append(' ').append(y));
-        return buffer.append(')').toString();
+        return AbstractDirectPosition.toString(this, isSimplePrecision(x, y));
     }
 
     /**

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/Envelope2D.java
 Tue Dec 18 08:22:43 2012
@@ -982,6 +982,6 @@ public class Envelope2D extends Rectangl
      */
     @Override
     public String toString() {
-        return AbstractEnvelope.toString(this);
+        return AbstractEnvelope.toString(this, false);
     }
 }

Modified: 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
 (original)
+++ 
sis/branches/JDK7/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralDirectPosition.java
 Tue Dec 18 08:22:43 2012
@@ -28,6 +28,7 @@ import org.opengis.geometry.DirectPositi
 import org.opengis.geometry.MismatchedDimensionException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.util.resources.Errors;
+import org.apache.sis.math.MathFunctions;
 
 // JDK7 related
 import java.util.Objects;
@@ -263,6 +264,14 @@ public class GeneralDirectPosition exten
     }
 
     /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return toString(this, MathFunctions.isSimplePrecision(ordinates));
+    }
+
+    /**
      * Returns a deep copy of this position.
      */
     @Override

Modified: 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
 (original)
+++ 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/math/MathFunctions.java
 Tue Dec 18 08:22:43 2012
@@ -197,6 +197,23 @@ public final class MathFunctions extends
     }
 
     /**
+     * Returns {@code true} if every values in the given {@code double} array 
could be casted
+     * to the {@code float} type without precision lost. This method treats 
all {@code NaN} values
+     * as equal.
+     *
+     * @param  values The value to test for their precision.
+     * @return {@code true} if every values can be casted to the {@code float} 
type without precision lost.
+     */
+    public static boolean isSimplePrecision(final double... values) {
+        for (final double value : values) {
+            if (Double.doubleToLongBits(value) != 
Double.doubleToLongBits((float) value)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
      * Returns the number of fraction digits needed for formatting in base 10 
numbers of the given
      * accuracy. If the {@code strict} argument is {@code true}, then for any 
given {@code accuracy}
      * this method returns a value <var>n</var> such as the difference between 
adjacent numbers

Modified: 
sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/math/MathFunctionsTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/math/MathFunctionsTest.java?rev=1423316&r1=1423315&r2=1423316&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/math/MathFunctionsTest.java
 (original)
+++ 
sis/branches/JDK7/sis-utility/src/test/java/org/apache/sis/math/MathFunctionsTest.java
 Tue Dec 18 08:22:43 2012
@@ -84,6 +84,15 @@ public final strictfp class MathFunction
     }
 
     /**
+     * Tests {@link MathFunctions#isSimplePrecision(double[])}.
+     */
+    @Test
+    public void testIsSimplePrecision() {
+        assertTrue (isSimplePrecision(2, 0.5, 0.25, Double.NaN, 
Double.POSITIVE_INFINITY));
+        assertFalse(isSimplePrecision(2, 0.5, 1.0 / 3));
+    }
+
+    /**
      * Tests {@link MathFunctions#fractionDigitsForDelta(double, boolean)}.
      */
     @Test


Reply via email to