From bd7db6649338e679f20df56578ecb94ac6ae1b27 Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Tue, 12 Apr 2022 17:20:28 -0700 Subject: [PATCH 01/12] [SEDONA-105] Initial commit --- docs/api/flink/Function.md | 26 +++++++++++++++++++ .../java/org/apache/sedona/flink/Catalog.java | 3 ++- .../sedona/flink/expressions/Functions.java | 9 +++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index c559abf2c1..c4c25e8221 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -99,4 +99,30 @@ Result: +-----------------------------+ |u3r0p | +-----------------------------+ +``` + +## ST_PointOnSurface + +Introduction: Returns a POINT guaranteed to lie on the surface. + +Format: `ST_PointOnSurface(geom: geometry)` + +Since: `v1.2.0` + +Example: + + +``` +SELECT ST_PointOnSurface('POINT(0 5)'::geometry); +------------ + POINT(0 5) + +SELECT ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry); +------------ + POINT(0 5) + +SELECT ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry); +---------------- + POINT(2.5 2.5) + ``` \ No newline at end of file diff --git a/flink/src/main/java/org/apache/sedona/flink/Catalog.java b/flink/src/main/java/org/apache/sedona/flink/Catalog.java index 440f4ad44f..c11917643c 100644 --- a/flink/src/main/java/org/apache/sedona/flink/Catalog.java +++ b/flink/src/main/java/org/apache/sedona/flink/Catalog.java @@ -30,7 +30,8 @@ public static UserDefinedFunction[] getFuncs() { new Functions.ST_Distance(), new Functions.ST_Transform(), new Functions.ST_FlipCoordinates(), - new Functions.ST_GeoHash() + new Functions.ST_GeoHash(), + new Functions.ST_PointOnSurface() }; } diff --git a/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java b/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java index 6f43143557..6a27fac0a4 100644 --- a/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java +++ b/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java @@ -84,4 +84,13 @@ public Optional eval(@DataTypeHint(value = "RAW", bridgedTo = org.locati return Optional.empty(); } } + + public static class ST_PointOnSurface extends ScalarFunction { + @DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class) + public Geometry eval(@DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class) Object o) { + Geometry geom = (Geometry) o; + GeomUtils.pointOnSurface(geom); + return geom; + } + } } From 0204eec4320f665ba20dce0bdd219215f68e9a8f Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Tue, 12 Apr 2022 17:29:53 -0700 Subject: [PATCH 02/12] [SEDONA-105] Initial commit --- docs/api/flink/Function.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index c4c25e8221..fa859f4186 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -113,15 +113,15 @@ Example: ``` -SELECT ST_PointOnSurface('POINT(0 5)'::geometry); +SELECT ST_PointOnSurface('POINT(0 5)'::geometry) ------------ POINT(0 5) -SELECT ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry); +SELECT ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry) ------------ POINT(0 5) -SELECT ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry); +SELECT ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry) ---------------- POINT(2.5 2.5) From 4b6b986c3a7c6615d7659b7ca62e3d0e7f47e6bc Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Tue, 12 Apr 2022 20:14:18 -0700 Subject: [PATCH 03/12] [SEDONA-105] Adding ST_PointOnSurface --- .../java/org/apache/sedona/core/utils/GeomUtils.java | 9 +++++++++ .../test/java/org/apache/sedona/flink/FunctionTest.java | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java b/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java index dfdc8cb316..56c6de47d3 100644 --- a/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java +++ b/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java @@ -71,4 +71,13 @@ public boolean isDone() { } }); } + /* + * Returns a POINT that is guaranteed to lie on the surface. + */ + public static Geometry pointOnSurface(Geometry geometry) { + if(geometry==null) { + return null; + } + return geometry.getInteriorPoint(); + } } diff --git a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java index 2d244a7aa2..ea82fc6b0e 100644 --- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java +++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java @@ -64,4 +64,13 @@ public void testGeomToGeoHash() { ); assertEquals(first(pointTable).getField(0), Optional.of("s0000")); } + + @Test + public void pointOnSurface() { + Table pointTable = createPointTable(testDataSize); + pointTable = pointTable.select( + call("ST_PointOnSurface", $(pointColNames[0])) + ); + assertEquals("POINT (32 -118)",first(pointTable).getField(0)); + } } From c2e0eb53e0d43dad526af9255acd98caabca239d Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Tue, 12 Apr 2022 22:24:48 -0700 Subject: [PATCH 04/12] [SEDONA-105] Adding ST_PointOnSurface to SQL API --- docs/api/flink/Function.md | 2 +- docs/api/sql/Function.md | 26 +++++++++++++++++++ python/tests/sql/test_function.py | 18 ++++++++++++- .../org/apache/sedona/sql/UDF/Catalog.scala | 1 + .../sedona_sql/expressions/Functions.scala | 23 ++++++++++++++++ 5 files changed, 68 insertions(+), 2 deletions(-) diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index fa859f4186..170bae7a2d 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -107,7 +107,7 @@ Introduction: Returns a POINT guaranteed to lie on the surface. Format: `ST_PointOnSurface(geom: geometry)` -Since: `v1.2.0` +Since: `v1.2.1` Example: diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md index 71b2da8a57..8c1c924c6d 100644 --- a/docs/api/sql/Function.md +++ b/docs/api/sql/Function.md @@ -1029,3 +1029,29 @@ Result: ``` POLYGON ((3 -1, 3 -3, -3 -3, -3 3, 3 3, 3 1, 5 0, 3 -1)) ``` + +## ST_PointOnSurface + +Introduction: Returns a POINT guaranteed to lie on the surface. + +Format: `ST_PointOnSurface(geom: geometry)` + +Since: `v1.2.1` + +Example: + + +``` +SELECT ST_PointOnSurface('POINT(0 5)'::geometry) +------------ + POINT(0 5) + +SELECT ST_PointOnSurface('LINESTRING(0 5, 0 10)'::geometry) +------------ + POINT(0 5) + +SELECT ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry) +---------------- + POINT(2.5 2.5) + +``` \ No newline at end of file diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index b7ea1606cc..97b23ceb5c 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -902,4 +902,20 @@ def __wkt_list_to_data_frame(self, wkt_list: List) -> DataFrame: return self.spark.createDataFrame([[wkt.loads(given_wkt)] for given_wkt in wkt_list], self.geo_schema) def __wkt_pair_list_with_index_to_data_frame(self, wkt_list: List) -> DataFrame: - return self.spark.createDataFrame([[index, wkt.loads(given_wkt)] for index, given_wkt in wkt_list], self.geo_schema_with_index) \ No newline at end of file + return self.spark.createDataFrame([[index, wkt.loads(given_wkt)] for index, given_wkt in wkt_list], self.geo_schema_with_index) + + def test_st_pointonsurface(self): + tests1 = { + "'POINT(0 5)'":"POINT(0 5)", + "'LINESTRING(0 5, 0 10)'":"POINT(0 5)", + "'POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'":"POINT(2.5 2.5)" + } + tests2 = { "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'":"POINT(0 0 1)" } + + for input_geom, expected_geom in tests1.items(): + pointOnSurface = self.spark.sql("select ST_AsText(ST_PointOnSurface(ST_GeomFromText({})))".format(input_geom)) + assert pointOnSurface.take(1)[0][0] == expected_geom + + for input_geom, expected_geom in tests2.items(): + pointOnSurface = self.spark.sql("select ST_AsEWKT(ST_PointOnSurface(ST_GeomFromText({})))".format(input_geom)) + assert pointOnSurface.take(1)[0][0] == expected_geom \ No newline at end of file diff --git a/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala b/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala index 473eb5c7f0..a8467eca6e 100644 --- a/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala +++ b/sql/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala @@ -101,6 +101,7 @@ object Catalog { ST_GeomFromGeoHash, ST_Collect, ST_Multi, + ST_PointOnSurface, // Expression for rasters RS_NormalizedDifference, RS_Mean, 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 fbe446d442..754d609f75 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 @@ -1527,4 +1527,27 @@ case class ST_Multi(inputExpressions: Seq[Expression]) extends UnaryGeometryExpr override protected def nullSafeEval(geometry: Geometry): Any ={ Collect.createMultiGeometry(Seq(geometry)).toGenericArrayData } + + /** + * Returns a version of the given geometry with X and Y axis flipped. + * + * @param inputExpressions Geometry + */ + case class ST_PointOnSurface(inputExpressions: Seq[Expression]) + extends UnaryGeometryExpression with CodegenFallback { + assert(inputExpressions.length == 1) + + override protected def nullSafeEval(geometry: Geometry): Any = { + GeomUtils.pointOnSurface(geometry) + geometry.toGenericArrayData + } + + override def dataType: DataType = GeometryUDT + + override def children: Seq[Expression] = inputExpressions + + protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = { + copy(inputExpressions = newChildren) + } + } } \ No newline at end of file From 809feedfc6b365b6ab738afcb28da47e35d62f0b Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Tue, 12 Apr 2022 22:28:02 -0700 Subject: [PATCH 05/12] [SEDONA-105] fixing the function description --- .../org/apache/spark/sql/sedona_sql/expressions/Functions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 754d609f75..d430c20d33 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 @@ -1529,7 +1529,7 @@ case class ST_Multi(inputExpressions: Seq[Expression]) extends UnaryGeometryExpr } /** - * Returns a version of the given geometry with X and Y axis flipped. + * Returns a POINT guaranteed to lie on the surface. * * @param inputExpressions Geometry */ From 246e19095486ea5b086f39859d3cdbd5a7334dd7 Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Tue, 12 Apr 2022 22:39:11 -0700 Subject: [PATCH 06/12] [SEDONA-105] Adding Scala unit tests --- .../apache/sedona/sql/functionTestScala.scala | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) 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 6f55c05af1..0bef45eea1 100644 --- a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala +++ b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala @@ -1266,6 +1266,34 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample } + it ("Should pass ST_Reverse") { + val geomTestCases1 = Map( + "'POINT(0 5)'" + -> "POINT(0 5)", + "'LINESTRING(0 5, 0 10)'" + -> "POINT(0 5)", + "'POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'" + -> "POINT(2.5 2.5)" + ) + + val geomTestCases2 = Map( + "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'" + -> "POINT(0 0 1)" + ) + + for((inputGeom, expectedGeom) <- geomTestCases1) { + var df = sparkSession.sql(s"select ST_AsText(ST_Reverse(ST_GeomFromText($inputGeom)))") + var result = df.collect() + assert(result.head.get(0).asInstanceOf[String]==expectedGeom) + } + + for((inputGeom, expectedGeom) <- geomTestCases2) { + var df = sparkSession.sql(s"select ST_AsEWKT(ST_Reverse(ST_GeomFromText($inputGeom)))") + var result = df.collect() + assert(result.head.get(0).asInstanceOf[String]==expectedGeom) + } + } + it("handles nulls") { var functionDf: DataFrame = null functionDf = sparkSession.sql("select ST_Distance(null, null)") @@ -1372,5 +1400,7 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample assert(functionDf.first().get(0) == null) functionDf = sparkSession.sql("select ST_Union(null, null)") assert(functionDf.first().get(0) == null) + functionDf = sparkSession.sql("select ST_PointOnSurface(null)") + assert(functionDf.first().get(0) == null) } } From 928d5c45bafbb7763e9d06c4bcabbe724848be4c Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Wed, 13 Apr 2022 09:41:10 -0700 Subject: [PATCH 07/12] Resolving merge conflicts from PR #605 2 --- .../test/scala/org/apache/sedona/sql/functionTestScala.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 bb09b5d867..d81d51496d 100644 --- a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala +++ b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala @@ -1283,13 +1283,13 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample ) for((inputGeom, expectedGeom) <- geomTestCases1) { - var df = sparkSession.sql(s"select ST_AsText(ST_Reverse(ST_GeomFromText($inputGeom)))") + var df = sparkSession.sql(s"select ST_AsText(ST_PointOnSurface(ST_GeomFromText($inputGeom)))") var result = df.collect() assert(result.head.get(0).asInstanceOf[String]==expectedGeom) } for((inputGeom, expectedGeom) <- geomTestCases2) { - var df = sparkSession.sql(s"select ST_AsEWKT(ST_Reverse(ST_GeomFromText($inputGeom)))") + var df = sparkSession.sql(s"select ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT($inputGeom)))") var result = df.collect() assert(result.head.get(0).asInstanceOf[String]==expectedGeom) } From 8c56b9018c5b978c7f6b005e824d0010c0cfe5a9 Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Wed, 13 Apr 2022 09:44:05 -0700 Subject: [PATCH 08/12] Resolving merge conflicts from PR #605 3 --- flink/src/test/java/org/apache/sedona/flink/FunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java index bc80edcf7f..32852a46c4 100644 --- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java +++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java @@ -66,7 +66,7 @@ public void testGeomToGeoHash() { } @Test - public void pointOnSurface() { + public void testPointOnSurface() { Table pointTable = createPointTable(testDataSize); pointTable = pointTable.select( call("ST_PointOnSurface", $(pointColNames[0])) From 0c2e7e000f9ae0bc9ad021b5ebe4463dccb0d530 Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Wed, 13 Apr 2022 09:47:40 -0700 Subject: [PATCH 09/12] Resolving merge conflicts from PR #605 4 --- python/tests/sql/test_function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index 12723f0dac..7e5dd296cb 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -950,5 +950,5 @@ def test_st_pointonsurface(self): assert pointOnSurface.take(1)[0][0] == expected_geom for input_geom, expected_geom in tests2.items(): - pointOnSurface = self.spark.sql("select ST_AsEWKT(ST_PointOnSurface(ST_GeomFromText({})))".format(input_geom)) + pointOnSurface = self.spark.sql("select ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT({})))".format(input_geom)) assert pointOnSurface.take(1)[0][0] == expected_geom \ No newline at end of file From aa8faae90b8373890c4cf90455f17a9ebfcbb8a5 Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Wed, 13 Apr 2022 10:11:01 -0700 Subject: [PATCH 10/12] Fixed unclosed braces --- .../org/apache/spark/sql/sedona_sql/expressions/Functions.scala | 1 + 1 file changed, 1 insertion(+) 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 77335090ff..76b657b690 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 @@ -1527,6 +1527,7 @@ case class ST_Multi(inputExpressions: Seq[Expression]) extends UnaryGeometryExpr override protected def nullSafeEval(geometry: Geometry): Any ={ Collect.createMultiGeometry(Seq(geometry)).toGenericArrayData } +} /** * Returns a POINT guaranteed to lie on the surface. From 8da98ad76581e318cc3e1d48256897380f8fd0c2 Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Wed, 13 Apr 2022 11:56:33 -0700 Subject: [PATCH 11/12] Resolving all test cases --- .../apache/sedona/core/utils/GeomUtils.java | 2 +- docs/api/flink/Function.md | 2 +- docs/api/sql/Function.md | 6 +++--- .../sedona/flink/expressions/Functions.java | 2 +- .../org/apache/sedona/flink/FunctionTest.java | 9 ++++---- python/tests/sql/test_function.py | 15 ++++++++----- .../sedona_sql/expressions/Functions.scala | 3 +-- .../apache/sedona/sql/functionTestScala.scala | 21 ++++++++++++------- 8 files changed, 34 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java b/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java index 56c6de47d3..27687050c3 100644 --- a/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java +++ b/core/src/main/java/org/apache/sedona/core/utils/GeomUtils.java @@ -74,7 +74,7 @@ public boolean isDone() { /* * Returns a POINT that is guaranteed to lie on the surface. */ - public static Geometry pointOnSurface(Geometry geometry) { + public static Geometry getInteriorPoint(Geometry geometry) { if(geometry==null) { return null; } diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index 469f325096..4a5b179dde 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -131,7 +131,7 @@ FROM df 4. Input: `LINESTRING(0 5 1, 0 0 1, 0 10 2)` - Output: `POINT (0 0 1)` + Output: `POINT Z(0 0 1)` ## ST_Reverse diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md index f42062231a..7c06e73297 100644 --- a/docs/api/sql/Function.md +++ b/docs/api/sql/Function.md @@ -1056,10 +1056,10 @@ SELECT ST_AsText(ST_PointOnSurface(ST_GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, ---------------- POINT(2.5 2.5) -SELECT ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT('LINESTRING(0 5 1, 0 0 1, 0 10 2)'))); - st_asewkt +SELECT ST_AsText(ST_PointOnSurface(ST_GeomFromText('LINESTRING(0 5 1, 0 0 1, 0 10 2)'))); + st_astext ---------------- - POINT(0 0 1) + POINT Z(0 0 1) ``` diff --git a/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java b/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java index f7528a9621..bc615a5548 100644 --- a/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java +++ b/flink/src/main/java/org/apache/sedona/flink/expressions/Functions.java @@ -89,7 +89,7 @@ public static class ST_PointOnSurface extends ScalarFunction { @DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class) public Geometry eval(@DataTypeHint(value = "RAW", bridgedTo = org.locationtech.jts.geom.Geometry.class) Object o) { Geometry geom = (Geometry) o; - GeomUtils.pointOnSurface(geom); + GeomUtils.getInteriorPoint(geom); return geom; } } diff --git a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java index 32852a46c4..87df7c1762 100644 --- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java +++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java @@ -67,11 +67,10 @@ public void testGeomToGeoHash() { @Test public void testPointOnSurface() { - Table pointTable = createPointTable(testDataSize); - pointTable = pointTable.select( - call("ST_PointOnSurface", $(pointColNames[0])) - ); - assertEquals("POINT (32 -118)",first(pointTable).getField(0)); + Table pointTable = createPointTable_real(testDataSize); + Table surfaceTable = pointTable.select(call(Functions.ST_PointOnSurface.class.getSimpleName(), $(pointColNames[0]))); + Geometry result = (Geometry) first(surfaceTable).getField(0); + assertEquals("POINT (32 -118)", result.toString()); } public void testReverse() { diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index 7e5dd296cb..b585cd3a9a 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -940,15 +940,20 @@ def __wkt_pair_list_with_index_to_data_frame(self, wkt_list: List) -> DataFrame: def test_st_pointonsurface(self): tests1 = { "'POINT(0 5)'":"POINT(0 5)", - "'LINESTRING(0 5, 0 10)'":"POINT(0 5)", - "'POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'":"POINT(2.5 2.5)" + "'LINESTRING(0 5, 0 10)'":"POINT (0 5)", + "'POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'":"POINT (2.5 2.5)", + "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'":"POINT Z(0 0 1)" } - tests2 = { "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'":"POINT(0 0 1)" } - + for input_geom, expected_geom in tests1.items(): pointOnSurface = self.spark.sql("select ST_AsText(ST_PointOnSurface(ST_GeomFromText({})))".format(input_geom)) assert pointOnSurface.take(1)[0][0] == expected_geom + ''' + ST_AsEWKT Has not been implemented yet + tests2 = { "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'":"POINT(0 0 1)" } + for input_geom, expected_geom in tests2.items(): pointOnSurface = self.spark.sql("select ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT({})))".format(input_geom)) - assert pointOnSurface.take(1)[0][0] == expected_geom \ No newline at end of file + assert pointOnSurface.take(1)[0][0] == expected_geom + ''' \ No newline at end of file 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 76b657b690..2261604b01 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 @@ -1539,8 +1539,7 @@ case class ST_PointOnSurface(inputExpressions: Seq[Expression]) assert(inputExpressions.length == 1) override protected def nullSafeEval(geometry: Geometry): Any = { - GeomUtils.pointOnSurface(geometry) - geometry.toGenericArrayData + new GenericArrayData(GeometrySerializer.serialize(GeomUtils.getInteriorPoint(geometry))) } override def dataType: DataType = GeometryUDT 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 d81d51496d..55b0640121 100644 --- a/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala +++ b/sql/src/test/scala/org/apache/sedona/sql/functionTestScala.scala @@ -1270,29 +1270,34 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample val geomTestCases1 = Map( "'POINT(0 5)'" - -> "POINT(0 5)", + -> "POINT (0 5)", "'LINESTRING(0 5, 0 10)'" - -> "POINT(0 5)", + -> "POINT (0 5)", "'POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'" - -> "POINT(2.5 2.5)" - ) - - val geomTestCases2 = Map( + -> "POINT (2.5 2.5)", "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'" - -> "POINT(0 0 1)" + -> "POINT Z(0 0 1)" ) - for((inputGeom, expectedGeom) <- geomTestCases1) { + for((inputGeom, expectedGeom) <- geomTestCases1) { var df = sparkSession.sql(s"select ST_AsText(ST_PointOnSurface(ST_GeomFromText($inputGeom)))") var result = df.collect() assert(result.head.get(0).asInstanceOf[String]==expectedGeom) } + /* ST_AsEWKT Has not been implemented yet + + val geomTestCases2 = Map( + "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'" + -> "POINT (0 0 1)" + ) + for((inputGeom, expectedGeom) <- geomTestCases2) { var df = sparkSession.sql(s"select ST_AsEWKT(ST_PointOnSurface(ST_GeomFromEWKT($inputGeom)))") var result = df.collect() assert(result.head.get(0).asInstanceOf[String]==expectedGeom) } + */ } it ("Should pass ST_Reverse") { From e643548747eb899be673703cfaaf75972340c91b Mon Sep 17 00:00:00 2001 From: hemenduroy Date: Wed, 13 Apr 2022 14:39:54 -0700 Subject: [PATCH 12/12] Fixed Python test case --- python/tests/sql/test_function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index b585cd3a9a..e6250a2c73 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -939,7 +939,7 @@ def __wkt_pair_list_with_index_to_data_frame(self, wkt_list: List) -> DataFrame: def test_st_pointonsurface(self): tests1 = { - "'POINT(0 5)'":"POINT(0 5)", + "'POINT(0 5)'":"POINT (0 5)", "'LINESTRING(0 5, 0 10)'":"POINT (0 5)", "'POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'":"POINT (2.5 2.5)", "'LINESTRING(0 5 1, 0 0 1, 0 10 2)'":"POINT Z(0 0 1)"