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 eec072bb3fbe8341c2bf3cb0daa3cbb49017462f
Merge: 93c592d047 47d67c936c
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Tue Dec 2 17:25:45 2025 +0100

    Merge branch 'geoapi-4.0' into geoapi-3.1.
    Contains bug fixes in netCDF, GeoTIFF and JavaFX application.

 .../feature/internal/shared/FeatureProjection.java |   2 +-
 .../apache/sis/filter/DefaultFilterFactory.java    |   4 +-
 .../org/apache/sis/filter/FunctionRegister.java    |  10 +-
 .../geometry/wrapper/SpatialOperationContext.java  |   2 +-
 .../apache/sis/geometry/wrapper/jts/Wrapper.java   |   4 +-
 .../org/apache/sis/image/BandAggregateLayout.java  |   2 +-
 .../apache/sis/image/BandedSampleConverter.java    |  33 ++-
 .../main/org/apache/sis/image/Colorizer.java       |   8 +-
 .../main/org/apache/sis/image/ImageLayout.java     |  57 +++-
 .../main/org/apache/sis/image/ImageProcessor.java  |   4 +-
 .../main/org/apache/sis/image/MaskedImage.java     |   4 +-
 .../main/org/apache/sis/image/ResampledImage.java  |   6 +-
 .../main/org/apache/sis/image/Transferer.java      |  14 +-
 .../main/org/apache/sis/image/Visualization.java   |   6 +-
 .../image/internal/shared/ColorScaleBuilder.java   |  77 ++---
 .../sis/image/internal/shared/ColorsForRange.java  |   2 +-
 .../sis/image/BandedSampleConverterTest.java       |   1 +
 .../org/apache/sis/metadata/MetadataStandard.java  |   9 +-
 .../org/apache/sis/metadata/MetadataVisitor.java   |  28 +-
 .../apache/sis/metadata/ModifiableMetadata.java    |  20 +-
 .../org/apache/sis/metadata/TreeTableView.java     |  12 +-
 .../iso/maintenance/DefaultScopeDescription.java   |   2 +-
 .../iso/quality/DefaultEvaluationMethod.java       |   2 +-
 .../org/apache/sis/metadata/sql/Dispatcher.java    |   7 +-
 .../main/org/apache/sis/xml/bind/Context.java      |   7 +-
 .../org/apache/sis/map/coverage/RenderingData.java |  14 +-
 .../main/org/apache/sis/portrayal/Canvas.java      |   2 +-
 .../apache/sis/profile/japan/netcdf/GCOM_C.java    |   2 +-
 .../apache/sis/geometry/WraparoundAdjustment.java  |   6 +-
 .../main/org/apache/sis/parameter/IntegerList.java |   2 +-
 .../main/org/apache/sis/parameter/Verifier.java    |   6 +-
 .../main/org/apache/sis/referencing/CRS.java       | 121 +++++---
 .../main/org/apache/sis/referencing/CommonCRS.java |   7 +-
 .../referencing/EllipsoidalHeightSeparator.java    |   3 +-
 .../apache/sis/referencing/GeodeticCalculator.java |   4 +-
 .../apache/sis/referencing/crs/AbstractCRS.java    |   2 +-
 .../sis/referencing/crs/AbstractDerivedCRS.java    |  30 +-
 .../sis/referencing/crs/DefaultProjectedCRS.java   |   2 +-
 .../sis/referencing/datum/DatumOrEnsemble.java     |   3 +
 .../factory/ConcurrentAuthorityFactory.java        |  26 +-
 .../referencing/factory/GeodeticObjectFactory.java |   2 +-
 .../factory/IdentifiedObjectFinder.java            |  11 +-
 .../referencing/factory/sql/EPSGDataAccess.java    |  45 ++-
 .../sis/referencing/factory/sql/EPSGInstaller.java |  14 +-
 .../factory/sql/InstallationScriptProvider.java    |  10 -
 .../referencing/internal/ParameterizedAffine.java  |  26 +-
 .../referencing/internal/PositionTransformer.java  |   2 +-
 .../internal/shared/GeodeticObjectBuilder.java     |   7 +-
 .../internal/shared/ReferencingUtilities.java      |  16 --
 .../internal/shared/TemporalAccessor.java          |   3 +-
 .../internal/shared/WraparoundAxesFinder.java      |   3 +-
 .../operation/AbstractCoordinateOperation.java     |  48 ++--
 .../operation/CoordinateOperationRegistry.java     |  31 +-
 .../referencing/operation/DefaultConversion.java   |   4 +-
 .../operation/DefaultPassThroughOperation.java     |  11 +-
 .../operation/transform/ConcatenatedTransform.java |   2 +-
 .../operation/transform/MathTransforms.java        |   6 +-
 .../operation/transform/TransformSeparator.java    |  43 ++-
 .../test/org/apache/sis/io/wkt/CRSParserTest.java  |   2 +-
 .../operation/DefaultConversionTest.java           |   4 +-
 .../apache/sis/storage/geotiff/GeoTiffStore.java   |   5 +-
 .../sis/storage/geotiff/reader/CRSBuilder.java     |   4 +-
 .../sis/storage/geotiff/reader/XMLMetadata.java    |   4 +-
 .../apache/sis/storage/netcdf/base/CRSBuilder.java |   2 +-
 .../apache/sis/storage/netcdf/base/CRSMerger.java  |   5 +-
 .../apache/sis/storage/netcdf/base/Convention.java |   2 +-
 .../apache/sis/storage/netcdf/base/Decoder.java    |   2 +-
 .../org/apache/sis/storage/netcdf/base/Grid.java   |  50 ++--
 .../sis/storage/netcdf/base/GridAdjustment.java    |   8 +-
 .../sis/storage/netcdf/base/GridMapping.java       | 316 ++++++++++++++-------
 .../sis/storage/netcdf/base/NamedElement.java      |   2 +-
 .../apache/sis/storage/netcdf/base/Variable.java   |   6 +-
 .../sis/storage/netcdf/internal/Resources.java     |   6 +
 .../storage/netcdf/internal/Resources.properties   |   1 +
 .../netcdf/internal/Resources_fr.properties        |   1 +
 .../apache/sis/storage/esri/AsciiGridStore.java    |   5 +-
 .../main/org/apache/sis/math/Vector.java           |   2 +-
 .../org/apache/sis/pending/jdk/ScopedValue.java    |  28 +-
 .../main/org/apache/sis/system/Semaphores.java     | 130 +++++----
 .../sis/storage/isobmff/MainBoxRegistry.java       |  18 ++
 .../apache/sis/storage/isobmff/gimi/ModelCRS.java  |  24 ++
 .../sis/storage/isobmff/gimi/ModelTiePoint.java    |  24 ++
 .../storage/isobmff/gimi/ModelTransformation.java  |  24 ++
 .../sis/storage/isobmff/gimi/ExtensionTest.java    |   5 +
 optional/src/org.apache.sis.gui/bundle/bin/sisfx   |   1 +
 .../main/org/apache/sis/gui/RecentFiles.java       |   2 +-
 .../org/apache/sis/gui/coverage/Background.png     | Bin 0 -> 95 bytes
 .../apache/sis/gui/coverage/CoverageCanvas.java    |  29 +-
 .../apache/sis/gui/coverage/CoverageControls.java  |   2 -
 .../org/apache/sis/gui/coverage/GridError.java     |   3 +-
 .../org/apache/sis/gui/coverage/GridViewSkin.java  |   2 +-
 .../sis/gui/coverage/StyledRenderingData.java      |   2 +-
 .../org/apache/sis/gui/dataset/ExpandableList.java |   4 +-
 .../main/org/apache/sis/gui/dataset/LogViewer.java |   7 +-
 .../sis/gui/metadata/IdentificationInfo.java       |   2 +-
 .../apache/sis/gui/metadata/MetadataSummary.java   |   2 +-
 .../org/apache/sis/gui/referencing/CRSChooser.java |   4 +-
 .../org/apache/sis/gui/referencing/MenuSync.java   |   8 +-
 98 files changed, 964 insertions(+), 621 deletions(-)

