Skip to content

Commit 49c9450

Browse files
author
dsamaey
committed
Issue #392 added support for "array_contains" in the OpenEOProcessScriptBuilder
1 parent c161c6c commit 49c9450

File tree

2 files changed

+132
-79
lines changed

2 files changed

+132
-79
lines changed

openeo-geotrellis/src/main/scala/org/openeo/geotrellis/OpenEOProcessScriptBuilder.scala

+34-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package org.openeo.geotrellis
33
import ai.catboost.CatBoostModel
44
import ai.catboost.spark.CatBoostClassificationModel
55
import geotrellis.raster.mapalgebra.local._
6-
import geotrellis.raster.{ArrayTile, BitCellType, ByteUserDefinedNoDataCellType, CellType, ConstantTile, Dimensions, DoubleConstantNoDataCellType, DoubleConstantTile, FloatConstantNoDataCellType, FloatConstantTile, IntConstantNoDataCellType, IntConstantTile, MultibandTile, MutableArrayTile, NODATA, ShortConstantNoDataCellType, ShortConstantTile, Tile, UByteCells, UByteConstantTile, UByteUserDefinedNoDataCellType, UShortCells, UShortUserDefinedNoDataCellType, isData, isNoData}
6+
import geotrellis.raster.{ArrayTile, BitCellType, BitConstantTile, ByteUserDefinedNoDataCellType, CellType, ConstantTile, Dimensions, DoubleConstantNoDataCellType, DoubleConstantTile, FloatConstantNoDataCellType, FloatConstantTile, IntConstantNoDataCellType, IntConstantTile, MultibandTile, MutableArrayTile, NODATA, ShortConstantNoDataCellType, ShortConstantTile, Tile, UByteCells, UByteConstantTile, UByteUserDefinedNoDataCellType, UShortCells, UShortUserDefinedNoDataCellType, isData, isNoData}
77
import org.apache.commons.math3.exception.NotANumberException
88
import org.apache.commons.math3.stat.descriptive.rank.Percentile
99
import org.apache.commons.math3.stat.descriptive.rank.Percentile.EstimationType
@@ -21,11 +21,10 @@ import java.time.temporal.{ChronoUnit, TemporalAccessor}
2121
import java.time.{Duration, ZonedDateTime}
2222
import java.util
2323
import scala.Double.NaN
24-
import scala.collection.JavaConversions.mapAsScalaMap
24+
import scala.collection.JavaConverters.mapAsScalaMap
2525
import scala.collection.JavaConverters.collectionAsScalaIterableConverter
2626
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
2727
import scala.collection.{immutable, mutable}
28-
import scala.math.BigDecimal
2928
import scala.util.Try
3029
import scala.util.control.Breaks.{break, breakable}
3130

@@ -633,6 +632,37 @@ class OpenEOProcessScriptBuilder {
633632
contextStack.head.getOrElse(name, null).asInstanceOf[OpenEOProcess]
634633
}
635634

635+
private def arrayContains(arguments:java.util.Map[String,Object]) : OpenEOProcess = {
636+
val value = getProcessArg("value")
637+
val data = getProcessArg("data")
638+
639+
val arrayContainsProcess = (context: Map[String, Any]) => (tiles: Seq[Tile]) => {
640+
val value_input: Seq[Tile] = evaluateToTiles(value, context, tiles)
641+
val data_input: Seq[Tile] = evaluateToTiles(data, context, tiles)
642+
if (value_input.size != 1) {
643+
throw new IllegalArgumentException("The value argument of the array_contains function should resolve to exactly one input.")
644+
}
645+
val the_value = value_input.head
646+
val tile = MultibandTile(data_input)
647+
648+
val mutableResult:MutableArrayTile = ArrayTile.empty(BitCellType,tile.cols,tile.rows)
649+
for (column <- Range(0, tile.cols)) {
650+
for (row <- Range(0, tile.rows)) {
651+
breakable {
652+
for (band <- tile.bands) {
653+
if (band.get(column, row) == the_value.get(column, row)) {
654+
mutableResult.set(column, row, 1)
655+
break
656+
}
657+
}
658+
}
659+
}
660+
}
661+
Seq(mutableResult)
662+
}
663+
664+
arrayContainsProcess
665+
}
636666

637667
private def arrayFind(arguments:java.util.Map[String,Object]) : OpenEOProcess = {
638668
val storedArgs = contextStack.head
@@ -1203,6 +1233,7 @@ class OpenEOProcessScriptBuilder {
12031233
case "array_modify" => arrayModifyFunction(arguments)
12041234
case "array_interpolate_linear" => applyListFunction("data", linearInterpolation, dataTypeMode = PRESERVE_DATATYPE_MODE)
12051235
case "array_find" => arrayFind(arguments)
1236+
case "array_contains" => arrayContains(arguments)
12061237
case "linear_scale_range" => linearScaleRangeFunction(arguments)
12071238
case "quantiles" => quantilesFunction(arguments, ignoreNoData)
12081239
case "array_concat" => arrayConcatFunction(arguments)

0 commit comments

Comments
 (0)