You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2022/03/03 03:30:37 UTC

[incubator-sedona] branch master updated: [SEDONA-86] Support empty geometries in ST_AsBinary and ST_AsEWKB (#587)

This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 84a69fc  [SEDONA-86] Support empty geometries in ST_AsBinary and ST_AsEWKB (#587)
84a69fc is described below

commit 84a69fc21d849b2692f0c05786633e56c51fb7f9
Author: Martin Andersson <u....@gmail.com>
AuthorDate: Thu Mar 3 04:30:31 2022 +0100

    [SEDONA-86] Support empty geometries in ST_AsBinary and ST_AsEWKB (#587)
---
 .../apache/spark/sql/sedona_sql/expressions/Functions.scala  |  4 ++--
 .../test/scala/org/apache/sedona/sql/functionTestScala.scala | 12 ++++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala
index 4f29dbf..0270016 100644
--- a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala
+++ b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala
@@ -541,7 +541,7 @@ case class ST_AsBinary(inputExpressions: Seq[Expression])
   inputExpressions.validateLength(1)
 
   override protected def nullSafeEval(geometry: Geometry): Any = {
-    val dimensions = if (java.lang.Double.isNaN(geometry.getCoordinate.getZ)) 2 else 3
+    val dimensions = if (geometry.isEmpty() || java.lang.Double.isNaN(geometry.getCoordinate.getZ)) 2 else 3
     val endian = if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) ByteOrderValues.BIG_ENDIAN else ByteOrderValues.LITTLE_ENDIAN
     val writer = new WKBWriter(dimensions, endian)
     writer.write(geometry)
@@ -561,7 +561,7 @@ case class ST_AsEWKB(inputExpressions: Seq[Expression])
   inputExpressions.validateLength(1)
 
   override protected def nullSafeEval(geometry: Geometry): Any = {
-    val dimensions = if (java.lang.Double.isNaN(geometry.getCoordinate.getZ)) 2 else 3
+    val dimensions = if (geometry.isEmpty() || java.lang.Double.isNaN(geometry.getCoordinate.getZ)) 2 else 3
     val endian = if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) ByteOrderValues.BIG_ENDIAN else ByteOrderValues.LITTLE_ENDIAN
     val writer = new WKBWriter(dimensions, endian, geometry.getSRID != 0)
     writer.write(geometry)
diff --git a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
index 109628c..8d1d8b2 100644
--- a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
+++ b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala
@@ -316,6 +316,12 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample
       assert(Hex.encodeHexString(df.first().get(0).asInstanceOf[Array[Byte]]) == s)
     }
 
+    it("Passed ST_AsBinary empty geometry") {
+      val df = sparkSession.sql("SELECT ST_AsBinary(ST_GeomFromWKT('POINT EMPTY'))")
+      val s = "0101000000000000000000f87f000000000000f87f"
+      assert(Hex.encodeHexString(df.first().get(0).asInstanceOf[Array[Byte]]) == s)
+    }
+
     it("Passed ST_SRID") {
       val df = sparkSession.sql("SELECT ST_SRID(ST_GeomFromWKT('POLYGON((1 1, 8 1, 8 8, 1 8, 1 1))'))")
       assert(df.first().getInt(0) == 0)
@@ -336,6 +342,12 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample
       assert(Hex.encodeHexString(df.first().get(0).asInstanceOf[Array[Byte]]) == s)
     }
 
+    it("Passed ST_AsEWKB empty geometry") {
+      val df = sparkSession.sql("SELECT ST_AsEWKB(ST_SetSrid(ST_GeomFromWKT('POINT EMPTY'), 3021))")
+      val s = "0101000020cd0b0000000000000000f87f000000000000f87f"
+      assert(Hex.encodeHexString(df.first().get(0).asInstanceOf[Array[Byte]]) == s)
+    }
+
     it("Passed ST_NPoints") {
       var test = sparkSession.sql("SELECT ST_NPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'))")
       assert(test.take(1)(0).get(0).asInstanceOf[Int] == 4)