This is an automated email from the ASF dual-hosted git repository.
desruisseaux 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 bf2b3b2 The translations applied on "target to source pixel
coordinates" transform shall be computed from requested extents, not from
global extents.
bf2b3b2 is described below
commit bf2b3b2cded976f56698a162f4cc255083d5cfe8
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Wed May 6 13:40:51 2020 +0200
The translations applied on "target to source pixel coordinates" transform
shall be computed from requested extents, not from global extents.
---
.../sis/coverage/grid/ResampledGridCoverage.java | 56 ++++++++++++----------
1 file changed, 32 insertions(+), 24 deletions(-)
diff --git
a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
index 1fe621d..21e3260 100644
---
a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
+++
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
@@ -471,34 +471,42 @@ final class ResampledGridCoverage extends GridCoverage {
/**
* Returns a two-dimensional slice of resampled grid data as a rendered
image.
+ *
+ * @throws CannotEvaluateException if this method can not produce the
rendered image.
*/
@Override
public RenderedImage render(GridExtent sliceExtent) {
- if (sliceExtent != null) try {
- final GeneralEnvelope bounds = sliceExtent.toCRS(toSourceCorner,
toSourceCenter, null);
- sliceExtent = new GridExtent(bounds, GridRoundingMode.ENCLOSING,
null, null, null);
- } catch (TransformException e) {
- throw new CannotEvaluateException(e.getLocalizedMessage(), e);
- }
- final RenderedImage image = source.render(sliceExtent);
- final GridExtent sourceExtent =
source.getGridGeometry().getExtent();
- final GridExtent targetExtent = gridGeometry.getExtent();
- final Rectangle bounds = new
Rectangle(Math.toIntExact(targetExtent.getSize(xDimension)),
-
Math.toIntExact(targetExtent.getSize(yDimension)));
- /*
- * `this.toSource` is a transform from source cell coordinates to
target cell coordinates.
- * We need a transform from source pixel coordinates to target pixel
coordinates (in images).
- * An offset may exist between cell coordinates and pixel coordinates.
- */
- final MathTransform pixelsToTransform = MathTransforms.translation(
- targetExtent.getLow(xDimension),
- targetExtent.getLow(yDimension));
+ final RenderedImage values; // Source image providing the
values to resample.
+ final MathTransform toSource; // From resampled image pixels to
source image pixels.
+ final Rectangle bounds; // Bounds (in pixel coordinates)
of resampled image.
+ try {
+ GridExtent sourceExtent = null;
+ if (sliceExtent != null) {
+ final GeneralEnvelope envelope =
sliceExtent.toCRS(toSourceCorner, toSourceCenter, null);
+ sourceExtent = new GridExtent(envelope,
GridRoundingMode.ENCLOSING, null, null, null);
+ }
+ values = source.render(sourceExtent);
+ if (sliceExtent == null) sliceExtent = gridGeometry.getExtent();
+ if (sourceExtent == null) sourceExtent =
source.getGridGeometry().getExtent();
+ bounds = new
Rectangle(Math.toIntExact(sliceExtent.getSize(xDimension)),
+
Math.toIntExact(sliceExtent.getSize(yDimension)));
+ /*
+ * `this.toSource` is a transform from source cell coordinates to
target cell coordinates.
+ * We need a transform from source pixel coordinates to target
pixel coordinates (in images).
+ * An offset may exist between cell coordinates and pixel
coordinates.
+ */
+ final MathTransform pixelsToTransform = MathTransforms.translation(
+ sliceExtent.getLow(xDimension),
+ sliceExtent.getLow(yDimension));
- final MathTransform transformToPixels = MathTransforms.translation(
- Math.subtractExact(image.getMinX(),
sourceExtent.getLow(xDimension)),
- Math.subtractExact(image.getMinY(),
sourceExtent.getLow(yDimension)));
+ final MathTransform transformToPixels = MathTransforms.translation(
+ Math.negateExact(sourceExtent.getLow(xDimension)),
+ Math.negateExact(sourceExtent.getLow(yDimension)));
- final MathTransform toImage =
MathTransforms.concatenate(pixelsToTransform, toSourceCenter,
transformToPixels);
- return imageProcessor.resample(bounds, toImage, image);
+ toSource = MathTransforms.concatenate(pixelsToTransform,
toSourceCenter, transformToPixels);
+ } catch (TransformException | ArithmeticException e) {
+ throw new CannotEvaluateException(e.getLocalizedMessage(), e);
+ }
+ return imageProcessor.resample(bounds, toSource, values);
}
}