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 3f5c1731b1d7d4d3a1c04175240790e4e5ea7105
Author: jsorel <[email protected]>
AuthorDate: Fri Oct 9 12:25:04 2026 +0200

    feat(Geometry): map GeometryType enum to matching Java class
---
 .../main/org/apache/sis/geometries/Curve.java      |   2 +
 .../org/apache/sis/geometries/GeometryType.java    | 184 ++++++++++++++-------
 .../main/org/apache/sis/geometries/curve/Line.java | 161 ++++++++++++++++++
 .../geometries/internal/shared/DefaultLine.java    |  87 ++++++++++
 4 files changed, 370 insertions(+), 64 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 ffbeb07625..9d731eb4c8 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
@@ -28,6 +28,7 @@ import org.apache.sis.geometries.curve.CompoundCurve;
 import org.apache.sis.geometries.curve.Conic;
 import org.apache.sis.geometries.curve.FunctionCurve;
 import org.apache.sis.geometries.curve.Geodesic;
+import org.apache.sis.geometries.curve.Line;
 import org.apache.sis.geometries.curve.LineString;
 import org.apache.sis.geometries.curve.OffsetCurve;
 import org.apache.sis.geometries.curve.ProductCurve;
@@ -74,6 +75,7 @@ public sealed interface Curve extends Orientable
                 Conic,
                 FunctionCurve,
                 Geodesic,
+                Line,
                 LineString,
                 OffsetCurve,
                 ProductCurve,
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 9a5a86d1bf..1c158f2b6d 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
@@ -16,6 +16,50 @@
  */
 package org.apache.sis.geometries;
 
+import org.apache.sis.geometries.curve.Arc;
+import org.apache.sis.geometries.curve.ArcByBulge;
+import org.apache.sis.geometries.curve.ArcByCenterPoint;
+import org.apache.sis.geometries.curve.BSplineCurve;
+import org.apache.sis.geometries.curve.Bezier;
+import org.apache.sis.geometries.curve.Circle;
+import org.apache.sis.geometries.curve.CircularString;
+import org.apache.sis.geometries.curve.Clothoid;
+import org.apache.sis.geometries.curve.CompoundCurve;
+import org.apache.sis.geometries.curve.Conic;
+import org.apache.sis.geometries.curve.CubicSpline;
+import org.apache.sis.geometries.curve.EllipticArc;
+import org.apache.sis.geometries.curve.Geodesic;
+import org.apache.sis.geometries.curve.Line;
+import org.apache.sis.geometries.curve.LineString;
+import org.apache.sis.geometries.curve.LinearRing;
+import org.apache.sis.geometries.curve.MultiCurve;
+import org.apache.sis.geometries.curve.MultiLineString;
+import org.apache.sis.geometries.curve.NurbCurve;
+import org.apache.sis.geometries.curve.OffsetCurve;
+import org.apache.sis.geometries.curve.PolynomialSpline;
+import org.apache.sis.geometries.curve.ProductCurve;
+import org.apache.sis.geometries.curve.Rhumb;
+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.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.BSplineSurface;
+import org.apache.sis.geometries.surface.BilinearGrid;
+import org.apache.sis.geometries.surface.CurvePolygon;
+import org.apache.sis.geometries.surface.MultiPolygon;
+import org.apache.sis.geometries.surface.MultiSurface;
+import org.apache.sis.geometries.surface.NurbSurface;
+import org.apache.sis.geometries.surface.Polygon;
+import org.apache.sis.geometries.surface.PolyhedralSurface;
+import org.apache.sis.geometries.surface.TIN;
+import org.apache.sis.geometries.surface.Triangle;
 import static org.opengis.annotation.Specification.ISO_19107;
 import org.opengis.annotation.UML;
 
