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()); + } }