This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/sis.git
commit 0661f9eaf0ee9d18b2053ea011cfe695d2072af5 Merge: d581822c74 236ded5a92 Author: Martin Desruisseaux <[email protected]> AuthorDate: Fri Aug 15 23:13:03 2025 +0200 Merge branch 'geoapi-3.1'. Contains an upgrade of the EPSG installer for EPSG version 12. .../coverage/grid/BandAggregateGridCoverage.java | 2 +- .../sis/coverage/grid/ClippedGridCoverage.java | 193 ++++++ .../apache/sis/coverage/grid/DefaultEvaluator.java | 3 +- .../sis/coverage/grid/DerivedGridCoverage.java | 2 +- .../org/apache/sis/coverage/grid/GridCoverage.java | 4 +- .../apache/sis/coverage/grid/GridCoverage2D.java | 4 +- .../sis/coverage/grid/GridCoverageProcessor.java | 34 +- .../org/apache/sis/coverage/grid/GridExtent.java | 6 +- .../apache/sis/coverage/grid/ImageRenderer.java | 50 +- .../sis/coverage/grid/ResampledGridCoverage.java | 4 +- .../sis/coverage/grid/TranslatedGridCoverage.java | 9 +- .../main/org/apache/sis/image/BandSelectImage.java | 22 +- .../main/org/apache/sis/image/ImageOverlay.java | 2 + .../main/org/apache/sis/image/PlanarImage.java | 25 +- .../sis/image/PositionalConsistencyImage.java | 6 +- .../org/apache/sis/image/SourceAlignedImage.java | 7 +- .../sis/coverage/grid/ClippedGridCoverageTest.java | 202 +++++++ .../coverage/grid/ConvertedGridCoverageTest.java | 9 +- .../sis/coverage/grid/GridCoverage2DTest.java | 4 +- .../coverage/grid/TranslatedGridCoverageTest.java | 4 +- .../org/apache/sis/metadata/sql/Installer.java | 2 +- .../org/apache/sis/metadata/sql/privy/Dialect.java | 78 ++- .../sis/metadata/sql/privy/ScriptRunner.java | 274 +++------ .../apache/sis/metadata/sql/privy/Supports.java | 41 +- .../main/org/apache/sis/temporal/TemporalDate.java | 2 +- .../org/apache/sis/metadata/sql/TestDatabase.java | 2 +- .../sis/metadata/sql/privy/ScriptRunnerTest.java | 9 +- .../sis/metadata/sql/privy/SupportsTest.java} | 34 +- .../org/apache/sis/map/coverage/RenderingData.java | 22 +- .../main/org/apache/sis/portrayal/Canvas.java | 2 +- .../sis/referencing/crs/AbstractSingleCRS.java | 32 +- .../org/apache/sis/referencing/cs/AbstractCS.java | 2 +- .../sis/referencing/datum/AbstractDatum.java | 2 +- .../referencing/factory/sql/AuthorityCodes.java | 6 +- .../referencing/factory/sql/EPSGCodeFinder.java | 18 +- .../referencing/factory/sql/EPSGDataAccess.java | 26 +- .../sis/referencing/factory/sql/EPSGFactory.java | 54 +- .../sis/referencing/factory/sql/EPSGInstaller.java | 190 ++---- .../sis/referencing/factory/sql/EPSG_Finish.sql | 117 ++-- .../sis/referencing/factory/sql/EPSG_Prepare.sql | 32 +- .../factory/sql/InstallationScriptProvider.java | 31 +- .../sis/referencing/factory/sql/SQLTranslator.java | 224 +++---- .../sis/referencing/factory/sql/TableInfo.java | 32 +- .../referencing/internal/VerticalDatumTypes.java | 2 - .../operation/AbstractCoordinateOperation.java | 2 +- .../referencing/factory/sql/EPSGInstallerTest.java | 40 +- .../sis/storage/base/MemoryGridResource.java | 143 +++-- .../main/org/apache/sis/pending/jdk/JDK22.java | 11 + .../main/org/apache/sis/util/ComparisonMode.java | 62 +- .../main/org/apache/sis/util/StringBuilders.java | 23 +- .../org/apache/sis/util/StringBuildersTest.java | 27 +- .../coveragejson/CoverageJsonStoreProvider.java | 5 +- .../sis/storage/coveragejson/CoverageResource.java | 8 +- .../apache/sis/storage/geopackage/GpkgStore.java | 2 +- netbeans-project/nbproject/project.xml | 1 + optional/build.gradle.kts | 2 + .../sis/referencing/factory/sql/epsg/Clear.sql | 43 ++ .../factory/sql/epsg/DataScriptFormatter.java | 655 ++++++++++----------- .../factory/sql/epsg/DataScriptUpdater.java | 93 +++ .../referencing/factory/sql/epsg/DebugTools.sql | 17 +- .../sis/referencing/factory/sql/epsg/README.md | 40 +- .../factory/sql/epsg/TableScriptUpdater.java | 174 ++++++ .../referencing/factory/sql/epsg/TableValues.java | 364 ++++++++++++ 63 files changed, 2334 insertions(+), 1204 deletions(-) diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractSingleCRS.java index e6d0cea5cf,ac88426d4a..16172dd7aa --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractSingleCRS.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractSingleCRS.java @@@ -31,12 -31,12 +31,13 @@@ import org.apache.sis.util.resources.Er import org.apache.sis.referencing.IdentifiedObjects; import org.apache.sis.referencing.cs.AbstractCS; import org.apache.sis.referencing.internal.Resources; + import org.apache.sis.metadata.privy.Identifiers; import org.apache.sis.metadata.privy.ImplementationHelper; -// Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.referencing.datum.DatumEnsemble; -import org.opengis.metadata.Identifier; +// Specific to the main branch: +import org.opengis.referencing.ReferenceIdentifier; +import org.apache.sis.referencing.datum.DefaultDatumEnsemble; +import org.apache.sis.pending.geoapi.referencing.MissingMethods; /** @@@ -209,6 -209,22 +210,22 @@@ class AbstractSingleCRS<D extends Datum return ensemble; } + /** + * Returns whether the given datum may be considered as equivalent to the given datum ensemble. + * Used for comparisons with {@link ComparisonMode#APPROXIMATE} for interoperability between + * the legacy and the new definition of EPSG:4326. + */ - private static boolean isHeuristicMatchForName(final DatumEnsemble<?> ensemble, final Datum datum, final ComparisonMode mode) { ++ private static boolean isHeuristicMatchForName(final DefaultDatumEnsemble<?> ensemble, final Datum datum, final ComparisonMode mode) { + if (ensemble == null || datum == null) { + return false; + } + final Boolean match = Identifiers.hasCommonIdentifier(ensemble.getIdentifiers(), datum.getIdentifiers()); + if (match != null) { + return match; + } + return IdentifiedObjects.isHeuristicMatchForName(datum, ensemble.getName().getCode()); + } + /** * Compares this coordinate reference system with the specified object for equality. * @@@ -228,8 -244,17 +245,17 @@@ } default: { final var that = (SingleCRS) object; - return Utilities.deepEquals(getDatum(), that.getDatum(), mode) && - Utilities.deepEquals(getDatumEnsemble(), MissingMethods.getDatumEnsemble(that), mode); + final var d1 = this.getDatum(); + final var d2 = that.getDatum(); + if (mode == ComparisonMode.DEBUG) { + mode = ComparisonMode.ALLOW_VARIANT; // For avoiding too early `AssertionError`. + } + if (Utilities.deepEquals(d1, d2, mode)) { - return mode.allowsVariant() || Utilities.deepEquals(getDatumEnsemble(), that.getDatumEnsemble(), mode); ++ return mode.allowsVariant() || Utilities.deepEquals(getDatumEnsemble(), MissingMethods.getDatumEnsemble(that), mode); + } else if (mode.allowsVariant()) { + return isHeuristicMatchForName(this.getDatumEnsemble(), d2, mode) || - isHeuristicMatchForName(that.getDatumEnsemble(), d1, mode); ++ isHeuristicMatchForName(MissingMethods.getDatumEnsemble(that), d1, mode); + } } } } diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/EPSGDataAccess.java index 8034b0bb4f,38e2b7c7da..8d624ffa7f --- 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 @@@ -2051,12 -2026,12 +2051,12 @@@ search: try (ResultSet result = execute final var accuracy = PositionalAccuracyConstant.ensemble(max); final List<Datum> members = createComponents( GeodeticAuthorityFactory::createDatum, - "DatumEnsembleMember", + "Datum Ensemble Member", "SELECT DATUM_CODE" - + " FROM \"DatumEnsembleMember\"" + + " FROM \"Datum Ensemble Member\"" + " WHERE DATUM_ENSEMBLE_CODE = ?" + " ORDER BY DATUM_SEQUENCE", code); - return (factory, metadata) -> DefaultDatumEnsemble.castOrCopy(factory.createDatumEnsemble(metadata, members, accuracy)); + return (factory, metadata) -> extended(factory).createDatumEnsemble(metadata, members, accuracy); } /** @@@ -2736,24 -2711,22 +2736,24 @@@ /** * Returns the realization method for the specified code. + * Returned as the legacy {@link VerticalDatumType} because + * {@code RealizationMethod} did not existed in GeoAPI 3.0. * * @param code code of the realization method, or {@code null} if none. - * @return realization method, or {@code null} if the given code was null. + * @return realization method, or {@code GEOIDAL} if the given code was null. */ - private RealizationMethod getRealizationMethod(final Integer code) throws FactoryException, SQLException { + private VerticalDatumType getRealizationMethod(final Integer code) throws FactoryException, SQLException { assert Thread.holdsLock(this); if (code == null) { - return null; + return VerticalDatumType.GEOIDAL; } final Long cacheKey = cacheKey(2, code); - var returnValue = (RealizationMethod) localCache.get(cacheKey); + var returnValue = (VerticalDatumType) localCache.get(cacheKey); if (returnValue == null && code != null) { try (ResultSet result = executeQueryForCodes( - "DatumRealizationMethod", + "Datum Realization Method", "SELECT REALIZATION_METHOD_NAME" - + " FROM \"DatumRealizationMethod\"" + + " FROM \"Datum Realization Method\"" + " WHERE REALIZATION_METHOD_CODE = ?", code)) { while (result.next()) { diff --cc endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java index 26c70067cf,49c0195828..39925454cf --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/sql/TableInfo.java @@@ -276,13 -265,15 +269,14 @@@ final class TableInfo /** * Appends a {@code WHERE} clause together with a condition for searching the specified object. - * This method delegates to {@link #where(Class, StringBuilder)} with the type of the given object, - * except that some object properties may be inspected for resolving ambiguities. + * This method delegates to {@link #where(EPSGDataAccess, Class, StringBuilder)} with the type + * of the given object, except that some object properties may be inspected for resolving ambiguities. * - * @param object the object to search in the database. - * @param buffer where to append the {@code WHERE} clause. + * @param factory the factory which is writing a <abbr>SQL</abbr> statement. + * @param object the object to search in the database. + * @param buffer where to append the {@code WHERE} clause. */ - final void where(final IdentifiedObject object, final StringBuilder buffer) { - @SuppressWarnings("deprecation") + final void where(final EPSGDataAccess factory, final IdentifiedObject object, final StringBuilder buffer) { Class<?> userType = object.getClass(); if (object instanceof GeodeticCRS) { final CoordinateSystem cs = ((GeodeticCRS) object).getCoordinateSystem();
