This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch geoapi-3.1
in repository https://gitbox.apache.org/repos/asf/sis.git

commit fac1549bcd691de3a7c8711dc31a440278a12d9a
Merge: 80c161ba8d 914b87d356
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Wed Sep 30 00:41:35 2026 +0900

    Merge branch 'geoapi-4.0' into geoapi-3.1

 README.md                                          |    1 +
 .../org.apache.sis.feature/main/module-info.java   |    4 +-
 .../apache/sis/coverage/grid/GridCRSBuilder.java   |    2 +-
 .../apache/sis/metadata/internal/Resources.java    |    5 +
 .../sis/metadata/internal/Resources.properties     |    1 +
 .../sis/metadata/internal/Resources_fr.properties  |    1 +
 .../metadata/sql/internal/shared/SQLBuilder.java   |   10 +-
 .../main/org/apache/sis/xml/IdentifierSpace.java   |    4 +-
 .../main/org/apache/sis/xml/ReferenceResolver.java |   83 +-
 .../main/org/apache/sis/xml/XML.java               |   30 +-
 .../main/org/apache/sis/xml/bind/Context.java      |   13 +-
 .../xml/internal/shared/ExternalLinkHandler.java   |   31 +-
 .../sis/xml/internal/shared/InputFactory.java      |   49 +-
 .../apache/sis/xml/internal/shared/URISource.java  |   48 +-
 .../main/org/apache/sis/xml/package-info.java      |    2 +-
 .../sql/internal/shared/SQLBuilderTest.java        |   12 +
 .../org/apache/sis/metadata/xml/TestUsingFile.java |   17 +
 .../sis/metadata/xml/extern/UsingExternalXLink.xml |   51 +
 .../org/apache/sis/xml/ReferenceResolverMock.java  |    1 +
 .../org/apache/sis/xml/ReferenceResolverTest.java  |  109 +-
 .../main/org/apache/sis/io/wkt/WKTFormat.java      |    5 +-
 .../sis/parameter/DefaultParameterValue.java       |   60 +-
 .../main/org/apache/sis/parameter/Parameters.java  |   11 +-
 .../factory/ConcurrentAuthorityFactory.java        |    8 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |    9 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |    4 +-
 .../operation/AbstractSingleOperation.java         |    2 +-
 .../referencing/operation/DefiningConversion.java  |  100 +-
 .../referencing/operation/gridded/GridFile.java    |  223 +---
 .../referencing/operation/gridded/LoadedGrid.java  |    6 +-
 .../provider/FranceGeocentricInterpolation.java    |   12 +-
 .../sis/referencing/operation/provider/NADCON.java |   16 +-
 .../sis/referencing/operation/provider/NTv2.java   |   35 +-
 .../transform/InterpolatedGeocentricTransform.java |    4 +-
 .../InterpolatedGeocentricTransform2D.java         |    2 +-
 .../operation/transform/MathTransformBuilder.java  |   59 +-
 .../xml/bind/referencing/CC_OperationMethod.java   |    4 +-
 .../org/apache/sis/xml/bind/referencing/Code.java  |    3 +-
 .../test/org/apache/sis/io/wkt/ElementTest.java    |    3 +-
 .../operation/gridded/GridFileTest.java            |  117 ++
 .../operation/provider/DatumShiftTestCase.java     |   67 -
 .../FranceGeocentricInterpolationTest.java         |   75 +-
 .../provider/GeocentricTranslationTest.java        |    2 +-
 .../referencing/operation/provider/NADCONTest.java |   52 +-
 .../referencing/operation/provider/NTv2Test.java   |   49 +-
 .../provider/PositionVector7ParamTest.java         |    3 +-
 .../InterpolatedGeocentricTransformTest.java       |   47 +-
 .../transform/InterpolatedTransformTest.java       |   35 +-
 .../sis/test/integration/DatumShiftTest.java       |    8 +-
 .../main/module-info.java                          |    2 +-
 .../main/org/apache/sis/storage/landsat/Band.java  |   36 +-
 .../apache/sis/storage/landsat/LandsatStore.java   |   14 +-
 .../apache/sis/storage/landsat/MetadataReader.java |    6 +-
 .../sis/storage/landsat}/internal/Resources.java   |  113 +-
 .../storage/landsat}/internal/Resources.properties |   12 +-
 .../sis/storage/landsat/internal/Resources_en.java |   19 +-
 .../sis/storage/landsat/internal/Resources_fr.java |   19 +-
 .../landsat/internal/Resources_fr.properties}      |   17 +-
 .../sis/storage/landsat/internal/package-info.java |   22 +-
 .../apache/sis/storage/landsat/package-info.java   |    2 +-
 .../storage/landsat/LandsatStoreProviderTest.java  |   92 +-
 .../sis/storage/landsat/MetadataReaderTest.java    |    7 +-
 .../apache/sis/storage/geotiff/DeferredEntry.java  |   29 +-
 .../org/apache/sis/storage/geotiff/Reader.java     |   11 +-
 .../geotiff/reader/ImageMetadataBuilder.java       |    1 +
 .../apache/sis/storage/netcdf/MetadataReader.java  |   11 +-
 .../sis/storage/netcdf/classic/ChannelDecoder.java |   27 +-
 .../org.apache.sis.storage/main/module-info.java   |    1 +
 .../main/org/apache/sis/io/stream/ChannelData.java |   11 +-
 .../org/apache/sis/io/stream/ChannelDataInput.java |   18 +
 .../main/org/apache/sis/io/stream/IOUtilities.java |   17 +
 .../org/apache/sis/storage/base/URIDataStore.java  |    4 +-
 .../org/apache/sis/storage/event/WarningEvent.java |   18 +-
 .../org/apache/sis/storage/event/package-info.java |    4 +-
 .../main/org/apache/sis/storage/wkt/Store.java     |    1 +
 .../main/org/apache/sis/storage/xml/Store.java     |    4 +-
 .../src/org.apache.sis.util/main/module-info.java  |    1 +
 .../main/org/apache/sis/io/Authorization.java      |   71 +
 .../main/org/apache/sis/io/package-info.java       |   34 +-
 .../main/org/apache/sis/setup/Configuration.java   |   38 +-
 .../main/org/apache/sis/system/DataURI.java        |  226 ++++
 .../main/org/apache/sis/system/Environment.java    |    8 +
 .../sis/util/internal/AutoMessageFormat.java       |   22 +-
 .../apache/sis/util/internal/shared/Strings.java   |   78 ++
 .../apache/sis/util/logging/MonolineFormatter.java |   44 +-
 .../main/org/apache/sis/util/resources/Errors.java |    5 +
 .../apache/sis/util/resources/Errors.properties    |    1 +
 .../apache/sis/util/resources/Errors_fr.properties |    3 +-
 .../sis/util/resources/IndexedResourceBundle.java  |   18 +-
 .../org.apache.sis.geometry/main/module-info.java  |   19 +-
 .../sis/geometries/AttributeInterpolation.java     |   50 +
 ...rpolation.java => AttributeTransformation.java} |   31 +-
 .../main/org/apache/sis/geometries/BBox.java       |   14 +-
 .../org/apache/sis/geometries/BoundaryType.java    |   25 +
 .../main/org/apache/sis/geometries/Curve.java      |  635 +++++++--
 .../apache/sis/geometries/CurveInterpolation.java  |   76 +-
 .../org/apache/sis/geometries/CurvePolygon.java    |  109 --
 .../main/org/apache/sis/geometries/DE9IM.java      |  512 +++++++
 .../{PointSequence.java => DataPoints.java}        |   41 +-
 .../{AttributesType.java => DataPointsType.java}   |  130 +-
 .../main/org/apache/sis/geometries/Empty.java      |  137 +-
 .../main/org/apache/sis/geometries/Geometries.java |  202 ++-
 .../main/org/apache/sis/geometries/Geometry.java   |  953 +++++++++++--
 .../apache/sis/geometries/GeometryCollection.java  |  129 +-
 .../org/apache/sis/geometries/GeometryFactory.java |  582 +++++++-
 .../org/apache/sis/geometries/GeometryType.java    |  249 +++-
 .../org/apache/sis/geometries/GeometryVisitor.java |   19 +-
 .../geometries/{Frustrum.java => HyperPlane.java}  |   32 +-
 .../main/org/apache/sis/geometries/Knot.java       |   34 -
 .../main/org/apache/sis/geometries/LineString.java |  121 --
 .../org/apache/sis/geometries/MultiLineString.java |   55 -
 .../main/org/apache/sis/geometries/OBBox.java      |   17 +-
 .../org/apache/sis/geometries/OffsetCurve.java     |   39 -
 .../main/org/apache/sis/geometries/Orientable.java |   76 +-
 .../apache/sis/geometries/OrientedGeometry.java    |    7 +-
 .../sis/geometries/ParametricCurveSurface.java     |   66 -
 .../main/org/apache/sis/geometries/Plane.java      |    8 +-
 .../main/org/apache/sis/geometries/Point.java      |  223 +++-
 .../main/org/apache/sis/geometries/Polygon.java    |  116 --
 .../apache/sis/geometries/PolyhedralSurface.java   |   97 --
 .../main/org/apache/sis/geometries/Primitive.java  |   75 +-
 .../main/org/apache/sis/geometries/Prism.java      |   14 +-
 .../org/apache/sis/geometries/ProductCurve.java    |   38 -
 .../main/org/apache/sis/geometries/Ray.java        |   15 +-
 .../main/org/apache/sis/geometries/Rhumb.java      |   41 -
 .../main/org/apache/sis/geometries/Solid.java      |  189 ++-
 .../apache/sis/geometries/SolidInterpolation.java  |   38 +-
 .../main/org/apache/sis/geometries/Surface.java    |  241 +++-
 .../sis/geometries/SurfaceInterpolation.java       |   63 +-
 .../main/org/apache/sis/geometries/TIN.java        |   75 --
 .../main/org/apache/sis/geometries/Wrapper.java    |  162 +--
 .../apache/sis/geometries/adapter/JTSAdapter.java  |  399 ++++++
 .../geometries/adapter/PathIteratorAdapter.java    |  269 ++++
 .../sis/geometries/adapter/ShapeAdapter.java       |  189 +++
 .../sis/geometries/adapter/ShapeConverter.java     |  331 +++++
 .../org/apache/sis/geometries/adapter/Srid.java    |  168 +++
 .../sis/geometries/adapter/WellKnownBinary.java    |  687 ++++++++++
 .../geometries/adapter/WellKnownBinaryParser.java  |  742 +++++++++++
 .../sis/geometries/adapter/WellKnownText.java      |  597 +++++++++
 .../geometries/adapter/WellKnownTextParser.java    |  871 ++++++++++++
 .../main/org/apache/sis/geometries/conics/Arc.java |   49 -
 .../sis/geometries/conics/CircularString.java      |   35 -
 .../org/apache/sis/geometries/conics/Conic.java    |   45 -
 .../apache/sis/geometries/conics/EllipticArc.java  |   30 -
 .../main/org/apache/sis/geometries/cs/Bearing.java |  210 +++
 .../sis/geometries/cs/CurveRelativeDirection.java  |   51 +-
 .../apache/sis/geometries/cs/FixedDirection.java   |   47 +-
 .../geometries/cs/GeometricCoordinateSystem.java   |    7 +-
 .../sis/geometries/cs/ReferenceDirection.java      |   23 +-
 .../sis/geometries/cs/RelativeDirection.java       |   38 +-
 .../org/apache/sis/geometries/cs/Rotation.java     |   22 +-
 .../org/apache/sis/geometries/cs/package-info.java |   30 +-
 .../geometries/csg/ConstructiveSolidGeometry.java  |    7 +-
 .../main/org/apache/sis/geometries/curve/Arc.java  |  140 ++
 .../apache/sis/geometries/curve/ArcByBulge.java    |  124 ++
 .../sis/geometries/curve/ArcByCenterPoint.java     |  145 ++
 .../apache/sis/geometries/curve/BSplineCurve.java  |   75 ++
 .../org/apache/sis/geometries/curve/Bezier.java    |   82 ++
 .../org/apache/sis/geometries/curve/Circle.java    |   69 +
 .../sis/geometries/curve/CircularString.java       |  103 ++
 .../org/apache/sis/geometries/curve/Clothoid.java  |   85 ++
 .../apache/sis/geometries/curve/CompoundCurve.java |  135 ++
 .../org/apache/sis/geometries/curve/Conic.java     |  125 ++
 .../{BilinearGrid.java => curve/ConicArc.java}     |   15 +-
 .../apache/sis/geometries/curve/CubicSpline.java   |   68 +
 .../sis/geometries/{conics => curve}/Ellipse.java  |    9 +-
 .../apache/sis/geometries/curve/EllipticArc.java   |   65 +
 .../{polynomials => curve}/FunctionArc.java        |   31 +-
 .../apache/sis/geometries/curve/FunctionCurve.java |   76 ++
 .../org/apache/sis/geometries/curve/Geodesic.java  |  131 ++
 .../geometries/{splines => curve}/KnotType.java    |   25 +-
 .../apache/sis/geometries/curve/LineString.java    |  165 +++
 .../apache/sis/geometries/curve/LinearRing.java    |   69 +
 .../sis/geometries/{ => curve}/MultiCurve.java     |   47 +-
 .../MultiLineString.java}                          |   39 +-
 .../org/apache/sis/geometries/curve/NurbCurve.java |  139 ++
 .../apache/sis/geometries/curve/OffsetCurve.java   |  115 ++
 .../{polynomials => curve}/PolynomialArc.java      |   27 +-
 .../sis/geometries/curve/PolynomialCurve.java      |   59 +
 .../sis/geometries/curve/PolynomialSpline.java     |  132 ++
 .../apache/sis/geometries/curve/ProductCurve.java  |  136 ++
 .../apache/sis/geometries/curve/RealFunction.java  |   77 ++
 .../sis/geometries/curve/RealPolynomial.java       |  107 ++
 .../org/apache/sis/geometries/curve/Rhumb.java     |  141 ++
 .../org/apache/sis/geometries/curve/Spiral.java    |  132 ++
 .../apache/sis/geometries/curve/SplineCurve.java   |  115 ++
 .../{splines => curve}/SplineCurveForm.java        |   25 +-
 .../{ellipsoidal => curve}/package-info.java       |    7 +-
 .../apache/sis/geometries/geodesics/Geodesic.java  |   37 -
 .../sis/geometries/griddedsolid/BSolidSpline.java  |   30 -
 .../griddedsolid/ParametricCurveSolid.java         |   68 -
 .../org/apache/sis/geometries/index/KdTree.java    |    6 +-
 .../internal/shared/AbstractGeometry.java          |   54 +-
 .../internal/shared/AbstractOrientedGeometry.java  |    8 +-
 .../{ArraySequence.java => ArrayDataPoints.java}   |   64 +-
 .../sis/geometries/internal/shared/DefaultArc.java |   70 +
 .../internal/shared/DefaultArcByBulge.java         |   81 ++
 .../internal/shared/DefaultArcByCenterPoint.java   |  100 ++
 .../internal/shared/DefaultBSplineCurve.java       |  177 +++
 .../internal/shared/DefaultBSplineSolid.java       |  177 +++
 .../internal/shared/DefaultBSplineSurface.java     |  197 +++
 .../geometries/internal/shared/DefaultBearing.java |  451 +++++++
 .../geometries/internal/shared/DefaultBezier.java  |   58 +
 .../internal/shared/DefaultBilinearGrid.java       |  181 +++
 .../geometries/internal/shared/DefaultCircle.java  |   54 +
 .../internal/shared/DefaultCircularString.java     |   58 +
 .../internal/shared/DefaultClothoid.java           |   55 +
 .../internal/shared/DefaultCompoundCurve.java      |  108 ++
 .../geometries/internal/shared/DefaultConic.java   |  107 ++
 .../internal/shared/DefaultCubicSpline.java        |   67 +
 ...efaultPolygon.java => DefaultCurvePolygon.java} |   51 +-
 ...ltPointSequence.java => DefaultDataPoints.java} |   20 +-
 ...aultLinearRing.java => DefaultEllipticArc.java} |   21 +-
 .../{DefaultMultiPoint.java => DefaultEmpty.java}  |   53 +-
 ...DefaultLineString.java => DefaultGeodesic.java} |   18 +-
 .../internal/shared/DefaultGeometryCollection.java |   29 +-
 .../internal/shared/DefaultLineString.java         |   13 +-
 .../internal/shared/DefaultLinearRing.java         |    9 +-
 .../internal/shared/DefaultMultiCurve.java         |   32 +-
 .../internal/shared/DefaultMultiLineString.java    |   11 +-
 .../internal/shared/DefaultMultiPoint.java         |   36 +-
 .../internal/shared/DefaultMultiPolygon.java       |   11 +-
 ...LineString.java => DefaultMultiPolyhedron.java} |   25 +-
 .../internal/shared/DefaultMultiSurface.java       |   37 +-
 .../internal/shared/DefaultNurbCurve.java          |  311 +++++
 .../internal/shared/DefaultNurbSurface.java        |  386 ++++++
 .../internal/shared/DefaultOffsetCurve.java        |  122 ++
 .../geometries/internal/shared/DefaultPoint.java   |   34 +-
 .../geometries/internal/shared/DefaultPolygon.java |   22 +-
 .../internal/shared/DefaultPolyhedralSurface.java  |   98 ++
 .../internal/shared/DefaultPolyhedron.java         |  116 ++
 .../internal/shared/DefaultPolynomialSpline.java   |  198 +++
 .../geometries/internal/shared/DefaultPrism.java   |   98 ++
 .../internal/shared/DefaultProductCurve.java       |   84 ++
 ...ltLineString.java => DefaultRawMultiPoint.java} |   23 +-
 .../internal/shared/DefaultReversedCurve.java      |  141 ++
 .../internal/shared/DefaultReversedSurface.java    |  105 ++
 .../{DefaultLineString.java => DefaultRhumb.java}  |   24 +-
 .../geometries/internal/shared/DefaultSpiral.java  |  134 ++
 .../internal/shared/DefaultTriangle.java           |   15 +-
 ...iCurve.java => DefaultTriangulatedSurface.java} |   39 +-
 .../{DefaultMultiPoint.java => IndexedPoint.java}  |   58 +-
 .../apache/sis/geometries/mesh/MeshPrimitive.java  |  109 +-
 .../geometries/mesh/MeshPrimitiveComparator.java   |   44 +-
 .../sis/geometries/mesh/MeshPrimitiveIndexes.java  |   10 +-
 .../sis/geometries/mesh/MeshPrimitiveVisitor.java  |   16 +-
 .../sis/geometries/mesh/MultiMeshPrimitive.java    |    4 +-
 .../sis/geometries/operation/ComputeAttribute.java |   87 ++
 .../apache/sis/geometries/operation/Contains.java  |  110 ++
 .../sis/geometries/operation/DeBoorAlgorithm.java  |  138 ++
 .../spatialanalysis2d => operation}/Distance.java  |   38 +-
 .../geometries/operation/GeometryOperations.java   |  782 -----------
 .../geometries/operation/GeometryProcessor.java    |  624 +++++++++
 .../sis/geometries/operation/Intersection.java     |  544 ++++++++
 .../apache/sis/geometries/operation/Operation.java |   82 --
 .../{processor => operation}/ProcessorUtils.java   |    7 +-
 .../geometries/operation/ShewchukPredicates.java   |  213 +++
 .../geometries/operation/SutherlandHodgman.java    |   21 +-
 .../org/apache/sis/geometries/operation/To3D.java  |  148 +++
 .../sis/geometries/operation/ToPrimitive.java      |  159 +++
 .../apache/sis/geometries/operation/Transform.java |  202 +++
 .../operation/simplify/greedyinsert/Edge.java      |    4 +-
 .../simplify/greedyinsert/TINBuilder.java          |   18 +-
 .../simplify/greedyinsert/TinDistance.java         |   12 +-
 .../operation/simplify/greedyinsert/WTriangle.java |   68 +-
 .../operation/spatialanalysis2d/Buffer.java        |   41 -
 .../operation/spatialanalysis2d/ConvexHull.java    |   39 -
 .../operation/spatialanalysis2d/Difference.java    |   37 -
 .../operation/spatialanalysis2d/Distance.java      |   40 -
 .../operation/spatialanalysis2d/ISOBand.java       |   18 +-
 .../operation/spatialanalysis2d/ISOLine.java       |   24 +-
 .../operation/spatialanalysis2d/Intersection.java  |   37 -
 .../operation/spatialanalysis2d/SymDifference.java |   38 -
 .../operation/spatialanalysis2d/Union.java         |   37 -
 .../operation/spatialedition/ComputeAttribute.java |   73 -
 .../geometries/operation/spatialedition/To3D.java  |   48 -
 .../operation/spatialedition/Transform.java        |   63 -
 .../operation/spatialrelations2d/Contains.java     |   38 -
 .../operation/spatialrelations2d/Crosses.java      |   37 -
 .../operation/spatialrelations2d/Disjoint.java     |   37 -
 .../operation/spatialrelations2d/Equals.java       |   37 -
 .../operation/spatialrelations2d/Intersects.java   |   37 -
 .../operation/spatialrelations2d/LocateAlong.java  |   40 -
 .../spatialrelations2d/LocateBetween.java          |   42 -
 .../operation/spatialrelations2d/Overlaps.java     |   37 -
 .../operation/spatialrelations2d/Relate.java       |   42 -
 .../operation/spatialrelations2d/Touches.java      |   37 -
 .../operation/spatialrelations2d/Within.java       |   37 -
 .../operation/triangulate/EarClipping.java         |   22 +-
 .../operation/triangulate/delaunay/Delaunay.java   |   17 +-
 .../triangulate/delaunay/OrientedEdge.java         |   32 +-
 .../triangulate/delaunay/OrientedTriangle.java     |   32 +-
 .../org/apache/sis/geometries/package-info.java    |   18 +-
 .../sis/geometries/{ => point}/MultiPoint.java     |   59 +-
 .../apache/sis/geometries/point/PointCloud.java    |  128 ++
 .../sis/geometries/polynomials/FunctionCurve.java  |   36 -
 .../geometries/polynomials/PolynomialCurve.java    |   32 -
 .../sis/geometries/polynomials/RealFunction.java   |   45 -
 .../sis/geometries/polynomials/RealPolynomial.java |   51 -
 .../processor/spatialanalysis2d/Intersection.java  |  243 ----
 .../processor/spatialedition/ComputeAttribute.java |  111 --
 .../geometries/processor/spatialedition/To3D.java  |  191 ---
 .../processor/spatialedition/ToPrimitive.java      |  284 ----
 .../processor/spatialedition/Transform.java        |  274 ----
 .../processor/spatialrelations2d/Contains.java     |  138 --
 .../apache/sis/geometries/solid/BSplineSolid.java  |   67 +
 .../apache/sis/geometries/{ => solid}/Capsule.java |   12 +-
 .../sis/geometries/{ => solid}/Cylinder.java       |   12 +-
 .../sis/geometries/{ => solid}/Frustrum.java       |   13 +-
 .../geometries/{ => solid}/MultiPolyhedron.java    |   16 +-
 .../sis/geometries/solid/ParametricCurveSolid.java |  223 ++++
 .../sis/geometries/{ => solid}/Polyhedron.java     |   35 +-
 .../apache/sis/geometries/{ => solid}/Sphere.java  |   75 +-
 .../{ellipsoidal => solid}/package-info.java       |    7 +-
 .../{ => solid}/polyhedron/AbstractPolyhedron.java |   39 +-
 .../{ => solid}/polyhedron/Dodecahedron.java       |   14 +-
 .../{ => solid}/polyhedron/Hexahedron.java         |   14 +-
 .../{ => solid}/polyhedron/Icosahedron.java        |   14 +-
 .../{ => solid}/polyhedron/Octahedron.java         |   14 +-
 .../polyhedron/RhombicTriacontahedron.java         |   14 +-
 .../{ => solid}/polyhedron/Tetrahedron.java        |   14 +-
 .../polyhedron/TruncatedIcosahedron.java           |   14 +-
 .../{ => solid}/polyhedron/package-info.java       |    2 +-
 .../sis/geometries/spherical/GreatCircleArc.java   |   46 +-
 .../spherical/SphericalConvexPolygon.java          |    8 +-
 .../geometries/spherical/SphericalTriangle.java    |   78 +-
 .../apache/sis/geometries/spirals/Clothoid.java    |   30 -
 .../org/apache/sis/geometries/spirals/Spiral.java  |   42 -
 .../sis/geometries/splines/BSplineCurve.java       |   30 -
 .../org/apache/sis/geometries/splines/Bezier.java  |   30 -
 .../apache/sis/geometries/splines/CubicSpline.java |   30 -
 .../org/apache/sis/geometries/splines/NURB.java    |   30 -
 .../sis/geometries/splines/PolynomialSpline.java   |   39 -
 .../apache/sis/geometries/splines/SplineCurve.java |   50 -
 .../geometries/splinesurfaces/BSplineSurface.java  |   57 -
 .../main/org/apache/sis/geometries/summary.adoc    | 1111 ++++++++++++++++
 .../sis/geometries/surface/BSplineSurface.java     |  185 +++
 .../BSplineSurfaceForm.java                        |   28 +-
 .../sis/geometries/surface/BilinearGrid.java       |   78 ++
 .../sis/geometries/surface/CurvePolygon.java       |  155 +++
 .../sis/geometries/{ => surface}/MultiPolygon.java |   42 +-
 .../sis/geometries/{ => surface}/MultiSurface.java |   51 +-
 .../apache/sis/geometries/surface/NurbSurface.java |   62 +
 .../geometries/surface/ParametricCurveSurface.java |  233 ++++
 .../org/apache/sis/geometries/surface/Polygon.java |  175 +++
 .../sis/geometries/surface/PolyhedralSurface.java  |  168 +++
 .../sis/geometries/{ => surface}/PreparedTIN.java  |   41 +-
 .../org/apache/sis/geometries/surface/TIN.java     |   60 +
 .../sis/geometries/{ => surface}/Triangle.java     |  117 +-
 .../geometries/surface/TriangulatedSurface.java    |   58 +
 .../{ellipsoidal => surface}/package-info.java     |    7 +-
 .../main/org/apache/sis/gml/AbstractGMLReader.java |  419 ++++++
 .../main/org/apache/sis/gml/AbstractGMLWriter.java |  275 ++++
 .../org/apache/sis/gml/DOMXMLStreamReader.java     |  696 ++++++++++
 .../main/org/apache/sis/gml/GML2Reader.java        |  385 ++++++
 .../main/org/apache/sis/gml/GML2Tags.java          |   73 +
 .../main/org/apache/sis/gml/GML2Writer.java        |  268 ++++
 .../main/org/apache/sis/gml/GML3Reader.java        | 1400 ++++++++++++++++++++
 .../main/org/apache/sis/gml/GML3Tags.java          |  131 ++
 .../main/org/apache/sis/gml/GML3Writer.java        |  547 ++++++++
 .../main/org/apache/sis/gml/GMLCRS.java            |  185 +++
 .../main/org/apache/sis/gml/GMLGeometryReader.java |   45 +
 .../main/org/apache/sis/gml/GMLGeometryWriter.java |   59 +
 .../main/org/apache/sis/gml/GMLReader.java         |  146 ++
 .../Bearing.java => gml/GMLVersion.java}           |   22 +-
 .../main/org/apache/sis/gml/GMLWriter.java         |  119 ++
 .../org/apache/sis/gml/JAXBGeometryAdapter.java    |  103 ++
 .../org/apache/sis/gml/PositionListBuilder.java    |  185 +++
 .../conics/ConicArc.java => gml/package-info.java} |   10 +-
 .../main/org/apache/sis/images}/ImageBuilder.java  |    3 +-
 .../main/org/apache/sis/images}/MergeOperator.java |    2 +-
 .../{geometries/math => maths}/AbstractAffine.java |    2 +-
 .../{geometries/math => maths}/AbstractArray.java  |    2 +-
 .../{geometries/math => maths}/AbstractCursor.java |    2 +-
 .../{geometries/math => maths}/AbstractMatrix.java |    2 +-
 .../math => maths}/AbstractSimilarity.java         |    2 +-
 .../{geometries/math => maths}/AbstractTuple.java  |    2 +-
 .../sis/{geometries/math => maths}/Affine.java     |    2 +-
 .../sis/{geometries/math => maths}/Affine1D.java   |    2 +-
 .../sis/{geometries/math => maths}/Affine2D.java   |    2 +-
 .../sis/{geometries/math => maths}/Affine3D.java   |    2 +-
 .../sis/{geometries/math => maths}/Affine4D.java   |    2 +-
 .../sis/{geometries/math => maths}/AffineND.java   |    2 +-
 .../sis/{geometries/math => maths}/Affines.java    |    2 +-
 .../sis/{geometries/math => maths}/Array.java      |   19 +-
 .../math => maths}/ArrayConcatenated.java          |    2 +-
 .../{geometries/math => maths}/ArrayFactory.java   |   58 +-
 .../math => maths}/ArrayFactoryFFM.java            |   20 +-
 .../math => maths}/ArrayFactoryHAT.java            |    2 +-
 .../math => maths}/ArrayFactoryJava.java           |   20 +-
 .../math => maths}/ArraySpliterator.java           |    2 +-
 .../math => maths}/ArrayUnmodifiable.java          |    2 +-
 .../sis/{geometries/math => maths}/Cursor.java     |    2 +-
 .../math => maths}/CursorUnmodifiable.java         |    2 +-
 .../sis/{geometries/math => maths}/DataType.java   |    2 +-
 .../{geometries/math => maths}/EasingMethod.java   |    2 +-
 .../sis/{geometries/math => maths}/Maths.java      |  174 ++-
 .../sis/{geometries/math => maths}/Matrices.java   |   57 +-
 .../sis/{geometries/math => maths}/Matrix.java     |    2 +-
 .../sis/{geometries/math => maths}/Matrix2D.java   |    2 +-
 .../sis/{geometries/math => maths}/Matrix3D.java   |    2 +-
 .../sis/{geometries/math => maths}/Matrix4D.java   |    4 +-
 .../sis/{geometries/math => maths}/MatrixND.java   |    2 +-
 .../sis/{geometries/math => maths}/NDArray.java    |    2 +-
 .../sis/{geometries/math => maths}/NDArrays.java   |    6 +-
 .../sis/{geometries/math => maths}/Quaternion.java |    4 +-
 .../{geometries/math => maths}/Quaternions.java    |    2 +-
 .../sis/{geometries/math => maths}/ReadOnly.java   |   42 +-
 .../{geometries/math => maths}/SampleSystem.java   |    7 +-
 .../sis/{geometries/math => maths}/Similarity.java |    2 +-
 .../{geometries/math => maths}/Similarity3D.java   |    2 +-
 .../{geometries/math => maths}/SimilarityND.java   |    2 +-
 .../math => maths}/SimplifiedTransform.java        |    2 +-
 .../sis/{geometries/math => maths}/Transform.java  |    4 +-
 .../{geometries/math => maths}/Transform1D.java    |    2 +-
 .../sis/{geometries/math => maths}/Tuple.java      |    2 +-
 .../math => maths}/TupleUnmodifiable.java          |    2 +-
 .../sis/{geometries/math => maths}/Vector.java     |   36 +-
 .../sis/{geometries/math => maths}/Vector1D.java   |    2 +-
 .../sis/{geometries/math => maths}/Vector2D.java   |    2 +-
 .../sis/{geometries/math => maths}/Vector3D.java   |    2 +-
 .../sis/{geometries/math => maths}/Vector4D.java   |    2 +-
 .../sis/{geometries/math => maths}/VectorND.java   |    2 +-
 .../sis/{geometries/math => maths}/Vectors.java    |  103 +-
 .../{geometries/math => maths}/package-info.java   |    2 +-
 .../org/apache/sis/scene/AnimationSampler.java     |    2 +-
 .../main/org/apache/sis/scene/MorphTarget.java     |   12 +-
 .../main/org/apache/sis/scene/SceneNode.java       |    4 +-
 .../main/org/apache/sis/scene/SceneUtilities.java  |    4 +-
 .../main/org/apache/sis/scene/Skin.java            |    2 +-
 .../main/org/apache/sis/scene/Texture.java         |    4 +-
 .../operation/simplify => scene}/TextureAtlas.java |    2 +-
 .../main/org/apache/sis/scene/physics/Motion.java  |    4 +-
 .../test/org/apache/sis/geometries/DE9IMTest.java  |  181 +++
 .../org/apache/sis/geometries/DataPointsTest.java  |  141 ++
 .../test/org/apache/sis/geometries/EmptyTest.java  |  293 ++++
 .../sis/geometries/GeometryCollectionTest.java     |  237 ++++
 .../sis/geometries/OrientedGeometryTest.java       |  229 ++++
 .../test/org/apache/sis/geometries/PointTest.java  |  395 ++++++
 .../test/org/apache/sis/geometries/PrismTest.java  |  237 ++++
 .../sis/geometries/adapter/ShapeAdapterTest.java   |  217 +++
 .../sis/geometries/adapter/ShapeConverterTest.java |  231 ++++
 .../geometries/adapter/WellKnownBinaryTest.java    |  601 +++++++++
 .../sis/geometries/adapter/WellKnownTextTest.java  |  418 ++++++
 .../org/apache/sis/geometries/cs/BearingTest.java  |  438 ++++++
 .../sis/geometries/curve/ArcByBulgeTest.java       |  477 +++++++
 .../sis/geometries/curve/ArcByCenterPointTest.java |  501 +++++++
 .../org/apache/sis/geometries/curve/ArcTest.java}  |   55 +-
 .../sis/geometries/curve/BSplineCurveTest.java     |  509 +++++++
 .../apache/sis/geometries/curve/BezierTest.java}   |   21 +-
 .../apache/sis/geometries/curve/CircleTest.java}   |   19 +-
 .../sis/geometries/curve/CircularStringTest.java   |  469 +++++++
 .../apache/sis/geometries/curve/ClothoidTest.java} |   29 +-
 .../sis/geometries/curve/CompoundCurveTest.java    |  485 +++++++
 .../apache/sis/geometries/curve/ConicArcTest.java} |   10 +-
 .../org/apache/sis/geometries/curve/ConicTest.java |  461 +++++++
 .../sis/geometries/curve/CubicSplineTest.java}     |   19 +-
 .../apache/sis/geometries/curve/EllipseTest.java}  |    8 +-
 .../sis/geometries/curve/EllipticArcTest.java}     |   20 +-
 .../sis/geometries/curve/FunctionArcTest.java}     |   29 +-
 .../apache/sis/geometries/curve/GeodesicTest.java  |  477 +++++++
 .../sis/geometries/curve/LineStringTest.java       |  485 +++++++
 .../sis/geometries/curve/LinearRingTest.java}      |   48 +-
 .../MultiCurveTest.java}                           |   49 +-
 .../sis/geometries/curve/MultiLineStringTest.java} |   29 +-
 .../apache/sis/geometries/curve/NurbCurveTest.java |  117 ++
 .../sis/geometries/curve/OffsetCurveTest.java      |  485 +++++++
 .../sis/geometries/curve/PolynomialArcTest.java}   |   29 +-
 .../sis/geometries/curve/PolynomialSplineTest.java |  533 ++++++++
 .../sis/geometries/curve/ProductCurveTest.java     |  485 +++++++
 .../RealFunctionTest.java}                         |   49 +-
 .../sis/geometries/curve/RealPolynomialTest.java   |   77 ++
 .../org/apache/sis/geometries/curve/RhumbTest.java |  485 +++++++
 .../apache/sis/geometries/curve/SpiralTest.java    |  485 +++++++
 .../internal/shared/ArrayDataPointsTest.java}      |   10 +-
 .../internal/shared/ArraySequenceTest.java         |   60 +-
 .../internal/shared/DefaultArcByBulgeTest.java}    |   10 +-
 .../shared/DefaultArcByCenterPointTest.java}       |   11 +-
 .../internal/shared/DefaultArcTest.java}           |    9 +-
 .../internal/shared/DefaultBSplineCurveTest.java}  |   10 +-
 .../internal/shared/DefaultBSplineSolidTest.java}  |   10 +-
 .../shared/DefaultBSplineSurfaceTest.java}         |   12 +-
 .../internal/shared/DefaultBezierTest.java}        |   10 +-
 .../internal/shared/DefaultBilinearGridTest.java}  |   10 +-
 .../internal/shared/DefaultCircleTest.java}        |   10 +-
 .../shared/DefaultCircularStringTest.java}         |   10 +-
 .../internal/shared/DefaultClothoidTest.java}      |   10 +-
 .../internal/shared/DefaultCompoundCurveTest.java} |   10 +-
 .../internal/shared/DefaultConicTest.java}         |   10 +-
 .../internal/shared/DefaultCubicSplineTest.java}   |   10 +-
 .../internal/shared/DefaultCurvePolygonTest.java}  |   10 +-
 .../internal/shared/DefaultDataPointsTest.java}    |   10 +-
 .../internal/shared/DefaultEllipticArcTest.java}   |   10 +-
 .../internal/shared/DefaultEmptyTest.java}         |   48 +-
 .../internal/shared/DefaultGeodesicTest.java}      |   10 +-
 .../shared/DefaultGeometryCollectionTest.java}     |   12 +-
 .../internal/shared/DefaultLineStringTest.java}    |   10 +-
 .../internal/shared/DefaultLinearRingTest.java}    |   10 +-
 .../internal/shared/DefaultMultiCurveTest.java}    |   10 +-
 .../shared/DefaultMultiLineStringTest.java}        |   12 +-
 .../internal/shared/DefaultMultiPointTest.java}    |   10 +-
 .../internal/shared/DefaultMultiPolygonTest.java}  |   10 +-
 .../shared/DefaultMultiPolyhedronTest.java}        |   12 +-
 .../internal/shared/DefaultMultiSurfaceTest.java}  |   10 +-
 .../internal/shared/DefaultNurbCurveTest.java}     |   10 +-
 .../internal/shared/DefaultNurbSurfaceTest.java}   |   10 +-
 .../internal/shared/DefaultOffsetCurveTest.java}   |   10 +-
 .../internal/shared/DefaultPointTest.java}         |   25 +-
 .../internal/shared/DefaultPolygonTest.java}       |   10 +-
 .../shared/DefaultPolyhedralSurfaceTest.java}      |   12 +-
 .../internal/shared/DefaultPolyhedronTest.java}    |   10 +-
 .../shared/DefaultPolynomialSplineTest.java}       |   12 +-
 .../internal/shared/DefaultPrismTest.java}         |   10 +-
 .../internal/shared/DefaultProductCurveTest.java}  |   10 +-
 .../internal/shared/DefaultRawMultiPointTest.java} |   10 +-
 .../internal/shared/DefaultReversedCurveTest.java  |  461 +++++++
 .../shared/DefaultReversedSurfaceTest.java         |  341 +++++
 .../internal/shared/DefaultRhumbTest.java}         |   10 +-
 .../internal/shared/DefaultSpiralTest.java}        |   10 +-
 .../internal/shared/DefaultTriangleTest.java}      |   10 +-
 .../shared/DefaultTriangulatedSurfaceTest.java}    |   10 +-
 .../internal/shared/IndexedPointTest.java}         |   26 +-
 .../apache/sis/geometries/math/VectorsTest.java    |  127 --
 .../sis/geometries/mesh/PrimitiveIndexesTest.java  |    4 +-
 .../apache/sis/geometries/mesh/PrimitiveTest.java  |    6 +-
 .../sis/geometries/mesh/PrimitiveVisitorTest.java  |  152 +--
 .../sis/geometries/operation/BufferTest.java       |   90 ++
 .../sis/geometries/operation/ContainsTest.java     |   87 ++
 .../sis/geometries/operation/ConvexHullTest.java   |   75 ++
 .../sis/geometries/operation/CrossesTest.java      |   88 ++
 .../sis/geometries/operation/DifferenceTest.java   |   85 ++
 .../sis/geometries/operation/DisjointTest.java     |   86 ++
 .../sis/geometries/operation/DistanceTest.java     |  134 ++
 .../apache/sis/geometries/operation/EqualTest.java |   86 ++
 .../IntersectionTest.java                          |   76 +-
 .../sis/geometries/operation/IntersectsTest.java   |   86 ++
 .../sis/geometries/operation/LocateAlongTest.java  |   80 ++
 .../geometries/operation/LocateBetweenTest.java    |   82 ++
 .../sis/geometries/operation/OverlapsTest.java     |   91 ++
 .../sis/geometries/operation/RelateTest.java       |  101 ++
 .../operation/ShewchukPredicatesTest.java          |  119 ++
 .../geometries/operation/SutherlandHogmanTest.java |    8 +-
 .../geometries/operation/SymDifferenceTest.java    |  100 ++
 .../apache/sis/geometries/operation/TestData.java  |  112 ++
 .../spatialedition => operation}/To3DTest.java     |   21 +-
 .../ToPrimitiveTest.java                           |   51 +-
 .../sis/geometries/operation/TouchesTest.java      |   91 ++
 .../TransformTest.java                             |   56 +-
 .../apache/sis/geometries/operation/UnionTest.java |   98 ++
 .../geometries/operation/WithinDistanceTest.java   |   89 ++
 .../sis/geometries/operation/WithinTest.java       |   88 ++
 .../operation/simplify/TextureAtlasTest.java       |    1 +
 .../operation/spatialanalysis2d/IsoBandTest.java   |    4 +-
 .../triangulate/delaunay/DelaunayTest.java         |    4 +-
 .../triangulate/delaunay/OrientedEdgeTest.java     |    4 +-
 .../sis/geometries/point/MultiPointTest.java}      |   35 +-
 .../sis/geometries/point/PointCloudTest.java}      |   55 +-
 .../processor/spatialanalysis2d/DistanceTest.java  |   70 -
 .../sis/geometries/solid/BSplineSolidTest.java     |  357 +++++
 .../sis/geometries/solid/MultiPolyhedronTest.java} |   20 +-
 .../sis/geometries/solid/PolyhedronTest.java       |  293 ++++
 .../geometries/spherical/GreatCircleArcTest.java   |   56 +-
 .../spherical/SphericalConvexPolygonTest.java      |   10 +-
 .../spherical/SphericalTriangleTest.java           |   74 +-
 .../sis/geometries/surface/BSplineSurfaceTest.java |  125 ++
 .../sis/geometries/surface/BilinearGridTest.java}  |   20 +-
 .../sis/geometries/surface/CurvePolygonTest.java   |  381 ++++++
 .../sis/geometries/surface/MultiPolygonTest.java}  |   29 +-
 .../sis/geometries/surface/MultiSurfaceTest.java}  |   55 +-
 .../sis/geometries/surface/NurbSurfaceTest.java}   |   35 +-
 .../surface/ParametricCurveSurfaceTest.java        |  397 ++++++
 .../apache/sis/geometries/surface/PolygonTest.java |  381 ++++++
 .../geometries/surface/PolyhedralSurfaceTest.java  |  373 ++++++
 .../geometries/{ => surface}/PreparedTINTest.java  |   56 +-
 .../apache/sis/geometries/surface/TINTest.java}    |   29 +-
 .../sis/geometries/{ => surface}/TriangleTest.java |  101 +-
 .../test/org/apache/sis/gml/2/box.gml              |    4 +
 .../test/org/apache/sis/gml/2/linearring.gml       |    4 +
 .../test/org/apache/sis/gml/2/linestring.gml       |    4 +
 .../test/org/apache/sis/gml/2/linestring_coord.gml |    6 +
 .../test/org/apache/sis/gml/2/multigeometry.gml    |   13 +
 .../test/org/apache/sis/gml/2/multilinestring.gml  |   13 +
 .../test/org/apache/sis/gml/2/multipoint.gml       |   13 +
 .../test/org/apache/sis/gml/2/multipolygon.gml     |   21 +
 .../test/org/apache/sis/gml/2/no_namespace.gml     |    4 +
 .../test/org/apache/sis/gml/2/point.gml            |    4 +
 .../test/org/apache/sis/gml/2/point_coord.gml      |    7 +
 .../test/org/apache/sis/gml/2/polygon.gml          |   13 +
 .../test/org/apache/sis/gml/3/compositecurve.gml   |    8 +
 .../test/org/apache/sis/gml/3/compositesolid.gml   |   10 +
 .../test/org/apache/sis/gml/3/compositesurface.gml |   12 +
 .../test/org/apache/sis/gml/3/curve.gml            |    8 +
 .../test/org/apache/sis/gml/3/curve_arc.gml        |    8 +
 .../test/org/apache/sis/gml/3/curve_arcbybulge.gml |   10 +
 .../apache/sis/gml/3/curve_arcbycenterpoint.gml    |   11 +
 .../test/org/apache/sis/gml/3/envelope.gml         |    5 +
 .../test/org/apache/sis/gml/3/linearring.gml       |    4 +
 .../org/apache/sis/gml/3/linestring_poslist.gml    |    4 +
 .../test/org/apache/sis/gml/3/multicurve.gml       |   13 +
 .../test/org/apache/sis/gml/3/multigeometry.gml    |   13 +
 .../test/org/apache/sis/gml/3/multipoint.gml       |   13 +
 .../apache/sis/gml/3/multipoint_pointmembers.gml   |   11 +
 .../test/org/apache/sis/gml/3/multisurface.gml     |   21 +
 .../test/org/apache/sis/gml/3/orientablecurve.gml  |    8 +
 .../org/apache/sis/gml/3/orientablesurface.gml     |   12 +
 .../test/org/apache/sis/gml/3/point.gml            |    4 +
 .../test/org/apache/sis/gml/3/polygon_exterior.gml |   13 +
 .../test/org/apache/sis/gml/3/ring.gml             |   12 +
 .../test/org/apache/sis/gml/3/solid.gml            |   16 +
 .../test/org/apache/sis/gml/3/surface.gml          |   12 +
 .../gml/3/tolerance_legacy_style_new_namespace.gml |    8 +
 .../gml/3/tolerance_new_style_old_namespace.gml    |    4 +
 .../org/apache/sis/gml/DOMXMLStreamReaderTest.java |  221 +++
 .../org/apache/sis/gml/DocumentComparator.java     |  827 ++++++++++++
 .../test/org/apache/sis/gml/GML2ReaderTest.java    |  339 +++++
 .../test/org/apache/sis/gml/GML2WriterTest.java    |  220 +++
 .../test/org/apache/sis/gml/GML3ReaderTest.java    |  807 +++++++++++
 .../test/org/apache/sis/gml/GML3WriterTest.java    |  440 ++++++
 .../test/org/apache/sis/gml/GMLReaderTest.java     |  126 ++
 .../test/org/apache/sis/gml/GMLWriterTest.java     |   82 ++
 .../test/org/apache/sis/gml/GeometryAssert.java    |  147 ++
 .../apache/sis/gml/JAXBGeometryAdapterTest.java    |  195 +++
 .../test/org/apache/sis/gml/TestCase.java          |  129 ++
 .../test/org/apache/sis/gml/TestData.java          |  107 ++
 .../math => maths}/AbstractArrayTest.java          |    2 +-
 .../math => maths}/AbstractTupleTest.java          |    2 +-
 .../math => maths}/AbstractVectorTest.java         |    2 +-
 .../math => maths}/ArrayConcatenatedTest.java      |    2 +-
 .../{geometries/math => maths}/ArrayNbTest.java    |    2 +-
 .../{geometries/math => maths}/ArrayNdTest.java    |    2 +-
 .../{geometries/math => maths}/ArrayNfTest.java    |    2 +-
 .../{geometries/math => maths}/ArrayNiTest.java    |    2 +-
 .../{geometries/math => maths}/ArrayNlTest.java    |    2 +-
 .../{geometries/math => maths}/ArrayNsTest.java    |    2 +-
 .../{geometries/math => maths}/ArrayNubTest.java   |    2 +-
 .../{geometries/math => maths}/ArrayNuiTest.java   |    2 +-
 .../{geometries/math => maths}/ArrayNusTest.java   |    2 +-
 .../math => maths}/EasingMethodTest.java           |    2 +-
 .../sis/{geometries/math => maths}/MathsTest.java  |   65 +-
 .../{geometries/math => maths}/NDArraysTest.java   |    2 +-
 .../{geometries/math => maths}/QuaternionTest.java |    2 +-
 .../{geometries/math => maths}/Vector3DTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXbTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXdTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXfTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXiTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXlTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXsTest.java   |    2 +-
 .../{geometries/math => maths}/VectorXubTest.java  |    2 +-
 .../{geometries/math => maths}/VectorXuiTest.java  |    2 +-
 .../{geometries/math => maths}/VectorXusTest.java  |    2 +-
 .../test/org/apache/sis/maths/VectorsTest.java     |  242 ++++
 .../org/apache/sis/scene/SceneUtilitiesTest.java   |    4 +-
 .../org/apache/sis/referencing/dggs/s2/S2Zone.java |    2 +-
 .../dggs/DiscreteGlobalGridCoverageProcessor.java  |   10 +-
 .../storage/dggs/DiscreteGlobalGridGeometry.java   |    4 +-
 .../storage/dggs/DiscreteGlobalGridSystems.java    |   16 +-
 .../shared/AbstractDiscreteGlobalGridCoverage.java |    2 +-
 .../shared/ArrayDiscreteGlobalGridCoverage.java    |   10 +-
 .../shared/IndexedDiscreteGlobalGridCoverage.java  |    2 +-
 .../rs/internal/shared/AbstractCodedCoverage.java  |    2 +-
 .../rs/internal/shared/ArrayCodedCoverage.java     |   10 +-
 .../rs/internal/shared/GridAsCodedResource.java    |    8 +-
 .../sis/referencing/dggs/AbstractDggrsTest.java    |   16 +-
 .../org/apache/sis/referencing/dggs/s2/S2Test.java |    4 +-
 .../main/module-info.java                          |    3 +
 .../storage/internal/shared/AggregationEvent.java  |   61 +
 .../sis/storage/internal/shared/ContentEvent.java} |   26 +-
 .../internal/shared/FeatureSetContentEvent.java    |   98 ++
 .../internal/shared/FeatureSetModelEvent.java      |   98 ++
 .../sis/storage/internal/shared/ModelEvent.java}   |   18 +-
 .../sis/storage/internal/shared/StorageEvent.java} |   25 +-
 .../internal/shared/TilingContentEvent.java        |   88 ++
 .../storage/internal/shared/TilingModelEvent.java  |   97 ++
 .../sis/storage/shapefile/ShapefileStore.java      |  437 ++++--
 .../sis/storage/shapefile/dbf/DBFReader.java       |    7 +-
 .../sis/storage/shapefile/dbf/DBFWriter.java       |   14 +
 .../apache/sis/storage/shapefile/package-info.java |    9 +
 .../sis/storage/shapefile/shp/ShapeRecord.java     |   26 +-
 .../sis/storage/shapefile/shp/ShapeWriter.java     |    5 +
 .../shapefile/ShapefileStoreEventsTest.java        |  373 ++++++
 .../sis/storage/shapefile/ShapefileStoreTest.java  |  146 +-
 .../sis/storage/shapefile/dbf/DBFIOTest.java       |   48 +
 .../sis/storage/shapefile/shp/ShapeIOTest.java     |   63 +
 netbeans-project/nbproject/project.xml             |    1 +
 optional/src/org.apache.sis.gui/bundle/bin/sis     |    1 +
 optional/src/org.apache.sis.gui/bundle/bin/sisfx   |    1 +
 .../main/org/apache/sis/gui/setup/Inflater.java    |    6 +-
 .../main/module-info.java                          |    2 +-
 .../referencing/factory/sql/epsg/package-info.java |    4 +-
 .../factory/sql/epsg/DataScriptUpdater.java        |    4 +
 .../sis/referencing/factory/sql/epsg/README.md     |   10 +-
 692 files changed, 51252 insertions(+), 8375 deletions(-)

