You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by am...@apache.org on 2026/05/18 15:54:45 UTC
(sis) 03/07: fix(Storage): Fix ImageTileMatrix tile indices to work with slices in N dimensions.
This is an automated email from the ASF dual-hosted git repository.
alexismanin pushed a commit to branch fix/image-tile-matrix-get-tile
in repository https://gitbox.apache.org/repos/asf/sis.git
commit a0449bf1b4032052a7a0457995d9542ec3724c3c
Author: Alexis Manin <al...@geomatys.com>
AuthorDate: Mon May 18 08:45:12 2026 +0200
fix(Storage): Fix ImageTileMatrix tile indices to work with slices in N dimensions.
Previously, tiles from the ImageTileMatrix were assuming that its tiles were set in a 2D space.
However, an ImageTileMatrix can be a 2D slice in higher dimension space (for example, CRS:84 + single elevation coordinate). In such cases, the code that was relying on tile coordinates broke.
---
.../apache/sis/storage/tiling/ImageTileMatrix.java | 41 ++++++++++++++++++----
1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/tiling/ImageTileMatrix.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/tiling/ImageTileMatrix.java
index 38d09e96e8..84087f6e29 100644
--- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/tiling/ImageTileMatrix.java
+++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/tiling/ImageTileMatrix.java
@@ -383,7 +383,8 @@ final class ImageTileMatrix implements TileMatrix {
return new Iterator(Math.toIntExact(xmin),
Math.toIntExact(ymin),
Math.toIntExact(xmax),
- Math.toIntExact(ymax));
+ Math.toIntExact(ymax),
+ indiceRanges.getLow().getCoordinateValues());
}
}
}
@@ -448,19 +449,42 @@ final class ImageTileMatrix implements TileMatrix {
*/
private final long offsetX, offsetY;
+ /**
+ * Dimension indices for the X and Y axes in the tile matrix coordinate system.
+ */
+ private final int xDim, yDim;
+
+ /**
+ * Base template of tile indices.
+ * Used when returning {@link Tile#getIndices() tile indices}.
+ * Tiles will use these coordinates, replacing {link #xDim X} and {link #yDim Y} dimensions.
+ */
+ private final long[] baseIndices;
+
/**
* Creates a new request for tile iterators.
*
- * @param xmin first column index of tiles, inclusive.
- * @param xmin first row index of tiles, inclusive.
- * @param xmax last column index of tiles, inclusive.
- * @param ymax last row index of tiles, inclusive.
+ * @param xmin first column index of tiles, inclusive.
+ * @param ymin first row index of tiles, inclusive.
+ * @param xmax last column index of tiles, inclusive.
+ * @param ymax last row index of tiles, inclusive.
+ * @param baseIndices tile coordinate template.
+ * It can be any valid coordinate of the tiles managed by this iterator.
+ * It serves as base to build correct tile coordinate for each returned tile.
+ * Each tile will clone this array and replace its X and Y indices with its own.
+ * Therefore, it is important that it represent properly the "slice" of extra-dimensions
+ * this iterator operates on.
*/
- Iterator(final int xmin, final int ymin, final int xmax, final int ymax) {
+ Iterator(final int xmin, final int ymin, final int xmax, final int ymax,
+ final long[] baseIndices)
+ {
super(xmin, ymin, xmax, ymax);
tiles = image;
offsetX = imageToTileX;
offsetY = imageToTileY;
+ xDim = coverage.xDimension;
+ yDim = coverage.yDimension;
+ this.baseIndices = baseIndices;
}
/**
@@ -481,7 +505,10 @@ final class ImageTileMatrix implements TileMatrix {
/** Returns the indices of this tile in the {@code TileMatrix}. */
@Override public long[] getIndices() {
- return new long[] {offsetX + tileX, offsetY + tileY};
+ final long[] indices = baseIndices.clone();
+ indices[xDim] = offsetX + tileX;
+ indices[yDim] = offsetY + tileY;
+ return indices;
}
/** Returns information about whether the tile failed to load. */