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 b93dfa38 [SEDONA-303] Port all Sedona Spark function to Sedona Flink 
-- ST_MinimumBoundingRadius (#895)
b93dfa38 is described below

commit b93dfa38474f8caf685a2d0a8327161a340449a2
Author: Junhao Liu <[email protected]>
AuthorDate: Wed Jul 12 01:48:42 2023 +0800

    [SEDONA-303] Port all Sedona Spark function to Sedona Flink -- 
ST_MinimumBoundingRadius (#895)
---
 .../src/main/java/org/apache/sedona/common/Functions.java | 10 ++++++++++
 .../test/java/org/apache/sedona/common/FunctionsTest.java | 15 +++++++++++++++
 docs/api/flink/Function.md                                | 12 ++++++++++++
 flink/src/main/java/org/apache/sedona/flink/Catalog.java  |  1 +
 .../org/apache/sedona/flink/expressions/Functions.java    |  9 +++++++++
 .../test/java/org/apache/sedona/flink/FunctionTest.java   | 10 ++++++++++
 6 files changed, 57 insertions(+)

diff --git a/common/src/main/java/org/apache/sedona/common/Functions.java 
b/common/src/main/java/org/apache/sedona/common/Functions.java
index ee9031cc..501741df 100644
--- a/common/src/main/java/org/apache/sedona/common/Functions.java
+++ b/common/src/main/java/org/apache/sedona/common/Functions.java
@@ -14,6 +14,8 @@
 package org.apache.sedona.common;
 
 import com.google.common.geometry.S2CellId;
+
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.sedona.common.geometryObjects.Circle;
 import org.apache.sedona.common.subDivide.GeometrySubDivider;
 import org.apache.sedona.common.utils.GeomUtils;
@@ -536,6 +538,14 @@ public class Functions {
         return circle;
     }
 
+    public static Pair<Geometry, Double> minimumBoundingRadius(Geometry 
geometry) {
+        MinimumBoundingCircle minimumBoundingCircle = new 
MinimumBoundingCircle(geometry);
+        Coordinate coods = minimumBoundingCircle.getCentre();
+        double radius = minimumBoundingCircle.getRadius();
+        Point centre = GEOMETRY_FACTORY.createPoint(coods);
+        return Pair.of(centre, radius);
+    }
+
     public static Geometry lineSubString(Geometry geom, double fromFraction, 
double toFraction) {
         double length = geom.getLength();
         LengthIndexedLine indexedLine = new LengthIndexedLine(geom);
diff --git a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java 
b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
index 2a238fcd..4e2b329d 100644
--- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
+++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java
@@ -763,6 +763,21 @@ public class FunctionsTest {
         assertEquals(wktWriter3D.write(expectedLineString3D), 
wktWriter3D.write(actualGeometryCollection.getGeometryN(0).getGeometryN(3)));
     }
 
+    @Test
+    public void minimumBoundingRadius() {
+        Point point = GEOMETRY_FACTORY.createPoint(new Coordinate(0, 0));
+        assertEquals("POINT (0 0)", 
Functions.minimumBoundingRadius(point).getLeft().toString());
+        assertEquals(0, Functions.minimumBoundingRadius(point).getRight(), 
1e-6);
+
+        LineString line = GEOMETRY_FACTORY.createLineString(coordArray(0, 0, 
0, 10));
+        assertEquals("POINT (0 5)", 
Functions.minimumBoundingRadius(line).getLeft().toString());
+        assertEquals(5, Functions.minimumBoundingRadius(line).getRight(), 
1e-6);
+
+        Polygon polygon = GEOMETRY_FACTORY.createPolygon(coordArray(0, 0, 0, 
10, 10, 10, 10, 0, 0, 0));
+        assertEquals("POINT (5 5)", 
Functions.minimumBoundingRadius(polygon).getLeft().toString());
+        assertEquals(7.071067, 
Functions.minimumBoundingRadius(polygon).getRight(), 1e-6);
+    }
+
     @Test
     public void nRingsPolygonOnlyExternal() throws Exception {
         Polygon polygon = GEOMETRY_FACTORY.createPolygon(coordArray(1, 0, 1, 
1, 2, 1, 2, 0, 1, 0));
diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md
index 0ad9c628..517d01b2 100644
--- a/docs/api/flink/Function.md
+++ b/docs/api/flink/Function.md
@@ -1256,6 +1256,18 @@ Example:
 ```sql
 SELECT ST_MinimumBoundingCircle(ST_GeomFromText('POLYGON((1 1,0 0, -1 1, 1 
1))'))
 
+## ST_MinimumBoundingRadius
+
+Introduction: Returns a struct containing the center point and radius of the 
smallest circle that contains a geometry.
+
+Format: `ST_MinimumBoundingRadius(geom: geometry)`
+
+Since: `v1.5.0`
+
+Example:
+```sql
+SELECT ST_MinimumBoundingRadius(ST_GeomFromText('POLYGON((1 1,0 0, -1 1, 1 
1))'))
+```
 
 ## ST_Multi
 
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 0aef2bab..d773438b 100644
--- a/flink/src/main/java/org/apache/sedona/flink/Catalog.java
+++ b/flink/src/main/java/org/apache/sedona/flink/Catalog.java
@@ -113,6 +113,7 @@ public class Catalog {
                 new Functions.ST_MakePolygon(),
                 new Functions.ST_MakeValid(),
                 new Functions.ST_MinimumBoundingCircle(),
+                new Functions.ST_MinimumBoundingRadius(),
                 new Functions.ST_Multi(),
                 new Functions.ST_StartPoint(),
                 new Functions.ST_SimplifyPreserveTopology(),
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 90fd657d..971a9451 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
@@ -13,6 +13,7 @@
  */
 package org.apache.sedona.flink.expressions;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.flink.table.annotation.DataTypeHint;
 import org.apache.flink.table.annotation.InputGroup;
 import org.apache.flink.table.functions.ScalarFunction;
@@ -715,6 +716,14 @@ public class Functions {
         }
     }
 
+    public static class ST_MinimumBoundingRadius extends ScalarFunction {
+        @DataTypeHint(value = "RAW")
+        public Pair<Geometry, Double> eval(@DataTypeHint(value = "RAW", 
bridgedTo = org.locationtech.jts.geom.Geometry.class) Object o) {
+            Geometry geom = (Geometry) o;
+            return 
org.apache.sedona.common.Functions.minimumBoundingRadius(geom);
+        }
+    }
+
     public static class ST_Multi 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) {
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 4c5b73c1..247e4635 100644
--- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
+++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java
@@ -14,6 +14,7 @@
 package org.apache.sedona.flink;
 
 import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.flink.table.api.Table;
 import org.apache.sedona.flink.expressions.Functions;
 import org.geotools.referencing.CRS;
@@ -804,6 +805,15 @@ public class FunctionTest extends TestBase{
         assertEquals(actual, expected);
     }
 
+    @Test 
+    public void testMinimumBoundingRadius() {
+        Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('LINESTRING (0 
0, 1 0)') AS geom");
+        table = 
table.select(call(Functions.ST_MinimumBoundingRadius.class.getSimpleName(), 
$("geom")));
+        Pair<Geometry, Double> result = (Pair<Geometry, Double>) 
first(table).getField(0);
+        assertEquals("POINT (0.5 0)", result.getLeft().toString());
+        assertEquals(0.5, result.getRight(), 1e-6);
+    }
+
     @Test 
     public void testMulti() {
         Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('POINT (0 0)') 
AS geom");

Reply via email to