diff --cc 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSurface.java
index 0000000000,452e250e52..a53ca31542
mode 000000,100644..100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSurface.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBSplineSurface.java
@@@ -1,0 -1,195 +1,197 @@@
+ /*
+  * 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 java.util.List;
+ import java.util.Objects;
+ import javax.measure.Quantity;
+ import org.apache.sis.geometries.Curve;
+ import org.apache.sis.geometries.DataPoints;
+ import org.apache.sis.geometries.curve.KnotType;
+ import org.apache.sis.geometries.surface.BSplineSurface;
+ import org.apache.sis.geometries.surface.BSplineSurfaceForm;
+ import org.opengis.geometry.DirectPosition;
+ import org.opengis.geometry.Envelope;
 -import org.opengis.metadata.Identifier;
++
++// Specific to the geoapi-3.1 branch:
++import org.opengis.referencing.ReferenceIdentifier;
+ 
+ 
+ /**
+  * A rational or polynomial parametric surface represented by control points, 
b-spline basis
+  * functions and possibly weights.
+  *
+  * <p>For the rational flavour, which carries a weight per control point and 
can therefore be
+  * evaluated, see {@link DefaultNurbSurface}.</p>
+  *
+  * @author Johann Sorel (Geomatys)
+  */
+ public non-sealed class DefaultBSplineSurface extends AbstractGeometry 
implements BSplineSurface {
+ 
+     /**
+      * Positions of this surface at the knots of the parameter grid, in 
row-major order.
+      */
+     protected final DataPoints points;
+ 
+     /**
+      * Control points of the section curves, in row-major order, or an empty 
list if none.
+      */
+     protected final List<DirectPosition> controlPoints;
+ 
+     /**
+      * Number of rows in the parameter grid.
+      */
+     protected final int rows;
+ 
+     /**
+      * Number of columns in the parameter grid.
+      */
+     protected final int columns;
+ 
+     /**
+      * The two knot sequences used to define the basis functions, one per 
surface parameter.
+      */
+     protected final List<double[]> knots;
+ 
+     /**
+      * Algebraic degree of the b-spline basis functions.
+      */
+     protected final int degree;
+ 
+     /**
+      * Distribution of the knots, given for information only.
+      */
+     protected final KnotType knotSpec;
+ 
+     /**
+      * Kind of surface which this spline approximates.
+      */
+     protected final BSplineSurfaceForm surfaceForm;
+ 
+     /**
+      * Whether this surface is a polynomial spline rather than a rational one.
+      */
+     protected final boolean polynomial;
+ 
+     /**
+      * Creates a b-spline surface over the given parameter grid.
+      *
+      * @param  points         positions at the knots of the parameter grid, 
in row-major order.
+      *                        There shall be {@code rows} × {@code columns} 
of them.
+      * @param  controlPoints  control points in row-major order, or {@code 
null} if none.
+      * @param  rows           number of rows in the parameter grid.
+      * @param  columns        number of columns in the parameter grid.
+      * @param  knots          exactly two knot sequences, one per surface 
parameter, knots with a
+      *                        multiplicity greater than one being repeated in 
the sequence.
+      * @param  degree         algebraic degree of the b-spline basis 
functions.
+      * @param  knotSpec       distribution of the knots, or {@code null} if 
unspecified.
+      * @param  surfaceForm    kind of surface approximated by this spline, or 
{@code null} if none.
+      * @param  polynomial     {@code true} if this surface is polynomial, 
{@code false} if the
+      *                        control points are expressed in homogeneous 
coordinates, which makes
+      *                        it rational.
+      */
+     public DefaultBSplineSurface(final DataPoints points, final 
List<DirectPosition> controlPoints,
+             final int rows, final int columns, final List<double[]> knots, 
final int degree,
+             final KnotType knotSpec, final BSplineSurfaceForm surfaceForm, 
final boolean polynomial)
+     {
+         this.points        = Objects.requireNonNull(points);
+         this.controlPoints = (controlPoints == null) ? List.of() : 
List.copyOf(controlPoints);
+         this.rows          = rows;
+         this.columns       = columns;
+         this.knots         = (knots == null) ? List.of() : List.copyOf(knots);
+         this.degree        = degree;
+         this.knotSpec      = knotSpec;
+         this.surfaceForm   = surfaceForm;
+         this.polynomial    = polynomial;
+     }
+ 
+     @Override
+     public int getDegree() {
+         return degree;
+     }
+ 
+     @Override
+     public List<double[]> getKnots() {
+         return knots;
+     }
+ 
+     @Override
+     public KnotType getKnotSpec() {
+         return knotSpec;
+     }
+ 
+     @Override
+     public BSplineSurfaceForm getSurfaceForm() {
+         return surfaceForm;
+     }
+ 
+     @Override
+     public boolean isPolynomial() {
+         return polynomial;
+     }
+ 
+     @Override
+     public int getRows() {
+         return rows;
+     }
+ 
+     @Override
+     public int getColumns() {
+         return columns;
+     }
+ 
+     @Override
+     public DataPoints getDataPoints() {
+         return points;
+     }
+ 
+     @Override
+     public List<DirectPosition> getControlPoints() {
+         return controlPoints;
+     }
+ 
+     @Override
+     public Curve getHorizontalCurve(double v) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Curve getVerticalCurve(double u) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public DirectPosition getSurface(double u, double v) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Quantity<?> getArea() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Envelope getEnvelope() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
 -    public Identifier getName() {
++    public ReferenceIdentifier getName() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+ }
diff --cc 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBilinearGrid.java
index 0000000000,1d5e740466..92bf6a8759
mode 000000,100644..100644
--- 
a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBilinearGrid.java
+++ 
b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultBilinearGrid.java
@@@ -1,0 -1,179 +1,181 @@@
+ /*
+  * 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 java.util.List;
+ import java.util.Objects;
+ import javax.measure.Quantity;
+ import org.apache.sis.geometries.Curve;
+ import org.apache.sis.geometries.DataPoints;
+ import org.apache.sis.geometries.GeometryType;
+ import org.apache.sis.geometries.surface.BilinearGrid;
+ import org.opengis.geometry.DirectPosition;
+ import org.opengis.geometry.Envelope;
 -import org.opengis.metadata.Identifier;
+ import org.opengis.referencing.crs.CoordinateReferenceSystem;
+ import org.apache.sis.geometries.DataPointsType;
+ 
++// Specific to the geoapi-3.1 branch:
++import org.opengis.referencing.ReferenceIdentifier;
++
+ 
+ /**
+  * A parametric curve surface using polylines as both horizontal and vertical 
curves, each cell of
+  * the parameter grid being interpolated bilinearly over the unit square.
+  *
+  * @author Johann Sorel (Geomatys)
+  */
+ public non-sealed class DefaultBilinearGrid extends AbstractGeometry 
implements BilinearGrid {
+ 
+     /**
+      * Positions of this surface at the knots of the parameter grid, in 
row-major order.
+      */
+     protected final DataPoints points;
+ 
+     /**
+      * Control points of the section curves, in row-major order, or an empty 
list if none.
+      */
+     protected final List<DirectPosition> controlPoints;
+ 
+     /**
+      * Number of rows in the parameter grid.
+      */
+     protected final int rows;
+ 
+     /**
+      * Number of columns in the parameter grid.
+      */
+     protected final int columns;
+ 
+     /**
+      * Construction parameter values matching the data points, the first 
sequence being for the
+      * <var>u</var> parameter and the second one for <var>v</var>.
+      */
+     protected final List<double[]> knots;
+ 
+     /**
+      * Creates a bilinear grid over the given parameter grid.
+      *
+      * @param  points         positions at the knots of the parameter grid, 
in row-major order.
+      *                        There shall be {@code rows} × {@code columns} 
of them.
+      * @param  controlPoints  control points of the section curves in 
row-major order,
+      *                        or {@code null} if none.
+      * @param  rows           number of rows in the parameter grid.
+      * @param  columns        number of columns in the parameter grid.
+      * @param  knots          knot values, one sequence per surface 
parameter, or {@code null} if none.
+      */
+     public DefaultBilinearGrid(final DataPoints points, final 
List<DirectPosition> controlPoints,
+             final int rows, final int columns, final List<double[]> knots)
+     {
+         this.points        = Objects.requireNonNull(points);
+         this.controlPoints = (controlPoints == null) ? List.of() : 
List.copyOf(controlPoints);
+         this.rows          = rows;
+         this.columns       = columns;
+         this.knots         = (knots == null) ? List.of() : List.copyOf(knots);
+     }
+ 
+     @Override
+     public int getRows() {
+         return rows;
+     }
+ 
+     @Override
+     public int getColumns() {
+         return columns;
+     }
+ 
+     @Override
+     public DataPoints getDataPoints() {
+         return points;
+     }
+ 
+     @Override
+     public List<DirectPosition> getControlPoints() {
+         return controlPoints;
+     }
+ 
+     @Override
+     public List<double[]> getKnots() {
+         return knots;
+     }
+ 
+     /**
+      * Returns {@link GeometryType#LINE}: the horizontal sections of a 
bilinear grid are polylines.
+      */
+     @Override
+     public GeometryType getHorizontalCurveType() {
+         return GeometryType.LINE;
+     }
+ 
+     /**
+      * Returns {@link GeometryType#LINE}: the vertical sections of a bilinear 
grid are polylines.
+      */
+     @Override
+     public GeometryType getVerticalCurveType() {
+         return GeometryType.LINE;
+     }
+ 
+     @Override
+     public Curve getHorizontalCurve(double v) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Curve getVerticalCurve(double u) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public DirectPosition getSurface(double u, double v) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public CoordinateReferenceSystem getCoordinateReferenceSystem() {
+         return points.getCoordinateReferenceSystem();
+     }
+ 
+     @Override
+     public void setCoordinateReferenceSystem(CoordinateReferenceSystem crs) 
throws IllegalArgumentException {
+         points.setCoordinateReferenceSystem(crs);
+     }
+ 
+     @Override
+     public DataPointsType getDataPointsType() {
+         return points.getType();
+     }
+ 
+     @Override
+     public boolean isEmpty() {
+         return points.isEmpty();
+     }
+ 
+     @Override
+     public Quantity<?> getArea() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Envelope getEnvelope() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
 -    public Identifier getName() {
++    public ReferenceIdentifier getName() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+ }
diff --cc 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultNurbSurface.java
index 0000000000,6e27f7759e..49076462ef
mode 000000,100644..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
@@@ -1,0 -1,384 +1,386 @@@
+ /*
+  * 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 java.util.Arrays;
+ import java.util.List;
+ import javax.measure.Quantity;
+ import org.apache.sis.geometries.BBox;
+ import org.apache.sis.geometries.Curve;
+ import org.apache.sis.geometries.DataPoints;
+ import org.apache.sis.geometries.curve.KnotType;
+ import org.apache.sis.geometries.operation.DeBoorAlgorithm;
+ import org.apache.sis.geometries.surface.BSplineSurfaceForm;
+ import org.apache.sis.geometries.surface.NurbSurface;
+ import org.apache.sis.maths.NDArrays;
+ import org.apache.sis.maths.Vector;
+ import org.apache.sis.maths.Vectors;
+ import org.opengis.geometry.DirectPosition;
 -import org.opengis.metadata.Identifier;
++
++// Specific to the geoapi-3.1 branch:
++import org.opengis.referencing.ReferenceIdentifier;
+ 
+ /**
+  * NURBS surface: tensor product of two directions (u, v), each one with its 
own degree and its own knot vector.
+  * The control points form a grid controlPoints[i][j] (i = u direction, j = v 
direction).
+  *
+  * @author Johann Sorel (Geomatys)
+  */
+ public non-sealed class DefaultNurbSurface extends AbstractGeometry 
implements NurbSurface {
+ 
+     final Vector<?>[][] controlPoints;
+     final double[][] weights;
+     final double[] knotsU;
+     final double[] knotsV;
+     final int degree;
+ 
+     public DefaultNurbSurface(final Vector<?>[][] controlPoints, final 
double[][] weights,
+             final double[] knotsU, final double[] knotsV, final int degree) {
+         this.controlPoints = controlPoints;
+         this.weights = weights;
+         this.knotsU = knotsU;
+         this.knotsV = knotsV;
+         this.degree = degree;
+     }
+ 
+     /**
+      * Evaluates the point S(u,v) of the surface at the given parameters.
+      *
+      * Principle: the formula S(u,v) = ΣΣ N_i,p(u) N_j,q(v) Pw_ij is computed 
as two passes of the "classical" De Boor
+      * algorithm in homogeneous coordinates: 1) for each row i, evaluate a 
curve along v -> one homogeneous point Q_i
+      * per row (this "flattens" the v direction) 2) then evaluate a curve 
along u using the Q_i as homogeneous control
+      * points and only dehomogenize at the very end — exactly the same 
principle as for curves, just applied twice.
+      *
+      * N_i,p(u) and N_j,q(v) vanish outside of their support, so only 
degreeU+1 rows and, within each of them, degreeV+1
+      * columns actually contribute. They are selected first through {@link 
DeBoorAlgorithm#findKnotSpan}, then De Boor's
+      * recursion is run on that small window only, through {@link 
DeBoorAlgorithm#evaluateWindow} — instead of walking
+      * the whole grid. The cost is therefore O(degreeU × degreeV) instead of 
O(rows × cols), independently of the grid
+      * size.
+      */
+     public Vector<?> evaluate(final double u, final double v) {
+         final int rows = controlPoints.length;
+         final int spatialDim = controlPoints[0][0].getDimension();
+ 
+         final int ku = DeBoorAlgorithm.findKnotSpan(u, knotsU, degree, rows - 
1);
+ 
+         final Vector<?>[] windowU = new Vector<?>[degree + 1];
+         for (int t = 0; t <= degree; t++) {
+             final int i = ku - degree + t;
+             windowU[t] = evaluateRowAlongV(controlPoints[i], weights[i], v, 
knotsV, degree);
+         }
+ 
+         final Vector<?> result = DeBoorAlgorithm.evaluateWindow(u, windowU, 
knotsU, degree, ku);
+         return DefaultNurbCurve.fromHomogeneous(result, spatialDim);
+     }
+ 
+     /**
+      * Evaluates, for a single row of the grid, the homogeneous point along v 
(degreeV+1 window only).
+      */
+     private static Vector<?> evaluateRowAlongV(final Vector<?>[] 
rowControlPoints, final double[] rowWeights,
+             final double v, final double[] knotsV, final int degreeV) {
+         final int cols = rowControlPoints.length;
+         final int kv = DeBoorAlgorithm.findKnotSpan(v, knotsV, degreeV, cols 
- 1);
+ 
+         final Vector<?>[] windowV = new Vector<?>[degreeV + 1];
+         for (int t = 0; t <= degreeV; t++) {
+             final int j = kv - degreeV + t;
+             windowV[t] = DefaultNurbCurve.toHomogeneous(rowControlPoints[j], 
rowWeights[j]);
+         }
+         return DeBoorAlgorithm.evaluateWindow(v, windowV, knotsV, degreeV, 
kv);
+     }
+ 
+     /**
+      * Partial derivatives {Su, Sv} at point (u,v) — the two vectors tangent 
to the surface.
+      *
+      * Same principle as for curves (differentiation of the homogeneous 
surface then the quotient rule), applied in each
+      * direction:
+      *
+      * - For Su: the v direction is flattened first (as in {@link 
#evaluate}), which yields a homogeneous curve in u; it
+      * is then differentiated with the same formula as for curves. - For Sv: 
symmetrically, u is flattened first, then
+      * the differentiation happens in v.
+      *
+      * Unlike {@link #evaluate} (optimized to a local window), this method 
rebuilds the complete flattened curve in each
+      * direction, because the differentiation formula needs the whole knot 
vector in order to stay correct at the window
+      * boundaries.
+      */
+     public Vector<?>[] derivative(final double u, final double v) {
+         final int rows = controlPoints.length;
+         final int cols = controlPoints[0].length;
+         final int spatialDim = controlPoints[0][0].getDimension();
+ 
+         // Flatten v -> a homogeneous curve along u (one value per row)
+         final Vector<?>[] alongU = new Vector<?>[rows];
+         for (int i = 0; i < rows; i++) {
+             final Vector<?>[] rowHom = new Vector<?>[cols];
+             for (int j = 0; j < cols; j++) {
+                 rowHom[j] = 
DefaultNurbCurve.toHomogeneous(controlPoints[i][j], weights[i][j]);
+             }
+             alongU[i] = DeBoorAlgorithm.evaluate(v, rowHom, knotsV, degree);
+         }
+         final Vector<?> Sw = DeBoorAlgorithm.evaluate(u, alongU, knotsU, 
degree);
+         final double w = Sw.get(spatialDim);
+         final double[] Suv = new double[spatialDim];
+         for (int c = 0; c < spatialDim; c++) {
+             Suv[c] = Sw.get(c) / w;
+         }
+ 
+         final Vector<?> su = partialDerivative(u, alongU, knotsU, degree, w, 
Suv, spatialDim);
+ 
+         // Flatten u -> a homogeneous curve along v (one value per column)
+         final Vector<?>[] alongV = new Vector<?>[cols];
+         for (int j = 0; j < cols; j++) {
+             final Vector<?>[] colHom = new Vector<?>[rows];
+             for (int i = 0; i < rows; i++) {
+                 colHom[i] = 
DefaultNurbCurve.toHomogeneous(controlPoints[i][j], weights[i][j]);
+             }
+             alongV[j] = DeBoorAlgorithm.evaluate(u, colHom, knotsU, degree);
+         }
+         final Vector<?> sv = partialDerivative(v, alongV, knotsV, degree, w, 
Suv, spatialDim);
+ 
+         return new Vector<?>[]{su, sv};
+     }
+ 
+     /**
+      * Differentiates the "flattened" homogeneous curve (already in 
homogeneous coordinates) and applies the quotient
+      * rule.
+      */
+     private static Vector<?> partialDerivative(final double param, final 
Vector<?>[] flattenedHomogeneous, final double[] knots, final int degree,
+             final double w, final double[] surfacePoint, final int 
spatialDim) {
+         if (degree == 0) {
+             return Vectors.createDouble(spatialDim);
+         }
+ 
+         final Vector<?>[] derivCtrl = 
DeBoorAlgorithm.derivativeControlPoints(flattenedHomogeneous, knots, degree);
+         final double[] derivKnots = Arrays.copyOfRange(knots, 1, knots.length 
- 1);
+         final Vector<?> deriv = DeBoorAlgorithm.evaluate(param, derivCtrl, 
derivKnots, degree - 1);
+ 
+         final double wDeriv = deriv.get(spatialDim);
+         final double[] result = new double[spatialDim];
+         for (int c = 0; c < spatialDim; c++) {
+             result[c] = (deriv.get(c) - wDeriv * surfacePoint[c]) / w;
+         }
+         return Vectors.createDouble(result.length).set(result);
+     }
+ 
+     /**
+      * Unit normal at point (u,v) — defined for a 3D surface only.
+      */
+     public Vector<?> normal(final double u, final double v) {
+         final Vector<?>[] d = derivative(u, v);
+         final Vector<?> n = d[0].cross(d[1]);
+         n.normalize();
+         return n;
+     }
+ 
+     public double domainStartU() {
+         return knotsU[degree];
+     }
+ 
+     public double domainEndU() {
+         return knotsU[controlPoints.length];
+     }
+ 
+     public double domainStartV() {
+         return knotsV[degree];
+     }
+ 
+     public double domainEndV() {
+         return knotsV[controlPoints[0].length];
+     }
+ 
+     // ------------------------------------------------------------------
+     // Subdivision
+     // ------------------------------------------------------------------
+     /**
+      * Splits this surface in two halves along the u direction, at the given 
u value.
+      * Trick: each column of the grid IS a curve in u,
+      * so {@link DefaultNurbCurve#subdivide(double)} is reused directly, 
column by column.
+      * The resulting left/right knot vector is the same for every column
+      * (it depends only on u and on the original knot vector), so it can be 
collected once.
+      *
+      * @param u parameter at which to split the surface
+      * @return the two halves, in parameter order
+      */
+     public DefaultNurbSurface[] subdivideU(final double u) {
+         final int rows = controlPoints.length, cols = controlPoints[0].length;
+         Vector<?>[][] leftCtrl = null, rightCtrl = null;
+         double[][] leftW = null, rightW = null;
+         double[] leftKnots = null, rightKnots = null;
+ 
+         for (int j = 0; j < cols; j++) {
+             final Vector<?>[] colCtrl = new Vector<?>[rows];
+             final double[] colW = new double[rows];
+             for (int i = 0; i < rows; i++) {
+                 colCtrl[i] = controlPoints[i][j];
+                 colW[i] = weights[i][j];
+             }
+ 
+             final DataPoints colDp = new ArrayDataPoints(
+                 NDArrays.of(List.of(colCtrl),
+                 colCtrl[0].getSampleSystem(),
+                 colCtrl[0].getDataType()));
+             final DefaultNurbCurve[] halves = new DefaultNurbCurve(colDp, 
colW, knotsU, degree).subdivide(u);
+ 
+             if (leftCtrl == null) {
+                 leftCtrl = new Vector<?>[halves[0].nbCtrlPts][cols];
+                 leftW = new double[halves[0].nbCtrlPts][cols];
+                 rightCtrl = new Vector<?>[halves[1].nbCtrlPts][cols];
+                 rightW = new double[halves[1].nbCtrlPts][cols];
+                 leftKnots = halves[0].knots;
+                 rightKnots = halves[1].knots;
+             }
+             for (int i = 0; i < halves[0].nbCtrlPts; i++) {
+                 leftCtrl[i][j] = halves[0].controlPoints[i];
+                 leftW[i][j] = halves[0].weights[i];
+             }
+             for (int i = 0; i < halves[1].nbCtrlPts; i++) {
+                 rightCtrl[i][j] = halves[1].controlPoints[i];
+                 rightW[i][j] = halves[1].weights[i];
+             }
+         }
+ 
+         return new DefaultNurbSurface[]{
+             new DefaultNurbSurface(leftCtrl, leftW, leftKnots, knotsV, 
degree),
+             new DefaultNurbSurface(rightCtrl, rightW, rightKnots, knotsV, 
degree)
+         };
+     }
+ 
+     /**
+      * Same as {@link #subdivideU} but along the v direction (each ROW is a 
curve in v).
+      */
+     public DefaultNurbSurface[] subdivideV(final double v) {
+         final int rows = controlPoints.length;
+         Vector<?>[][] leftCtrl = null, rightCtrl = null;
+         double[][] leftW = null, rightW = null;
+         double[] leftKnots = null, rightKnots = null;
+ 
+         for (int i = 0; i < rows; i++) {
+ 
+             final DataPoints dp = new ArrayDataPoints(
+                 NDArrays.of(List.of(controlPoints[i]),
+                 controlPoints[i][0].getSampleSystem(),
+                 controlPoints[i][0].getDataType()));
+ 
+             final DefaultNurbCurve[] halves = new DefaultNurbCurve(dp, 
weights[i], knotsV, degree).subdivide(v);
+ 
+             if (leftCtrl == null) {
+                 leftCtrl = new Vector<?>[rows][halves[0].nbCtrlPts];
+                 leftW = new double[rows][halves[0].controlPoints.length];
+                 rightCtrl = new Vector<?>[rows][halves[1].nbCtrlPts];
+                 rightW = new double[rows][halves[1].controlPoints.length];
+                 leftKnots = halves[0].knots;
+                 rightKnots = halves[1].knots;
+             }
+             leftCtrl[i] = halves[0].controlPoints;
+             leftW[i] = halves[0].weights;
+             rightCtrl[i] = halves[1].controlPoints;
+             rightW[i] = halves[1].weights;
+         }
+ 
+         return new DefaultNurbSurface[]{
+             new DefaultNurbSurface(leftCtrl, leftW, knotsU, leftKnots, 
degree),
+             new DefaultNurbSurface(rightCtrl, rightW, knotsU, rightKnots, 
degree)
+         };
+     }
+ 
+ 
+     /**
+      * Bounding box of the control points, which contains the surface (convex 
hull property).
+      *
+      * @return the bounding box of this surface
+      */
+     public BBox getEnvelope() {
+         final BBox bbox = new BBox(controlPoints[0][0], controlPoints[0][0]);
+         for (final Vector<?>[] row : controlPoints) {
+             for (final Vector<?> p : row) {
+                 bbox.add(p);
+             }
+         }
+         return bbox;
+     }
+ 
+     @Override
+     public int getDegree() {
+         return degree;
+     }
+ 
+     @Override
+     public List<double[]> getKnots() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public KnotType getKnotSpec() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public BSplineSurfaceForm getSurfaceForm() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public boolean isPolynomial() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Quantity<?> getArea() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public int getRows() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public int getColumns() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public List<DirectPosition> getControlPoints() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public DataPoints getDataPoints() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Curve getHorizontalCurve(double v) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public Curve getVerticalCurve(double u) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
+     public DirectPosition getSurface(double u, double v) {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+     @Override
 -    public Identifier getName() {
++    public ReferenceIdentifier getName() {
+         throw new UnsupportedOperationException("Not supported yet.");
+     }
+ 
+ }
diff --cc 
incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/solid/Sphere.java
index f39eee8d29,936c0a4768..8cb60846c8
--- 
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/solid/Sphere.java
@@@ -14,22 -14,29 +14,31 @@@
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
- package org.apache.sis.geometries;
+ package org.apache.sis.geometries.solid;
  
  import java.util.List;
- import org.opengis.geometry.Envelope;
- import org.opengis.geometry.DirectPosition;
- import org.opengis.referencing.crs.CoordinateReferenceSystem;
+ import javax.measure.Quantity;
+ import org.apache.sis.geometries.BBox;
+ import org.apache.sis.geometries.Curve;
+ import org.apache.sis.geometries.DataPoints;
+ import org.apache.sis.geometries.Geometries;
+ import org.apache.sis.geometries.GeometryType;
+ import org.apache.sis.geometries.SurfaceInterpolation;
 -import org.apache.sis.geometries.internal.shared.AbstractGeometry;
+ import org.apache.sis.geometries.surface.ParametricCurveSurface;
+ import org.apache.sis.maths.Tuple;
+ import org.apache.sis.maths.Vector;
+ import org.apache.sis.maths.Vectors;
 -import org.apache.sis.util.ArgumentChecks;
  import static org.opengis.annotation.Specification.ISO_19107;
  import org.opengis.annotation.UML;
 +import org.apache.sis.geometries.internal.shared.AbstractGeometry;
- import org.apache.sis.geometries.math.Tuple;
- import org.apache.sis.geometries.math.Vector;
- import org.apache.sis.geometries.math.Vectors;
 +import org.apache.sis.util.ArgumentChecks;
 +
 +// Specific to the geoapi-3.1 branch:
 +import org.opengis.referencing.ReferenceIdentifier;
+ import org.opengis.geometry.DirectPosition;
+ import org.opengis.geometry.Envelope;
 -import org.opengis.metadata.Identifier;
+ import org.opengis.referencing.crs.CoordinateReferenceSystem;
+ import org.apache.sis.geometries.DataPointsType;
  
  
  /**

Reply via email to