You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2023/01/17 14:30:02 UTC

[sis] branch geoapi-3.1 updated (f76afb0622 -> bece843ce4)

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

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


    from f76afb0622 Merge branch 'geoapi-4.0' into geoapi-3.1
     add ae61bb0a20 Add missing `equals` and `hashCode` method on a legacy metadata property.
     add 8881e88be3 Disable some GIGS tests that are known to fail. https://gigs.iogp.org/
     add 0f46e213f3 More advanced test for rounding errors.
     add 8991c55d92 Replace `Path` parameter value by `URI` in operation methods using datum shift grids.
     add 8eceb4133a Replace `Path` by `File` in `ResourceEvent` for resolving serialization warning. The `File` object was what we needed for storing in `RecentFiles` anyway. Opportunistic documentation cleanup.
     add f8afbbfd5b Document `StandardDateFormat` as not intended for serialization. We verified that it was not used as non-transient field in a serialiable class.
     add c288461503 Consolidate the constants for `ByteBuffer` capacity and increase the default capacity from 8 kb to 16 kb.
     add 47e5b43141 Replace some <div> by <h2> or <h4> headings. This is a change in javadoc formatting only.
     add 9f079c7e51 Move the `Configuration` annotation to internal package. Apply the annotation on some static constants worth to know that they can be changed.
     add 8566937622 Use static constants for most (not all) loggers.
     new 3014fe6003 Opportunistically use the division by `w` in ProjectiveTransform for reducing rounding errors with fractional matrix element values.
     new bece843ce4 Merge branch 'geoapi-4.0' into geoapi-3.1. Contains cleanup on serialization, loggers, rounding errors (again), javadoc.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/sis/console/AboutCommand.java  |   4 +-
 .../java/org/apache/sis/console/package-info.java  |   2 +-
 .../main/java/org/apache/sis/gui/RecentFiles.java  |  14 +-
 .../apache/sis/gui/coverage/CoverageCanvas.java    |   7 +-
 .../apache/sis/gui/coverage/GridSliceSelector.java |   8 +-
 .../org/apache/sis/gui/dataset/FeatureLoader.java  |   2 +
 .../org/apache/sis/gui/dataset/FeatureTable.java   |   9 +-
 .../org/apache/sis/gui/dataset/PathAction.java     |  12 +-
 .../org/apache/sis/gui/dataset/ResourceCell.java   |   4 +-
 .../org/apache/sis/gui/dataset/ResourceEvent.java  |  33 +-
 .../org/apache/sis/gui/dataset/ResourceTree.java   |   9 +-
 .../org/apache/sis/gui/dataset/WindowHandler.java  |   8 +-
 .../org/apache/sis/gui/dataset/package-info.java   |   2 +-
 .../org/apache/sis/gui/map/GestureFollower.java    |   8 +-
 .../java/org/apache/sis/gui/map/MapCanvas.java     |   7 +-
 .../java/org/apache/sis/gui/map/MapCanvasAWT.java  |   3 +
 .../org/apache/sis/gui/map/OperationFinder.java    |   7 +-
 .../java/org/apache/sis/gui/map/StatusBar.java     |   6 +-
 .../org/apache/sis/gui/map/ValuesFormatter.java    |   7 +-
 .../org/apache/sis/gui/metadata/MetadataTree.java  |   7 +-
 .../org/apache/sis/gui/metadata/package-info.java  |   2 +-
 .../apache/sis/gui/referencing/AuthorityCodes.java |   7 +-
 .../gui/referencing/PositionableProjection.java    |   8 +-
 .../gui/referencing/RecentReferenceSystems.java    |   7 +-
 .../java/org/apache/sis/gui/referencing/Utils.java |   7 +-
 .../apache/sis/internal/gui/BackgroundThreads.java |   7 +-
 .../apache/sis/internal/gui/ImageConverter.java    |   7 +-
 .../org/apache/sis/internal/gui/LogHandler.java    |  10 +-
 .../org/apache/sis/internal/gui/RecentChoices.java |   2 +
 .../java/org/apache/sis/internal/gui/Styles.java   |   7 +-
 .../apache/sis/internal/gui/control/ColorCell.java |   6 +-
 .../org/apache/sis/internal/gui/package-info.java  |   2 +-
 .../org/apache/sis/coverage/SampleRangeFormat.java |   2 +
 .../coverage/grid/CoordinateOperationFinder.java   |   7 +-
 .../apache/sis/coverage/grid/DefaultEvaluator.java |   7 +-
 .../sis/coverage/grid/GridCoverageProcessor.java   |   7 +-
 .../org/apache/sis/coverage/grid/GridExtent.java   |  11 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |   4 +-
 .../apache/sis/feature/AbstractIdentifiedType.java |   9 +-
 .../java/org/apache/sis/feature/FeatureFormat.java |   7 +-
 .../java/org/apache/sis/feature/package-info.java  |   2 +-
 .../apache/sis/image/BandedSampleConverter.java    |   7 +-
 .../java/org/apache/sis/image/ErrorAction.java     |  13 +-
 .../main/java/org/apache/sis/image/MaskImage.java  |   7 +-
 .../java/org/apache/sis/image/ResampledImage.java  |   7 +-
 .../java/org/apache/sis/image/ResamplingGrid.java  |   2 +
 .../java/org/apache/sis/image/package-info.java    |   2 +-
 .../sis/internal/coverage/j2d/ImageLayout.java     |   4 +
 .../sis/internal/coverage/j2d/ImageUtilities.java  |  15 +-
 .../apache/sis/internal/feature/Geometries.java    |   9 +-
 .../sis/internal/feature/GeometryFactories.java    |   6 +-
 .../org/apache/sis/internal/feature/jts/JTS.java   |   7 +-
 .../sis/internal/feature/jts/package-info.java     |   2 +-
 .../apache/sis/internal/feature/package-info.java  |   2 +-
 .../java/org/apache/sis/internal/filter/Node.java  |  12 +-
 .../internal/filter/sqlmm/RegistryTestCase.java    |   8 +-
 .../apache/sis/internal/metadata/Dependencies.java |   3 +-
 .../sis/internal/metadata/ServicesForUtility.java  |   8 +-
 .../internal/metadata/legacy/DateToTemporal.java   |  25 +-
 .../internal/metadata/legacy/TemporalToDate.java   |  25 +-
 .../sis/internal/metadata/legacy/package-info.java |   2 +-
 .../sis/internal/metadata/sql/Initializer.java     |  32 +-
 .../sis/internal/metadata/sql/LocalDataSource.java |  14 +-
 .../sis/internal/metadata/sql/package-info.java    |   2 +-
 .../sis/internal/simple/CitationConstant.java      |  12 +-
 .../apache/sis/internal/simple/package-info.java   |   2 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |   4 +-
 .../org/apache/sis/metadata/MetadataStandard.java  |   2 +
 .../apache/sis/metadata/PropertyInformation.java   |  11 +-
 .../sis/metadata/StandardImplementation.java       |  15 +-
 .../org/apache/sis/metadata/TreeNodeChildren.java  |   4 +-
 .../java/org/apache/sis/metadata/package-info.java |   2 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  10 +-
 .../org/apache/sis/metadata/sql/package-info.java  |   2 +-
 .../main/java/org/apache/sis/util/iso/Types.java   |  18 +-
 .../main/java/org/apache/sis/xml/LegacyCodes.java  |   8 +-
 .../java/org/apache/sis/xml/MarshallerPool.java    |  14 +-
 .../java/org/apache/sis/xml/NilObjectHandler.java  |   4 +-
 .../main/java/org/apache/sis/xml/NilReason.java    |   4 +-
 .../src/main/java/org/apache/sis/xml/XLink.java    |   8 +-
 .../src/main/java/org/apache/sis/xml/XML.java      |   4 +-
 .../coverage/MultiResolutionCoverageLoader.java    |   2 +
 .../sis/internal/map/coverage/RenderingData.java   |  12 +-
 .../sis/internal/map/coverage/package-info.java    |   2 +-
 .../main/java/org/apache/sis/portrayal/Canvas.java |   5 +-
 .../org/apache/sis/portrayal/CanvasContext.java    |   2 +
 .../org/apache/sis/portrayal/CanvasFollower.java   |   4 +-
 .../java/org/apache/sis/portrayal/Observable.java  |   9 +-
 .../apache/sis/portrayal/TransformChangeEvent.java |   4 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |   8 +-
 .../gazetteer/ReferencingByIdentifiers.java        |  12 +-
 .../sis/referencing/gazetteer/package-info.java    |   2 +-
 .../org/apache/sis/geometry/AbstractEnvelope.java  |   4 +-
 .../org/apache/sis/geometry/CoordinateFormat.java  |  14 +-
 .../java/org/apache/sis/geometry/Envelopes.java    |  13 +-
 .../apache/sis/geometry/GeneralDirectPosition.java |   6 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |   6 +-
 .../java/org/apache/sis/geometry/package-info.java |   2 +-
 .../sis/internal/referencing/Arithmetic.java       |   4 +-
 .../internal/referencing/DefinitionVerifier.java   |   2 +-
 .../sis/internal/referencing/DeprecatedCode.java   |   9 +-
 .../sis/internal/referencing/DeprecatedName.java   |   9 +-
 .../apache/sis/internal/referencing/Formulas.java  |   8 +-
 .../referencing/PositionalAccuracyConstant.java    |   4 +
 .../sis/internal/referencing/WKTKeywords.java      |   6 +-
 .../sis/internal/referencing/WKTUtilities.java     |   9 +-
 .../referencing/provider/AbstractProvider.java     |  12 +-
 .../referencing/provider/DatumShiftGridFile.java   |  65 ++--
 .../referencing/provider/DatumShiftGridGroup.java  |   6 +-
 .../referencing/provider/DatumShiftGridLoader.java |  62 +++-
 .../provider/FranceGeocentricInterpolation.java    | 361 +++++++++++----------
 .../referencing/provider/GeocentricAffine.java     |   7 +-
 .../referencing/provider/Geographic3Dto2D.java     |   6 +-
 .../provider/MolodenskyInterpolation.java          |   1 +
 .../sis/internal/referencing/provider/NADCON.java  |  93 +++---
 .../sis/internal/referencing/provider/NTv2.java    |  54 ++-
 .../referencing/provider/VerticalOffset.java       |   6 +-
 .../java/org/apache/sis/io/wkt/AbstractParser.java |  14 +-
 .../main/java/org/apache/sis/io/wkt/Formatter.java |   3 +
 .../java/org/apache/sis/io/wkt/WKTDictionary.java  |   6 +-
 .../main/java/org/apache/sis/io/wkt/WKTFormat.java |  16 +-
 .../sis/parameter/DefaultParameterValue.java       |  12 +-
 .../apache/sis/parameter/ParameterValueList.java   |   6 +-
 .../java/org/apache/sis/parameter/Verifier.java    |  12 +-
 .../org/apache/sis/parameter/package-info.java     |   2 +-
 .../apache/sis/referencing/AuthorityFactories.java |  11 +-
 .../main/java/org/apache/sis/referencing/CRS.java  |  12 +-
 .../java/org/apache/sis/referencing/CommonCRS.java |   9 +-
 .../sis/referencing/GeodesicsOnEllipsoid.java      |   6 +-
 .../apache/sis/referencing/IdentifiedObjects.java  |   6 +-
 .../sis/referencing/ImmutableIdentifier.java       |   4 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |   4 +-
 .../sis/referencing/crs/ExplicitParameters.java    |  11 +-
 .../apache/sis/referencing/crs/package-info.java   |   2 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  11 +-
 .../sis/referencing/cs/CoordinateSystems.java      |   5 +-
 .../sis/referencing/cs/DirectionAlongMeridian.java |   7 +-
 .../sis/referencing/datum/DatumShiftGrid.java      |   6 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |  23 +-
 .../factory/AuthorityFactoryIdentifier.java        |   7 +-
 .../factory/CommonAuthorityFactory.java            |   5 +-
 .../factory/ConcurrentAuthorityFactory.java        |  24 +-
 .../factory/GeodeticAuthorityFactory.java          |   9 +-
 .../referencing/factory/GeodeticObjectFactory.java |   9 +-
 .../factory/IdentifiedObjectFinder.java            |   8 +-
 .../referencing/factory/IdentifiedObjectSet.java   |   8 +-
 .../factory/MultiAuthoritiesFactory.java           |   9 +-
 .../sis/referencing/factory/ReferenceKeeper.java   |   3 +
 .../factory/sql/CloseableReference.java            |   7 +-
 .../referencing/factory/sql/EPSGCodeFinder.java    |  11 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  19 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |   3 +-
 .../factory/sql/InstallationScriptProvider.java    |   6 +-
 .../sis/referencing/factory/sql/package-info.java  |   9 +-
 .../operation/AbstractCoordinateOperation.java     |  12 +-
 .../operation/CoordinateOperationRegistry.java     |  15 +-
 .../DefaultCoordinateOperationFactory.java         |   2 +
 .../operation/builder/LinearTransformBuilder.java  |   6 +-
 .../operation/builder/LocalizationGridBuilder.java |   2 +
 .../operation/builder/ProjectedTransformTry.java   |  12 +-
 .../operation/matrix/GeneralMatrix.java            |   4 +
 .../referencing/operation/projection/Mercator.java |   3 +-
 .../operation/projection/NormalizedProjection.java |   8 +-
 .../operation/projection/Orthographic.java         |   4 +-
 .../operation/projection/TransverseMercator.java   |   2 +
 .../transform/AbstractLinearTransform.java         |   4 +-
 .../operation/transform/AbstractMathTransform.java |   9 +-
 .../operation/transform/ConcatenatedTransform.java |  12 +-
 .../operation/transform/ContextualParameters.java  |   5 +-
 .../transform/DefaultMathTransformFactory.java     |  11 +-
 .../operation/transform/InterpolatedTransform.java |   3 +
 .../operation/transform/ProjectiveTransform.java   | 221 ++++++++++---
 .../operation/transform/WraparoundTransform.java   |   7 +-
 .../src/main/resources/META-INF/GIGS.properties    |  80 +++++
 .../referencing/provider/DatumShiftTestCase.java   |  23 +-
 .../FranceGeocentricInterpolationTest.java         |  34 +-
 .../internal/referencing/provider/NADCONTest.java  |  11 +-
 .../internal/referencing/provider/NTv2Test.java    |  19 +-
 .../factory/ConcurrentAuthorityFactoryTest.java    |   6 +-
 .../sis/referencing/factory/TestFactorySource.java |   8 +-
 .../transform/ProjectiveTransformTest.java         |  19 +-
 .../transform/TransformResultComparator.java       |   2 +-
 .../sis/test/integration/DatumShiftTest.java       |  10 +-
 .../org/apache/sis/internal/jdk17/HexFormat.java   |   6 +-
 .../apache/sis/internal/system/CommonExecutor.java |   1 +
 .../apache/sis/internal/system/Configuration.java  |  91 ++++++
 .../apache/sis/internal/system/DataDirectory.java  |  30 +-
 .../sis/internal/system/DefaultFactories.java      |   5 +-
 .../sis/internal/system/DelayedExecutor.java       |   6 +-
 .../org/apache/sis/internal/system/Loggers.java    |   9 +-
 .../sis/internal/system/OptionalDependency.java    |   2 +-
 .../internal/system/ReferenceQueueConsumer.java    |   6 +-
 .../org/apache/sis/internal/system/Shutdown.java   |   6 +-
 .../org/apache/sis/internal/system/Supervisor.java |  11 +-
 .../apache/sis/internal/system/SystemListener.java |   8 +-
 .../org/apache/sis/internal/system/Threads.java    |   6 +-
 .../apache/sis/internal/util/DefinitionURI.java    |   6 +-
 .../org/apache/sis/internal/util/DoubleDouble.java |   4 +
 .../org/apache/sis/internal/util/Numerics.java     |   3 +
 .../sis/internal/util/StandardDateFormat.java      |  13 +-
 .../main/java/org/apache/sis/math/Fraction.java    |   2 +-
 .../src/main/java/org/apache/sis/math/Plane.java   |   2 +
 .../src/main/java/org/apache/sis/math/Vector.java  |  10 +-
 .../java/org/apache/sis/measure/AbstractUnit.java  |  11 +-
 .../apache/sis/measure/DefaultQuantityFactory.java |   2 +-
 .../org/apache/sis/measure/QuantityFormat.java     |   9 +-
 .../main/java/org/apache/sis/measure/Scalar.java   |   5 +-
 .../java/org/apache/sis/measure/UnitFormat.java    |   7 +-
 .../java/org/apache/sis/measure/UnitRegistry.java  |  13 +-
 .../java/org/apache/sis/measure/UnitServices.java  |   4 +-
 .../src/main/java/org/apache/sis/setup/About.java  |   4 +-
 .../java/org/apache/sis/setup/Configuration.java   |  11 +-
 .../main/java/org/apache/sis/setup/OptionKey.java  |   2 +-
 .../java/org/apache/sis/setup/package-info.java    |   2 +-
 .../java/org/apache/sis/util/Configuration.java    |  44 ---
 .../src/main/java/org/apache/sis/util/Locales.java |   9 +-
 .../src/main/java/org/apache/sis/util/Numbers.java |   2 +-
 .../java/org/apache/sis/util/collection/Cache.java |   8 +-
 .../apache/sis/util/collection/CodeListSet.java    |   4 +-
 .../sis/util/collection/DefaultTreeTable.java      |   9 +-
 .../sis/util/collection/FrequencySortedSet.java    |   6 +-
 .../apache/sis/util/collection/TreeNodeList.java   |   4 +-
 .../java/org/apache/sis/util/logging/Logging.java  |  57 +++-
 .../apache/sis/util/logging/MonolineFormatter.java |  15 +-
 .../apache/sis/util/logging/PerformanceLevel.java  |   7 +-
 .../sis/util/resources/IndexedResourceBundle.java  |  18 +-
 .../apache/sis/util/resources/package-info.java    |   2 +-
 .../src/test/java/org/apache/sis/test/Assume.java  |   7 +-
 .../java/org/apache/sis/test/package-info.java     |   2 +-
 ide-project/NetBeans/nbproject/project.xml         |   1 +
 .../sis/storage/landsat/LandsatStoreProvider.java  |  18 +-
 .../storage/inflater/CompressionChannel.java       |   6 +-
 .../sis/storage/geotiff/GeoTiffStoreProvider.java  |  18 +-
 .../org/apache/sis/storage/geotiff/Reader.java     |   6 +-
 .../org/apache/sis/internal/netcdf/Decoder.java    |  16 +-
 .../org/apache/sis/internal/netcdf/FeatureSet.java |   2 +
 .../apache/sis/internal/netcdf/package-info.java   |   2 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |   2 +
 .../sis/storage/netcdf/NetcdfStoreProvider.java    |  14 +-
 .../apache/sis/storage/netcdf/package-info.java    |   2 +-
 .../apache/sis/storage/sql/SQLStoreProvider.java   |  18 +-
 .../internal/storage/DocumentedStoreProvider.java  |   5 +-
 .../sis/internal/storage/StoreUtilities.java       |   2 +
 .../sis/internal/storage/csv/StoreProvider.java    |  20 +-
 .../storage/esri/AsciiGridStoreProvider.java       |  18 +-
 .../storage/esri/RawRasterStoreProvider.java       |  18 +-
 .../sis/internal/storage/esri/package-info.java    |   2 +-
 .../sis/internal/storage/folder/StoreProvider.java |  18 +-
 .../sis/internal/storage/folder/package-info.java  |   2 +-
 .../storage/image/WorldFileStoreProvider.java      |  18 +-
 .../internal/storage/io/FileCacheByteChannel.java  |  18 +-
 .../sis/internal/storage/io/HttpByteChannel.java   |   2 +-
 .../sis/internal/storage/io/IOUtilities.java       |  21 --
 .../internal/storage/io/MemoryDataTransfer.java    |   4 +-
 .../internal/storage/io/RewindableLineReader.java  |   7 +-
 .../apache/sis/internal/storage/package-info.java  |   2 +-
 .../sis/internal/storage/wkt/FirstKeywordPeek.java |   1 +
 .../sis/internal/storage/wkt/StoreProvider.java    |  18 +-
 .../sis/internal/storage/wkt/package-info.java     |   2 +-
 .../sis/internal/storage/xml/StoreProvider.java    |  16 +
 .../org/apache/sis/storage/AbstractResource.java   |  12 +-
 .../org/apache/sis/storage/DataStoreProvider.java  |  26 +-
 .../org/apache/sis/storage/ProbeInputStream.java   |   4 +-
 .../java/org/apache/sis/storage/ProbeReader.java   |   4 +-
 .../org/apache/sis/storage/StorageConnector.java   |  31 +-
 .../aggregate/ConcatenatedGridCoverage.java        |   9 +-
 .../apache/sis/storage/aggregate/package-info.java |   2 +-
 .../apache/sis/storage/event/StoreListeners.java   |   5 +-
 .../storage/io/FileCacheByteChannelTest.java       |   2 +-
 .../apache/sis/test/storage/SubsampledImage.java   |   4 +-
 .../sis/internal/storage/gpx/StoreProvider.java    |  16 +
 271 files changed, 1958 insertions(+), 1282 deletions(-)
 create mode 100644 core/sis-referencing/src/main/resources/META-INF/GIGS.properties
 create mode 100644 core/sis-utility/src/main/java/org/apache/sis/internal/system/Configuration.java
 delete mode 100644 core/sis-utility/src/main/java/org/apache/sis/util/Configuration.java


