diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala index 9c1ab2234..4d8cb2a56 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -82,8 +82,13 @@ case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: E // Optimized pass-through case. case (s: LazyCRS, r: LazyCRS) if s.encoded == r.encoded => geometry.eval(input) case _ => - val geom = JTSTypes.GeometryTypeInstance.deserialize(geometry.eval(input)) - JTSTypes.GeometryTypeInstance.serialize(reproject(geom, src, dst)) + if (geometry.eval(input) != null) { + val geom = JTSTypes.GeometryTypeInstance.deserialize(geometry.eval(input)) + JTSTypes.GeometryTypeInstance.serialize(reproject(geom, src, dst)) + } + else { + null + } } } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index ef677f0e5..1a04c998c 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -22,6 +22,7 @@ package org.locationtech.rasterframes import geotrellis.proj4.{CRS, LatLng, Sinusoidal, WebMercator} +import org.apache.spark.sql.functions.lit import org.apache.spark.sql.Encoders import org.locationtech.jts.geom._ @@ -118,5 +119,15 @@ class ReprojectGeometrySpec extends TestEnvironment { checkDocs("st_reproject") } + + it("should work on null columns") { + val df = Seq(1, 2, 3).toDF("id") + + noException shouldBe thrownBy { + df.withColumn("nullId", lit(null)) + .select(st_reproject(st_makePoint($"nullId", $"nullId"), WebMercator, Sinusoidal)) + .count() + } + } } }