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/sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 0c7a2792 [SEDONA-303] Port all Sedona Spark functions to Sedona Flink 
-- Step 5 (#890)
0c7a2792 is described below

commit 0c7a2792769a4c959c6373318c85cf122cef41e3
Author: Junhao Liu <[email protected]>
AuthorDate: Fri Jul 7 12:20:13 2023 +0800

    [SEDONA-303] Port all Sedona Spark functions to Sedona Flink -- Step 5 
(#890)
---
 docs/api/flink/Function.md                         | 104 +++++++++++++++++++++
 .../main/java/org/apache/sedona/flink/Catalog.java |   4 +
 .../apache/sedona/flink/expressions/Functions.java |  36 +++++++
 .../java/org/apache/sedona/flink/FunctionTest.java |  33 +++++++
 4 files changed, 177 insertions(+)

diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md
index 2b234826..884bed47 100644
--- a/docs/api/flink/Function.md
+++ b/docs/api/flink/Function.md
@@ -1588,6 +1588,110 @@ SELECT ST_SRID(polygondf.countyshape)
 FROM polygondf
 ```
 
+## ST_SimplifyPreserveTopology
+
+Introduction: Simplifies a geometry and ensures that the result is a valid 
geometry having the same dimension and number of components as the input,
+and with the components having the same topological relationship.
+
+Since: `v1.5.0`
+
+Format: `ST_SimplifyPreserveTopology (A:geometry, distanceTolerance: Double)`
+
+Example:
+```sql
+SELECT ST_SimplifyPreserveTopology(polygondf.countyshape, 10.0)
+FROM polygondf
+```
+
+## ST_StartPoint
+
+Introduction: Returns first point of given linestring.
+
+Format: `ST_StartPoint(geom: geometry)`
+
+Since: `v1.5.0`
+
+Example:
+```sql
+SELECT ST_StartPoint(ST_GeomFromText('LINESTRING(100 150,50 60, 70 80, 160 
170)'))
+```
+
+Output: `POINT(100 150)`
+
+## ST_SubDivide
+
+Introduction: Returns list of geometries divided based of given maximum number 
of vertices.
+
+Format: `ST_SubDivide(geom: geometry, maxVertices: int)`
+
+Since: `v1.5.0`
+
+Example:
+```sql
+SELECT ST_SubDivide(ST_GeomFromText("POLYGON((35 10, 45 45, 15 40, 10 20, 35 
10), (20 30, 35 35, 30 20, 20 30))"), 5)
+
+```
+
+Output:
+```
+[
+    POLYGON((37.857142857142854 20, 35 10, 10 20, 37.857142857142854 20)),
+    POLYGON((15 20, 10 20, 15 40, 15 20)),
+    POLYGON((20 20, 15 20, 15 30, 20 30, 20 20)),
+    POLYGON((26.428571428571427 20, 20 20, 20 30, 26.4285714 23.5714285, 
26.4285714 20)),
+    POLYGON((15 30, 15 40, 20 40, 20 30, 15 30)),
+    POLYGON((20 40, 26.4285714 40, 26.4285714 32.1428571, 20 30, 20 40)),
+    POLYGON((37.8571428 20, 30 20, 34.0476190 32.1428571, 37.8571428 
32.1428571, 37.8571428 20)),
+    POLYGON((34.0476190 34.6825396, 26.4285714 32.1428571, 26.4285714 40, 
34.0476190 40, 34.0476190 34.6825396)),
+    POLYGON((34.0476190 32.1428571, 35 35, 37.8571428 35, 37.8571428 
32.1428571, 34.0476190 32.1428571)),
+    POLYGON((35 35, 34.0476190 34.6825396, 34.0476190 35, 35 35)),
+    POLYGON((34.0476190 35, 34.0476190 40, 37.8571428 40, 37.8571428 35, 
34.0476190 35)),
+    POLYGON((30 20, 26.4285714 20, 26.4285714 23.5714285, 30 20)),
+    POLYGON((15 40, 37.8571428 43.8095238, 37.8571428 40, 15 40)),
+    POLYGON((45 45, 37.8571428 20, 37.8571428 43.8095238, 45 45))
+]
+```
+
+Example:
+
+```sql
+SELECT ST_SubDivide(ST_GeomFromText("LINESTRING(0 0, 85 85, 100 100, 120 120, 
21 21, 10 10, 5 5)"), 5)
+```
+
+Output:
+```
+[
+    LINESTRING(0 0, 5 5)
+    LINESTRING(5 5, 10 10)
+    LINESTRING(10 10, 21 21)
+    LINESTRING(21 21, 60 60)
+    LINESTRING(60 60, 85 85)
+    LINESTRING(85 85, 100 100)
+    LINESTRING(100 100, 120 120)
+]
+```
+
+## ST_SymDifference
+
+Introduction: Return the symmetrical difference between geometry A and B 
(return parts of geometries which are in either of the sets, but not in their 
intersection)
+
+
+Format: `ST_SymDifference (A:geometry, B:geometry)`
+
+Since: `v1.5.0`
+
+Example:
+
+```sql
+SELECT ST_SymDifference(ST_GeomFromWKT('POLYGON ((-3 -3, 3 -3, 3 3, -3 3, -3 
-3))'), ST_GeomFromWKT('POLYGON ((-2 -3, 4 -3, 4 3, -2 3, -2 -3))'))
+```
+
+Result:
+
+```
+MULTIPOLYGON (((-2 -3, -3 -3, -3 3, -2 3, -2 -3)), ((3 -3, 3 3, 4 3, 4 -3, 3 
-3)))
+```
+
 ## ST_Transform
 
 Introduction:
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 5999071f..5a383b42 100644
--- a/flink/src/main/java/org/apache/sedona/flink/Catalog.java
+++ b/flink/src/main/java/org/apache/sedona/flink/Catalog.java
@@ -112,7 +112,11 @@ public class Catalog {
                 new Functions.ST_MakePolygon(),
                 new Functions.ST_MakeValid(),
                 new Functions.ST_Multi(),
+                new Functions.ST_StartPoint(),
+                new Functions.ST_SimplifyPreserveTopology(),
                 new Functions.ST_Split(),
+                new Functions.ST_Subdivide(),
+                new Functions.ST_SymDifference(),
                 new Functions.ST_S2CellIDs(),
                 new Functions.ST_GeometricMedian(),
                 new Functions.ST_NumPoints(),
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 8291b3de..36a8d29e 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
@@ -699,6 +699,14 @@ public class Functions {
         }
     }
 
+    public static class ST_StartPoint 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;
+            return org.apache.sedona.common.Functions.startPoint(geom);
+        }
+    }
+
     public static class ST_Split 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 o1,
@@ -718,6 +726,34 @@ public class Functions {
         }
     }
 
+    public static class ST_SimplifyPreserveTopology 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,
+                               @DataTypeHint("Double") Double 
distanceTolerance) {
+            Geometry geom = (Geometry) o;
+            return 
org.apache.sedona.common.Functions.simplifyPreserveTopology(geom, 
distanceTolerance);
+        }
+    }
+
+    public static class ST_Subdivide 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,
+                               @DataTypeHint("INT") Integer maxVertices) {
+            Geometry geom = (Geometry) o;
+            return org.apache.sedona.common.Functions.subDivide(geom, 
maxVertices);
+        }
+    }
+
+    public static class ST_SymDifference 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 o1,
+                             @DataTypeHint(value = "RAW", bridgedTo = 
org.locationtech.jts.geom.Geometry.class) Object o2) {
+            Geometry geom1 = (Geometry) o1;
+            Geometry geom2 = (Geometry) o2;
+            return org.apache.sedona.common.Functions.symDifference(geom1, 
geom2);
+        }
+    }
+
     public static class ST_GeometricMedian 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) throws Exception {
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 6156709f..5016fa8a 100644
--- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
+++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
@@ -783,12 +783,45 @@ public class FunctionTest extends TestBase{
         assertEquals("MULTIPOINT ((0 0))", result.toString());
     }
 
+    @Test 
+    public void testStartPoint() {
+        Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('LINESTRING (0 
0, 1 0)') AS geom");
+        table = 
table.select(call(Functions.ST_StartPoint.class.getSimpleName(), $("geom")));
+        Geometry result = (Geometry) first(table).getField(0);
+        assertEquals("POINT (0 0)", result.toString());
+    }
+
+    @Test 
+    public void testSimplifyPreserveTopology() {
+        Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('POLYGON ((0 0, 
1 0, 1 0.9, 1 1, 0 0))') AS geom");
+        table = 
table.select(call(Functions.ST_SimplifyPreserveTopology.class.getSimpleName(), 
$("geom"), 0.2));
+        Geometry result = (Geometry) first(table).getField(0);
+        assertEquals("POLYGON ((0 0, 1 0, 1 1, 0 0))", result.toString());
+    }
+
     @Test
     public void testSplit() {
         Table pointTable = tableEnv.sqlQuery("SELECT 
ST_Split(ST_GeomFromWKT('LINESTRING (0 0, 1.5 1.5, 2 2)'), 
ST_GeomFromWKT('MULTIPOINT (0.5 0.5, 1 1)'))");
         assertEquals("MULTILINESTRING ((0 0, 0.5 0.5), (0.5 0.5, 1 1), (1 1, 
1.5 1.5, 2 2))", ((Geometry)first(pointTable).getField(0)).norm().toText());
     }
 
+    @Test 
+    public void testSubdivide() {
+        Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('LINESTRING (0 
0, 1 0, 2 0, 3 0, 4 0, 5 0)') AS geom");
+        table = 
table.select(call(Functions.ST_Subdivide.class.getSimpleName(), $("geom"), 5));
+        Geometry[] result = (Geometry[]) first(table).getField(0);
+        assertEquals("LINESTRING (0 0, 2.5 0)", result[0].toString());
+        assertEquals("LINESTRING (2.5 0, 5 0)", result[1].toString());
+    }
+
+    @Test 
+    public void testSymDifference() {
+        Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('POLYGON ((-1 
-1, 1 -1, 1 1, -1 1, -1 -1))') AS a, ST_GeomFromWKT('POLYGON ((0 -2, 2 -2, 2 0, 
0 0, 0 -2))') AS b");
+        table = 
table.select(call(Functions.ST_SymDifference.class.getSimpleName(), $("a"), 
$("b")));
+        Geometry result = (Geometry) first(table).getField(0);
+        assertEquals("MULTIPOLYGON (((0 -1, -1 -1, -1 1, 1 1, 1 0, 0 0, 0 
-1)), ((0 -1, 1 -1, 1 0, 2 0, 2 -2, 0 -2, 0 -1)))", result.toString());
+    }
+
     @Test
     public void testS2CellIDs() {
         String initExplodeQuery = "SELECT id, geom, cell_tbl.cell from (VALUES 
%s) as raw_tbl(id, geom, cells) CROSS JOIN UNNEST(raw_tbl.cells) AS cell_tbl 
(cell)";

Reply via email to