[sis] 01/02: Opportunistically use the division by `w` in ProjectiveTransform for reducing rounding errors with fractional matrix element values.

Posted by de...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3014fe6003c66cc4c54a3fc144c3cc339a67e191
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Jan 17 15:19:31 2023 +0100

    Opportunistically use the division by `w` in ProjectiveTransform
    for reducing rounding errors with fractional matrix element values.
---
 .../transform/AbstractLinearTransform.java         |   4 +-
 .../operation/transform/ProjectiveTransform.java   | 221 ++++++++++++++++-----
 .../transform/ProjectiveTransformTest.java         |  12 ++
 3 files changed, 182 insertions(+), 55 deletions(-)

diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java
index f37950fc84..f8cc1d777e 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/AbstractLinearTransform.java
@@ -80,8 +80,8 @@ abstract class AbstractLinearTransform extends AbstractMathTransform implements
         for (int i=0; i<elements.length; i++) {
             final double element = elements[i];
             if (element != 0) {
-                final int vi = (int) element;           // Check if we can store as integer.
-                numbers[i] = (vi == element) ? Integer.valueOf(vi) : Double.valueOf(element);
+                final int ie = (int) element;           // Check if we can store as integer.
+                numbers[i] = (ie == element) ? Integer.valueOf(ie) : Double.valueOf(element);
             }
         }
         return numbers;
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ProjectiveTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ProjectiveTransform.java
index 5188c12e66..0e6f023b0c 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ProjectiveTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/ProjectiveTransform.java
@@ -23,9 +23,11 @@ import org.apache.sis.internal.referencing.DirectPositionView;
 import org.apache.sis.referencing.operation.matrix.Matrices;
 import org.apache.sis.referencing.operation.matrix.MatrixSIS;
 import org.apache.sis.internal.referencing.ExtendedPrecisionMatrix;