@@ -41,227 +85,219 @@ public enum GeometryType {
     /**
      * The empty set, of topological dimension −1.
      */
-    EMPTY,
+    EMPTY(Empty.class),
     /**
      * The abstract root of all geometry types.
      */
-    GEOMETRY,
+    GEOMETRY(Geometry.class),
     /**
      * A collection behaving as the set union of its elements.
      */
-    COLLECTION,
+    COLLECTION(GeometryCollection.class),
 
     //point types
     /**
      * A single location, of topological dimension 0.
      */
-    POINT,
+    POINT(Point.class),
     /**
      * A collection of points.
      */
-    MULTIPOINT,
+    MULTIPOINT(MultiPoint.class),
 
     //curve types
     /**
      * A curve of unspecified interpolation, of topological dimension 1.
      */
-    CURVE,
+    CURVE(Curve.class),
     /**
      * A curve using a linear interpolation in the coordinate system.
      */
-    LINE,
+    LINE(Line.class),
     /**
      * A sequence of segments using a linear interpolation.
      */
-    LINESTRING,
+    LINESTRING(LineString.class),
     /**
      * A {@linkplain #LINESTRING} whose start point is its end point.
      */
-    LINEARRING,
+    LINEARRING(LinearRing.class),
     /**
      * A sequence of segments using a circular interpolation.
      */
-    CIRCULARSTRING,
+    CIRCULARSTRING(CircularString.class),
     /**
      * A curve made of contiguous curves of possibly different interpolations.
      */
-    COMPOUNDCURVE,
+    COMPOUNDCURVE(CompoundCurve.class),
     /**
      * A curve following the shortest path on the geometric reference surface.
      */
-    GEODESIC,
+    GEODESIC(Geodesic.class),
     /**
      * A curve of constant azimuth, also called loxodrome.
      */
-    RHUMB,
+    RHUMB(Rhumb.class),
     /**
      * A portion of a circle defined by three points.
      */
-    ARC,
+    ARC(Arc.class),
     /**
      * A portion of a circle defined by two points and a bulge factor.
      */
-    ARCBYBULGE,
+    ARCBYBULGE(ArcByBulge.class),
     /**
      * A portion of a circle defined by its center, its radius and two angles.
      */
-    ARCBYCENTERPOINT,
+    ARCBYCENTERPOINT(ArcByCenterPoint.class),
     /**
      * A closed {@linkplain #ARC}.
      */
-    CIRCLE,
+    CIRCLE(Circle.class),
     /**
      * A portion of an ellipse.
      */
-    ELLIPTICARC,
+    ELLIPTICARC(EllipticArc.class),
     /**
      * A curve defined by a conic section.
      */
-    CONIC,
+    CONIC(Conic.class),
     /**
      * A curve whose curvature varies linearly with its length, also called 
Euler spiral.
      */
-    CLOTHOID,
+    CLOTHOID(Clothoid.class),
     /**
      * A curve winding around a center point.
      */
-    SPIRAL,
+    SPIRAL(Spiral.class),
     /**
      * A curve at a constant distance from another curve.
      */
-    OFFSETCURVE,
+    OFFSETCURVE(OffsetCurve.class),
     /**
      * A curve defined as the product of two other curves.
      */
-    PRODUCTCURVE,
+    PRODUCTCURVE(ProductCurve.class),
     /**
      * A curve interpolated by spline functions.
      */
-    SPLINECURVE,
+    SPLINECURVE(SplineCurve.class),
     /**
      * A curve interpolated by B-spline basis functions.
      */
-    BSPLINECURVE,
+    BSPLINECURVE(BSplineCurve.class),
     /**
      * A curve interpolated by cubic polynomials.
      */
-    CUBICSPLINE,
+    CUBICSPLINE(CubicSpline.class),
     /**
      * A curve interpolated by polynomials of arbitrary degree.
      */
-    POLYNOMIALSPLINE,
+    POLYNOMIALSPLINE(PolynomialSpline.class),
     /**
      * A curve interpolated by Bernstein polynomials over its control points.
      */
-    BEZIER,
+    BEZIER(Bezier.class),
     /**
      * A curve interpolated by non-uniform rational B-spline basis functions.
      */
-    NURBSCURVE,
+    NURBSCURVE(NurbCurve.class),
     /**
      * A collection of curves.
      */
-    MULTICURVE,
+    MULTICURVE(MultiCurve.class),
     /**
      * A collection of {@linkplain #LINESTRING}.
      */
-    MULTILINESTRING,
+    MULTILINESTRING(MultiLineString.class),
 
     //surface types
     /**
      * A surface of unspecified interpolation, of topological dimension 2.
      */
-    SURFACE,
+    SURFACE(Surface.class),
     /**
      * A surface defined only by its boundary rings and a spanning surface.
      */
-    POLYGON,
+    POLYGON(Polygon.class),
     /**
      * A {@linkplain #POLYGON} with exactly three distinct non-collinear 
points and no interior ring.
      */
-    TRIANGLE,
+    TRIANGLE(Triangle.class),
     /**
      * A {@linkplain #POLYGON} whose rings may use any curve interpolation.
      */
-    CURVEPOLYGON,
+    CURVEPOLYGON(CurvePolygon.class),
     /**
      * A surface made of contiguous polygon patches.
      */
-    POLYHEDRALSURFACE,
+    POLYHEDRALSURFACE(PolyhedralSurface.class),
     /**
      * A {@linkplain #POLYHEDRALSURFACE} whose patches are triangles.
      */
-    TIN,
+    TIN(TIN.class),
     /**
      * A surface interpolated bilinearly over a grid of control points.
      */
-    BILINEARGRID,
-    /**
-     * A surface interpolated by spline functions.
-     */
-    SPLINESURFACE,
+    BILINEARGRID(BilinearGrid.class),
     /**
      * A surface interpolated by B-spline basis functions.
      */
-    BSPLINESURFACE,
+    BSPLINESURFACE(BSplineSurface.class),
     /**
      * A surface interpolated by non-uniform rational B-spline basis functions.
      */
-    NURBSSURFACE,
+    NURBSSURFACE(NurbSurface.class),
     /**
      * A collection of {@linkplain #POLYGON}.
      */
-    MULTIPOLYGON,
+    MULTIPOLYGON(MultiPolygon.class),
     /**
      * A collection of surfaces.
      */
-    MULTISURFACE,
+    MULTISURFACE(MultiSurface.class),
 
     //solid types
     /**
      * A solid of unspecified interpolation, of topological dimension 3.
      */
-    SOLID,
+    SOLID(Solid.class),
     /**
      * A solid bounded by planar faces.
      */
-    POLYHEDRON,
+    POLYHEDRON(Polyhedron.class),
     /**
      * A collection of {@linkplain #POLYHEDRON}.
      */
-    MULTIPOLYHEDRON,
-    /**
-     * A solid interpolated by spline functions, of topological dimension 3.
-     */
-    SPLINESOLID,
+    MULTIPOLYHEDRON(MultiPolyhedron.class),
     /**
      * A solid interpolated by B-spline basis functions.
      */
-    BSPLINESOLID,
+    BSPLINESOLID(BSplineSolid.class),
     /**
      * A solid bounded by the positions at a constant distance from a center 
point.
      */
-    SPHERE,
+    SPHERE(Sphere.class),
     /**
      * A {@linkplain #SPHERE} scaled by a distinct factor along each axis of 
the coordinate system.
      */
-    ELLIPSOID,
+    ELLIPSOID(Ellipsoid.class),
     /**
      * A solid bounded by a lateral surface and two parallel bases.
      */
-    CYLINDER,
+    CYLINDER(Cylinder.class),
     /**
      * A {@linkplain #CYLINDER} closed by a half-sphere at each end.
      */
-    CAPSULE,
+    CAPSULE(Capsule.class),
     /**
      * The portion of a solid lying between two parallel planes.
      */
-    FRUSTRUM,
+    FRUSTRUM(Frustrum.class),
     /**
      * A solid swept by translating a surface along a direction.
      */
-    PRISM,
+    PRISM(Prism.class),
 
     /*
      * Types having no equivalent in OGC Simple Feature Access.
@@ -269,17 +305,37 @@ public enum GeometryType {
     /**
      * A rectangle whose sides are parallel to the axes of the coordinate 
system.
      */
-    BBOX,
+    BBOX(BBox.class),
     /**
      * An unbounded flat surface in a three-dimensional coordinate system.
      */
-    PLANE,
+    PLANE(Plane.class),
     /**
      * A half-line, defined by an origin and a direction.
      */
-    RAY,
+    RAY(Ray.class),
     /**
      * The generalization of {@link #PLANE} to a coordinate system of any 
dimension.
      */
-    HYPERPLANE,
+    HYPERPLANE(HyperPlane.class);
+
+
+    final Class<? extends Geometry> javaClass;
+
+    private GeometryType(Class<? extends Geometry> c) {
+        this.javaClass = c;
+    }
+
+    public Class<? extends Geometry> getJavaClass() {
+        return javaClass;
+    }
+
+    public boolean isAssignableFrom(GeometryType type) {
+        return javaClass.isAssignableFrom(type.javaClass);
+    }
+
+    public boolean isInstance(Geometry geom) {
+        return javaClass.isInstance(geom);
+    }
+
 }
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/curve/Line.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/curve/Line.java
new file mode 100644
index 0000000000..7694226626
--- /dev/null
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/curve/Line.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.geometries.curve;
+
+import javax.measure.Quantity;
+import javax.print.attribute.standard.MediaSize.ISO;
+import static org.opengis.annotation.Specification.ISO_19107;
+import org.opengis.annotation.UML;
+import org.opengis.geometry.Envelope;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.apache.sis.geometries.Curve;
+import org.apache.sis.geometries.CurveInterpolation;
+import org.apache.sis.geometries.DataPoints;
+import org.apache.sis.geometries.GeometryType;
+import org.apache.sis.geometries.Point;
+import org.apache.sis.geometries.DataPointsType;
+import org.apache.sis.geometries.internal.shared.DefaultLine;
+import org.apache.sis.geometries.internal.shared.DefaultLineString;
+import org.apache.sis.maths.Array;
+
+
+/**
+ * A curve using a linear interpolation between two data points,
+ * each consecutive pair of points defining a line segment.
+ *
+ * <p>Constraints:</p>
+ * <ul>
+ *   <li>At least two data points, the first one being the {@linkplain 
#getStartPoint() start point}
+ *       and the last one the {@linkplain #getEndPoint() end point}.</li>
+ *   <li>The position at the construction parameter <var>λ</var> between two 
consecutive data points
+ *       <var>P<sub>i</sub></var> and <var>P<sub>i+1</sub></var> is
+ *       (1 − <var>λ</var>)⋅<var>P<sub>i</sub></var> + 
<var>λ</var>⋅<var>P<sub>i+1</sub></var>
+ *       for <var>λ</var> ∈ [0 … 1].</li>
+ * </ul>
+ *
+ * <p>Note: ISO 19107 names this class a {@code Line}, even if it has more 
than 2 points.</p>
+ *
+ * @author Johann Sorel (Geomatys)
+ *
+ * @see OGC Simple Feature Access 1.2.1 - 6.1.7
+ * @see ISO 19107:2019 - 7.1.2
+ */
+@UML(identifier="Line", specification=ISO_19107)
+public sealed interface Line extends Curve
+        permits DefaultLine
+{
+
+    /**
+     * Well-known text keyword of this geometry type.
+     */
+    static final String TYPE = "LINE";
+
+    /**
+     * Returns {@link GeometryType#LINE}.
+     *
+     * @see ISO 19107:2019 - 6.4.4.23
+     */
+    @Override
+    default GeometryType getGeometryType() {
+        return GeometryType.LINE;
+    }
+
+    /**
+     * Returns {@link CurveInterpolation#LINEAR}.
+     *
+     * @see ISO 19107:2019 - 7.1.2.2
+     */
+    @UML(identifier="interpolation", specification=ISO_19107)
+    @Override
+    default CurveInterpolation getInterpolation() {
+        return CurveInterpolation.LINEAR;
+    }
+
+    /**
+     * Returns {@code this}, since a line string is already a linear 
approximation of itself.
+     *
+     * @see ISO 19107:2019 - 6.4.18.17
+     */
+    @Override
+    default LineString asLine(Quantity<?> spacing, Quantity<?> offset) {
+        return new DefaultLineString(getDataPoints());
+    }
+
+    /**
+     * The number of Points in this LineString.
+     *
+     * @see OGC Simple Feature Access 1.2.1 - 6.1.7.2
+     * @return number of Points in this LineString.
+     */
+    default int getNumPoints() {
+        return getDataPoints().size();
+    }
+
+    /**
+     * Returns the specified Point N in this LineString.
+     *
+     * @see OGC Simple Feature Access 1.2.1 - 6.1.7.2
+     * @return the specified Point N in this LineString.
+     */
+    default Point getPointN(int n) {
+        return getDataPoints().getPoint(n);
+    }
+
+    /**
+     * @return null, a LineString has no control points
+     *
+     * @see ISO 19107:2019 - 6.4.18.2
+     */
+    @Override
+    default Array getControlPoints() {
+        return null;
+    }
+
+    @Override
+    default CoordinateReferenceSystem getCoordinateReferenceSystem() {
+        return getDataPoints().getCoordinateReferenceSystem();
+    }
+
+    @Override
+    default void setCoordinateReferenceSystem(CoordinateReferenceSystem cs) 
throws IllegalArgumentException {
+        getDataPoints().setCoordinateReferenceSystem(cs);
+    }
+
+    @Override
+    default DataPointsType getDataPointsType() {
+        return getDataPoints().getType();
+    }
+
+    /**
+     * A Line is a LineString with exactly 2 Points.
+     *
+     * @return true if lineString is a line.
+     */
+    default boolean isLine() {
+        return getDataPoints().size() == 2;
+    }
+
+    @Override
+    default Envelope getEnvelope() {
+        DataPoints points = getDataPoints();
+        if (points.isEmpty()) {
+            return null;
+        }
+        return points.getEnvelope();
+    }
+
+}
diff --git 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultLine.java
 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultLine.java
