This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit ef13105bb13c4014fc51c8fedde774aa516dc639 Author: jsorel <[email protected]> AuthorDate: Wed Oct 14 10:42:32 2026 +0200 feat(Geometry): implement Surface methods on nurbSuface, implement surface interpolation methods --- .../main/org/apache/sis/geometries/Curve.java | 3 +- .../main/org/apache/sis/geometries/Orientable.java | 11 ++---- .../main/org/apache/sis/geometries/Solid.java | 6 +-- .../main/org/apache/sis/geometries/Surface.java | 30 ++++++++++----- .../internal/shared/DefaultCurvePolygon.java | 11 +++++- .../internal/shared/DefaultEllipsoid.java | 11 ------ .../internal/shared/DefaultNurbSurface.java | 44 ++++++++++++++++------ .../internal/shared/DefaultPolyhedron.java | 10 ----- .../internal/shared/DefaultReversedSurface.java | 32 +++++++++++++++- .../geometries/internal/shared/DefaultSolid.java | 10 ----- .../geometries/internal/shared/DefaultSphere.java | 11 ------ .../solid/polyhedron/AbstractPolyhedron.java | 6 ++- .../org/apache/sis/geometries/surface/Capsule.java | 11 ++++++ .../apache/sis/geometries/surface/Ellipsoid.java | 16 ++++++++ .../org/apache/sis/geometries/surface/Sphere.java | 20 ++++++++++ 15 files changed, 152 insertions(+), 80 deletions(-) diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Curve.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Curve.java index 526b71a5fc..4303695aa9 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Curve.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Curve.java @@ -297,8 +297,7 @@ public sealed interface Curve extends Orientable */ @UML(identifier="interpolation", specification=ISO_19107) default CurveInterpolation getInterpolation() { - //TODO - throw new UnsupportedOperationException(); + return CurveInterpolation.LINEAR; } /** diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Orientable.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Orientable.java index 31a2915255..03e8959602 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Orientable.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Orientable.java @@ -84,8 +84,7 @@ public sealed interface Orientable extends Primitive */ @UML(identifier="proxy", specification=ISO_19107) default Orientable getProxy(){ - //TODO - throw new UnsupportedOperationException(); + return getReverse(); } /** @@ -97,8 +96,7 @@ public sealed interface Orientable extends Primitive */ @UML(identifier="primitive", specification=ISO_19107) default Primitive getPrimitive(){ - //TODO - throw new UnsupportedOperationException(); + return this; } /** @@ -112,9 +110,6 @@ public sealed interface Orientable extends Primitive */ // called opposite on figure 16 @UML(identifier="reverse", specification=ISO_19107) - default Orientable getReverse(){ - //TODO - throw new UnsupportedOperationException(); - } + Orientable getReverse(); } diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Solid.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Solid.java index 90ee93519a..11f965cc22 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Solid.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Solid.java @@ -167,7 +167,7 @@ public sealed interface Solid extends Primitive */ @UML(identifier="controlPoint", specification=ISO_19107) default List<DirectPosition> getControlPoints() { - throw new UnsupportedOperationException(); + return List.of(); } /** @@ -180,7 +180,7 @@ public sealed interface Solid extends Primitive */ @UML(identifier="interpolation", specification=ISO_19107) default SolidInterpolation getInterpolation() { - throw new UnsupportedOperationException(); + return SolidInterpolation.NONE; } /** @@ -200,7 +200,7 @@ public sealed interface Solid extends Primitive */ @UML(identifier="knot", specification=ISO_19107) default List<double[]> getKnots() { - throw new UnsupportedOperationException(); + return List.of(); } } diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Surface.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Surface.java index c9e94c5880..50cbba7829 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Surface.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/Surface.java @@ -87,6 +87,21 @@ public sealed interface Surface extends Orientable return 2; } + /** + * Returns this surface with the opposite orientation, i.e. with its up-normal flipped. + * + * @see ISO 19107:2019 - 6.4.15.3 + */ + @Override + default Surface getReverse() { + /* + * A view of this surface carrying the opposite orientation sign, for the same reason as + * `Curve.getReverse()`: reversing changes no coordinate. `DefaultReversedSurface` returns + * this surface back from its own `getReverse()`, so wrapping never nests. + */ + return GeometryFactory.DEFAULT.createReversed(this); + } + /** * The area of this Surface, as measured in the spatial reference system of this Surface. * @@ -176,8 +191,7 @@ public sealed interface Surface extends Orientable */ @UML(identifier="interpolation", specification=ISO_19107) default List<SurfaceInterpolation> getInterpolation() { - //TODO - throw new UnsupportedOperationException(); + return List.of(SurfaceInterpolation.PLANAR); } /** @@ -192,8 +206,7 @@ public sealed interface Surface extends Orientable */ @UML(identifier="numDerivativesBoundary", specification=ISO_19107) default Integer getNumDerivativesBoundary() { - //TODO - throw new UnsupportedOperationException(); + return 0; } /** @@ -206,8 +219,7 @@ public sealed interface Surface extends Orientable */ @UML(identifier="numDerivativeInterior", specification=ISO_19107) default Integer getNumDerivativeInterior() { - //TODO - throw new UnsupportedOperationException(); + return 0; } /** @@ -250,8 +262,7 @@ public sealed interface Surface extends Orientable */ @UML(identifier="controlPoint", specification=ISO_19107) default List<DirectPosition> getControlPoints() { - //TODO - throw new UnsupportedOperationException(); + return List.of(); } /** @@ -272,8 +283,7 @@ public sealed interface Surface extends Orientable */ @UML(identifier="knot", specification=ISO_19107) default List<double[]> getKnots() { - //TODO - throw new UnsupportedOperationException(); + return List.of(); } /** diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultCurvePolygon.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultCurvePolygon.java index 9d7fbc4c52..80c9b74ae3 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultCurvePolygon.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultCurvePolygon.java @@ -24,6 +24,7 @@ import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.geometries.Curve; import org.apache.sis.geometries.Geometries; import org.apache.sis.geometries.Geometry; +import org.apache.sis.geometries.GeometryFactory; import org.apache.sis.geometries.surface.CurvePolygon; @@ -83,9 +84,17 @@ public non-sealed class DefaultCurvePolygon extends AbstractGeometry implements return exterior.getEnvelope(); } + /** + * Returns the exterior ring followed by the interior rings. + */ @Override public Geometry getBoundary() { - throw new UnsupportedOperationException("Not supported yet."); + final var rings = new Curve[interiors.size() + 1]; + rings[0] = exterior; + for (int i = 1; i < rings.length; i++) { + rings[i] = interiors.get(i - 1); + } + return GeometryFactory.DEFAULT.createMultiCurve(getCoordinateReferenceSystem(), rings); } @Override diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultEllipsoid.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultEllipsoid.java index 8a427c31e2..9c15c172b5 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultEllipsoid.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultEllipsoid.java @@ -26,7 +26,6 @@ import org.apache.sis.geometries.DataPoints; import org.apache.sis.geometries.Geometries; import org.apache.sis.geometries.Geometry; import org.apache.sis.geometries.GeometryFactory; -import org.apache.sis.geometries.GeometryType; import org.apache.sis.geometries.surface.Ellipsoid; import org.apache.sis.maths.DataType; import org.apache.sis.maths.NDArrays; @@ -216,16 +215,6 @@ public non-sealed class DefaultEllipsoid extends AbstractGeometry implements Ell throw new UnsupportedOperationException("Not supported yet."); } - @Override - public GeometryType getHorizontalCurveType() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public GeometryType getVerticalCurveType() { - throw new UnsupportedOperationException("Not supported yet."); - } - @Override public List<double[]> getKnots() { throw new UnsupportedOperationException("Not supported yet."); diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultNurbSurface.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultNurbSurface.java index eeb5736e90..85a86dd6ad 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultNurbSurface.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultNurbSurface.java @@ -16,6 +16,7 @@ */ package org.apache.sis.geometries.internal.shared; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.measure.Quantity; @@ -322,24 +323,30 @@ public non-sealed class DefaultNurbSurface extends AbstractGeometry implements N return degree; } + /** + * Returns a copy of the knot vectors, the one of the <var>u</var> parameter first. + */ @Override public List<double[]> getKnots() { - throw new UnsupportedOperationException("Not supported yet."); + return List.of(knotsU.clone(), knotsV.clone()); } + /** + * Returns {@link KnotType#NON_UNIFORM}, the general case which makes no assumption + * on the spacing and multiplicity of the knots. + */ @Override public KnotType getKnotSpec() { - throw new UnsupportedOperationException("Not supported yet."); + return KnotType.NON_UNIFORM; } + /** + * Returns {@link BSplineSurfaceForm#UNSPECIFIED}: this surface is not known to approximate + * any particular surface. + */ @Override public BSplineSurfaceForm getSurfaceForm() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean isPolynomial() { - throw new UnsupportedOperationException("Not supported yet."); + return BSplineSurfaceForm.UNSPECIFIED; } @Override @@ -347,19 +354,34 @@ public non-sealed class DefaultNurbSurface extends AbstractGeometry implements N throw new UnsupportedOperationException("Not supported yet."); } + /** + * Returns the number of control points along the <var>u</var> direction. + */ @Override public int getRows() { - throw new UnsupportedOperationException("Not supported yet."); + return controlPoints.length; } + /** + * Returns the number of control points along the <var>v</var> direction. + */ @Override public int getColumns() { - throw new UnsupportedOperationException("Not supported yet."); + return controlPoints[0].length; } + /** + * Returns views of the control points in row-major order, without their weights. + */ @Override public List<DirectPosition> getControlPoints() { - throw new UnsupportedOperationException("Not supported yet."); + final var positions = new ArrayList<DirectPosition>(getRows() * getColumns()); + for (final Vector<?>[] row : controlPoints) { + for (final Vector<?> p : row) { + positions.add(Vectors.asDirectPostion(p)); + } + } + return positions; } @Override diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultPolyhedron.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultPolyhedron.java index 04c2772b47..dfc2e9da58 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultPolyhedron.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultPolyhedron.java @@ -19,7 +19,6 @@ package org.apache.sis.geometries.internal.shared; import java.util.List; import java.util.Objects; import javax.measure.Quantity; -import org.opengis.geometry.DirectPosition; import org.opengis.geometry.Envelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.geometries.GeometryCollection; @@ -99,13 +98,4 @@ public non-sealed class DefaultPolyhedron extends AbstractGeometry implements Po throw new UnsupportedOperationException("Not supported yet."); } - @Override - public List<DirectPosition> getControlPoints() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public List<double[]> getKnots() { - throw new UnsupportedOperationException("Not supported yet."); - } } diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultReversedSurface.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultReversedSurface.java index 5114c5c4a0..6ed92ccf10 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultReversedSurface.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultReversedSurface.java @@ -16,16 +16,20 @@ */ package org.apache.sis.geometries.internal.shared; +import java.util.List; import java.util.Objects; import javax.measure.Quantity; import org.opengis.geometry.Envelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.geometries.DataPoints; import org.apache.sis.geometries.Geometry; +import org.apache.sis.geometries.GeometryCollection; +import org.apache.sis.geometries.GeometryFactory; import org.apache.sis.geometries.GeometryType; import org.apache.sis.geometries.Orientable; import org.apache.sis.geometries.Primitive; import org.apache.sis.geometries.Surface; +import org.apache.sis.geometries.SurfaceInterpolation; import org.apache.sis.geometries.DataPointsType; @@ -58,10 +62,18 @@ public non-sealed class DefaultReversedSurface extends AbstractGeometry implemen } @Override - public Orientable getReverse() { + public Surface getReverse() { return base; } + /** + * Returns the interpolations of the base surface: reversing a surface does not change how it is built. + */ + @Override + public List<SurfaceInterpolation> getInterpolation() { + return base.getInterpolation(); + } + /** * Returns the geometry type of the base surface: reversing a surface does not change what kind * of surface it is. @@ -104,9 +116,25 @@ public non-sealed class DefaultReversedSurface extends AbstractGeometry implemen return base.getEnvelope(); } + /** + * Returns the boundary of the base surface with each curve reversed, so that this surface, + * whose up-normal is flipped, stays on the left of its boundary. + */ @Override public Geometry getBoundary() { - throw new UnsupportedOperationException("Not supported yet."); + final Geometry boundary = base.getBoundary(); + if (boundary instanceof Orientable o) { + return o.getReverse(); + } + if (boundary instanceof GeometryCollection<?> c) { + final var reversed = new Geometry[c.getNumGeometries()]; + for (int i = 0; i < reversed.length; i++) { + final Geometry g = c.getGeometryN(i); + reversed[i] = (g instanceof Orientable o) ? o.getReverse() : g; + } + return GeometryFactory.DEFAULT.createGeometryCollection(c.getElementType(), c.getCoordinateReferenceSystem(), reversed); + } + return boundary; } @Override diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSolid.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSolid.java index 4cc582d057..7c6c4acebc 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSolid.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSolid.java @@ -21,7 +21,6 @@ import javax.measure.Quantity; import org.apache.sis.geometries.DataPoints; import org.apache.sis.geometries.DataPointsType; import org.apache.sis.geometries.Geometry; -import org.opengis.geometry.DirectPosition; import org.opengis.geometry.Envelope; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.geometries.GeometryCollection; @@ -120,13 +119,4 @@ public non-sealed class DefaultSolid extends AbstractGeometry implements Solid { throw new UnsupportedOperationException("Not supported yet."); } - @Override - public List<DirectPosition> getControlPoints() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public List<double[]> getKnots() { - throw new UnsupportedOperationException("Not supported yet."); - } } diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSphere.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSphere.java index ef1e4d6984..70223e83d6 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSphere.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSphere.java @@ -25,7 +25,6 @@ import org.apache.sis.geometries.DataPoints; import org.apache.sis.geometries.Geometries; import org.apache.sis.geometries.Geometry; import org.apache.sis.geometries.GeometryFactory; -import org.apache.sis.geometries.GeometryType; import org.apache.sis.geometries.surface.Sphere; import org.apache.sis.maths.DataType; import org.apache.sis.maths.NDArrays; @@ -154,16 +153,6 @@ public non-sealed class DefaultSphere extends AbstractGeometry implements Sphere throw new UnsupportedOperationException("Not supported yet."); } - @Override - public GeometryType getHorizontalCurveType() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public GeometryType getVerticalCurveType() { - throw new UnsupportedOperationException("Not supported yet."); - } - @Override public List<double[]> getKnots() { throw new UnsupportedOperationException("Not supported yet."); diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/polyhedron/AbstractPolyhedron.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/polyhedron/AbstractPolyhedron.java index 0f2a763c2c..3d24496ada 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/polyhedron/AbstractPolyhedron.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/polyhedron/AbstractPolyhedron.java @@ -99,9 +99,13 @@ public abstract sealed class AbstractPolyhedron extends AbstractGeometry impleme throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody } + /** + * Returns the {@linkplain #getExteriorShell() exterior shell}: a regular polyhedron has no void, + * so its faces are its whole boundary. + */ @Override public GeometryCollection<? extends Surface> getBoundary() { - throw new UnsupportedOperationException("Not supported yet."); + return getExteriorShell(); } /** diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java index 5ea62d8613..d7ddb0f81b 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java @@ -16,6 +16,7 @@ */ package org.apache.sis.geometries.surface; +import java.util.List; import static org.opengis.annotation.Specification.ISO_12113; import org.opengis.annotation.UML; import org.opengis.referencing.crs.CoordinateReferenceSystem; @@ -23,6 +24,7 @@ import org.apache.sis.geometries.BBox; import org.apache.sis.geometries.DataPointsType; import org.apache.sis.geometries.GeometryType; import org.apache.sis.geometries.Surface; +import org.apache.sis.geometries.SurfaceInterpolation; import org.apache.sis.geometries.internal.shared.DefaultCapsule; import org.apache.sis.maths.DataType; import org.apache.sis.maths.ReadOnly; @@ -64,6 +66,15 @@ public sealed interface Capsule extends Surface return false; } + /** + * Returns {@link SurfaceInterpolation#SPHERICAL} for the two hemispherical ends + * and {@link SurfaceInterpolation#CONIC} for the band joining them. + */ + @Override + default List<SurfaceInterpolation> getInterpolation() { + return List.of(SurfaceInterpolation.SPHERICAL, SurfaceInterpolation.CONIC); + } + /** * @return the center of the bottom sphere */ diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java index 653f04c508..254686b012 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java @@ -83,6 +83,22 @@ public sealed interface Ellipsoid extends ParametricCurveSurface return List.of(SurfaceInterpolation.ELLIPTICAL); } + /** + * Returns {@link GeometryType#ELLIPTICARC}: the horizontal curves are the ellipses of constant latitude. + */ + @Override + default GeometryType getHorizontalCurveType() { + return GeometryType.ELLIPTICARC; + } + + /** + * Returns {@link GeometryType#ELLIPTICARC}: the vertical curves are the ellipses of constant longitude. + */ + @Override + default GeometryType getVerticalCurveType() { + return GeometryType.ELLIPTICARC; + } + /** * Returns a copy of the semi-axis lengths, one per axis of the coordinate system. * Writing in the returned array does not reshape this ellipsoid; diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java index 144d46c9c7..8e8218958d 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java @@ -87,6 +87,26 @@ public sealed interface Sphere extends ParametricCurveSurface return List.of(SurfaceInterpolation.SPHERICAL); } + /** + * Returns {@link GeometryType#CIRCLE}: the horizontal curves are the circles of constant latitude. + * + * @see ISO 19107:2019 - 8.5.2 + */ + @Override + default GeometryType getHorizontalCurveType() { + return GeometryType.CIRCLE; + } + + /** + * Returns {@link GeometryType#CIRCLE}: the vertical curves are the great circles of constant longitude. + * + * @see ISO 19107:2019 - 8.5.2 + */ + @Override + default GeometryType getVerticalCurveType() { + return GeometryType.CIRCLE; + } + /** * @return radius of the sphere. */
