From 44d428762c473f18054d81779edb1e73a52d7c25 Mon Sep 17 00:00:00 2001 From: AM1729 Date: Tue, 18 Nov 2025 16:37:05 +0100 Subject: [PATCH 1/2] gets nodata from raster metadata, fixes shifts and resampling for observing in different resolutions --- .../klab/raster/files/RasterEncoder.java | 9 +++++ .../klab/stac/STACEncoder.java | 36 +++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/raster/files/RasterEncoder.java b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/raster/files/RasterEncoder.java index 55c45eb20..d0302b8c5 100644 --- a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/raster/files/RasterEncoder.java +++ b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/raster/files/RasterEncoder.java @@ -69,6 +69,8 @@ import org.integratedmodelling.klab.utils.NumberUtils; import org.opengis.coverage.grid.GridCoverage; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.geotools.coverage.util.CoverageUtilities; +import it.geosolutions.jaiext.range.NoDataContainer; import groovy.lang.Binding; import groovy.lang.GroovyShell; @@ -113,6 +115,13 @@ public void encodeFromCoverage(IResource resource, Map urnParame } int nBands = coverage.getNumSampleDimensions(); Set nodata = getNodata(resource, coverage, band); + + if (nodata.isEmpty()) { + NoDataContainer nodataContainer = CoverageUtilities.getNoDataProperty((GridCoverage2D) coverage); + double nodataValue = nodataContainer.getAsSingleValue(); + nodata.add(nodataValue); + } + GroovyShell shell = null; Binding binding = null; Script transformation = null; diff --git a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java index 7d5e137cf..579a0f4d0 100644 --- a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java +++ b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java @@ -15,6 +15,7 @@ import org.hortonmachine.gears.io.stac.HMStacItem; import org.hortonmachine.gears.io.stac.HMStacManager; import org.hortonmachine.gears.libs.modules.HMRaster; +import org.hortonmachine.gears.libs.modules.HMRaster.HMRasterWritableBuilder; import org.hortonmachine.gears.libs.modules.HMRaster.MergeMode; import org.hortonmachine.gears.libs.monitor.LogProgressMonitor; import org.hortonmachine.gears.utils.CrsUtilities; @@ -36,6 +37,7 @@ import org.integratedmodelling.klab.api.provenance.IArtifact; import org.integratedmodelling.klab.api.runtime.IContextualizationScope; import org.integratedmodelling.klab.api.runtime.monitoring.IMonitor; +import org.integratedmodelling.klab.components.geospace.extents.Projection; import org.integratedmodelling.klab.components.geospace.extents.Space; import org.integratedmodelling.klab.components.runtime.observations.Observation; import org.integratedmodelling.klab.components.time.extents.Time; @@ -60,6 +62,9 @@ import org.locationtech.jts.geom.Polygon; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; +import org.opengis.geometry.DirectPosition; +import org.geotools.referencing.CRS; +import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.github.davidmoten.aws.lw.client.Client; @@ -199,8 +204,35 @@ public void getEncodedData(IResource resource, Map urnParameters COGURL = resource.getParameters().get("cog", String.class); scope.getMonitor().info("Getting requested extent from the COG Asset from url" + COGURL); GridCoverage2D coverage = COGAssetExtension.getCOGWindowCoverage(bbox, COGURL); - encoder = new RasterEncoder(); - ((RasterEncoder) encoder).encodeFromCoverage(resource, urnParameters, coverage, geometry, builder, scope); + + String rcrs = geometry.getDimension(IGeometry.Dimension.Type.SPACE).getParameters().get( + org.integratedmodelling.klab.common.Geometry.PARAMETER_SPACE_PROJECTION, + String.class); + + Projection crs = Projection.create(rcrs); + org.locationtech.jts.geom.Envelope requestedExtend = new org.locationtech.jts.geom.Envelope(bbox.get(0), + bbox.get(1), bbox.get(2), bbox.get(3)); + + HMRaster raster = HMRaster.fromGridCoverage(coverage); + HMRaster outRaster = new HMRasterWritableBuilder().setRegion(RegionMap.fromEnvelopeAndGrid(requestedExtend, + (int) space.shape()[0], + (int) space.shape()[1])).setCrs(crs.getCoordinateReferenceSystem()) + .setNoValue(raster.getNovalue()) + .build(); + + System.out.println(raster.getNovalue()); + + GridCoverage2D adjCoverage = null; + try { + outRaster.mapRaster(null, raster, null); + adjCoverage = outRaster.buildCoverage(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + encoder = new RasterEncoder(); + ((RasterEncoder) encoder).encodeFromCoverage(resource, urnParameters, adjCoverage, geometry, builder, scope); return; } From fe8d0f24fac0b6be062e3099ae6aff2d0506de25 Mon Sep 17 00:00:00 2001 From: AM1729 Date: Wed, 19 Nov 2025 12:33:40 +0100 Subject: [PATCH 2/2] fixes --- .../java/org/integratedmodelling/klab/stac/STACEncoder.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java index 579a0f4d0..5586387d7 100644 --- a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java +++ b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java @@ -219,16 +219,13 @@ public void getEncodedData(IResource resource, Map urnParameters (int) space.shape()[1])).setCrs(crs.getCoordinateReferenceSystem()) .setNoValue(raster.getNovalue()) .build(); - - System.out.println(raster.getNovalue()); GridCoverage2D adjCoverage = null; try { outRaster.mapRaster(null, raster, null); adjCoverage = outRaster.buildCoverage(); } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); + throw new KlabResourceAccessException("Cannot build COG Output " + e.getMessage()); } encoder = new RasterEncoder();