Skip to content

Commit

Permalink
improve test to actually mimick how masking is done in reality, this …
Browse files Browse the repository at this point in the history
…also provides significant speed-up of the test itself

Open-EO/openeo-geopyspark-driver#986
  • Loading branch information
jdries committed Jan 8, 2025
1 parent 9acdd8a commit 863c63b
Showing 1 changed file with 32 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,9 @@ class Sentinel2FileLayerProviderTest extends RasterMatchers {
assertRastersEqual(referenceTile,actualTile,160.0)
}

/**
* Test simulates the very common case where an 'scl dilation mask' is applied at load time.
*/
@Test
def testToSclDilationMaskOnS2TileEdge(): Unit = {
val ref = "https://artifactory.vgt.vito.be/artifactory/testdata-public/toscldilationmask_masked_ref.tif"
Expand All @@ -542,8 +545,11 @@ class Sentinel2FileLayerProviderTest extends RasterMatchers {
val crs = CRS.fromEpsgCode(32631)
val boundingBox = ProjectedExtent(Extent(640860, 5676170, 666460, 5701770), crs)
val dataCubeParameters = new DataCubeParameters

val listener = new GetInfoSparkListener()
SparkContext.getOrCreate().addSparkListener(listener)
// dataCubeParameters.tileSize = 2048 (This requires increased spark.kryoserializer.buffer.max)
val layer = tocLayerProviderUTM.readMultibandTileLayer(
val sclCube = sceneclassificationLayerProviderUTM.readMultibandTileLayer(
from = date,
to = date,
boundingBox,
Expand All @@ -553,31 +559,48 @@ class Sentinel2FileLayerProviderTest extends RasterMatchers {
sc,
Some(dataCubeParameters)
)
val spatialLayer: RDD[(SpatialKey, MultibandTile)] with Metadata[TileLayerMetadata[SpatialKey]] = layer.toSpatial(date)

// Create mask.
val sclLayer = MultibandTileLayerRDD(layer.mapValues(t => MultibandTile(Seq(t.band(3)))), layer.metadata)

val mask1Values = util.Arrays.asList(2, 4, 5, 6, 7)
val mask2Values = util.Arrays.asList(3, 8, 9, 10, 11)
val erosionKernelSize = 0
val kernel1Size = 17
val kernel2Size = 201
val mask: MultibandTileLayerRDD[SpaceTimeKey] = new OpenEOProcesses().toSclDilationMask(sclLayer, erosionKernelSize, mask1Values, mask2Values, kernel1Size, kernel2Size)
val spatialMask = mask.toSpatial(date)
val mask: MultibandTileLayerRDD[SpaceTimeKey] = new OpenEOProcesses().toSclDilationMask(sclCube, erosionKernelSize, mask1Values, mask2Values, kernel1Size, kernel2Size)

dataCubeParameters.setMaskingCube(mask)
val rgbCube = tocLayerProviderUTM.readMultibandTileLayer(
from = date,
to = date,
boundingBox,
polygons = Array(MultiPolygon(boundingBox.extent.toPolygon())),
polygons_crs = crs,
zoom = 0,
sc,
Some(dataCubeParameters)
)
val maskedCube: RDD[(SpatialKey, MultibandTile)] with Metadata[TileLayerMetadata[SpatialKey]] = rgbCube.toSpatial(date)

// Apply Mask.
val maskedLayer: MultibandTileLayerRDD[SpatialKey] = new OpenEOProcesses().rasterMask_spatial_spatial(spatialLayer, spatialMask, NODATA)
val reprojectedBoundingBox = boundingBox.reproject(spatialLayer.metadata.crs)
val reprojectedBoundingBox = boundingBox.reproject(maskedCube.metadata.crs)

// Compare results.
maskedLayer.sparseStitch(reprojectedBoundingBox) match {
case Some(stitched) => MultibandGeoTiff(stitched.crop(reprojectedBoundingBox), maskedLayer.metadata.crs).write(actual)
maskedCube.sparseStitch(reprojectedBoundingBox) match {
case Some(stitched) => MultibandGeoTiff(stitched.crop(reprojectedBoundingBox), maskedCube.metadata.crs).write(actual)
case _ => throw new IllegalStateException("nothing to sparse-stitch")
}
SparkContext.getOrCreate().removeSparkListener(listener)

listener.printStatus()

val referenceTile = GeoTiffRasterSource(ref).read().get
val actualTile = GeoTiffRasterSource(actual).read().get
assertRastersEqual(referenceTile, actualTile, 160.0)
//because debugging is enabled, it actually runs more jobs and stages then done in production
assertEquals(5,listener.getJobsCompleted)
assertEquals(18, listener.getStagesCompleted)

}

@Test
Expand Down

0 comments on commit 863c63b

Please sign in to comment.