@@ -27,7 +27,7 @@ import org.apache.spark.{Partitioner, SparkContext}
27
27
import org .openeo .geotrellis .OpenEOProcessScriptBuilder .{MaxIgnoreNoData , MinIgnoreNoData , OpenEOProcess , safeConvert }
28
28
import org .openeo .geotrellis .focal ._
29
29
import org .openeo .geotrellis .netcdf .NetCDFRDDWriter .ContextSeq
30
- import org .openeo .geotrelliscommon .{ByTileSpacetimePartitioner , ByTileSpatialPartitioner , ConfigurableSpaceTimePartitioner , ConfigurableSpatialPartitionerReduceZ , DatacubeSupport , FFTConvolve , OpenEORasterCube , OpenEORasterCubeMetadata , SCLConvolutionFilter , SpaceTimeByMonthPartitioner , SparseSpaceOnlyPartitioner , SparseSpaceTimePartitioner , SparseSpatialPartitioner }
30
+ import org .openeo .geotrelliscommon .{ByTileSpacetimePartitioner , ByTileSpatialPartitioner , ConfigurableSpaceTimePartitioner , ConfigurableSpatialPartitionerReduceZ , DatacubeSupport , FFTConvolve , OpenEORasterCube , OpenEORasterCubeMetadata , SCLConvolutionFilter , SpaceTimeByMonthPartitioner , SparseSpaceOnlyPartitioner , SparseSpaceTimePartitioner , SparseSpatialPartitioner , SpatialKeysProvider }
31
31
import org .slf4j .LoggerFactory
32
32
33
33
import java .io .File
@@ -173,8 +173,6 @@ class OpenEOProcesses extends Serializable {
173
173
}
174
174
175
175
private def transformTimeDimension [KT ](datacube : MultibandTileLayerRDD [SpaceTimeKey ], scriptBuilder : OpenEOProcessScriptBuilder , context : util.Map [String , Any ], reduce: Boolean = false ): RDD [(KT , MultibandTile )] = {
176
-
177
-
178
176
val expectedCellType = datacube.metadata.cellType
179
177
val applyToTimeseries : Iterable [(SpaceTimeKey , MultibandTile )] => Map [KT , MultibandTile ] =
180
178
if (reduce){
@@ -191,8 +189,6 @@ class OpenEOProcesses extends Serializable {
191
189
}
192
190
193
191
private def transformTimeDimension [KT ](datacube : MultibandTileLayerRDD [SpaceTimeKey ],applyToTimeseries : Iterable [(SpaceTimeKey , MultibandTile )] => Map [KT , MultibandTile ], reduce: Boolean ): RDD [(KT , MultibandTile )] = {
194
-
195
-
196
192
val index : Option [PartitionerIndex [SpaceTimeKey ]] =
197
193
if (datacube.partitioner.isDefined && datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpaceTimeKey ]]) {
198
194
Some (datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index)
@@ -201,15 +197,15 @@ class OpenEOProcesses extends Serializable {
201
197
}
202
198
logger.info(s " Applying callback on time dimension of cube with partitioner: ${datacube.partitioner.getOrElse(" no partitioner" )} - index: ${index.getOrElse(" no index" )} and metadata ${datacube.metadata}" )
203
199
val rdd : RDD [(SpaceTimeKey , MultibandTile )] =
204
- if (index.isDefined && (index.get.isInstanceOf [SparseSpaceOnlyPartitioner ] || index.get == ByTileSpacetimePartitioner )) {
200
+ if (index.isDefined && (index.get.isInstanceOf [SparseSpaceOnlyPartitioner ] || index.get. isInstanceOf [ ByTileSpacetimePartitioner ] )) {
205
201
datacube
206
202
} else {
207
- val keys : Option [Array [SpaceTimeKey ]] = findPartitionerKeys (datacube)
203
+ val keys : Option [Array [SpatialKey ]] = findPartitionerSpatialKeys (datacube)
208
204
val spatiallyGroupingIndex =
209
205
if (keys.isDefined){
210
- new SparseSpaceOnlyPartitioner (keys.get.map(SparseSpaceOnlyPartitioner .toIndex(_, indexReduction = 0 )).distinct.sorted, 0 , keys )
206
+ new SparseSpaceOnlyPartitioner (keys.get.map(SparseSpaceOnlyPartitioner .toIndex(_, indexReduction = 0 )).distinct.sorted, 0 , findPartitionerKeys(datacube) )
211
207
}else {
212
- ByTileSpacetimePartitioner
208
+ new ByTileSpacetimePartitioner ()
213
209
}
214
210
logger.info(f " Regrouping data cube along the time dimension, with index $spatiallyGroupingIndex. Cube metadata: ${datacube.metadata}" )
215
211
val partitioner : Partitioner = new SpacePartitioner (datacube.metadata.bounds)(implicitly, implicitly, spatiallyGroupingIndex)
@@ -289,10 +285,10 @@ class OpenEOProcesses extends Serializable {
289
285
290
286
val newBounds = retiled.metadata.bounds.asInstanceOf [KeyBounds [SpaceTimeKey ]].toSpatial
291
287
292
- val keys = findPartitionerKeys (datacube)
288
+ val keys = findPartitionerSpatialKeys (datacube)
293
289
val spatiallyGroupingIndex =
294
290
if (keys.isDefined){
295
- val spatialKeys : Array [SpatialKey ] = keys.get.map(_.spatialKey).distinct
291
+ val spatialKeys : Array [SpatialKey ] = keys.get
296
292
new SparseSpatialPartitioner (spatialKeys.map(ByTileSpatialPartitioner .toIndex).distinct.sorted, 0 , Some (spatialKeys))
297
293
}else {
298
294
ByTileSpatialPartitioner
@@ -306,11 +302,11 @@ class OpenEOProcesses extends Serializable {
306
302
private def groupOnTimeDimension (datacube : MultibandTileLayerRDD [SpaceTimeKey ]) = {
307
303
val targetBounds = datacube.metadata.bounds.asInstanceOf [KeyBounds [SpaceTimeKey ]].toSpatial
308
304
309
- val keys : Option [Array [SpaceTimeKey ]] = findPartitionerKeys (datacube)
305
+ val keys : Option [Array [SpatialKey ]] = findPartitionerSpatialKeys (datacube)
310
306
311
307
val index =
312
308
if (keys.isDefined) {
313
- new SparseSpatialPartitioner (keys.get.map(SparseSpaceOnlyPartitioner .toIndex(_, indexReduction = 0 )).distinct.sorted, 0 , keys.map(_.map(_.spatialKey)) )
309
+ new SparseSpatialPartitioner (keys.get.map(SparseSpaceOnlyPartitioner .toIndex(_, indexReduction = 0 )).distinct.sorted, 0 , keys)
314
310
} else {
315
311
ByTileSpatialPartitioner
316
312
}
@@ -322,6 +318,20 @@ class OpenEOProcesses extends Serializable {
322
318
groupedOnTime
323
319
}
324
320
321
+ def findPartitionerSpatialKeys (datacube : MultibandTileLayerRDD [SpaceTimeKey ]): Option [Array [SpatialKey ]] = {
322
+ val keys : Option [Array [SpatialKey ]] = if (datacube.partitioner.isDefined && (datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpaceTimeKey ]] || datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpatialKey ]])) {
323
+ val index = datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index
324
+ index match {
325
+ case value : SpatialKeysProvider =>
326
+ value.spatialKeys
327
+ case _ =>
328
+ Option .empty
329
+ }
330
+ } else {
331
+ Option .empty
332
+ }
333
+ keys
334
+ }
325
335
326
336
def findPartitionerKeys (datacube : MultibandTileLayerRDD [SpaceTimeKey ]): Option [Array [SpaceTimeKey ]] = {
327
337
val keys : Option [Array [SpaceTimeKey ]] = if (datacube.partitioner.isDefined && datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpaceTimeKey ]]) {
@@ -461,9 +471,9 @@ class OpenEOProcesses extends Serializable {
461
471
462
472
val filteredCube = filterNegativeSpatialKeys(datacube)
463
473
464
- val keys = findPartitionerKeys (filteredCube).map(_.filter( k => k.row >= 0 && k.col >= 0 ))
474
+ val keys = findPartitionerSpatialKeys (filteredCube).map(_.filter( k => k.row >= 0 && k.col >= 0 ))
465
475
val allPossibleKeys : immutable.Seq [SpatialKey ] = if (keys.isDefined) {
466
- keys.get.map(_.spatialKey). distinct.toList
476
+ keys.get.distinct.toList
467
477
} else {
468
478
filteredCube.metadata.tileBounds
469
479
.coordsIter
@@ -480,7 +490,7 @@ class OpenEOProcesses extends Serializable {
480
490
}else {
481
491
if (datacube.partitioner.isDefined && datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpaceTimeKey ]]) {
482
492
val index = datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index
483
- if (index.isInstanceOf [SparseSpaceOnlyPartitioner ] || index == ByTileSpacetimePartitioner ) {
493
+ if (index.isInstanceOf [SparseSpaceOnlyPartitioner ] || index. isInstanceOf [ ByTileSpacetimePartitioner ] ) {
484
494
index// a space only partitioner does not care about time, so can be reused as-is
485
495
} else {
486
496
SpaceTimeByMonthPartitioner
@@ -537,7 +547,7 @@ class OpenEOProcesses extends Serializable {
537
547
538
548
val tilesByInterval : RDD [(SpaceTimeKey , MultibandTile )] =
539
549
if (reduce) {
540
- if (datacube.partitioner.isDefined && datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpaceTimeKey ]] && (datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index.isInstanceOf [SparseSpaceOnlyPartitioner ] || datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index == ByTileSpacetimePartitioner )) {
550
+ if (datacube.partitioner.isDefined && datacube.partitioner.get.isInstanceOf [SpacePartitioner [SpaceTimeKey ]] && (datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index.isInstanceOf [SparseSpaceOnlyPartitioner ] || datacube.partitioner.get.asInstanceOf [SpacePartitioner [SpaceTimeKey ]].index. isInstanceOf [ ByTileSpacetimePartitioner ] )) {
541
551
filteredCube.mapPartitions(elements => {
542
552
val byNewKey = elements.flatMap(mapToNewKey).toStream.groupBy(_._1)
543
553
byNewKey.mapValues(v=> aggregateTiles(v.map(_._2))).iterator
@@ -717,7 +727,7 @@ class OpenEOProcesses extends Serializable {
717
727
implicit val newIndex : PartitionerIndex [K ] = new SparseSpaceOnlyPartitioner (newIndices,leftPart.index.asInstanceOf [SparseSpaceOnlyPartitioner ].indexReduction).asInstanceOf [PartitionerIndex [K ]]
718
728
SpacePartitioner [K ](kb)(implicitly,implicitly,newIndex)
719
729
}
720
- else if (leftPart.index == rightPart.index && (leftPart.index == ByTileSpatialPartitioner || leftPart.index == ByTileSpacetimePartitioner )) {
730
+ else if (leftPart.index == rightPart.index && (leftPart.index == ByTileSpatialPartitioner || leftPart.index. isInstanceOf [ ByTileSpacetimePartitioner ] )) {
721
731
leftPart
722
732
}
723
733
else if (leftPart.index == rightPart.index && leftPart.index.isInstanceOf [ConfigurableSpaceTimePartitioner ] ) {
0 commit comments