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)