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) {