+import org.apache.sis.internal.referencing.Arithmetic;
 import org.apache.sis.internal.referencing.Formulas;
-import org.apache.sis.util.resources.Errors;
+import org.apache.sis.internal.util.Numerics;
 import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.math.Fraction;
 
 
 /**
@@ -48,7 +50,7 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
     /**
      * Serial number for inter-operability with different versions.
      */
-    private static final long serialVersionUID = -5616239625370371256L;
+    private static final long serialVersionUID = -4813507361303377148L;
 
     /**
      * The number of rows.
@@ -61,12 +63,26 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
     private final int numCol;
 
     /**
-     * Elements of the matrix. Column indices vary fastest.
+     * Number of columns for coefficients other than scales and shears in the {@link #elt} array.
+     * There is one column for translation terms and one column for denominators.
+     */
+    private static final int NON_SCALE_COLUMNS = 2;
+
+    /**
+     * Elements of the matrix augmented with one column containing common denominators.
+     * Column indices vary fastest.
+     *
+     * <h4>Denominator column</h4>
+     * An additional column is appended after the translation column.
+     * That column contains a denominator inferred from fractional values found on the row.
+     * All elements in the matrix row shall be multiplied by that denominator.
+     * The intend is to increase the chances that matrix elements are integer values.
+     * If no fractional value is found, the default denominator value is 1.
      */
     private final double[] elt;
 
     /**
-     * Same numbers than {@link #elt} with potentially extended precision.
+     * Same numbers than {@link #elt} excluding the denominators and with potentially extended precision.
      * Zero values <em>shall</em> be represented by null elements.
      */
     private final Number[] numbers;
