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.
      */

Reply via email to