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 70752bf4c861096bce86f6a619f4240cdc40a927
Author: jsorel <[email protected]>
AuthorDate: Fri Oct 9 15:51:27 2026 +0200

    feat(Geometry): define GeometryType on all GeometryCollection 
implementation, add DefaultSolid to build solid from surfaces
---
 .../apache/sis/geometries/GeometryCollection.java  |  5 +-
 .../org/apache/sis/geometries/GeometryFactory.java | 17 +++--
 .../org/apache/sis/geometries/GeometryType.java    |  8 +--
 .../main/org/apache/sis/geometries/Solid.java      |  6 +-
 .../internal/shared/DefaultBSplineSolid.java       |  4 +-
 .../internal/shared/DefaultGeometryCollection.java | 15 +++-
 .../internal/shared/DefaultMultiCurve.java         |  3 +-
 .../internal/shared/DefaultMultiPolyhedron.java    |  3 +-
 .../internal/shared/DefaultMultiSurface.java       |  3 +-
 .../internal/shared/DefaultPolyhedron.java         |  5 +-
 .../internal/shared/DefaultProductCurve.java       |  3 +-
 .../internal/shared/DefaultRawMultiPoint.java      |  3 +-
 .../{DefaultPolyhedron.java => DefaultSolid.java}  | 80 ++++++++++++++--------
 .../sis/geometries/mesh/MultiMeshPrimitive.java    |  7 ++
 .../solid/polyhedron/AbstractPolyhedron.java       |  6 +-
 .../sis/geometries/spherical/GreatCircleArc.java   |  2 +-
 .../spherical/SphericalConvexPolygon.java          |  2 +-
 .../geometries/spherical/SphericalTriangle.java    |  2 +-
 .../sis/geometries/{solid => surface}/Capsule.java |  2 +-
 .../geometries/{solid => surface}/Cylinder.java    |  4 +-
 .../geometries/{solid => surface}/Ellipsoid.java   |  2 +-
 .../geometries/surface/ParametricCurveSurface.java |  2 -
 .../sis/geometries/{solid => surface}/Sphere.java  |  2 +-
 .../geometries/spherical/GreatCircleArcTest.java   |  2 +-
 .../spherical/SphericalConvexPolygonTest.java      |  2 +-
 .../spherical/SphericalTriangleTest.java           |  2 +-
 26 files changed, 123 insertions(+), 69 deletions(-)

diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
index b58e611cb4..55af9eb961 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java
@@ -101,10 +101,7 @@ public sealed interface GeometryCollection<T extends 
Geometry> extends Geometry
      * @see ISO 19107:2019 - 6.4.31.2
      */
     @UML(identifier="elementType", specification=ISO_19107)