new file mode 100644
index 0000000000..61172ef87e
--- /dev/null
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultLine.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.geometries.internal.shared;
+
+import javax.measure.Quantity;
+import org.apache.sis.geometries.DataPoints;
+import org.apache.sis.geometries.Geometries;
+import org.apache.sis.geometries.Point;
+import org.apache.sis.geometries.curve.Line;
+import org.apache.sis.measure.Quantities;
+
+
+/**
+ *
+ * @author Johann Sorel (Geomatys)
+ */
+public non-sealed class DefaultLine extends AbstractGeometry implements Line {
+
+    private final DataPoints points;
+
+    public DefaultLine(DataPoints points) {
+        this.points = points;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return points.isEmpty();
+    }
+
+    @Override
+    public DataPoints getDataPoints() {
+        return points;
+    }
+
+    @Override
+    public Quantity<?> getLength() {
+        //TODO : fallback on JTS until implemented
+        return Quantities.create(asJTS().getLength(), 
Geometries.getLinearUnit(this));
+    }
+
+    @Override
+    public Point getCentroid() {
+        if (isEmpty()) {
+            // The centroid of the empty set is undefined.
+            return null;
+        }
+        //TODO : fallback on JTS until implemented
+        return (Point) fromJTS(asJTS().getCentroid());
+    }
+
+    @Override
+    public Point getRepresentativePoint() {
+        if (isEmpty()) {
+            // The empty set has no interior position.
+            return null;
+        }
+        //TODO : fallback on JTS until implemented
+        return (Point) fromJTS(asJTS().getInteriorPoint());
+    }
+
+    @Override
+    public boolean isSimple() {
+        //TODO : fallback on JTS until implemented
+        return asJTS().isSimple();
+    }
+
+    @Override
+    public boolean isValid() {
+        //TODO : fallback on JTS until implemented
+        return asJTS().isValid();
+    }
+
+}

Reply via email to