diff --git a/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CoordinatesTransformer.java b/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CoordinatesTransformer.java index 648167783..0c8f5ea6a 100644 --- a/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CoordinatesTransformer.java +++ b/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CoordinatesTransformer.java @@ -7,6 +7,7 @@ */ package de.ii.xtraplatform.geometries.domain.transform; +import de.ii.xtraplatform.geometries.domain.Axes; import de.ii.xtraplatform.geometries.domain.CircularString; import de.ii.xtraplatform.geometries.domain.Geometry; import de.ii.xtraplatform.geometries.domain.LineString; @@ -24,26 +25,32 @@ public class CoordinatesTransformer implements GeometryTransformer { private final CoordinatesTransformation transformationChain; private final boolean simplifiesArcs; + private final Axes resultAxes; public CoordinatesTransformer(CoordinatesTransformation transformationChain) { this.transformationChain = transformationChain; CoordinatesTransformation current = transformationChain; boolean simplifiesArcs = false; + Axes resultAxes = null; while (Objects.nonNull(current)) { if (current.simplifiesArcs()) { simplifiesArcs = true; - break; + } + if (current instanceof CrsTransform transform) { + final int targetDimension = transform.getCrsTransformer().getTargetDimension(); + resultAxes = targetDimension == 3 ? Axes.XYZ : Axes.XY; } current = current.getNext().orElse(null); } this.simplifiesArcs = simplifiesArcs; + this.resultAxes = resultAxes; } @Override public Geometry visit(Point geometry) { return Point.of( Position.of( - geometry.getAxes(), + Objects.requireNonNullElse(resultAxes, geometry.getAxes()), processPositions( geometry.getValue().getCoordinates(), geometry.getAxes().size(), @@ -59,7 +66,7 @@ public Geometry visit(SingleCurve geometry) { if (geometry instanceof CircularString) { PositionList posList = PositionList.of( - geometry.getAxes(), + Objects.requireNonNullElse(resultAxes, geometry.getAxes()), processPositions( coordinates, dimension, @@ -71,7 +78,7 @@ public Geometry visit(SingleCurve geometry) { } return LineString.of( PositionList.of( - geometry.getAxes(), + Objects.requireNonNullElse(resultAxes, geometry.getAxes()), processPositions( coordinates, dimension, diff --git a/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CrsTransform.java b/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CrsTransform.java index 5a469fa17..b0e0f1373 100644 --- a/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CrsTransform.java +++ b/xtraplatform-geometries/src/main/java/de/ii/xtraplatform/geometries/domain/transform/CrsTransform.java @@ -10,6 +10,7 @@ import de.ii.xtraplatform.crs.domain.CrsTransformer; import de.ii.xtraplatform.geometries.domain.PositionList.Interpolation; import java.io.IOException; +import java.util.Arrays; import java.util.Optional; import java.util.OptionalInt; import org.immutables.value.Value; @@ -28,14 +29,24 @@ public double[] onCoordinates( Optional interpolation, OptionalInt minNumberOfPositions) throws IOException { - double[] transformed = - getCrsTransformer().transform(coordinates, length / dimension, dimension); + final int positions = length / dimension; + double[] transformed = getCrsTransformer().transform(coordinates, positions, dimension); + + final int targetDimension = getCrsTransformer().getTargetDimension(); + if (dimension == 3 && targetDimension == 2) { + transformed = Arrays.copyOfRange(transformed, 0, positions * 2); + } if (getNext().isEmpty()) { return transformed; } return getNext() .get() - .onCoordinates(transformed, length, dimension, interpolation, minNumberOfPositions); + .onCoordinates( + transformed, + positions * targetDimension, + targetDimension, + interpolation, + minNumberOfPositions); } }