-    default Set<GeometryType> getElementType() {
-        //TODO
-        throw new UnsupportedOperationException();
-    }
+    Set<GeometryType> getElementType();
 
     /**
      * Returns whether this collection has no element.
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryFactory.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryFactory.java
index 28c33b334c..b5a67540ed 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryFactory.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryFactory.java
@@ -95,14 +95,15 @@ import 
org.apache.sis.geometries.internal.shared.DefaultRawMultiPoint;
 import org.apache.sis.geometries.internal.shared.DefaultReversedCurve;
 import org.apache.sis.geometries.internal.shared.DefaultReversedSurface;
 import org.apache.sis.geometries.internal.shared.DefaultRhumb;
+import org.apache.sis.geometries.internal.shared.DefaultSolid;
 import org.apache.sis.geometries.internal.shared.DefaultSpiral;
 import org.apache.sis.geometries.internal.shared.DefaultTriangle;
 import org.apache.sis.geometries.internal.shared.DefaultTriangulatedSurface;
 import org.apache.sis.geometries.point.MultiPoint;
-import org.apache.sis.geometries.solid.Ellipsoid;
+import org.apache.sis.geometries.surface.Ellipsoid;
 import org.apache.sis.geometries.solid.MultiPolyhedron;
 import org.apache.sis.geometries.solid.Polyhedron;
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.geometries.solid.BSplineSolid;
 import org.apache.sis.geometries.surface.BSplineSurface;
 import org.apache.sis.geometries.surface.BSplineSurfaceForm;
@@ -684,6 +685,10 @@ public final class GeometryFactory {
     // Solids /////////////////////////////////////////////////////////////////
     // ////////////////////////////////////////////////////////////////////////
 
+    public Solid createSolid(List<Surface> surfaces) {
+        return new DefaultSolid(surfaces);
+    }
+
     public Polyhedron createPolyhedron(MultiPolygon exteriorShell, 
List<MultiPolygon> interiorShells) {
         return new DefaultPolyhedron(exteriorShell, interiorShells);
     }
@@ -728,11 +733,15 @@ public final class GeometryFactory {
     // ////////////////////////////////////////////////////////////////////////
 
     public <T extends Geometry> GeometryCollection<T> 
createGeometryCollection(T ... geometries) {
-        return new DefaultGeometryCollection<>(geometries);
+        return new DefaultGeometryCollection<>(GeometryType.GEOMETRY, 
geometries);
     }
 
     public <T extends Geometry> GeometryCollection<T> 
createGeometryCollection(CoordinateReferenceSystem crs, T ... geometries) {
-        return new DefaultGeometryCollection<>(crs, geometries);
+        return new DefaultGeometryCollection<>(GeometryType.GEOMETRY, crs, 
geometries);
+    }
+
+    public <T extends Geometry> GeometryCollection<T> 
createGeometryCollection(GeometryType elementType, CoordinateReferenceSystem 
crs, T ... geometries) {
+        return new DefaultGeometryCollection<>(elementType, crs, geometries);
     }
 
     // ////////////////////////////////////////////////////////////////////////
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryType.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryType.java
index 1c158f2b6d..e5ddcaf7a5 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryType.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryType.java
@@ -43,13 +43,13 @@ import org.apache.sis.geometries.curve.Spiral;
 import org.apache.sis.geometries.curve.SplineCurve;
 import org.apache.sis.geometries.point.MultiPoint;
 import org.apache.sis.geometries.solid.BSplineSolid;
-import org.apache.sis.geometries.solid.Capsule;
-import org.apache.sis.geometries.solid.Cylinder;
-import org.apache.sis.geometries.solid.Ellipsoid;
+import org.apache.sis.geometries.surface.Capsule;
+import org.apache.sis.geometries.surface.Cylinder;
+import org.apache.sis.geometries.surface.Ellipsoid;
 import org.apache.sis.geometries.solid.Frustrum;
 import org.apache.sis.geometries.solid.MultiPolyhedron;
 import org.apache.sis.geometries.solid.Polyhedron;
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.geometries.surface.BSplineSurface;
 import org.apache.sis.geometries.surface.BilinearGrid;
 import org.apache.sis.geometries.surface.CurvePolygon;
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 730cd187be..90ee93519a 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
@@ -18,6 +18,7 @@ package org.apache.sis.geometries;
 
 import java.util.List;
 import javax.measure.Quantity;
+import org.apache.sis.geometries.internal.shared.DefaultSolid;
 import static org.opengis.annotation.Specification.ISO_19107;
 import org.opengis.annotation.UML;
 import org.opengis.geometry.DirectPosition;
@@ -56,7 +57,8 @@ import org.apache.sis.geometries.solid.Polyhedron;
  */
 @UML(identifier="Solid", specification=ISO_19107)
 public sealed interface Solid extends Primitive