diff --cc 
endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/jts/Wrapper.java
index ee2828c272,3b1bc00fb5..63dd4f3b99
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/jts/Wrapper.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/geometry/wrapper/jts/Wrapper.java
@@@ -45,9 -45,9 +45,9 @@@ import org.opengis.util.FactoryExceptio
  import org.opengis.geometry.DirectPosition;
  import org.opengis.referencing.crs.CoordinateReferenceSystem;
  import org.opengis.referencing.operation.CoordinateOperation;
 -import org.opengis.referencing.operation.MathTransform;
  import org.opengis.referencing.operation.TransformException;
 +import org.opengis.referencing.operation.MathTransform;
- import org.apache.sis.referencing.internal.shared.ReferencingUtilities;
+ import org.apache.sis.referencing.CRS;
  import org.apache.sis.geometry.DirectPosition2D;
  import org.apache.sis.geometry.GeneralDirectPosition;
  import org.apache.sis.geometry.GeneralEnvelope;
diff --cc 
endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
index f6653ddeee,dcab52687c..6e1e6c20e9
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/maintenance/DefaultScopeDescription.java
@@@ -235,9 -221,9 +235,9 @@@ public class DefaultScopeDescription ex
          final Object value = this.value;
          if (value != null) {
              if (property == code) {
 -                return cast(value);
 +                return cast(value, type);
              } else if (!(value instanceof Set) || !((Set<?>) 
value).isEmpty()) {
-                 return Semaphores.query(Semaphores.NULL_COLLECTION)
+                 return Semaphores.NULL_FOR_EMPTY_COLLECTION.get()
                         ? null : new ExcludedSet<>(NAMES[code-1], 
NAMES[property-1]);
              }
          }
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/EllipsoidalHeightSeparator.java
index 6cdae16c03,f5c52cb9f6..2166f7a9d2
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/EllipsoidalHeightSeparator.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/EllipsoidalHeightSeparator.java
@@@ -143,9 -139,9 +142,9 @@@ final class EllipsoidalHeightSeparator 
           * we also need to reduce the number of dimensions in the base CRS 