@@ -74,47 +90,110 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
     /**
      * Constructs a transform from the specified matrix.
      * The matrix is usually square and affine, but this is not enforced.
+     * Non-affine transforms (e.g. projective transforms) are accepted but may not be invertible.
      *
-     * @param matrix  the matrix.
+     * @param matrix  the matrix containing the coefficients of this projective transform.
      */
     protected ProjectiveTransform(final Matrix matrix) {
         numRow = matrix.getNumRow();
         numCol = matrix.getNumCol();
-        Number[] numbers = null;
+        /*
+         * Get the matrix elements as `Number` instances if possible.
+         * Those instances allow better precision than `double` values.
+         * Those numbers are available only through SIS-specific API.
+         */
+        final boolean hasNumbers;
         if (matrix instanceof ExtendedPrecisionMatrix) {
             // Use `writable = true` because we need a copy protected from changes.
             numbers = ((ExtendedPrecisionMatrix) matrix).getElementAsNumbers(true);
-        }
-        if (matrix instanceof MatrixSIS) {
+            hasNumbers = true;
+        } else if (matrix instanceof MatrixSIS) {
             final MatrixSIS m = (MatrixSIS) matrix;
-            elt = m.getElements();
-            if (elt.length != numRow * numCol) {
-                throw new IllegalArgumentException(Errors.format(Errors.Keys.MismatchedArrayLengths));
-            }
-            if (numbers == null) {
-                numbers = new Number[elt.length];
-                for (int i=0; i<numbers.length; i++) {
-                    final Number element = m.getNumber(i / numCol, i % numCol);
-                    if (!ExtendedPrecisionMatrix.isZero(element)) {
-                        numbers[i] = element;
-                    }
+            numbers = new Number[numRow * numCol];
+            for (int i=0; i<numbers.length; i++) {
+                final Number e = m.getNumber(i / numCol, i % numCol);
+                if (!ExtendedPrecisionMatrix.isZero(e)) {
+                    numbers[i] = e;
                 }
             }
+            hasNumbers = true;
         } else {
-            elt = new double[numRow * numCol];
-            for (int i=0; i<elt.length; i++) {
-                elt[i] = matrix.getElement(i / numCol, i % numCol);
+            numbers = new Number[numRow * numCol];
+            hasNumbers = false;
+        }
+        /*
+         * Get the matrix elements as `double` values through the standard matrix API.
+         * We do that as a way to preserve negative zero, which is lost in `numbers`.
+         * The `numbers` array is either completed or compared for consistency.
+         */
+        final int dstDim    = numRow - 1;               // Last row is [0 0 … 1] in an affine transform.
+        final int rowStride = numCol + 1;               // The `elt` array has an extra column for denominators.
+        elt = new double[numRow * rowStride - 1];       // We don't need the denominator of the [0 0 … 1] row.
+        for (int k=0,i=0; i < numRow; i++) {
+            for (int j=0; j < numCol; j++) {
+                final double e = matrix.getElement(i, j);
+                elt[k++] = e;                           // May be negative zero.
+                if (hasNumbers) {
+                    assert epsilonEqual(e, numbers[i*numCol + j]);
+                } else if (e != 0) {
+                    final int v = (int) e;              // Check if we can store as integer.
+                    numbers[i*numCol + j] = (v == e) ? Integer.valueOf(v) : Double.valueOf(e);
+                }
             }
-            if (numbers == null) {
-                numbers = wrap(elt);
+            if (i != dstDim) {
+                elt[k++] = 1;
+            } else {
+                assert k == elt.length;
             }
         }
-        this.numbers = numbers;
-        if (elt.length != numbers.length) {
-            throw new IllegalArgumentException(Errors.format(Errors.Keys.MismatchedArrayLengths));
+        /*
+         * At this point, this `ProjectiveTransform` is initialized and valid.
+         * Optionally update the elements values for reducing rounding errors
+         * when a denominator can be identified. This is where the denominator
+         * column in the `elt` array may get values different than 1.
+         */
+        if (hasNumbers) {
+            for (int row=0; row < dstDim; row++) {
+                final int lower = numCol * row;
+                final int upper = numCol + lower;
+                final Integer denominator;
+                try {
+                    Fraction sum = null;
+                    for (int i=lower; i<upper; i++) {
+                        final Number element = numbers[i];
+                        if (element instanceof Fraction) {
+                            final Fraction f = (Fraction) element;
+                            sum = (sum != null) ? sum.add(f) : f;
+                        }
+                    }
+                    if (sum == null) {
+                        continue;
+                    }
+                    denominator = sum.denominator;
+                } catch (ArithmeticException e) {
+                    continue;
+                }
+                int k = row * rowStride;
+                for (int i=lower; i<upper; i++) {
+                    final Number element = Arithmetic.multiply(numbers[i], denominator);
+                    if (element != null) {
+                        elt[k] = element.doubleValue();
+                    }
+                    k++;
+                }
+                elt[k] = denominator.doubleValue();
+            }
         }
     }
 
+    /**
+     * Returns whether the given number are equal, with a tolerance of 1 ULP.
+     * A null {@code Number} is interpreted as zero.
+     */
+    private static boolean epsilonEqual(final double e, final Number v) {
+        return Numerics.epsilonEqual(e, (v != null) ? v.doubleValue() : 0, Math.ulp(e));
+    }
+
     /**
      * If a more efficient implementation of this math transform can be used, returns it.
      * Otherwise returns {@code this} unchanged.
@@ -125,7 +204,7 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
         }
         final int n = (numRow - 1) * numCol;
         for (int i = 0; i < numCol;) {
-            if (elt[n + i] != (++i == numCol ? 1 : 0)) {
+            if (!isIdentity(numbers[n + i], ++i == numCol)) {
                 return this;            // Transform is not affine (ignoring if square or not).
             }
         }
@@ -142,11 +221,11 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
         boolean isTranslation = (numRow == numCol);         // TranslationTransform is restricted to square matrix.
         final int lastColumn  = numCol - 1;
         for (int i=0; i<n; i++) {
-            final double v = elt[i];
+            final Number element = numbers[i];
             final int row  = (i / numCol);
             final int col  = (i % numCol);
-            isScale       &= (col == row)        || (v == 0);
-            isTranslation &= (col == lastColumn) || (v == (col == row ? 1 : 0));
+            if (col != row)        isScale       &= (element == null);
+            if (col != lastColumn) isTranslation &= isIdentity(element, col == row);
             if (!(isScale | isTranslation)) {
                 return this;
             }
@@ -158,6 +237,19 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
         }
     }
 
+    /**
+     * Returns {@code true} if the given element has the expected value of an identity matrix.
+     *
+     * @param  element   the element to test.
+     * @param  diagonal  whether the element is on the diagonal.
+     * @return whether the given element is an element of an identity matrix.
+     *
+     * @see #isIdentity()
+     */
+    private static boolean isIdentity(final Number element, final boolean diagonal) {
+        return diagonal ? (element != null && element.doubleValue() == 1) : (element == null);
+    }
+
     /**
      * Gets the dimension of input points.
      */
@@ -217,28 +309,35 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
     public final double getElement(final int row, final int column) {
         ArgumentChecks.ensureBetween("row",    0, numRow - 1, row);
         ArgumentChecks.ensureBetween("column", 0, numCol - 1, column);
-        return elt[row * numCol + column];
+        final Number element = numbers[row * numCol + column];
+        if (element != null) {
+            return element.doubleValue();
+        }
+        /*
+         * Fallback on the `elt` array only for 0 values for avoiding the need to divide by the denominator.
+         * Do not return a hard-coded 0 value in order to preserve the sign of negative zero.
+         */
+        final int rowStride = numCol + 1;
+        return elt[row * rowStride + column];
     }
 
     /**
      * Tests whether this transform does not move any points.
      *
-     * <div class="note"><b>Note:</b> this method should always returns {@code false}, since
+     * <h4>Note</h4>
+     * This method should always returns {@code false}, because
      * {@code MathTransforms.linear(…)} should have created specialized implementations for identity cases.
      * Nevertheless we perform the full check as a safety, in case someone instantiated this class directly
-     * instead of using a factory method.</div>
+     * instead of using a factory method.
      */
     @Override
     public final boolean isIdentity() {
         if (numRow != numCol) {
             return false;
         }
-        int mix = 0;
-        for (int j=0; j<numRow; j++) {
-            for (int i=0; i<numCol; i++) {
-                if (elt[mix++] != (i == j ? 1 : 0)) {
-                    return false;
-                }
+        for (int i=0; i < numbers.length; i++) {
+            if (!isIdentity(numbers[i], (i / numCol) == (i % numCol))) {
+                return false;
             }
         }
         return true;
@@ -328,12 +427,15 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
                     }
                 }
                 buffer[j] = sum;
-                mix++;
+                mix += NON_SCALE_COLUMNS;       // Skip the translation column and the denominator column.
             }
+            int k = numCol;
+            final int rowStride = numCol + 1;
             final double w = buffer[dstDim];
             for (int j=0; j<dstDim; j++) {
                 // `w` is equal to 1 if the transform is affine.
-                dstPts[dstOff + j] = buffer[j] / w;
+                dstPts[dstOff + j] = buffer[j] / (w * elt[k]);
+                k += rowStride;
             }
             srcOff += srcInc;
             dstOff += dstInc;
@@ -396,11 +498,14 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
                     }
                 }
                 buffer[j] = sum;
-                mix++;
+                mix += NON_SCALE_COLUMNS;
             }
+            int k = numCol;
+            final int rowStride = numCol + 1;
             final double w = buffer[dstDim];
             for (int j=0; j<dstDim; j++) {
-                dstPts[dstOff + j] = (float) (buffer[j] / w);
+                dstPts[dstOff + j] = (float) (buffer[j] / (w * elt[k]));
+                k += rowStride;
             }
             srcOff += srcInc;
             dstOff += dstInc;
@@ -436,11 +541,14 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
                     }
                 }
                 buffer[j] = sum;
