Skip to content

Commit a3f9bc8

Browse files
committed
fix: Mask over doubles
NODATA in Double context was returning Integer.MinValue instead
1 parent 82de60b commit a3f9bc8

File tree

6 files changed

+30
-5
lines changed

6 files changed

+30
-5
lines changed

core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/InverseMaskByDefined.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ case class InverseMaskByDefined(targetTile: Expression, maskTile: Expression)
6060
val (mask, maskCtx) = maskTileExtractor(row(maskInput))
6161
val result = maskEval(targetTile, mask,
6262
{ (v, m) => if (isNoData(m)) v else NODATA },
63-
{ (v, m) => if (isNoData(m)) v else NODATA }
63+
{ (v, m) => if (isNoData(m)) v else Double.NaN }
6464
)
6565
toInternalRow(result, targetCtx)
6666
}

core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/InverseMaskByValue.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ case class InverseMaskByValue(targetTile: Expression, maskTile: Expression, mask
7373

7474
val result = maskEval(targetTile, mask,
7575
{ (v, m) => if (m != maskValue) NODATA else v },
76-
{ (v, m) => if (m != maskValue) NODATA else v }
76+
{ (v, m) => if (m != maskValue) Double.NaN else v }
7777
)
7878
toInternalRow(result, targetCtx)
7979
}

core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/MaskByDefined.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ case class MaskByDefined(targetTile: Expression, maskTile: Expression)
5959
val (mask, maskCtx) = maskTileExtractor(row(maskInput))
6060
val result = maskEval(targetTile, mask,
6161
{ (v, m) => if (isNoData(m)) NODATA else v },
62-
{ (v, m) => if (isNoData(m)) NODATA else v }
62+
{ (v, m) => if (isNoData(m)) Double.NaN else v }
6363
)
6464
toInternalRow(result, targetCtx)
6565
}

core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/MaskByValue.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ case class MaskByValue(targetTile: Expression, maskTile: Expression, maskValue:
7373

7474
val result = maskEval(targetTile, mask,
7575
{ (v, m) => if (m == maskValue) NODATA else v },
76-
{ (v, m) => if (m == maskValue) NODATA else v }
76+
{ (v, m) => if (m == maskValue) Double.NaN else v }
7777
)
7878
toInternalRow(result, targetCtx)
7979
}

core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/MaskByValues.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ case class MaskByValues(targetTile: Expression, maskTile: Expression, maskValues
7373

7474
val result = maskEval(targetTile, mask,
7575
{ (v, m) => if (maskValues.contains(m)) NODATA else v },
76-
{ (v, m) => if (maskValues.contains(m)) NODATA else v }
76+
{ (v, m) => if (maskValues.contains(m)) Double.NaN else v }
7777
)
7878

7979
toInternalRow(result, targetCtx)

core/src/test/scala/org/locationtech/rasterframes/functions/MaskingFunctionsSpec.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,31 @@ class MaskingFunctionsSpec extends TestEnvironment {
134134
checkDocs("rf_mask_by_value")
135135
}
136136

137+
it("should mask_by_value") {
138+
val values = (0 to 16)
139+
val tile: Tile = DoubleArrayTile(values.map(_.toDouble).toArray, 4, 4)
140+
// array([[ 0, 1, 2, 3],
141+
// [ 4, 5, 6, 7],
142+
// [ 8, 9, 10, 11],
143+
// [12, 13, 14, 15]])
144+
val mask: Tile = IntArrayTile(values.map(x => x % 2 * 4).toArray, 4, 4)
145+
// array([[0, 4, 0, 4],
146+
// [0, 4, 0, 4],
147+
// [0, 4, 0, 4],
148+
// [0, 4, 0, 4]])
149+
150+
import spark.implicits._
151+
val df = List((tile, mask)).toDF("tile", "mask")
152+
153+
val (maskedTile, inverseMaskedTile) = df.select(
154+
rf_mask_by_value(col("tile"), col("mask"), lit(4), inverse=false).alias("m1"),
155+
rf_mask_by_value(col("tile"), col("mask"), lit(4), inverse=true).alias("m2")
156+
).as[(Tile, Tile)].first()
157+
158+
maskedTile.findMinMax shouldBe (0, 14)
159+
inverseMaskedTile.findMinMax shouldBe (1, 15)
160+
}
161+
137162
it("should mask by value for value 0.") {
138163
import spark.implicits._
139164
// maskingTile has -4, ND, and -15 values. Expect mask by value with 0 to not change the

0 commit comments

Comments
 (0)