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..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 @@ -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,32 @@ 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(); + + GridCoverage2D adjCoverage = null; + try { + outRaster.mapRaster(null, raster, null); + adjCoverage = outRaster.buildCoverage(); + } catch (Exception e) { + throw new KlabResourceAccessException("Cannot build COG Output " + e.getMessage()); + } + + encoder = new RasterEncoder(); + ((RasterEncoder) encoder).encodeFromCoverage(resource, urnParameters, adjCoverage, geometry, builder, scope); return; }