This is an automated email from the ASF dual-hosted git repository. jsorel pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push: new 14c6715972 Avoid recomputing matrix grid geometry, fix matrix transform alignement 14c6715972 is described below commit 14c671597232f7576e84b9349b75ca4e1a5b0633 Author: jsorel <johann.so...@geomatys.com> AuthorDate: Mon Oct 14 16:14:16 2024 +0200 Avoid recomputing matrix grid geometry, fix matrix transform alignement --- .../org/apache/sis/storage/gimi/GimiProvider.java | 2 +- .../main/org/apache/sis/storage/gimi/Group.java | 3 +-- .../org/apache/sis/storage/gimi/ResourceGrid.java | 30 +++++++++++++++++++--- .../storage/gimi/ResourceImageUncompressed.java | 4 +-- .../apache/sis/storage/gimi/ResourcePyramid.java | 12 ++++++--- .../apache/sis/storage/gimi/ResourceUnknown.java | 2 +- .../storage/gimi/internal/MatrixGridRessource.java | 21 ++++++++++----- .../isobmff/gimi/ModelTransformationProperty.java | 2 +- .../isobmff/gimi/TiledImageConfigurationBox.java | 1 - .../gimi/isobmff/gimi/WellKnownText2Property.java | 4 +-- 10 files changed, 57 insertions(+), 24 deletions(-) diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java index f575f4e5ac..60e84b428b 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java @@ -27,8 +27,8 @@ import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.DataStoreProvider; import org.apache.sis.storage.ProbeResult; import org.apache.sis.storage.StorageConnector; -import org.apache.sis.storage.GridCoverageResource; import static org.apache.sis.storage.DataStoreProvider.LOCATION; +import org.apache.sis.storage.GridCoverageResource; import org.apache.sis.storage.base.Capability; import org.apache.sis.storage.base.StoreMetadata; import org.apache.sis.storage.tiling.TiledResource; diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/Group.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/Group.java index d97feb22ad..1626befc54 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/Group.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/Group.java @@ -20,14 +20,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; -import org.opengis.util.GenericName; import org.apache.sis.storage.AbstractResource; import org.apache.sis.storage.Aggregate; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.Resource; import org.apache.sis.storage.gimi.isobmff.iso14496_12.EntityToGroup; import org.apache.sis.util.iso.Names; - +import org.opengis.util.GenericName; /** * An unidentified group of entities. diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceGrid.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceGrid.java index ee2ae02db3..acb0452394 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceGrid.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceGrid.java @@ -16,13 +16,13 @@ */ package org.apache.sis.storage.gimi; +import java.awt.image.RenderedImage; import java.util.Collection; import java.util.List; import java.util.Optional; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; import org.opengis.util.GenericName; -import org.opengis.util.FactoryException; import org.apache.sis.coverage.SampleDimension; import org.apache.sis.coverage.grid.GridExtent; import org.apache.sis.coverage.grid.GridGeometry; @@ -41,6 +41,7 @@ import org.apache.sis.storage.tiling.TileMatrix; import org.apache.sis.storage.tiling.TileMatrixSet; import org.apache.sis.storage.tiling.TiledResource; import org.apache.sis.util.iso.Names; +import org.opengis.util.FactoryException; /** @@ -59,6 +60,7 @@ final class ResourceGrid extends MatrixGridRessource implements TiledResource, S private CoordinateReferenceSystem crs; private TileMatrix tileMatrix; private GimiTileMatrixSet tileMatrixSet; + private GridGeometry gridGeometry; public ResourceGrid(Item item) throws DataStoreException { this.item = item; @@ -98,7 +100,14 @@ final class ResourceGrid extends MatrixGridRessource implements TiledResource, S return item.store; } - private synchronized void initialize() throws DataStoreException { + @Override + public GridGeometry getGridGeometry() throws DataStoreException { + initialize(); + return gridGeometry; + } + + @Override + protected synchronized void initialize() throws DataStoreException { if (tileMatrix != null) return; final Resource first = item.store.getComponent(item.getReferences().get(0).toItemId[0]); @@ -107,6 +116,19 @@ final class ResourceGrid extends MatrixGridRessource implements TiledResource, S } else { throw new DataStoreException("Expecting a GridCoverageResource tile but was a " + first.getClass().getName()); } + + if (first instanceof ResourceImageUncompressed) { + ResourceImageUncompressed riu = (ResourceImageUncompressed) first; + colorModel = riu.getColorModel(null); + sampleModel = riu.getSampleModel(null); + tileSize = riu.getTileSize(); + } else { + final RenderedImage image = this.first.read(null).render(null); + colorModel = image.getColorModel(); + sampleModel = image.getSampleModel(); + tileSize = new int[]{image.getWidth(), image.getHeight()}; + } + final GridGeometry firstTileGridGeom = this.first.getGridGeometry(); final GridExtent tileExtent = firstTileGridGeom.getExtent(); @@ -144,7 +166,8 @@ final class ResourceGrid extends MatrixGridRessource implements TiledResource, S } //create tile matrix - GridGeometry tilingScheme = new GridGeometry(new GridExtent(imageExts.imageWidth, imageExts.imageHeight), PixelInCell.CELL_CENTER, matrixGridToCrs, crs); + GridGeometry tilingScheme = new GridGeometry(new GridExtent(imageExts.imageWidth, imageExts.imageHeight), PixelInCell.CELL_CORNER, matrixGridToCrs, crs); + this.gridGeometry = tilingScheme; tilingScheme = tilingScheme.derive().subgrid(null, tileSize).build(); //remove tile size from scheme tileMatrix = new GimiTileMatrix(this, tilingScheme, tileSize); //create tile matrix set @@ -156,6 +179,7 @@ final class ResourceGrid extends MatrixGridRessource implements TiledResource, S tileMatrix = new GimiTileMatrix(this, tilingScheme, tileSize); tileMatrixSet = new GimiTileMatrixSet(Names.createLocalName(null, null, identifier.tip().toString() + "_tms"), crs); tileMatrixSet.matrices.insertByScale(tileMatrix); + this.gridGeometry = tilingScheme.upsample(tileSize); } @Override diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceImageUncompressed.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceImageUncompressed.java index a1c44bb3d4..d6efb72c3a 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceImageUncompressed.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceImageUncompressed.java @@ -35,7 +35,6 @@ import java.util.Optional; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.util.FactoryException; import org.opengis.util.GenericName; -import org.opengis.referencing.operation.MathTransform; import org.apache.sis.coverage.SampleDimension; import org.apache.sis.coverage.grid.GridCoverage; import org.apache.sis.coverage.grid.GridExtent; @@ -57,6 +56,7 @@ import org.apache.sis.storage.gimi.isobmff.iso23001_17.UncompressedFrameConfig; import org.apache.sis.storage.gimi.isobmff.iso23008_12.ImageSpatialExtents; import org.apache.sis.storage.gimi.isobmff.iso23008_12.PixelInformationProperty; import org.apache.sis.util.iso.Names; +import org.opengis.referencing.operation.MathTransform; /** @@ -205,7 +205,7 @@ class ResourceImageUncompressed extends TiledGridResource implements StoreResour } else { crs = modelWkt.toCRS(); } - return new GridGeometry(extent, PixelInCell.CELL_CENTER, gridToCrs, crs); + return new GridGeometry(extent, PixelInCell.CELL_CORNER, gridToCrs, crs); } catch (FactoryException ex) { throw new DataStoreException(ex); } diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java index 2c2d388b98..d9eadc5d05 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java @@ -25,12 +25,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; import org.opengis.util.GenericName; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; import org.apache.sis.coverage.SampleDimension; import org.apache.sis.coverage.grid.GridCoverage; import org.apache.sis.coverage.grid.GridExtent; import org.apache.sis.coverage.grid.GridGeometry; +import org.apache.sis.coverage.grid.GridRoundingMode; import org.apache.sis.coverage.grid.PixelInCell; import org.apache.sis.referencing.CommonCRS; import org.apache.sis.referencing.operation.transform.MathTransforms; @@ -49,6 +48,8 @@ import org.apache.sis.storage.tiling.TileMatrix; import org.apache.sis.storage.tiling.TileMatrixSet; import org.apache.sis.storage.tiling.TiledResource; import org.apache.sis.util.iso.Names; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; /** @@ -131,7 +132,7 @@ final class ResourcePyramid extends AbstractGridCoverageResource implements Tile */ final TileMatrix referenceMatrix = candidates.get(0).getTileMatrix(); final GridGeometry reference = referenceMatrix.getTilingScheme(); - final MathTransform referenceTransform = reference.isDefined(GridGeometry.GRID_TO_CRS) ? reference.getGridToCRS(PixelInCell.CELL_CENTER) : new AffineTransform2D(1, 0, 0, 1, 0, 0); + final MathTransform referenceTransform = reference.isDefined(GridGeometry.GRID_TO_CRS) ? reference.getGridToCRS(PixelInCell.CELL_CORNER) : new AffineTransform2D(1, 0, 0, 1, 0, 0); final CoordinateReferenceSystem crs = reference.isDefined(GridGeometry.CRS) ? referenceMatrix.getTilingScheme().getCoordinateReferenceSystem() : CommonCRS.Engineering.GRID.crs(); tileMatrixSet = new GimiTileMatrixSet(Names.createLocalName(null, null, getIdentifier().get().tip().toString() + "_tms"), crs); @@ -147,7 +148,7 @@ final class ResourcePyramid extends AbstractGridCoverageResource implements Tile final GridGeometry fixed = new GridGeometry( resource.getTileMatrix().getTilingScheme().getExtent(), - PixelInCell.CELL_CENTER, + PixelInCell.CELL_CORNER, MathTransforms.concatenate(scaleTrs, referenceTransform), reference.getCoordinateReferenceSystem()); @@ -174,8 +175,11 @@ final class ResourcePyramid extends AbstractGridCoverageResource implements Tile @Override public GridCoverage read(GridGeometry domain, int... ranges) throws DataStoreException { initialize(); + ResourceGrid bestMatch = grids.get(tileMatrixSet.getTileMatrices().lastKey()); if (domain != null && domain.isDefined(GridGeometry.RESOLUTION)) { + //transpose it to this pyramid + domain = getGridGeometry().derive().rounding(GridRoundingMode.ENCLOSING).subgrid(domain).build(); final double[] resolution = domain.getResolution(true); for (Map.Entry<GenericName, ? extends TileMatrix> entry : tileMatrixSet.getTileMatrices().entrySet()) { final ResourceGrid grid = grids.get(entry.getKey()); diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java index b9e5d58f9c..0994f09d74 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java @@ -17,12 +17,12 @@ package org.apache.sis.storage.gimi; import java.util.Optional; -import org.opengis.util.GenericName; import org.apache.sis.storage.AbstractResource; import org.apache.sis.storage.DataStore; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.base.StoreResource; import org.apache.sis.util.iso.Names; +import org.opengis.util.GenericName; /** diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java index 72817b3b51..96bbc5e809 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java @@ -25,7 +25,9 @@ import java.io.IOException; import java.util.logging.Logger; import org.opengis.util.GenericName; import org.apache.sis.coverage.grid.GridCoverage; +import org.apache.sis.coverage.grid.GridExtent; import org.apache.sis.coverage.grid.GridGeometry; +import org.apache.sis.coverage.grid.GridRoundingMode; import org.apache.sis.storage.DataStoreException; import org.apache.sis.storage.GridCoverageResource; import org.apache.sis.storage.Resource; @@ -40,9 +42,9 @@ import org.apache.sis.storage.tiling.TileMatrix; */ public abstract class MatrixGridRessource extends TiledGridResource { - private int[] tileSize; - private SampleModel sampleModel; - private ColorModel colorModel; + protected int[] tileSize; + protected SampleModel sampleModel; + protected ColorModel colorModel; protected static final Logger LOGGER = Logger.getLogger("org.geotoolkit.storage.coverage"); @@ -52,7 +54,7 @@ public abstract class MatrixGridRessource extends TiledGridResource { protected abstract TileMatrix getTileMatrix(); - private void initialize() throws DataStoreException { + protected void initialize() throws DataStoreException { if (sampleModel != null) return; final RenderedImage image = getTileImage(0,0); colorModel = image.getColorModel(); @@ -91,6 +93,13 @@ public abstract class MatrixGridRessource extends TiledGridResource { @Override public GridCoverage read(GridGeometry domain, int ... range) throws DataStoreException { + if (domain != null) { + GridGeometry grid = getGridGeometry(); + final GridExtent intersection = grid.derive() + .rounding(GridRoundingMode.ENCLOSING) + .subgrid(domain).getIntersection(); + domain = grid.derive().subgrid(intersection).build(); + } return new MatrixCoverage(new Subset(domain, range)); } @@ -132,9 +141,7 @@ public abstract class MatrixGridRessource extends TiledGridResource { } else { raster = image.getData(); } - if (s.originX != 0 || s.originY != 0) { - raster = raster.createTranslatedChild(s.originX, s.originY); - } + raster = raster.createTranslatedChild(s.originX, s.originY); result[iterator.getTileIndexInResultArray()] = raster; } } while (iterator.next()); diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/ModelTransformationProperty.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/ModelTransformationProperty.java index ead0898e57..d3f422c45a 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/ModelTransformationProperty.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/ModelTransformationProperty.java @@ -17,10 +17,10 @@ package org.apache.sis.storage.gimi.isobmff.gimi; import java.io.IOException; -import org.opengis.referencing.operation.MathTransform; import org.apache.sis.referencing.privy.AffineTransform2D; import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader; import org.apache.sis.storage.gimi.isobmff.iso14496_12.ItemFullProperty; +import org.opengis.referencing.operation.MathTransform; /** diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java index c727eb3db9..922213d3db 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java @@ -20,7 +20,6 @@ import java.io.IOException; import org.apache.sis.storage.gimi.isobmff.FullBox; import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader; - /** * Definition from OGC TestBed 20 : tild.pdf * diff --git a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/WellKnownText2Property.java b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/WellKnownText2Property.java index 52eb9e091c..2b5560e9fd 100644 --- a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/WellKnownText2Property.java +++ b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/WellKnownText2Property.java @@ -17,11 +17,11 @@ package org.apache.sis.storage.gimi.isobmff.gimi; import java.io.IOException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.util.FactoryException; import org.apache.sis.referencing.CRS; import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader; import org.apache.sis.storage.gimi.isobmff.iso14496_12.ItemFullProperty; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.util.FactoryException; /**