and in the conversion.
           */
          if (crs instanceof ProjectedCRS) {
 -            GeodeticCRS baseCRS = ((ProjectedCRS) crs).getBaseCRS();
 +            GeographicCRS baseCRS = ((ProjectedCRS) crs).getBaseCRS();
-             if (ReferencingUtilities.getDimension(baseCRS) != 2) {
+             if (CRS.getDimensionOrZero(baseCRS) != CRS.BIDIMENSIONAL) {
 -                baseCRS = (GeodeticCRS) separate(baseCRS);
 +                baseCRS = (GeographicCRS) separate(baseCRS);
              }
              Conversion projection = ((ProjectedCRS) 
crs).getConversionFromBase();
              /*
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
index e1415b3dad,29184c1e01..cb3f43f40a
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java
@@@ -1832,28 -1831,27 +1832,27 @@@ search: try (ResultSet result = execute
                          final CartesianCS cs = 
owner.createCartesianCS(csCode);
                          constructor = (factory, metadata) -> {
                              /*
-                              * The crsFactory method calls will indirectly 
create a parameterized MathTransform.
-                              * Their constructor will try to verify the 
parameter validity. But some deprecated
-                              * CRS had invalid parameter values (they were 
deprecated precisely for that reason).
-                              * If and only if we are creating a deprecated 
CRS, temporarily suspend the parameter
-                              * checks.
+                              * For a ProjectedCRS, the baseCRS is usually 
geodetic. However, geocentric CRS
+                              * is also allowed, but not yet supported in the 
code below. We could also have
+                              * a ProjectedCRS derived from another 
ProjectedCRS.
                               */
-                             final boolean old = !deprecated || 
Semaphores.queryAndSet(Semaphores.SUSPEND_PARAMETER_CHECK);
-                             try {
-                                 /*
-                                  * For a ProjectedCRS, the baseCRS is usually 
geodetic. However, geocentric CRS
-                                  * is also allowed, but not yet supported in 
the code below. We could also have
-                                  * a ProjectedCRS derived from another 
ProjectedCRS.
-                                  */
-                                 if (baseCRS instanceof GeographicCRS) {
-                                     return 
factory.createProjectedCRS(metadata, (GeographicCRS) baseCRS, fromBase, cs);
-                                 } else {
-                                     return factory.createDerivedCRS(metadata, 
baseCRS, fromBase, cs);
-                                 }
-                             } finally {
-                                 
Semaphores.clearIfFalse(Semaphores.SUSPEND_PARAMETER_CHECK, old);
+                             if (baseCRS instanceof GeodeticCRS) {
 -                                return factory.createProjectedCRS(metadata, 
(GeodeticCRS) baseCRS, fromBase, cs);
++                                return factory.createProjectedCRS(metadata, 
(GeographicCRS) baseCRS, fromBase, cs);
+                             } else {
+                                 return factory.createDerivedCRS(metadata, 
baseCRS, fromBase, cs);
                              }
                          };
+                         /*
+                          * The crsFactory method calls will indirectly create 
a parameterized MathTransform.
+                          * Their constructor will try to verify the parameter 
validity. But some deprecated
+                          * CRS had invalid parameter values (they were 
deprecated precisely for that reason).
+                          * If and only if we are creating a deprecated CRS, 
temporarily suspend the parameter
+                          * checks.
+                          */
+                         if (deprecated) {
+                             final var c = constructor;
+                             constructor = (factory, metadata) -> 
Semaphores.SUSPEND_PARAMETER_CHECK.execute(() -> c.create(factory, metadata));
+                         }
                          break;
                      }
                      /* 
──────────────────────────────────────────────────────────────────────
diff --cc 
endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
index 4ff2f37656,f3501c4cd6..9607bed122
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/DefaultConversion.java
@@@ -226,14 -223,13 +226,14 @@@ public class DefaultConversion extends 
       * @param target      the new target CRS.
       * @param factory     the factory to use for creating a transform from 
the parameters or for performing axis changes.
       */
 -    private DefaultConversion(final Conversion definition,
 -                              final CoordinateReferenceSystem source,
 -                              final CoordinateReferenceSystem target,
 -                              final MathTransformFactory factory) throws 
FactoryException
 +    @SuppressWarnings("deprecation")
 +    DefaultConversion(final Conversion definition,
 +                      final CoordinateReferenceSystem source,
 +                      final CoordinateReferenceSystem target,
 +                      final MathTransformFactory factory) throws 
FactoryException
      {
          super(definition);
-         int interpDim = 
ReferencingUtilities.getDimension(super.getInterpolationCRS().orElse(null));
+         int interpDim = 
CRS.getDimensionOrZero(super.getInterpolationCRS().orElse(null));
          if (transform == null) {
              /*
               * If the user did not specify explicitly a MathTransform, we 
will need to create it from the parameters.
diff --cc 
optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/CRSChooser.java
index 7f520adc90,9b49ea947b..d1b2d5d839
--- 
a/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/CRSChooser.java
+++ 
b/optional/src/org.apache.sis.gui/main/org/apache/sis/gui/referencing/CRSChooser.java
@@@ -388,9 -387,9 +388,9 @@@ public class CRSChooser extends Dialog<
              expected = 0;
          }
          String text = Vocabulary.forLocale(locale).getString(key);
-         final int     dimension = ReferencingUtilities.getDimension(crs);
+         final int     dimension = CRS.getDimensionOrZero(crs);
          final boolean addDimension = (dimension != expected && expected != 0);
 -        final boolean isProjection = (crs instanceof DerivedCRS);
 +        final boolean isProjection = (crs instanceof GeneralDerivedCRS);
          if (addDimension | isProjection) {
              final StringBuilder buffer = new StringBuilder(text);
              if (addDimension) {

Reply via email to