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");