This is an automated email from the ASF dual-hosted git repository.
jiayu pushed a commit to branch branch-1.5.2
in repository https://gitbox.apache.org/repos/asf/sedona.git
The following commit(s) were added to refs/heads/branch-1.5.2 by this push:
new 64570db0a [SEDONA-478] Make Sedona geometry functions and spatial join
working without GeoTools (#1398)
64570db0a is described below
commit 64570db0a6c4379c32a1b3cf2bf0f87c51fca1eb
Author: Kristin Cowalcijk <[email protected]>
AuthorDate: Sat May 4 05:20:16 2024 +0800
[SEDONA-478] Make Sedona geometry functions and spatial join working
without GeoTools (#1398)
---
.../org/apache/sedona/sql/RasterRegistrator.scala | 14 +----
.../sql/utils/GeoToolsCoverageAvailability.scala | 39 +++++++++++++
.../expressions/InferrableRasterTypes.scala | 64 ++++++++++++++++++++++
.../expressions/InferredExpression.scala | 47 ++++------------
.../expressions/InferredRasterExpression.scala | 64 ++++++++++++++++++++++
.../sql/sedona_sql/expressions/implicits.scala | 5 +-
.../expressions/raster/GeometryFunctions.scala | 1 +
.../sedona_sql/expressions/raster/MapAlgebra.scala | 1 +
.../expressions/raster/PixelFunctionEditors.scala | 1 +
.../expressions/raster/PixelFunctions.scala | 1 +
.../expressions/raster/RasterAccessors.scala | 1 +
.../expressions/raster/RasterBandAccessors.scala | 1 +
.../expressions/raster/RasterBandEditors.scala | 1 +
.../expressions/raster/RasterConstructors.scala | 1 +
.../expressions/raster/RasterEditors.scala | 1 +
.../expressions/raster/RasterOutputs.scala | 1 +
.../strategy/join/TraitJoinQueryBase.scala | 4 +-
17 files changed, 193 insertions(+), 54 deletions(-)
diff --git
a/spark/common/src/main/scala/org/apache/sedona/sql/RasterRegistrator.scala
b/spark/common/src/main/scala/org/apache/sedona/sql/RasterRegistrator.scala
index e3152e40d..1d5c1ab62 100644
--- a/spark/common/src/main/scala/org/apache/sedona/sql/RasterRegistrator.scala
+++ b/spark/common/src/main/scala/org/apache/sedona/sql/RasterRegistrator.scala
@@ -19,6 +19,7 @@
package org.apache.sedona.sql
import org.apache.sedona.sql.UDF.RasterUdafCatalog
+import
org.apache.sedona.sql.utils.GeoToolsCoverageAvailability.{gridClassName,
isGeoToolsAvailable}
import org.apache.spark.sql.catalyst.FunctionIdentifier
import org.apache.spark.sql.sedona_sql.UDT.RasterUdtRegistratorWrapper
import org.apache.spark.sql.{SparkSession, functions}
@@ -26,19 +27,6 @@ import org.slf4j.{Logger, LoggerFactory}
object RasterRegistrator {
val logger: Logger = LoggerFactory.getLogger(getClass)
- private val gridClassName = "org.geotools.coverage.grid.GridCoverage2D"
-
- // Helper method to check if GridCoverage2D is available
- private def isGeoToolsAvailable: Boolean = {
- try {
- Class.forName(gridClassName, true,
Thread.currentThread().getContextClassLoader)
- true
- } catch {
- case _: ClassNotFoundException =>
- logger.warn("Geotools was not found on the classpath. Raster
operations will not be available.")
- false
- }
- }
def registerAll(sparkSession: SparkSession): Unit = {
if (isGeoToolsAvailable) {
diff --git
a/spark/common/src/main/scala/org/apache/sedona/sql/utils/GeoToolsCoverageAvailability.scala
b/spark/common/src/main/scala/org/apache/sedona/sql/utils/GeoToolsCoverageAvailability.scala
new file mode 100644
index 000000000..1d197c2c3
--- /dev/null
+++
b/spark/common/src/main/scala/org/apache/sedona/sql/utils/GeoToolsCoverageAvailability.scala
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sedona.sql.utils
+
+import org.apache.sedona.sql.RasterRegistrator.logger
+
+/**
+ * A helper object to check if GeoTools GridCoverage2D is available on the
classpath.
+ */
+object GeoToolsCoverageAvailability {
+ val gridClassName = "org.geotools.coverage.grid.GridCoverage2D"
+
+ lazy val isGeoToolsAvailable: Boolean = {
+ try {
+ Class.forName(gridClassName, true,
Thread.currentThread().getContextClassLoader)
+ true
+ } catch {
+ case _: ClassNotFoundException =>
+ logger.warn("Geotools was not found on the classpath. Raster
operations will not be available.")
+ false
+ }
+ }
+}
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferrableRasterTypes.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferrableRasterTypes.scala
new file mode 100644
index 000000000..2d3349d4a
--- /dev/null
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferrableRasterTypes.scala
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.expressions
+
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.catalyst.expressions.Expression
+import org.apache.spark.sql.catalyst.util.ArrayData
+import org.apache.spark.sql.sedona_sql.UDT.RasterUDT
+import
org.apache.spark.sql.sedona_sql.expressions.raster.implicits.{RasterEnhancer,
RasterInputExpressionEnhancer}
+import org.apache.spark.sql.types.{ArrayType, DataTypes, UserDefinedType}
+
+import scala.reflect.runtime.universe.{Type, typeOf}
+import org.geotools.coverage.grid.GridCoverage2D
+
+object InferrableRasterTypes {
+ implicit val gridCoverage2DInstance: InferrableType[GridCoverage2D] =
+ new InferrableType[GridCoverage2D] {}
+ implicit val gridCoverage2DArrayInstance:
InferrableType[Array[GridCoverage2D]] =
+ new InferrableType[Array[GridCoverage2D]] {}
+
+ def isRasterType(t: Type): Boolean = t =:= typeOf[GridCoverage2D]
+ def isRasterArrayType(t: Type): Boolean = t =:= typeOf[Array[GridCoverage2D]]
+
+ val rasterUDT: UserDefinedType[_] = RasterUDT
+ val rasterUDTArray: ArrayType = DataTypes.createArrayType(RasterUDT)
+
+ def rasterExtractor(expr: Expression)(input: InternalRow): Any =
expr.toRaster(input)
+
+ def rasterSerializer(output: Any): Any =
+ if (output != null) {
+ output.asInstanceOf[GridCoverage2D].serialize
+ } else {
+ null
+ }
+
+ def rasterArraySerializer(output: Any): Any =
+ if (output != null) {
+ val rasters = output.asInstanceOf[Array[GridCoverage2D]]
+ val serialized = rasters.map { raster =>
+ val serialized = raster.serialize
+ raster.dispose(true)
+ serialized
+ }
+ ArrayData.toArrayData(serialized)
+ } else {
+ null
+ }
+}
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredExpression.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredExpression.scala
index 28096c4bc..6b9f89c45 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredExpression.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredExpression.scala
@@ -22,13 +22,11 @@ import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.{Expression,
ImplicitCastInputTypes}
import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback
import org.apache.spark.sql.catalyst.util.ArrayData
-import org.apache.spark.sql.sedona_sql.UDT.{GeometryUDT, RasterUDT}
+import org.apache.spark.sql.sedona_sql.UDT.GeometryUDT
import org.apache.spark.sql.types.{AbstractDataType, BinaryType, BooleanType,
DataType, DataTypes, DoubleType, IntegerType, LongType, StringType}
import org.apache.spark.unsafe.types.UTF8String
import org.locationtech.jts.geom.Geometry
import org.apache.spark.sql.sedona_sql.expressions.implicits._
-import org.apache.spark.sql.sedona_sql.expressions.raster.implicits._
-import org.geotools.coverage.grid.GridCoverage2D
import scala.collection.convert.ImplicitConversions.`collection
AsScalaIterable`
import scala.reflect.runtime.universe.TypeTag
@@ -75,14 +73,10 @@ abstract class InferredExpression(fSeq: InferrableFunction
*)
// This is a compile time type shield for the types we are able to infer.
Anything
// other than these types will cause a compilation error. This is the Scala
// 2 way of making a union type.
-sealed class InferrableType[T: TypeTag]
+class InferrableType[T: TypeTag]
object InferrableType {
implicit val geometryInstance: InferrableType[Geometry] =
new InferrableType[Geometry] {}
- implicit val gridCoverage2DInstance: InferrableType[GridCoverage2D] =
- new InferrableType[GridCoverage2D] {}
- implicit val gridCoverage2DArrayInstance:
InferrableType[Array[GridCoverage2D]] =
- new InferrableType[Array[GridCoverage2D]] {}
implicit val geometryArrayInstance: InferrableType[Array[Geometry]] =
new InferrableType[Array[Geometry]] {}
implicit val javaDoubleInstance: InferrableType[java.lang.Double] =
@@ -127,8 +121,8 @@ object InferredTypes {
expr => input => expr.toGeometry(input)
} else if (t =:= typeOf[Array[Geometry]]) {
expr => input => expr.toGeometryArray(input)
- } else if (t =:= typeOf[GridCoverage2D]) {
- expr => input => expr.toRaster(input)
+ } else if (InferredRasterExpression.isRasterType(t)) {
+ InferredRasterExpression.rasterExtractor
} else if (t =:= typeOf[Array[Double]]) {
expr => input => expr.eval(input).asInstanceOf[ArrayData].toDoubleArray()
} else if (t =:= typeOf[String]) {
@@ -156,14 +150,8 @@ object InferredTypes {
} else {
null
}
- } else if (t =:= typeOf[GridCoverage2D]) {
- output => {
- if (output != null) {
- output.asInstanceOf[GridCoverage2D].serialize
- } else {
- null
- }
- }
+ } else if (InferredRasterExpression.isRasterType(t)) {
+ InferredRasterExpression.rasterSerializer
} else if (t =:= typeOf[String]) {
output =>
if (output != null) {
@@ -194,19 +182,8 @@ object InferredTypes {
} else {
null
}
- } else if (t =:= typeOf[Array[GridCoverage2D]]) {
- output =>
- if (output != null) {
- val rasters = output.asInstanceOf[Array[GridCoverage2D]]
- val serialized = rasters.map { raster =>
- val serialized = raster.serialize
- raster.dispose(true)
- serialized
- }
- ArrayData.toArrayData(serialized)
- } else {
- null
- }
+ } else if (InferredRasterExpression.isRasterArrayType(t)) {
+ InferredRasterExpression.rasterArraySerializer
} else if (t =:= typeOf[Option[Boolean]]) {
output =>
if (output != null) {
@@ -224,10 +201,10 @@ object InferredTypes {
GeometryUDT
} else if (t =:= typeOf[Array[Geometry]] || t =:=
typeOf[java.util.List[Geometry]]) {
DataTypes.createArrayType(GeometryUDT)
- } else if (t =:= typeOf[GridCoverage2D]) {
- RasterUDT
- } else if (t =:= typeOf[Array[GridCoverage2D]]) {
- DataTypes.createArrayType(RasterUDT)
+ } else if (InferredRasterExpression.isRasterType(t)) {
+ InferredRasterExpression.rasterUDT
+ } else if (InferredRasterExpression.isRasterArrayType(t)) {
+ InferredRasterExpression.rasterUDTArray
} else if (t =:= typeOf[java.lang.Double]) {
DoubleType
} else if (t =:= typeOf[java.lang.Integer]) {
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredRasterExpression.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredRasterExpression.scala
new file mode 100644
index 000000000..9c6875a65
--- /dev/null
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/InferredRasterExpression.scala
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.expressions
+
+import
org.apache.sedona.sql.utils.GeoToolsCoverageAvailability.isGeoToolsAvailable
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.catalyst.expressions.Expression
+import org.apache.spark.sql.types.{ArrayType, UserDefinedType}
+
+import scala.reflect.runtime.universe.{Type, typeOf}
+
+object InferredRasterExpression {
+ def isRasterType(t: Type): Boolean =
+ isGeoToolsAvailable && InferrableRasterTypes.isRasterType(t)
+
+ def isRasterArrayType(t: Type): Boolean =
+ isGeoToolsAvailable && InferrableRasterTypes.isRasterArrayType(t)
+
+ def rasterUDT: UserDefinedType[_] = if (isGeoToolsAvailable) {
+ InferrableRasterTypes.rasterUDT
+ } else {
+ null
+ }
+
+ def rasterUDTArray: ArrayType = if (isGeoToolsAvailable) {
+ InferrableRasterTypes.rasterUDTArray
+ } else {
+ null
+ }
+
+ val rasterExtractor: Expression => InternalRow => Any = if
(isGeoToolsAvailable) {
+ InferrableRasterTypes.rasterExtractor
+ } else {
+ _ => _ => null
+ }
+
+ val rasterSerializer: Any => Any = if (isGeoToolsAvailable) {
+ InferrableRasterTypes.rasterSerializer
+ } else {
+ (_: Any) => null
+ }
+
+ val rasterArraySerializer: Any => Any = if (isGeoToolsAvailable) {
+ InferrableRasterTypes.rasterArraySerializer
+ } else {
+ (_: Any) => null
+ }
+}
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/implicits.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/implicits.scala
index 85719ce5a..a8baca903 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/implicits.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/implicits.scala
@@ -22,13 +22,10 @@ package org.apache.spark.sql.sedona_sql.expressions
import org.apache.sedona.sql.utils.GeometrySerializer
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.Expression
-import org.apache.spark.sql.catalyst.util.{ArrayData, GenericArrayData}
-import org.apache.spark.sql.types.{ByteType, DataTypes}
+import org.apache.spark.sql.catalyst.util.ArrayData
import org.apache.spark.unsafe.types.UTF8String
import org.locationtech.jts.geom.{Geometry, GeometryFactory, Point}
-import java.util
-
object implicits {
implicit class InputExpressionEnhancer(inputExpression: Expression) {
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/GeometryFunctions.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/GeometryFunctions.scala
index fa8390a31..e13e81dfc 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/GeometryFunctions.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/GeometryFunctions.scala
@@ -22,6 +22,7 @@ import org.apache.sedona.common.raster.GeometryFunctions
import org.apache.spark.sql.catalyst.expressions.Expression
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
case class RS_ConvexHull(inputExpressions: Seq[Expression]) extends
InferredExpression(GeometryFunctions.convexHull _) {
protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) =
{
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/MapAlgebra.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/MapAlgebra.scala
index bd3084402..42fb3fd22 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/MapAlgebra.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/MapAlgebra.scala
@@ -23,6 +23,7 @@ import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.Expression
import org.apache.spark.sql.catalyst.util.{ArrayData, GenericArrayData}
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
/// Calculate Normalized Difference between two bands
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctionEditors.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctionEditors.scala
index 10ea368ec..fc8770696 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctionEditors.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctionEditors.scala
@@ -21,6 +21,7 @@ package org.apache.spark.sql.sedona_sql.expressions.raster
import org.apache.sedona.common.raster.PixelFunctionEditors
import org.apache.spark.sql.catalyst.expressions.Expression
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
case class RS_SetValues(inputExpressions: Seq[Expression]) extends
InferredExpression(
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctions.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctions.scala
index f5499f277..22315ed94 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctions.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/PixelFunctions.scala
@@ -26,6 +26,7 @@ import
org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback
import org.apache.spark.sql.catalyst.util.GenericArrayData
import org.apache.spark.sql.sedona_sql.UDT.{GeometryUDT, RasterUDT}
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
import
org.apache.spark.sql.sedona_sql.expressions.raster.implicits.RasterInputExpressionEnhancer
import org.apache.spark.sql.types.{AbstractDataType, ArrayType, DataType,
DoubleType, IntegerType, StructType}
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
index f0039c6af..b7ffbbebb 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
@@ -21,6 +21,7 @@ package org.apache.spark.sql.sedona_sql.expressions.raster
import org.apache.sedona.common.raster.RasterAccessors
import org.apache.spark.sql.catalyst.expressions.Expression
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
case class RS_NumBands(inputExpressions: Seq[Expression]) extends
InferredExpression(RasterAccessors.numBands _) {
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandAccessors.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandAccessors.scala
index 11b415240..b64a9b5bb 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandAccessors.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandAccessors.scala
@@ -25,6 +25,7 @@ import org.apache.spark.sql.catalyst.expressions.Expression
import org.apache.spark.sql.catalyst.util.ArrayData
import org.apache.spark.sql.sedona_sql.UDT.RasterUDT
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import
org.apache.spark.sql.sedona_sql.expressions.raster.implicits.RasterInputExpressionEnhancer
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
import org.geotools.coverage.grid.GridCoverage2D
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandEditors.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandEditors.scala
index de782a888..de7f57dfc 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandEditors.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterBandEditors.scala
@@ -21,6 +21,7 @@ package org.apache.spark.sql.sedona_sql.expressions.raster
import org.apache.sedona.common.raster.RasterBandEditors
import org.apache.spark.sql.catalyst.expressions.Expression
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
case class RS_SetBandNoDataValue(inputExpressions: Seq[Expression]) extends
InferredExpression(
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterConstructors.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterConstructors.scala
index ae6c9e103..1e4a6a8ea 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterConstructors.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterConstructors.scala
@@ -25,6 +25,7 @@ import
org.apache.spark.sql.catalyst.expressions.{CreateArray, Expression, Gener
import org.apache.spark.sql.catalyst.util.ArrayData
import org.apache.spark.sql.sedona_sql.UDT.RasterUDT
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
import
org.apache.spark.sql.sedona_sql.expressions.raster.implicits.{RasterEnhancer,
RasterInputExpressionEnhancer}
import org.apache.spark.sql.types.{ArrayType, BooleanType, Decimal,
IntegerType, NullType, StructType}
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterEditors.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterEditors.scala
index 3b13e0310..db77310ba 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterEditors.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterEditors.scala
@@ -21,6 +21,7 @@ package org.apache.spark.sql.sedona_sql.expressions.raster
import org.apache.sedona.common.raster.RasterEditors
import org.apache.spark.sql.catalyst.expressions.Expression
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
case class RS_SetSRID(inputExpressions: Seq[Expression]) extends
InferredExpression(RasterEditors.setSrid _) {
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterOutputs.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterOutputs.scala
index 4d9e375b5..07a06730c 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterOutputs.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterOutputs.scala
@@ -21,6 +21,7 @@ package org.apache.spark.sql.sedona_sql.expressions.raster
import org.apache.sedona.common.raster.RasterOutputs
import org.apache.spark.sql.catalyst.expressions.Expression
import
org.apache.spark.sql.sedona_sql.expressions.InferrableFunctionConverter._
+import org.apache.spark.sql.sedona_sql.expressions.InferrableRasterTypes._
import org.apache.spark.sql.sedona_sql.expressions.InferredExpression
case class RS_AsGeoTiff(inputExpressions: Seq[Expression])
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/TraitJoinQueryBase.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/TraitJoinQueryBase.scala
index e34b1b87c..70868128e 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/TraitJoinQueryBase.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/strategy/join/TraitJoinQueryBase.scala
@@ -34,7 +34,7 @@ trait TraitJoinQueryBase {
leftShapeExpr: Expression,
rightRdd: RDD[UnsafeRow],
rightShapeExpr: Expression): (SpatialRDD[Geometry],
SpatialRDD[Geometry]) = {
- if (leftShapeExpr.dataType.acceptsType(RasterUDT) ||
rightShapeExpr.dataType.acceptsType(RasterUDT)) {
+ if (leftShapeExpr.dataType.isInstanceOf[RasterUDT] ||
rightShapeExpr.dataType.isInstanceOf[RasterUDT]) {
(toWGS84EnvelopeRDD(leftRdd, leftShapeExpr),
toWGS84EnvelopeRDD(rightRdd, rightShapeExpr))
} else {
@@ -60,7 +60,7 @@ trait TraitJoinQueryBase {
// transformation for both sides. We use expanded WGS84 envelope as the
joined geometries and perform a
// coarse-grained spatial join.
val spatialRdd = new SpatialRDD[Geometry]
- val wgs84EnvelopeRdd = if
(shapeExpression.dataType.acceptsType(RasterUDT)) {
+ val wgs84EnvelopeRdd = if
(shapeExpression.dataType.isInstanceOf[RasterUDT]) {
rdd.map { row =>
val raster =
RasterSerializer.deserialize(shapeExpression.eval(row).asInstanceOf[Array[Byte]])
val shape = JoinedGeometryRaster.rasterToWGS84Envelope(raster)