-        permits ParametricCurveSolid,
+        permits DefaultSolid,
+                ParametricCurveSolid,
                 Polyhedron
 {
 
@@ -101,7 +103,7 @@ public sealed interface Solid extends Primitive
      */
     @UML(identifier="boundary", specification=ISO_19107)
     @Override
-    Geometry getBoundary();
+    GeometryCollection<? extends Surface> getBoundary();
 
     /**
      * Sum of the areas of all the boundary surfaces of this solid.
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSolid.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSolid.java
index 33dd70764b..0cdd9b695d 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSolid.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSolid.java
@@ -26,6 +26,8 @@ import org.apache.sis.geometries.DataPoints;
 import org.apache.sis.geometries.Geometry;
 import org.apache.sis.geometries.GeometryType;
 import org.apache.sis.geometries.DataPointsType;
+import org.apache.sis.geometries.GeometryCollection;
+import org.apache.sis.geometries.Surface;
 import org.apache.sis.geometries.solid.BSplineSolid;
 
 
@@ -176,7 +178,7 @@ public non-sealed class DefaultBSplineSolid extends 
AbstractGeometry implements
     }
 
     @Override
-    public Geometry getBoundary() {
+    public GeometryCollection<? extends Surface> getBoundary() {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
index f713514ae1..f5a9c59d25 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java
@@ -16,10 +16,12 @@
  */
 package org.apache.sis.geometries.internal.shared;
 
+import java.util.Set;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 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.Point;
 
 
@@ -29,6 +31,7 @@ import org.apache.sis.geometries.Point;
  */
 public non-sealed class DefaultGeometryCollection<T extends Geometry> extends 
AbstractGeometry implements GeometryCollection<T> {
 
+    private final GeometryType elementType;
     private final T[] geometries;
 
     /**
@@ -38,19 +41,25 @@ public non-sealed class DefaultGeometryCollection<T extends 
Geometry> extends Ab
      */
     private CoordinateReferenceSystem fallbackCRS;
 
-    public DefaultGeometryCollection(T[] geometries) {
-        this(null, geometries);
+    public DefaultGeometryCollection(GeometryType elementType, T[] geometries) 
{
+        this(elementType, null, geometries);
     }
 
     /**
      * Creates a collection which reports the given coordinate reference system
      * when {@code geometries} is empty.
      */
-    public DefaultGeometryCollection(CoordinateReferenceSystem fallbackCRS, 
T[] geometries) {
+    public DefaultGeometryCollection(GeometryType elementType, 
CoordinateReferenceSystem fallbackCRS, T[] geometries) {
+        this.elementType = elementType;
         this.geometries  = geometries;
         this.fallbackCRS = fallbackCRS;
     }
 
+    @Override
+    public Set<GeometryType> getElementType() {
+        return Set.of(elementType);
+    }
+
     @Override
     public CoordinateReferenceSystem getCoordinateReferenceSystem() {
         return (geometries.length != 0) ? 
geometries[0].getCoordinateReferenceSystem() : fallbackCRS;
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiCurve.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiCurve.java
index 70143d064d..2a261c4594 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiCurve.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiCurve.java
@@ -18,6 +18,7 @@ package org.apache.sis.geometries.internal.shared;
 
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.geometries.Curve;
+import org.apache.sis.geometries.GeometryType;
 import org.apache.sis.geometries.curve.MultiCurve;
 
 
@@ -32,7 +33,7 @@ public non-sealed class DefaultMultiCurve<T extends Curve> 
extends DefaultGeomet
     }
 
     public DefaultMultiCurve(CoordinateReferenceSystem fallbackCRS, T[] 
geometries) {
-        super(fallbackCRS, geometries);
+        super(GeometryType.CURVE, fallbackCRS, geometries);
     }
 
 }
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiPolyhedron.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiPolyhedron.java
index 8e7d1b51cf..b09ceed31a 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiPolyhedron.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiPolyhedron.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.geometries.internal.shared;
 
+import org.apache.sis.geometries.GeometryType;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.geometries.solid.MultiPolyhedron;
 import org.apache.sis.geometries.solid.Polyhedron;
@@ -34,7 +35,7 @@ public non-sealed class DefaultMultiPolyhedron extends 
DefaultGeometryCollection
     }
 
     public DefaultMultiPolyhedron(CoordinateReferenceSystem fallbackCRS, 
Polyhedron... solids) {
-        super(fallbackCRS, solids);
+        super(GeometryType.POLYHEDRON, fallbackCRS, solids);
     }
 
 }
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiSurface.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiSurface.java
index 6d66de5cc8..61c80916cc 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiSurface.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultMultiSurface.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.geometries.internal.shared;
 
+import org.apache.sis.geometries.GeometryType;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.geometries.Point;
 import org.apache.sis.geometries.Surface;
@@ -33,7 +34,7 @@ public non-sealed class DefaultMultiSurface<T extends 
Surface> extends DefaultGe
     }
 
     public DefaultMultiSurface(CoordinateReferenceSystem fallbackCRS, T[] 
geometries) {
-        super(fallbackCRS, geometries);
+        super(GeometryType.SURFACE, fallbackCRS, geometries);
     }
 
     /**
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 37dee66304..633f75bdf6 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
@@ -22,7 +22,8 @@ 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.Geometry;
+import org.apache.sis.geometries.GeometryCollection;
+import org.apache.sis.geometries.Surface;
 import org.apache.sis.geometries.solid.Polyhedron;
 import org.apache.sis.geometries.surface.MultiPolygon;
 
@@ -84,7 +85,7 @@ public non-sealed class DefaultPolyhedron extends 
AbstractGeometry implements Po
     }
 
     @Override
-    public Geometry getBoundary() {
+    public GeometryCollection<? extends Surface> getBoundary() {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultProductCurve.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultProductCurve.java
index 94827b9490..46edccafc8 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultProductCurve.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultProductCurve.java
@@ -18,6 +18,7 @@ package org.apache.sis.geometries.internal.shared;
 
 import java.util.List;
 import org.apache.sis.geometries.Curve;
+import org.apache.sis.geometries.GeometryType;
 import org.apache.sis.geometries.cs.Projection;
 import org.apache.sis.geometries.curve.ProductCurve;
 import org.apache.sis.maths.Array;
@@ -55,7 +56,7 @@ public non-sealed class DefaultProductCurve extends 
DefaultGeometryCollection<Cu
     public DefaultProductCurve(final Range<?> parameterRange, final 
List<Projection> projections,
             final Curve... elements)
     {
-        super(elements);
+        super(GeometryType.CURVE, elements);
         this.parameterRange = parameterRange;
         this.projections    = (projections == null) ? List.of() : 
List.copyOf(projections);
     }
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultRawMultiPoint.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultRawMultiPoint.java
index e1c553536e..4d76f442d6 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultRawMultiPoint.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultRawMultiPoint.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.geometries.internal.shared;
 
+import org.apache.sis.geometries.GeometryType;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.apache.sis.geometries.Point;
 import org.apache.sis.geometries.point.MultiPoint;
@@ -32,7 +33,7 @@ public non-sealed class DefaultRawMultiPoint extends 
DefaultGeometryCollection<P
     }
 
     public DefaultRawMultiPoint(CoordinateReferenceSystem fallbackCRS, Point[] 
geometries) {
-        super(fallbackCRS, geometries);
+        super(GeometryType.POINT, fallbackCRS, geometries);
     }
 
 }
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/DefaultSolid.java
similarity index 52%
copy from 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultPolyhedron.java
copy to 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultSolid.java
index 37dee66304..4cc582d057 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/DefaultSolid.java
@@ -17,14 +17,19 @@
 package org.apache.sis.geometries.internal.shared;
 
 import java.util.List;
-import java.util.Objects;
 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.Geometry;
-import org.apache.sis.geometries.solid.Polyhedron;
-import org.apache.sis.geometries.surface.MultiPolygon;
+import org.apache.sis.geometries.GeometryCollection;
+import org.apache.sis.geometries.GeometryFactory;
+import org.apache.sis.geometries.GeometryType;
+import org.apache.sis.geometries.Solid;
+import org.apache.sis.geometries.Surface;
+import org.apache.sis.geometry.GeneralEnvelope;
 
 
 /**
@@ -32,45 +37,33 @@ import org.apache.sis.geometries.surface.MultiPolygon;
  *
  * @author Johann Sorel (Geomatys)
  */
