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

commit a1f8e943d11fb530ace54e73b2c9d19e78caebc6
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sun Dec 12 17:39:48 2021 +0100

    Fix a mismatched dimension error when the JTS geometry to transform is 
associated to a three-dimensional CRS.
---
 .../feature/jts/GeometryCoordinateTransform.java    |  4 ++--
 .../org/apache/sis/internal/feature/jts/JTS.java    |  7 +++++--
 .../apache/sis/internal/feature/jts/JTSTest.java    | 21 +++++++++++++++++++++
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/GeometryCoordinateTransform.java
 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/GeometryCoordinateTransform.java
index d1f2f61..56a4b42 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/GeometryCoordinateTransform.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/GeometryCoordinateTransform.java
@@ -28,7 +28,7 @@ import org.opengis.referencing.operation.TransformException;
  * This class is not thread-safe.
  *
  * @author  Johann Sorel (Geomatys)
- * @version 1.0
+ * @version 1.2
  * @since   1.0
  * @module
  */
@@ -74,7 +74,7 @@ final class GeometryCoordinateTransform extends 
GeometryTransform {
         final int maxDim   = Math.max(srcDim, tgtDim);
         final int count    = sequence.size();
         final int capacity = Math.max(4, Math.min(100, count));
-        final CoordinateSequence out = coordinateFactory.create(count, 
sequence.getDimension());
+        final CoordinateSequence out = coordinateFactory.create(count, tgtDim);
         if (coordinates == null || coordinates.length / maxDim < capacity) {
             coordinates = new double[capacity * maxDim];
         }
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java
index 8288253..c3b1b01 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java
@@ -30,7 +30,7 @@ import org.apache.sis.util.Utilities;
 import org.apache.sis.util.logging.Logging;
 import org.apache.sis.metadata.iso.citation.Citations;
 import org.apache.sis.metadata.iso.extent.DefaultGeographicBoundingBox;
-import org.apache.sis.geometry.Envelope2D;
+import org.apache.sis.geometry.GeneralEnvelope;
 import org.apache.sis.internal.system.Loggers;
 import org.apache.sis.internal.util.Constants;
 import org.apache.sis.referencing.IdentifiedObjects;
@@ -208,7 +208,10 @@ public final class JTS extends Static {
         DefaultGeographicBoundingBox bbox = new DefaultGeographicBoundingBox();
         try {
             final Envelope e = areaOfInterest.getEnvelopeInternal();
-            bbox.setBounds(new Envelope2D(sourceCRS, e.getMinX(), e.getMinY(), 
e.getWidth(), e.getHeight()));
+            final GeneralEnvelope env = new GeneralEnvelope(sourceCRS);     // 
May be 3- or 4-dimensional.
+            env.setRange(0, e.getMinX(), e.getMaxX());
+            env.setRange(1, e.getMinY(), e.getMaxY());
+            bbox.setBounds(env);
         } catch (TransformException ex) {
             bbox = null;
             Logging.ignorableException(Logging.getLogger(Loggers.GEOMETRY), 
JTS.class, "transform", ex);
diff --git 
a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
 
b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
index ab91be8..60fc318 100644
--- 
a/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
+++ 
b/core/sis-feature/src/test/java/org/apache/sis/internal/feature/jts/JTSTest.java
@@ -207,4 +207,25 @@ public final strictfp class JTSTest extends TestCase {
         assertEquals(15, ((Point) out).getX(), STRICT);
         assertEquals(26, ((Point) out).getY(), STRICT);
     }
+
+    /**
+     * Tests various {@code transform} method with a three-dimensional 
geometry.
+     *
+     * @throws FactoryException if an EPSG code can not be resolved.
+     * @throws TransformException if a coordinate can not be transformed.
+     */
+    @Test
+    public void testTransform3D() throws FactoryException, TransformException {
+        final GeometryFactory factory = Factory.INSTANCE.factory(false);
+        final Point in = factory.createPoint(new Coordinate(5, 6, 2));
+        assertEquals(Factory.TRIDIMENSIONAL, 
in.getCoordinateSequence().getDimension());
+        assertSame(in, JTS.transform(in, CommonCRS.WGS84.geographic()));
+
+        in.setUserData(CommonCRS.WGS84.geographic3D());
+        final Point out = (Point) JTS.transform(in, 
CommonCRS.WGS84.geographic());
+        assertEquals(5, out.getX(), STRICT);
+        assertEquals(6, out.getY(), STRICT);
+        assertEquals(CommonCRS.WGS84.geographic(), out.getUserData());
+        assertEquals(Factory.BIDIMENSIONAL, 
out.getCoordinateSequence().getDimension());
+    }
 }

Reply via email to