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;
 
 
 /**

Reply via email to