Skip to content

Commit 4191a8b

Browse files
authored
[GEOS-11797]: fix on sorting bands (geoserver#8499)
1 parent 39b3a97 commit 4191a8b

File tree

2 files changed

+57
-33
lines changed

2 files changed

+57
-33
lines changed

src/main/src/main/java/org/geoserver/catalog/CoverageViewReader.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@
100100
import org.geotools.referencing.CRS;
101101
import org.geotools.referencing.crs.DefaultGeographicCRS;
102102
import org.geotools.util.NumberRange;
103-
import org.geotools.util.factory.GeoTools;
104103
import org.geotools.util.factory.Hints;
105104
import org.geotools.util.logging.Logging;
106105

@@ -427,15 +426,20 @@ public GridCoverage2D readUsingBandSelect(
427426

428427
private GridCoverage2D readUsingJiffle(ViewInputs viewInputs) {
429428
HashMap<String, GridCoverage2D> inputCoverages = viewInputs.getInputCoverages();
429+
List<String> coverageOrder = new ArrayList<>(inputCoverages.keySet());
430430
GridCoverage2D[] coverages = inputCoverages.values().toArray(new GridCoverage2D[0]);
431431
GridCoverage2D reference = coverages[0];
432432

433433
String destName = coverageView.getOutputName();
434434
String script = coverageView.getDefinition();
435435
List<CoverageBand> outputBands = coverageView.getCoverageBands();
436436
List<InputCoverageBand> inputBands = outputBands.get(0).getInputCoverageBands();
437+
Set<String> usedBandNames =
438+
inputBands.stream().map(InputCoverageBand::getCoverageName).collect(Collectors.toSet());
439+
440+
// Make sure sourceBands are sorted the same way as the coverages
437441
List<String> sourceBands =
438-
inputBands.stream().map(icb -> icb.getCoverageName()).collect(Collectors.toList());
442+
coverageOrder.stream().filter(usedBandNames::contains).collect(Collectors.toList());
439443

440444
RenderedImage[] sources = new RenderedImage[inputCoverages.size()];
441445
sources[0] = reference.getRenderedImage();
@@ -446,7 +450,7 @@ private GridCoverage2D readUsingJiffle(ViewInputs viewInputs) {
446450
} else {
447451
double[] nodata = CoverageUtilities.getBackgroundValues(coverage);
448452
ROI roi = CoverageUtilities.getROIProperty(coverage);
449-
sources[i] = GridCoverage2DRIA.create(coverage, reference, nodata, GeoTools.getDefaultHints(), roi);
453+
sources[i] = GridCoverage2DRIA.create(coverage, reference, nodata, hints, roi);
450454
}
451455
}
452456

@@ -455,20 +459,10 @@ private GridCoverage2D readUsingJiffle(ViewInputs viewInputs) {
455459
Range[] nodatas = new Range[sources.length];
456460
nodatas = getNodatas(nodatas, coverages);
457461
RenderedOp result = JiffleDescriptor.create(
458-
sources,
459-
sourceNames,
460-
destName,
461-
script,
462-
null,
463-
null,
464-
outputBandCount,
465-
null,
466-
null,
467-
nodatas,
468-
GeoTools.getDefaultHints());
462+
sources, sourceNames, destName, script, null, null, outputBandCount, null, null, nodatas, hints);
469463

470464
GridSampleDimension[] sampleDimensions = getSampleDimensions(result, destName);
471-
GridCoverageFactory factory = new GridCoverageFactory(GeoTools.getDefaultHints());
465+
GridCoverageFactory factory = new GridCoverageFactory(hints);
472466
return factory.create("jiffle", result, reference.getEnvelope(), sampleDimensions, coverages, null);
473467
}
474468

src/main/src/test/java/org/geoserver/catalog/CoverageViewTest.java

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public class CoverageViewTest extends GeoServerSystemTestSupport {
6262
private static final String RGB_IR_VIEW = "RgbIrView";
6363
private static final String BANDS_FLAGS_VIEW = "BandsFlagsView";
6464
private static final String NDVI_VIEW = "NDVI";
65+
private static final String NDVI_VIEW2 = "NDVI2";
6566
private static final String BGR_VIEW = "BGR";
6667
private static final double ERROR = 1E-5;
6768
protected static QName WATTEMP = new QName(MockData.SF_URI, "watertemp", MockData.SF_PREFIX);
@@ -96,6 +97,7 @@ protected void onSetUp(SystemTestData testData) throws Exception {
9697
configureIROnCatalog(cat);
9798
configureBandsFlagsOnCatalog(cat);
9899
configureNDVIonCatalog(cat);
100+
configureNDVI2(cat);
99101
configureBGRonCatalogWithJiffle(cat);
100102
}
101103

@@ -129,7 +131,7 @@ private void configureNDVIonCatalog(Catalog cat) throws Exception {
129131
final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("s2reduced");
130132
InputCoverageBand ib04 = new InputCoverageBand("B04", "0");
131133
InputCoverageBand ib08 = new InputCoverageBand("B08", "0");
132-
final CoverageBand ndvi = new CoverageBand(Arrays.asList(ib04, ib08), "ndvi", 0, CompositionType.JIFFLE);
134+
final CoverageBand ndvi = new CoverageBand(Arrays.asList(ib04, ib08), "NDVI", 0, CompositionType.JIFFLE);
133135
final CoverageView coverageView = new CoverageView(NDVI_VIEW, Collections.singletonList(ndvi));
134136
coverageView.setOutputName("NDVI");
135137
coverageView.setDefinition("NDVI = (B08 - B04) / (B04 + B08);");
@@ -140,6 +142,22 @@ private void configureNDVIonCatalog(Catalog cat) throws Exception {
140142
cat.add(coverageInfo);
141143
}
142144

145+
private void configureNDVI2(Catalog cat) throws Exception {
146+
final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("s2reduced");
147+
InputCoverageBand ib04 = new InputCoverageBand("B04", "0");
148+
InputCoverageBand ib08 = new InputCoverageBand("B08", "0");
149+
// set bands in a different order
150+
final CoverageBand ndvi = new CoverageBand(Arrays.asList(ib08, ib04), "NDVI2", 0, CompositionType.JIFFLE);
151+
final CoverageView coverageView = new CoverageView(NDVI_VIEW2, Collections.singletonList(ndvi));
152+
coverageView.setOutputName("NDVI2");
153+
coverageView.setDefinition("A=B08; B=B04; NDVI2=(A-B)/(B+A);");
154+
coverageView.setCompositionType(CompositionType.JIFFLE);
155+
final CatalogBuilder builder = new CatalogBuilder(cat);
156+
builder.setStore(storeInfo);
157+
final CoverageInfo coverageInfo = coverageView.createCoverageInfo(NDVI_VIEW2, storeInfo, builder);
158+
cat.add(coverageInfo);
159+
}
160+
143161
private void configureBGRonCatalogWithJiffle(Catalog cat) throws Exception {
144162
// Let's do bands swap with jiffle
145163
final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("ir-rgb");
@@ -250,12 +268,14 @@ public void testCoverageView() throws Exception {
250268
}
251269

252270
private void disposeCoverage(GridCoverage coverage) {
253-
RenderedImage ri = coverage.getRenderedImage();
254-
if (coverage instanceof GridCoverage2D) {
255-
((GridCoverage2D) coverage).dispose(true);
256-
}
257-
if (ri instanceof PlanarImage) {
258-
ImageUtilities.disposePlanarImageChain((PlanarImage) ri);
271+
if (coverage != null) {
272+
RenderedImage ri = coverage.getRenderedImage();
273+
if (coverage instanceof GridCoverage2D) {
274+
((GridCoverage2D) coverage).dispose(true);
275+
}
276+
if (ri instanceof PlanarImage) {
277+
ImageUtilities.disposePlanarImageChain((PlanarImage) ri);
278+
}
259279
}
260280
}
261281

@@ -309,19 +329,30 @@ public void testBands() throws Exception {
309329

310330
@Test
311331
public void testNDVIJiffle() throws Exception {
312-
Catalog cat = getCatalog();
313-
CoverageInfo coverageInfo = cat.getCoverageByName(NDVI_VIEW);
314-
final ResourcePool rp = cat.getResourcePool();
315-
GridCoverageReader reader = rp.getGridCoverageReader(coverageInfo, NDVI_VIEW, null);
316-
GridCoverage2D solidCoverage = (GridCoverage2D) reader.read(NDVI_VIEW, null);
332+
assertNdvi("NDVI");
333+
}
317334

318-
GridCoverageReader rb04 = rp.getGridCoverageReader(cat.getCoverageByName("B04"), "B04", null);
319-
GridCoverageReader rb08 = rp.getGridCoverageReader(cat.getCoverageByName("B08"), "B08", null);
320-
GridCoverage b04Coverage = rb04.read("B04", null);
321-
GridCoverage b08Coverage = rb08.read("B08", null);
335+
@Test
336+
public void testNDVI2Jiffle() throws Exception {
337+
assertNdvi("NDVI2");
338+
}
322339

340+
private void assertNdvi(String viewName) throws Exception {
341+
GridCoverage2D solidCoverage = null;
342+
GridCoverage b04Coverage = null;
343+
GridCoverage b08Coverage = null;
323344
try {
324-
assertBandNames(solidCoverage, "NDVI");
345+
Catalog cat = getCatalog();
346+
CoverageInfo coverageInfo = cat.getCoverageByName(viewName);
347+
final ResourcePool rp = cat.getResourcePool();
348+
GridCoverageReader reader = rp.getGridCoverageReader(coverageInfo, viewName, null);
349+
solidCoverage = (GridCoverage2D) reader.read(viewName, null);
350+
assertBandNames(solidCoverage, viewName);
351+
GridCoverageReader rb04 = rp.getGridCoverageReader(cat.getCoverageByName("B04"), "B04", null);
352+
GridCoverageReader rb08 = rp.getGridCoverageReader(cat.getCoverageByName("B08"), "B08", null);
353+
b04Coverage = rb04.read("B04", null);
354+
b08Coverage = rb08.read("B08", null);
355+
325356
RenderedImage ri = solidCoverage.getRenderedImage();
326357
Raster raster = ri.getData();
327358
Raster b04 = b04Coverage.getRenderedImage().getData();
@@ -339,7 +370,6 @@ public void testNDVIJiffle() throws Exception {
339370
assertEquals(d, ndvi, ERROR);
340371
}
341372
}
342-
343373
} finally {
344374
disposeCoverage(solidCoverage);
345375
disposeCoverage(b04Coverage);

0 commit comments

Comments
 (0)