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 <[email protected]>
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;
/**