-public non-sealed class DefaultPolyhedron extends AbstractGeometry implements 
Polyhedron {
+public non-sealed class DefaultSolid extends AbstractGeometry implements Solid 
{
 
-    private final MultiPolygon exterior;
-    private final List<MultiPolygon> interiors;
+    private final List<Surface> boundaries;
 
-    public DefaultPolyhedron(MultiPolygon exterior) {
-        this(exterior, null);
-    }
-
-    public DefaultPolyhedron(MultiPolygon exterior, List<MultiPolygon> 
interiors) {
-        this.exterior  = Objects.requireNonNull(exterior);
-        this.interiors = (interiors == null) ? List.of() : 
List.copyOf(interiors);
+    public DefaultSolid(List<Surface> boundaries) {
+        this.boundaries = (boundaries == null) ? List.of() : 
List.copyOf(boundaries);
     }
 
     @Override
-    public MultiPolygon getExteriorShell() {
-        return exterior;
-    }
-
-    @Override
-    public List<MultiPolygon> getInteriorShells() {
-        return interiors;
+    public GeometryType getGeometryType() {
+        return GeometryType.SOLID;
     }
 
     @Override
     public boolean isEmpty() {
-        return exterior.isEmpty();
+        return boundaries.isEmpty();
     }
 
     @Override
     public CoordinateReferenceSystem getCoordinateReferenceSystem() {
-        return exterior.getCoordinateReferenceSystem();
+        return boundaries.get(0).getCoordinateReferenceSystem();
     }
 
     @Override
     public void setCoordinateReferenceSystem(CoordinateReferenceSystem cs) 
throws IllegalArgumentException {
-        exterior.setCoordinateReferenceSystem(cs);
-        for (final MultiPolygon interior : interiors) {
-            interior.setCoordinateReferenceSystem(cs);
+        for (final Surface boundary : boundaries) {
+            boundary.setCoordinateReferenceSystem(cs);
         }
     }
 
@@ -80,12 +73,41 @@ public non-sealed class DefaultPolyhedron extends 
AbstractGeometry implements Po
      */
     @Override
     public Envelope getEnvelope() {
-        return exterior.getEnvelope();
+        GeneralEnvelope e = null;
+        for (int i = 0, n = boundaries.size(); i < n; i++) {
+            Surface sn = boundaries.get(i);
+            Envelope envelope = sn.getEnvelope();
+            if (envelope != null) {
+                if (e == null) {
+                    e = new GeneralEnvelope(envelope);
+                } else {
+                    e.add(envelope);
+                }
+            }
+        }
+        if (e == null) {
+            e = new GeneralEnvelope(getCoordinateReferenceSystem());
+            e.setToNaN();
+        }
+        return e;
     }
 
     @Override
-    public Geometry getBoundary() {
-        throw new UnsupportedOperationException("Not supported yet.");
+    public DataPoints getDataPoints() {
+        if (boundaries.isEmpty()) {
+            return new EmptyDataPoints(getCoordinateReferenceSystem());
+        }
+        return ConcatenatedDataPoints.of(boundaries.toArray(Geometry[]::new));
+    }
+
+    @Override
+    public DataPointsType getDataPointsType() {
+        return boundaries.get(0).getDataPointsType();
+    }
+
+    @Override
+    public GeometryCollection<? extends Surface> getBoundary() {
+        return 
GeometryFactory.DEFAULT.createGeometryCollection(GeometryType.SURFACE, 
getCoordinateReferenceSystem(), boundaries.toArray(Surface[]::new));
     }
 
     @Override
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
index 774c23d703..6637257f8c 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java
@@ -24,12 +24,14 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.TransformException;
 import org.apache.sis.geometries.DataPoints;
 import org.apache.sis.geometries.Geometries;
 import org.apache.sis.geometries.Geometry;
 import org.apache.sis.geometries.GeometryCollection;
+import org.apache.sis.geometries.GeometryType;
 import org.apache.sis.geometries.internal.shared.AbstractGeometry;
 import org.apache.sis.geometries.internal.shared.ConcatenatedDataPoints;
 import org.apache.sis.geometries.internal.shared.EmptyDataPoints;
@@ -67,6 +69,11 @@ public final class MultiMeshPrimitive<T extends 
MeshPrimitive> extends AbstractG
         append(Arrays.asList(primitives));
     }
 
+    @Override
+    public Set<GeometryType> getElementType() {
+        return Set.of(GeometryType.GEOMETRY);
+    }
+
     @Override
     public CoordinateReferenceSystem getCoordinateReferenceSystem() {
         for (MeshPrimitive p : primitives) {
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 e3477f7bcd..6b77a450f6 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
@@ -21,11 +21,13 @@ 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.Surface;
 import org.apache.sis.geometries.curve.LinearRing;
 import org.apache.sis.geometries.internal.shared.AbstractGeometry;
 import org.apache.sis.geometries.solid.Polyhedron;
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.geometries.spherical.SphericalConvexPolygon;
 import org.apache.sis.geometries.surface.MultiPolygon;
 import org.apache.sis.geometries.surface.Polygon;
@@ -99,7 +101,7 @@ public abstract sealed class AbstractPolyhedron extends 
AbstractGeometry impleme
     }
 
     @Override
-    public Geometry getBoundary() {
+    public GeometryCollection<? extends Surface> getBoundary() {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/GreatCircleArc.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/GreatCircleArc.java
index 67075662a5..aa8f8b5b01 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/GreatCircleArc.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/GreatCircleArc.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.geometries.spherical;
 
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.maths.Maths;
 import org.apache.sis.maths.ReadOnly;
 
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalConvexPolygon.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalConvexPolygon.java
index 7dd163507b..373a0aca3a 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalConvexPolygon.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalConvexPolygon.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.geometries.spherical;
 
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.maths.Array;
 import org.apache.sis.maths.ReadOnly;
 import org.apache.sis.maths.Vector3D;
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalTriangle.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalTriangle.java
index 981c965bdf..c5638cfeaf 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalTriangle.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/spherical/SphericalTriangle.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.geometries.spherical;
 
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.maths.Maths;
 import org.apache.sis.maths.ReadOnly;
 import org.apache.sis.util.ArgumentChecks;
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Capsule.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java
similarity index 99%
rename from 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Capsule.java
rename to 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java
index 3844d76e30..2eff91b59d 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Capsule.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Capsule.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.geometries.solid;
+package org.apache.sis.geometries.surface;
 
 import java.util.Objects;
 import static org.opengis.annotation.Specification.ISO_12113;
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Cylinder.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Cylinder.java
similarity index 99%
rename from 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Cylinder.java
rename to 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Cylinder.java
index afb3967b1e..3651df2c36 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Cylinder.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Cylinder.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.geometries.solid;
+package org.apache.sis.geometries.surface;
 
 import java.util.Objects;
 import static org.opengis.annotation.Specification.ISO_12113;
@@ -30,8 +30,8 @@ import 
org.apache.sis.geometries.internal.shared.AbstractGeometry;
 import org.apache.sis.maths.DataType;
 import org.apache.sis.maths.NDArrays;
 import org.apache.sis.maths.ReadOnly;
-import org.apache.sis.maths.Vector;
 import org.apache.sis.maths.Vectors;
+import org.apache.sis.maths.Vector;
 
 
 /**
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Ellipsoid.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java
similarity index 99%
rename from 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Ellipsoid.java
rename to 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java
index 679bcdb8e1..4a87f4321e 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Ellipsoid.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Ellipsoid.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.geometries.solid;
+package org.apache.sis.geometries.surface;
 
 import java.util.Arrays;
 import java.util.List;
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/ParametricCurveSurface.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/ParametricCurveSurface.java
index df0b18c59b..035db3fd45 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/ParametricCurveSurface.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/ParametricCurveSurface.java
@@ -26,8 +26,6 @@ import org.apache.sis.geometries.DataPoints;
 import org.apache.sis.geometries.GeometryType;
 import org.apache.sis.geometries.Surface;
 import org.apache.sis.geometries.SurfaceInterpolation;
-import org.apache.sis.geometries.solid.Ellipsoid;
-import org.apache.sis.geometries.solid.Sphere;
 
 
 /**
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Sphere.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java
similarity index 99%
rename from 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Sphere.java
rename to 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java
index af09fd9b2a..6049fd9bf3 100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Sphere.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/surface/Sphere.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.geometries.solid;
+package org.apache.sis.geometries.surface;
 
 import java.util.List;
 import javax.measure.Quantity;
diff --git 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/GreatCircleArcTest.java
 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/GreatCircleArcTest.java
index d742aa3356..497fc6604f 100644
--- 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/GreatCircleArcTest.java
+++ 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/GreatCircleArcTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.geometries.spherical;
 
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.maths.ReadOnly;
 import org.apache.sis.maths.Vector3D;
 
diff --git 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalConvexPolygonTest.java
 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalConvexPolygonTest.java
index d74d5c2fb1..fd98150822 100644
--- 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalConvexPolygonTest.java
+++ 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalConvexPolygonTest.java
@@ -17,7 +17,7 @@
 package org.apache.sis.geometries.spherical;
 
 import java.util.List;
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.maths.Array;
 import org.apache.sis.maths.DataType;
 import org.apache.sis.maths.NDArrays;
diff --git 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalTriangleTest.java
 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalTriangleTest.java
index e80fc887b1..8ed5495a34 100644
--- 
a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalTriangleTest.java
+++ 
b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/spherical/SphericalTriangleTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sis.geometries.spherical;
 
-import org.apache.sis.geometries.solid.Sphere;
+import org.apache.sis.geometries.surface.Sphere;
 import org.apache.sis.maths.ReadOnly;
 import org.apache.sis.maths.Vector3D;
 

Reply via email to