-                mix++;
+                mix += NON_SCALE_COLUMNS;
             }
+            int k = numCol;
+            final int rowStride = numCol + 1;
             final double w = buffer[dstDim];
             for (int j=0; j<dstDim; j++) {
-                dstPts[dstOff++] = (float) (buffer[j] / w);
+                dstPts[dstOff++] = (float) (buffer[j] / (w * elt[k]));
+                k += rowStride;
             }
             srcOff += srcDim;
         }
@@ -475,11 +583,14 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
                     }
                 }
                 buffer[j] = sum;
-                mix++;
+                mix += NON_SCALE_COLUMNS;
             }
+            int k = numCol;
+            final int rowStride = numCol + 1;
             final double w = buffer[dstDim];
             for (int j=0; j<dstDim; j++) {
-                dstPts[dstOff++] = buffer[j] / w;
+                dstPts[dstOff++] = buffer[j] / (w * elt[k]);
+                k += rowStride;
             }
             srcOff += srcDim;
         }
@@ -494,14 +605,15 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
      */
     @Override
     public final Matrix derivative(final DirectPosition point) {
-        final int srcDim = numCol - 1;
-        final int dstDim = numRow - 1;
+        final int srcDim    = numCol - 1;
+        final int dstDim    = numRow - 1;
+        final int rowStride = numCol + 1;
         /*
          * In the `transform(…)` method, all coordinate values are divided by a `w` coefficient
          * which depends on the position. We need to reproduce that division here. Note that `w`
          * coefficient is different than 1 only if the transform is non-affine.
          */
-        int mix = dstDim * numCol;
+        int mix = dstDim * rowStride;
         double w = elt[mix + srcDim];                   // `w` is equal to 1 if the transform is affine.
         for (int i=0; i<srcDim; i++) {
             final double e = elt[mix++];
@@ -514,12 +626,15 @@ class ProjectiveTransform extends AbstractLinearTransform implements ExtendedPre
          * with last row and last column omitted.
          */
         mix = 0;
+        int k = numCol;
         final MatrixSIS matrix = Matrices.createZero(dstDim, srcDim);
         for (int j=0; j<dstDim; j++) {
+            final double r = w * elt[k];
             for (int i=0; i<srcDim; i++) {
-                matrix.setElement(j, i, elt[mix++] / w);
+                matrix.setElement(j, i, elt[mix++] / r);
             }
-            mix++;                                      // Skip translation column.
+            mix += NON_SCALE_COLUMNS;       // Skip the translation column and the denominator column.
+            k += rowStride;
         }
         return matrix;
     }
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java
index 7ed92c62a3..db8f374a07 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/ProjectiveTransformTest.java
@@ -177,6 +177,13 @@ public class ProjectiveTransformTest extends AffineTransformTest {
      * Tests the concatenation of transforms that would result in rounding errors
      * in extended-precision matrix operations were not used.
      *
+     * Actually there is two sources of rounding errors tested by this method.
+     * The first source is rounding errors caused by matrix multiplications.
+     * The other source is rounding errors inside the {@code transform(…)} methods,
+     * which is reduced by a denominator column in {@link ProjectiveTransform#elt}.
+     * For demonstrating the latter rounding errors, it may be necessary to set the
+     * {@link org.apache.sis.internal.referencing.Formulas#USE_FMA} flag to {@code false}.
+     *
      * @throws FactoryException if the transform cannot be created.
      * @throws TransformException if a coordinate conversion failed.
      *
@@ -204,6 +211,11 @@ public class ProjectiveTransformTest extends AffineTransformTest {
         assertEquals(new Fraction(2, 37),                 m.getElementOrNull(0,0));
         assertEquals(DoubleDouble.of(325).divide(100000), m.getElementOrNull(1,1));
         assertEquals(new Fraction(-17, 127),              m.getElementOrNull(2,2));
+        assertNull  (                                     m.getElementOrNull(0,1));
+        assertEquals(         0, m.getElement(0,1), STRICT);
+        assertEquals(  2d /  37, m.getElement(0,0), 1E-15);
+        assertEquals(   0.00325, m.getElement(1,1), 1E-15);
+        assertEquals(-17d / 127, m.getElement(2,2), 1E-15);
         /*
          * Test a transformation, expecting exact result.
          */


[sis] 02/02: Merge branch 'geoapi-4.0' into geoapi-3.1. Contains cleanup on serialization, loggers, rounding errors (again), javadoc.

Posted by de...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit bece843ce420f0355a4b0dc1f1effc2337594ff3
Merge: f76afb0622 3014fe6003
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Jan 17 15:27:57 2023 +0100

    Merge branch 'geoapi-4.0' into geoapi-3.1.
    Contains cleanup on serialization, loggers, rounding errors (again), javadoc.

 .../java/org/apache/sis/console/AboutCommand.java  |   4 +-
 .../java/org/apache/sis/console/package-info.java  |   2 +-
 .../main/java/org/apache/sis/gui/RecentFiles.java  |  14 +-
 .../apache/sis/gui/coverage/CoverageCanvas.java    |   7 +-
 .../apache/sis/gui/coverage/GridSliceSelector.java |   8 +-
 .../org/apache/sis/gui/dataset/FeatureLoader.java  |   2 +
 .../org/apache/sis/gui/dataset/FeatureTable.java   |   9 +-
 .../org/apache/sis/gui/dataset/PathAction.java     |  12 +-
 .../org/apache/sis/gui/dataset/ResourceCell.java   |   4 +-
 .../org/apache/sis/gui/dataset/ResourceEvent.java  |  33 +-
 .../org/apache/sis/gui/dataset/ResourceTree.java   |   9 +-
 .../org/apache/sis/gui/dataset/WindowHandler.java  |   8 +-
 .../org/apache/sis/gui/dataset/package-info.java   |   2 +-
 .../org/apache/sis/gui/map/GestureFollower.java    |   8 +-
 .../java/org/apache/sis/gui/map/MapCanvas.java     |   7 +-
 .../java/org/apache/sis/gui/map/MapCanvasAWT.java  |   3 +
 .../org/apache/sis/gui/map/OperationFinder.java    |   7 +-
 .../java/org/apache/sis/gui/map/StatusBar.java     |   6 +-
 .../org/apache/sis/gui/map/ValuesFormatter.java    |   7 +-
 .../org/apache/sis/gui/metadata/MetadataTree.java  |   7 +-
 .../org/apache/sis/gui/metadata/package-info.java  |   2 +-
 .../apache/sis/gui/referencing/AuthorityCodes.java |   7 +-
 .../gui/referencing/PositionableProjection.java    |   8 +-
 .../gui/referencing/RecentReferenceSystems.java    |   7 +-
 .../java/org/apache/sis/gui/referencing/Utils.java |   7 +-
 .../apache/sis/internal/gui/BackgroundThreads.java |   7 +-
 .../apache/sis/internal/gui/ImageConverter.java    |   7 +-
 .../org/apache/sis/internal/gui/LogHandler.java    |  10 +-
 .../org/apache/sis/internal/gui/RecentChoices.java |   2 +
 .../java/org/apache/sis/internal/gui/Styles.java   |   7 +-
 .../apache/sis/internal/gui/control/ColorCell.java |   6 +-
 .../org/apache/sis/internal/gui/package-info.java  |   2 +-
 .../org/apache/sis/coverage/SampleRangeFormat.java |   2 +
 .../coverage/grid/CoordinateOperationFinder.java   |   7 +-
 .../apache/sis/coverage/grid/DefaultEvaluator.java |   7 +-
 .../sis/coverage/grid/GridCoverageProcessor.java   |   7 +-
 .../org/apache/sis/coverage/grid/GridExtent.java   |  11 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java |   4 +-
 .../apache/sis/feature/AbstractIdentifiedType.java |   9 +-
 .../java/org/apache/sis/feature/FeatureFormat.java |   7 +-
 .../java/org/apache/sis/feature/package-info.java  |   2 +-
 .../apache/sis/image/BandedSampleConverter.java    |   7 +-
 .../java/org/apache/sis/image/ErrorAction.java     |  13 +-
 .../main/java/org/apache/sis/image/MaskImage.java  |   7 +-
 .../java/org/apache/sis/image/ResampledImage.java  |   7 +-
 .../java/org/apache/sis/image/ResamplingGrid.java  |   2 +
 .../java/org/apache/sis/image/package-info.java    |   2 +-
 .../sis/internal/coverage/j2d/ImageLayout.java     |   4 +
 .../sis/internal/coverage/j2d/ImageUtilities.java  |  15 +-
 .../apache/sis/internal/feature/Geometries.java    |   9 +-
 .../sis/internal/feature/GeometryFactories.java    |   6 +-
 .../org/apache/sis/internal/feature/jts/JTS.java   |   7 +-
 .../sis/internal/feature/jts/package-info.java     |   2 +-
 .../apache/sis/internal/feature/package-info.java  |   2 +-
 .../java/org/apache/sis/internal/filter/Node.java  |  12 +-
 .../internal/filter/sqlmm/RegistryTestCase.java    |   8 +-
 .../apache/sis/internal/metadata/Dependencies.java |   3 +-
 .../sis/internal/metadata/ServicesForUtility.java  |   8 +-
 .../internal/metadata/legacy/DateToTemporal.java   |  25 +-
 .../internal/metadata/legacy/TemporalToDate.java   |  25 +-
 .../sis/internal/metadata/legacy/package-info.java |   2 +-
 .../sis/internal/metadata/sql/Initializer.java     |  32 +-
 .../sis/internal/metadata/sql/LocalDataSource.java |  14 +-
 .../sis/internal/metadata/sql/package-info.java    |   2 +-
 .../sis/internal/simple/CitationConstant.java      |  12 +-
 .../apache/sis/internal/simple/package-info.java   |   2 +-
 .../org/apache/sis/metadata/AbstractMetadata.java  |   4 +-
 .../org/apache/sis/metadata/MetadataStandard.java  |   2 +
 .../apache/sis/metadata/PropertyInformation.java   |  11 +-
 .../sis/metadata/StandardImplementation.java       |  15 +-
 .../org/apache/sis/metadata/TreeNodeChildren.java  |   4 +-
 .../java/org/apache/sis/metadata/package-info.java |   2 +-
 .../apache/sis/metadata/sql/MetadataSource.java    |  10 +-
 .../org/apache/sis/metadata/sql/package-info.java  |   2 +-
 .../main/java/org/apache/sis/util/iso/Types.java   |  18 +-
 .../main/java/org/apache/sis/xml/LegacyCodes.java  |   8 +-
 .../java/org/apache/sis/xml/MarshallerPool.java    |  14 +-
 .../java/org/apache/sis/xml/NilObjectHandler.java  |   4 +-
 .../main/java/org/apache/sis/xml/NilReason.java    |   4 +-
 .../src/main/java/org/apache/sis/xml/XLink.java    |   8 +-
 .../src/main/java/org/apache/sis/xml/XML.java      |   4 +-
 .../coverage/MultiResolutionCoverageLoader.java    |   2 +
 .../sis/internal/map/coverage/RenderingData.java   |  12 +-
 .../sis/internal/map/coverage/package-info.java    |   2 +-
 .../main/java/org/apache/sis/portrayal/Canvas.java |   5 +-
 .../org/apache/sis/portrayal/CanvasContext.java    |   2 +
 .../org/apache/sis/portrayal/CanvasFollower.java   |   4 +-
 .../java/org/apache/sis/portrayal/Observable.java  |   9 +-
 .../apache/sis/portrayal/TransformChangeEvent.java |   4 +-
 .../gazetteer/MilitaryGridReferenceSystem.java     |   8 +-
 .../gazetteer/ReferencingByIdentifiers.java        |  12 +-
 .../sis/referencing/gazetteer/package-info.java    |   2 +-
 .../org/apache/sis/geometry/AbstractEnvelope.java  |   4 +-
 .../org/apache/sis/geometry/CoordinateFormat.java  |  14 +-
 .../java/org/apache/sis/geometry/Envelopes.java    |  13 +-
 .../apache/sis/geometry/GeneralDirectPosition.java |   6 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |   6 +-
 .../java/org/apache/sis/geometry/package-info.java |   2 +-
 .../sis/internal/referencing/Arithmetic.java       |   4 +-
 .../internal/referencing/DefinitionVerifier.java   |   2 +-
 .../sis/internal/referencing/DeprecatedCode.java   |   9 +-
 .../sis/internal/referencing/DeprecatedName.java   |   9 +-
 .../apache/sis/internal/referencing/Formulas.java  |   8 +-
 .../referencing/PositionalAccuracyConstant.java    |   4 +
 .../sis/internal/referencing/WKTKeywords.java      |   6 +-
 .../sis/internal/referencing/WKTUtilities.java     |   9 +-
 .../referencing/provider/AbstractProvider.java     |  12 +-
 .../referencing/provider/DatumShiftGridFile.java   |  65 ++--
 .../referencing/provider/DatumShiftGridGroup.java  |   6 +-
 .../referencing/provider/DatumShiftGridLoader.java |  62 +++-
 .../provider/FranceGeocentricInterpolation.java    | 361 +++++++++++----------
 .../referencing/provider/GeocentricAffine.java     |   7 +-
 .../referencing/provider/Geographic3Dto2D.java     |   6 +-
 .../provider/MolodenskyInterpolation.java          |   1 +
 .../sis/internal/referencing/provider/NADCON.java  |  93 +++---
 .../sis/internal/referencing/provider/NTv2.java    |  54 ++-
 .../referencing/provider/VerticalOffset.java       |   6 +-
 .../java/org/apache/sis/io/wkt/AbstractParser.java |  14 +-
 .../main/java/org/apache/sis/io/wkt/Formatter.java |   3 +
 .../java/org/apache/sis/io/wkt/WKTDictionary.java  |   6 +-
 .../main/java/org/apache/sis/io/wkt/WKTFormat.java |  16 +-
 .../sis/parameter/DefaultParameterValue.java       |  12 +-
 .../apache/sis/parameter/ParameterValueList.java   |   6 +-
 .../java/org/apache/sis/parameter/Verifier.java    |  12 +-
 .../org/apache/sis/parameter/package-info.java     |   2 +-
 .../apache/sis/referencing/AuthorityFactories.java |  11 +-
 .../main/java/org/apache/sis/referencing/CRS.java  |  12 +-
 .../java/org/apache/sis/referencing/CommonCRS.java |   9 +-
 .../sis/referencing/GeodesicsOnEllipsoid.java      |   6 +-
 .../apache/sis/referencing/IdentifiedObjects.java  |   6 +-
 .../sis/referencing/ImmutableIdentifier.java       |   4 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |   4 +-
 .../sis/referencing/crs/ExplicitParameters.java    |  11 +-
 .../apache/sis/referencing/crs/package-info.java   |   2 +-
 .../org/apache/sis/referencing/cs/AbstractCS.java  |  11 +-
 .../sis/referencing/cs/CoordinateSystems.java      |   5 +-
 .../sis/referencing/cs/DirectionAlongMeridian.java |   7 +-
 .../sis/referencing/datum/DatumShiftGrid.java      |   6 +-
 .../referencing/datum/DefaultGeodeticDatum.java    |  23 +-
 .../factory/AuthorityFactoryIdentifier.java        |   7 +-
 .../factory/CommonAuthorityFactory.java            |   5 +-
 .../factory/ConcurrentAuthorityFactory.java        |  24 +-
 .../factory/GeodeticAuthorityFactory.java          |   9 +-
 .../referencing/factory/GeodeticObjectFactory.java |   9 +-
 .../factory/IdentifiedObjectFinder.java            |   8 +-
 .../referencing/factory/IdentifiedObjectSet.java   |   8 +-
 .../factory/MultiAuthoritiesFactory.java           |   9 +-
 .../sis/referencing/factory/ReferenceKeeper.java   |   3 +
 .../factory/sql/CloseableReference.java            |   7 +-
 .../referencing/factory/sql/EPSGCodeFinder.java    |  11 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  19 +-
 .../sis/referencing/factory/sql/EPSGFactory.java   |   3 +-
 .../factory/sql/InstallationScriptProvider.java    |   6 +-
 .../sis/referencing/factory/sql/package-info.java  |   9 +-
 .../operation/AbstractCoordinateOperation.java     |  12 +-
 .../operation/CoordinateOperationRegistry.java     |  15 +-
 .../DefaultCoordinateOperationFactory.java         |   2 +
 .../operation/builder/LinearTransformBuilder.java  |   6 +-
 .../operation/builder/LocalizationGridBuilder.java |   2 +
 .../operation/builder/ProjectedTransformTry.java   |  12 +-
 .../operation/matrix/GeneralMatrix.java            |   4 +
 .../referencing/operation/projection/Mercator.java |   3 +-
 .../operation/projection/NormalizedProjection.java |   8 +-
 .../operation/projection/Orthographic.java         |   4 +-
 .../operation/projection/TransverseMercator.java   |   2 +
 .../transform/AbstractLinearTransform.java         |   4 +-
 .../operation/transform/AbstractMathTransform.java |   9 +-
 .../operation/transform/ConcatenatedTransform.java |  12 +-
 .../operation/transform/ContextualParameters.java  |   5 +-
 .../transform/DefaultMathTransformFactory.java     |  11 +-
 .../operation/transform/InterpolatedTransform.java |   3 +
 .../operation/transform/ProjectiveTransform.java   | 221 ++++++++++---
 .../operation/transform/WraparoundTransform.java   |   7 +-
 .../src/main/resources/META-INF/GIGS.properties    |  80 +++++
 .../referencing/provider/DatumShiftTestCase.java   |  23 +-
 .../FranceGeocentricInterpolationTest.java         |  34 +-
 .../internal/referencing/provider/NADCONTest.java  |  11 +-
 .../internal/referencing/provider/NTv2Test.java    |  19 +-
 .../factory/ConcurrentAuthorityFactoryTest.java    |   6 +-
 .../sis/referencing/factory/TestFactorySource.java |   8 +-
 .../transform/ProjectiveTransformTest.java         |  19 +-
 .../transform/TransformResultComparator.java       |   2 +-
 .../sis/test/integration/DatumShiftTest.java       |  10 +-
 .../org/apache/sis/internal/jdk17/HexFormat.java   |   6 +-
 .../apache/sis/internal/system/CommonExecutor.java |   1 +
 .../apache/sis/internal/system/Configuration.java  |  91 ++++++
 .../apache/sis/internal/system/DataDirectory.java  |  30 +-
 .../sis/internal/system/DefaultFactories.java      |   5 +-
 .../sis/internal/system/DelayedExecutor.java       |   6 +-
 .../org/apache/sis/internal/system/Loggers.java    |   9 +-
 .../sis/internal/system/OptionalDependency.java    |   2 +-
 .../internal/system/ReferenceQueueConsumer.java    |   6 +-
 .../org/apache/sis/internal/system/Shutdown.java   |   6 +-
 .../org/apache/sis/internal/system/Supervisor.java |  11 +-
 .../apache/sis/internal/system/SystemListener.java |   8 +-
 .../org/apache/sis/internal/system/Threads.java    |   6 +-
 .../apache/sis/internal/util/DefinitionURI.java    |   6 +-
 .../org/apache/sis/internal/util/DoubleDouble.java |   4 +
 .../org/apache/sis/internal/util/Numerics.java     |   3 +
 .../sis/internal/util/StandardDateFormat.java      |  13 +-
 .../main/java/org/apache/sis/math/Fraction.java    |   2 +-
 .../src/main/java/org/apache/sis/math/Plane.java   |   2 +
 .../src/main/java/org/apache/sis/math/Vector.java  |  10 +-
 .../java/org/apache/sis/measure/AbstractUnit.java  |  11 +-
 .../apache/sis/measure/DefaultQuantityFactory.java |   2 +-
 .../org/apache/sis/measure/QuantityFormat.java     |   9 +-
 .../main/java/org/apache/sis/measure/Scalar.java   |   5 +-
 .../java/org/apache/sis/measure/UnitFormat.java    |   7 +-
 .../java/org/apache/sis/measure/UnitRegistry.java  |  13 +-
 .../java/org/apache/sis/measure/UnitServices.java  |   4 +-
 .../src/main/java/org/apache/sis/setup/About.java  |   4 +-
 .../java/org/apache/sis/setup/Configuration.java   |  11 +-
 .../main/java/org/apache/sis/setup/OptionKey.java  |   2 +-
 .../java/org/apache/sis/setup/package-info.java    |   2 +-
 .../java/org/apache/sis/util/Configuration.java    |  44 ---
 .../src/main/java/org/apache/sis/util/Locales.java |   9 +-
 .../src/main/java/org/apache/sis/util/Numbers.java |   2 +-
 .../java/org/apache/sis/util/collection/Cache.java |   8 +-
 .../apache/sis/util/collection/CodeListSet.java    |   4 +-
 .../sis/util/collection/DefaultTreeTable.java      |   9 +-
 .../sis/util/collection/FrequencySortedSet.java    |   6 +-
 .../apache/sis/util/collection/TreeNodeList.java   |   4 +-
 .../java/org/apache/sis/util/logging/Logging.java  |  57 +++-
 .../apache/sis/util/logging/MonolineFormatter.java |  15 +-
 .../apache/sis/util/logging/PerformanceLevel.java  |   7 +-
 .../sis/util/resources/IndexedResourceBundle.java  |  18 +-
 .../apache/sis/util/resources/package-info.java    |   2 +-
 .../src/test/java/org/apache/sis/test/Assume.java  |   7 +-
 .../java/org/apache/sis/test/package-info.java     |   2 +-
 ide-project/NetBeans/nbproject/project.xml         |   1 +
 .../sis/storage/landsat/LandsatStoreProvider.java  |  18 +-
 .../storage/inflater/CompressionChannel.java       |   6 +-
 .../sis/storage/geotiff/GeoTiffStoreProvider.java  |  18 +-
 .../org/apache/sis/storage/geotiff/Reader.java     |   6 +-
 .../org/apache/sis/internal/netcdf/Decoder.java    |  16 +-
 .../org/apache/sis/internal/netcdf/FeatureSet.java |   2 +
 .../apache/sis/internal/netcdf/package-info.java   |   2 +-
 .../apache/sis/storage/netcdf/MetadataReader.java  |   2 +
 .../sis/storage/netcdf/NetcdfStoreProvider.java    |  14 +-
 .../apache/sis/storage/netcdf/package-info.java    |   2 +-
 .../apache/sis/storage/sql/SQLStoreProvider.java   |  18 +-
 .../internal/storage/DocumentedStoreProvider.java  |   5 +-
 .../sis/internal/storage/StoreUtilities.java       |   2 +
 .../sis/internal/storage/csv/StoreProvider.java    |  20 +-
 .../storage/esri/AsciiGridStoreProvider.java       |  18 +-
 .../storage/esri/RawRasterStoreProvider.java       |  18 +-
 .../sis/internal/storage/esri/package-info.java    |   2 +-
 .../sis/internal/storage/folder/StoreProvider.java |  18 +-
 .../sis/internal/storage/folder/package-info.java  |   2 +-
 .../storage/image/WorldFileStoreProvider.java      |  18 +-
 .../internal/storage/io/FileCacheByteChannel.java  |  18 +-
 .../sis/internal/storage/io/HttpByteChannel.java   |   2 +-
 .../sis/internal/storage/io/IOUtilities.java       |  21 --
 .../internal/storage/io/MemoryDataTransfer.java    |   4 +-
 .../internal/storage/io/RewindableLineReader.java  |   7 +-
 .../apache/sis/internal/storage/package-info.java  |   2 +-
 .../sis/internal/storage/wkt/FirstKeywordPeek.java |   1 +
 .../sis/internal/storage/wkt/StoreProvider.java    |  18 +-
 .../sis/internal/storage/wkt/package-info.java     |   2 +-
 .../sis/internal/storage/xml/StoreProvider.java    |  16 +
 .../org/apache/sis/storage/AbstractResource.java   |  12 +-
 .../org/apache/sis/storage/DataStoreProvider.java  |  26 +-
 .../org/apache/sis/storage/ProbeInputStream.java   |   4 +-
 .../java/org/apache/sis/storage/ProbeReader.java   |   4 +-
 .../org/apache/sis/storage/StorageConnector.java   |  31 +-
 .../aggregate/ConcatenatedGridCoverage.java        |   9 +-
 .../apache/sis/storage/aggregate/package-info.java |   2 +-
 .../apache/sis/storage/event/StoreListeners.java   |   5 +-
 .../storage/io/FileCacheByteChannelTest.java       |   2 +-
 .../apache/sis/test/storage/SubsampledImage.java   |   4 +-
 .../sis/internal/storage/gpx/StoreProvider.java    |  16 +
 271 files changed, 1958 insertions(+), 1282 deletions(-)

diff --cc core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/AbstractProvider.java
index c70a7d5542,dd8002cada..3f9f599a80
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/AbstractProvider.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/AbstractProvider.java
@@@ -19,8 -19,10 +19,9 @@@ package org.apache.sis.internal.referen
  import java.util.Map;
  import java.util.HashMap;
  import java.util.Collection;
+ import java.util.logging.Logger;
  import javax.xml.bind.annotation.XmlTransient;
  import org.opengis.util.GenericName;
 -import org.opengis.metadata.Identifier;
  import org.opengis.parameter.ParameterDescriptor;
  import org.opengis.parameter.ParameterDescriptorGroup;
  import org.opengis.referencing.IdentifiedObject;
@@@ -42,11 -44,6 +43,9 @@@ import org.apache.sis.util.Workaround
  import org.apache.sis.util.logging.Logging;
  import org.apache.sis.internal.system.Loggers;
  
- import static java.util.logging.Logger.getLogger;
- 
 +// Branch-dependent imports
 +import org.opengis.referencing.ReferenceIdentifier;
 +
  
  /**
   * Base class for all providers defined in this package.