Author: desruisseaux
Date: Thu Apr 21 11:27:20 2016
New Revision: 1740284
URL: http://svn.apache.org/viewvc?rev=1740284&view=rev
Log:
Fix an index out of bounds in matrix indices when computing the conversions
from a spatio-temporal CRS (as a compound CRS) to vertical CRS.
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubOperationInfo.java
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java?rev=1740284&r1=1740283&r2=1740284&view=diff
==============================================================================
---
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
[UTF-8] (original)
+++
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java
[UTF-8] Thu Apr 21 11:27:20 2016
@@ -207,7 +207,7 @@ public class CoordinateOperationFinder e
* We do not perform this verification on the first invocation because
it was already verified by
* DefaultCoordinateOperationFactory.createOperation(…). We do not
block if the operation is in
* process of being computed in another thread because of the risk of
deadlock. If the operation
- * is not in the cache, store the keys in our internal map for
preventing infinite recursivity.
+ * is not in the cache, store the key in our internal map for
preventing infinite recursivity.
*/
final CRSPair key = new CRSPair(sourceCRS, targetCRS);
if (useCache && !previousSearches.isEmpty()) {
@@ -921,8 +921,14 @@ public class CoordinateOperationFinder e
* trivial operations.
*/
CoordinateOperation main = null;
- if (step1.getName() == AXIS_CHANGES && mt1.getSourceDimensions() ==
mt1.getTargetDimensions()) main = step2;
- if (step2.getName() == AXIS_CHANGES && mt2.getSourceDimensions() ==
mt2.getTargetDimensions()) main = step1;
+ final boolean isAxisChange1 = (step1.getName() == AXIS_CHANGES);
+ final boolean isAxisChange2 = (step2.getName() == AXIS_CHANGES);
+ if (isAxisChange1 && isAxisChange2) {
+ main = step2; //
Arbitrarily take the last step.
+ } else {
+ if (isAxisChange1 && mt1.getSourceDimensions() ==
mt1.getTargetDimensions()) main = step2;
+ if (isAxisChange2 && mt2.getSourceDimensions() ==
mt2.getTargetDimensions()) main = step1;
+ }
if (main instanceof SingleOperation) {
final SingleOperation op = (SingleOperation) main;
final MathTransform mt =
factorySIS.getMathTransformFactory().createConcatenatedTransform(mt1, mt2);
@@ -935,7 +941,7 @@ public class CoordinateOperationFinder e
}
/*
* Sometime we get a concatenated operation made of an operation
followed by its inverse.
- * We can identity those case when the associated MathTransform is the
identity transform.
+ * We can identify thoses case when the associated MathTransform is
the identity transform.
* In such case, simplify by replacing the ConcatenatedTransform by a
SingleTransform.
*/
if (main instanceof ConcatenatedOperation &&
main.getMathTransform().isIdentity()) {
Modified:
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubOperationInfo.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubOperationInfo.java?rev=1740284&r1=1740283&r2=1740284&view=diff
==============================================================================
---
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubOperationInfo.java
[UTF-8] (original)
+++
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/SubOperationInfo.java
[UTF-8] Thu Apr 21 11:27:20 2016
@@ -112,9 +112,9 @@ final class SubOperationInfo {
final Class<?> targetType = type(target);
for (final Class<?>[] sourceTypes : COMPATIBLE_TYPES) {
if (sourceTypes[0].isAssignableFrom(targetType)) {
- int startAtDimension;
- int endAtDimension = 0;
for (final Class<?> sourceType : sourceTypes) {
+ int startAtDimension;
+ int endAtDimension = 0;
for (int i=0; i<sourceIsUsed.length; i++) {
final SingleCRS source = sources.get(i);
startAtDimension = endAtDimension;
Modified:
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java?rev=1740284&r1=1740283&r2=1740284&view=diff
==============================================================================
---
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
[UTF-8] (original)
+++
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java
[UTF-8] Thu Apr 21 11:27:20 2016
@@ -639,6 +639,45 @@ public final strictfp class CoordinateOp
}
/**
+ * Tests extracting the vertical part of a spatio-temporal CRS.
+ *
+ * @throws FactoryException if the operation can not be created.
+ * @throws TransformException if an error occurred while converting the
test points.
+ */
+ @Test
+ @DependsOnMethod("testGeographic3D_to_EllipsoidalHeight")
+ public void testGeographic4D_to_EllipsoidalHeight() throws
FactoryException, TransformException {
+ final CompoundCRS sourceCRS = compound("Test4D",
CommonCRS.WGS84.geographic3D(), CommonCRS.Temporal.JULIAN.crs());
+ final VerticalCRS targetCRS = CommonCRS.Vertical.ELLIPSOIDAL.crs();
+ final CoordinateOperation operation =
inference.createOperation(sourceCRS, targetCRS);
+ assertSame ("sourceCRS", sourceCRS,
operation.getSourceCRS());
+ assertSame ("targetCRS", targetCRS,
operation.getTargetCRS());
+ assertEquals ("name", "Axis changes",
operation.getName().getCode());
+ assertInstanceOf("operation", Conversion.class, operation);
+
+ transform = operation.getMathTransform();
+ assertInstanceOf("transform", LinearTransform.class, transform);
+ assertEquals("sourceDimensions", 4, transform.getSourceDimensions());
+ assertEquals("targetDimensions", 1, transform.getTargetDimensions());
+ Assert.assertMatrixEquals("transform.matrix", Matrices.create(2, 5,
new double[] {
+ 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 1
+ }), ((LinearTransform) transform).getMatrix(), STRICT);
+
+ isInverseTransformSupported = false;
+ verifyTransform(new double[] {
+ 0, 0, 0, 0,
+ 5, 8, 20, 10,
+ -5, -8, 24, 30
+ }, new double[] {
+ 0,
+ 20,
+ 24,
+ });
+ validate();
+ }
+
+ /**
* Convenience method for creating a compound CRS.
*/
private static CompoundCRS compound(final String name, final
CoordinateReferenceSystem... components) {