From 48d0a711bf4fa668da98b3e91485c1d5a9f57fdd Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Thu, 14 Mar 2024 09:56:46 +0530 Subject: [PATCH 1/8] feat: add ST_Snap --- .../org/apache/sedona/common/Functions.java | 6 +++++ .../apache/sedona/common/FunctionsTest.java | 22 +++++++++++++++- docs/api/flink/Function.md | 26 +++++++++++++++++++ docs/api/snowflake/vector-data/Function.md | 24 +++++++++++++++++ docs/api/sql/Function.md | 26 +++++++++++++++++++ .../java/org/apache/sedona/flink/Catalog.java | 1 + .../sedona/flink/expressions/Functions.java | 11 ++++++++ .../org/apache/sedona/flink/FunctionTest.java | 14 ++++++++++ python/Pipfile | 2 +- python/sedona/sql/st_functions.py | 11 ++++++++ python/tests/sql/test_dataframe_api.py | 4 +++ python/tests/sql/test_function.py | 11 ++++++++ .../snowflake/snowsql/TestFunctions.java | 9 +++++++ .../snowflake/snowsql/TestFunctionsV2.java | 8 ++++++ .../apache/sedona/snowflake/snowsql/UDFs.java | 11 ++++++++ .../sedona/snowflake/snowsql/UDFsV2.java | 11 ++++++++ .../org/apache/sedona/sql/UDF/Catalog.scala | 1 + .../sedona_sql/expressions/Functions.scala | 8 ++++++ .../sedona_sql/expressions/st_functions.scala | 3 +++ .../sedona/sql/dataFrameAPITestScala.scala | 11 ++++++++ .../apache/sedona/sql/functionTestScala.scala | 11 ++++++++ 21 files changed, 229 insertions(+), 2 deletions(-) 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 3177cf2fa4..dc5796258f 100644 --- a/common/src/main/java/org/apache/sedona/common/Functions.java +++ b/common/src/main/java/org/apache/sedona/common/Functions.java @@ -38,6 +38,7 @@ import org.locationtech.jts.operation.distance.DistanceOp; import org.locationtech.jts.operation.distance3d.Distance3DOp; import org.locationtech.jts.operation.linemerge.LineMerger; +import org.locationtech.jts.operation.overlay.snap.GeometrySnapper; import org.locationtech.jts.operation.valid.IsSimpleOp; import org.locationtech.jts.operation.valid.IsValidOp; import org.locationtech.jts.operation.valid.TopologyValidationError; @@ -1032,6 +1033,11 @@ public static Geometry[] subDivide(Geometry geometry, int maxVertices) { return GeometrySubDivider.subDivide(geometry, maxVertices); } + public static Geometry snap(Geometry input, Geometry reference, double tolerance) { + GeometrySnapper snapper = new GeometrySnapper(input); + return snapper.snapTo(reference, tolerance); + } + public static Geometry makeLine(Geometry geom1, Geometry geom2) { Geometry[] geoms = new Geometry[]{geom1, geom2}; return makeLine(geoms); 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 47a0b84240..95f551ed6a 100644 --- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java +++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java @@ -1175,10 +1175,30 @@ public void testBuffer() { assertEquals(expected, actual); } + @Test + public void testSnap() throws ParseException { + Geometry poly = geomFromWKT("POLYGON ((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))", 0); + Geometry line = geomFromWKT("LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)", 0); + double distance = Functions.distance(poly, line); + String actual = Functions.asWKT(Functions.snap(poly, line, distance * 1.01)); + String expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))"; + assertEquals(expected, actual); + + System.out.println(distance * 1.25); + actual = Functions.asWKT(Functions.snap(poly, line, distance * 1.25)); + expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))"; + assertEquals(expected, actual); + + // if the tolerance is less than distance between Geometries then input Geometry will be returned as is. + actual = Functions.asWKT(Functions.snap(poly, line, distance * 0.9)); + expected = Functions.asWKT(poly); + assertEquals(expected, actual); + } + @Test public void testBufferSpheroidal() throws ParseException { Geometry polygon1 = GEOMETRY_FACTORY.createPolygon(coordArray(16.2500, 48.2500, 16.3500, 48.2500, 16.3500, 48.2000, 16.2500, 48.2000, 16.2500, 48.2500)); - Geometry polygon2 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); + Geometry polygon2 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -1204326 30))", 4269); Geometry point1 = geomFromWKT("POINT(-180 60)", 4269); Geometry linestring1 = geomFromEWKT("LINESTRING(-91.185 30.4505, -91.187 30.452, -91.189 30.4535)"); Geometry polygon3 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index 1c6f4952ce..04c5bf4801 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -2485,6 +2485,32 @@ Output: POLYGON ((8 25, 28 22, 15 11, 33 3, 56 30, 47 44, 35 36, 43 19, 24 39, 8 25)) ``` +## ST_Snap + +Introduction: Snaps the vertices and segments of the `input` geometry to `reference` geometry within the specified `tolerance` distance. The `tolerance` parameter controls the maximum snap distance. + +If the minimum distance between the geometries exceeds the `tolerance`, the `input` geometry is returned unmodified. Adjusting the `tolerance` value allows tuning which vertices should snap to the `reference` and which remain untouched. + +Since: `v1.6.0` + +Format: `ST_Snap(input: Geometry, reference: Geometry, tolerance: double)` + +SQL Example: + +```sql +SELECT ST_Snap( + ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), + ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), + 2.525 + ) +``` + +Output: + +``` +POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5)) +``` + ## ST_StartPoint Introduction: Returns first point of given linestring. diff --git a/docs/api/snowflake/vector-data/Function.md b/docs/api/snowflake/vector-data/Function.md index cee7b315d9..5d669682b0 100644 --- a/docs/api/snowflake/vector-data/Function.md +++ b/docs/api/snowflake/vector-data/Function.md @@ -1890,6 +1890,30 @@ SELECT ST_SimplifyPreserveTopology(polygondf.countyshape, 10.0) FROM polygondf ``` +## ST_Snap + +Introduction: Snaps the vertices and segments of the `input` geometry to `reference` geometry within the specified `tolerance` distance. The `tolerance` parameter controls the maximum snap distance. + +If the minimum distance between the geometries exceeds the `tolerance`, the `input` geometry is returned unmodified. Adjusting the `tolerance` value allows tuning which vertices should snap to the `reference` and which remain untouched. + +Format: `ST_Snap(input: Geometry, reference: Geometry, tolerance: double)` + +SQL Example: + +```sql +SELECT ST_Snap( + ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), + ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), + 2.525 + ) +``` + +Output: + +``` +POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5)) +``` + ## ST_Split Introduction: Split an input geometry by another geometry (called the blade). diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md index 3347230efc..b466f9658f 100644 --- a/docs/api/sql/Function.md +++ b/docs/api/sql/Function.md @@ -2475,6 +2475,32 @@ Output: POLYGON ((8 25, 28 22, 15 11, 33 3, 56 30, 47 44, 35 36, 43 19, 24 39, 8 25)) ``` +## ST_Snap + +Introduction: Snaps the vertices and segments of the `input` geometry to `reference` geometry within the specified `tolerance` distance. The `tolerance` parameter controls the maximum snap distance. + +If the minimum distance between the geometries exceeds the `tolerance`, the `input` geometry is returned unmodified. Adjusting the `tolerance` value allows tuning which vertices should snap to the `reference` and which remain untouched. + +Since: `v1.6.0` + +Format: `ST_Snap(input: Geometry, reference: Geometry, tolerance: double)` + +SQL Example: + +```sql +SELECT ST_Snap( + ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), + ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), + 2.525 + ) +``` + +Output: + +``` +POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5)) +``` + ## ST_Split Introduction: Split an input geometry by another geometry (called the blade). 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 7b32e269c1..45ec724c1c 100644 --- a/flink/src/main/java/org/apache/sedona/flink/Catalog.java +++ b/flink/src/main/java/org/apache/sedona/flink/Catalog.java @@ -134,6 +134,7 @@ public static UserDefinedFunction[] getFuncs() { new Functions.ST_Subdivide(), new Functions.ST_SymDifference(), new Functions.ST_S2CellIDs(), + new Functions.ST_Snap(), new Functions.ST_GeometricMedian(), new Functions.ST_NumPoints(), new Functions.ST_Force3D(), 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 65f066230a..bbefcd813f 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 @@ -839,6 +839,17 @@ public Geometry eval(@DataTypeHint(value = "RAW", bridgedTo = org.locationtech.j } } + public static class ST_Snap 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, + @DataTypeHint("Double") Double tolerance) { + Geometry input = (Geometry) o1; + Geometry reference = (Geometry) o2; + return org.apache.sedona.common.Functions.snap(input, reference, tolerance); + } + } + public static class ST_S2CellIDs extends ScalarFunction { @DataTypeHint(value = "ARRAY") public Long[] 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 4a5129af5d..578ec67086 100644 --- a/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java +++ b/flink/src/test/java/org/apache/sedona/flink/FunctionTest.java @@ -973,6 +973,20 @@ public void testMinimumBoundingRadius() { assertEquals(0.5, result.getRight(), 1e-6); } + @Test + public void testSnap() { + Table base = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))') AS poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') AS line"); + Table table = base.select(call(Functions.ST_Snap.class.getSimpleName(), $("poly"), $("line"), 2.525).as("result")); + String actual = (String) first(table.select(call(Functions.ST_AsText.class.getSimpleName(), $("result")))).getField(0); + String expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))"; + assertEquals(expected, actual); + + table = base.select(call(Functions.ST_Snap.class.getSimpleName(), $("poly"), $("line"), 3.125).as("result")); + actual = (String) first(table.select(call(Functions.ST_AsText.class.getSimpleName(), $("result")))).getField(0); + expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))"; + assertEquals(expected, actual); + } + @Test public void testMulti() { Table table = tableEnv.sqlQuery("SELECT ST_GeomFromWKT('POINT (0 0)') AS geom"); diff --git a/python/Pipfile b/python/Pipfile index 110203363b..5a3b75b797 100644 --- a/python/Pipfile +++ b/python/Pipfile @@ -14,7 +14,7 @@ pytest-cov = "*" shapely=">=2.0.0" pandas="<=1.3.5" geopandas="<=0.10.2" -pyspark=">=2.3.0" +pyspark="*" attrs="*" pyarrow="*" keplergl = "==0.3.2" diff --git a/python/sedona/sql/st_functions.py b/python/sedona/sql/st_functions.py index d6f31fa0d1..a35f7bbde7 100644 --- a/python/sedona/sql/st_functions.py +++ b/python/sedona/sql/st_functions.py @@ -1216,6 +1216,17 @@ def ST_SetSRID(geometry: ColumnOrName, srid: Union[ColumnOrName, int]) -> Column """ return _call_st_function("ST_SetSRID", (geometry, srid)) +@validate_argument_types +def ST_Snap(input: ColumnOrName, reference: ColumnOrName, tolerance: Union[ColumnOrName, float]) -> Column: + """Snaps input Geometry to reference Geometry controlled by distance tolerance. + + :param input: Geometry + :param reference: Geometry to snap to + :param tolerance: Distance to control snapping + :return: Snapped Geometry + """ + return _call_st_function("ST_Snap", (input, reference, tolerance)) + @validate_argument_types def ST_SRID(geometry: ColumnOrName) -> Column: diff --git a/python/tests/sql/test_dataframe_api.py b/python/tests/sql/test_dataframe_api.py index 4469178a3f..e09d9c8877 100644 --- a/python/tests/sql/test_dataframe_api.py +++ b/python/tests/sql/test_dataframe_api.py @@ -148,6 +148,7 @@ (stf.ST_SetSRID, ("point", 3021), "point_geom", "ST_SRID(geom)", 3021), (stf.ST_ShiftLongitude, ("geom",), "triangle_geom", "", "POLYGON ((0 0, 1 0, 1 1, 0 0))"), (stf.ST_SimplifyPreserveTopology, ("geom", 0.2), "0.9_poly", "", "POLYGON ((0 0, 1 0, 1 1, 0 0))"), + (stf.ST_Snap, ("poly", "line", 2.525), "poly_and_line", "" ,"POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))"), (stf.ST_Split, ("line", "points"), "multipoint_splitting_line", "", "MULTILINESTRING ((0 0, 0.5 0.5), (0.5 0.5, 1 1), (1 1, 1.5 1.5, 2 2))"), (stf.ST_SRID, ("point",), "point_geom", "", 0), (stf.ST_StartPoint, ("line",), "linestring_geom", "", "POINT (0 0)"), @@ -310,6 +311,7 @@ (stf.ST_ShiftLongitude, (None,)), (stf.ST_SimplifyPreserveTopology, (None, 0.2)), (stf.ST_SimplifyPreserveTopology, ("", None)), + (stf.ST_Snap, (None, None, 12)), (stf.ST_SRID, (None,)), (stf.ST_StartPoint, (None,)), (stf.ST_SubDivide, (None, 5)), @@ -450,6 +452,8 @@ def base_df(self, request): return TestDataFrameAPI.spark.sql("SELECT ST_GeomFromWKT('POINT (-122.335167 47.608013)') AS seattle, ST_GeomFromWKT('POINT (-73.935242 40.730610)') as ny") elif request.param == "line_crossing_dateline": return TestDataFrameAPI.spark.sql("SELECT ST_GeomFromWKT('LINESTRING (179.95 30, -179.95 30)') AS line") + elif request.param == "poly_and_line": + return TestDataFrameAPI.spark.sql("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))') as poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') as line") raise ValueError(f"Invalid base_df name passed: {request.param}") def _id_test_configuration(val): diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index 2b1f674b1f..dd1c05d72d 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -576,6 +576,17 @@ def test_st_start_point(self): assert (not polygons.count()) + def test_st_snap(self): + baseDf = self.spark.sql("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 " + "))') AS poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') AS line") + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 2.525))") + expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" + assert (expected == actual) + + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 3.125))") + expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))" + assert (expected == actual) + def test_st_end_point(self): linestring_dataframe = create_sample_lines_df(self.spark, 5) other_geometry_dataframe = create_sample_points_df(self.spark, 5). \ diff --git a/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctions.java b/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctions.java index 63c54ae993..41a465a5f7 100644 --- a/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctions.java +++ b/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctions.java @@ -801,6 +801,15 @@ public void test_ST_StartPoint() { "POINT (1 2)" ); } + + @Test + public void test_ST_Snap() { + registerUDF("ST_Snap", byte[].class, byte[].class, double.class); + verifySqlSingleRes( + "SELECT sedona.ST_AsText(sedona.ST_Snap(ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), 2.525))", + "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" + ); + } @Test public void test_ST_SubDivide() { registerUDF("ST_SubDivide", byte[].class, int.class); diff --git a/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctionsV2.java b/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctionsV2.java index 90517b7f42..65146667d1 100644 --- a/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctionsV2.java +++ b/snowflake-tester/src/test/java/org/apache/sedona/snowflake/snowsql/TestFunctionsV2.java @@ -765,6 +765,14 @@ public void test_ST_StartPoint() { ); } @Test + public void test_ST_Snap() { + registerUDFV2("ST_Snap", String.class, String.class, double.class); + verifySqlSingleRes( + "SELECT sedona.ST_AsText(sedona.ST_Snap(ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), 2.525))", + "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" + ); + } + @Test public void test_ST_SubDivide() { registerUDFV2("ST_SubDivide", String.class, int.class); verifySqlSingleRes( diff --git a/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFs.java b/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFs.java index 10685687e2..736eff3e2f 100644 --- a/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFs.java +++ b/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFs.java @@ -1069,6 +1069,17 @@ public static byte[] ST_StartPoint(byte[] geometry) { ); } + @UDFAnnotations.ParamMeta(argNames = {"input", "reference", "tolerance"}) + public static byte[] ST_Snap(byte[] input, byte[] reference, double tolerance) { + return GeometrySerde.serialize( + Functions.snap( + GeometrySerde.deserialize(input), + GeometrySerde.deserialize(reference), + tolerance + ) + ); + } + @UDFAnnotations.ParamMeta(argNames = {"geometry", "maxVertices"}) public static byte[] ST_SubDivide(byte[] geometry, int maxVertices) { return GeometrySerde.serialize( diff --git a/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFsV2.java b/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFsV2.java index be6c09c6bc..74f5a69134 100644 --- a/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFsV2.java +++ b/snowflake/src/main/java/org/apache/sedona/snowflake/snowsql/UDFsV2.java @@ -918,6 +918,17 @@ public static String ST_StartPoint(String geometry) { ); } + @UDFAnnotations.ParamMeta(argNames = {"input", "reference", "tolerance"}, argTypes = {"Geometry", "Geometry", "double"}, returnTypes = "Geometry") + public static String ST_Snap(String input, String reference, double tolerance) { + return GeometrySerde.serGeoJson( + Functions.snap( + GeometrySerde.deserGeoJson(input), + GeometrySerde.deserGeoJson(reference), + tolerance + ) + ); + } + @UDFAnnotations.ParamMeta(argNames = {"geometry", "maxVertices"}, argTypes = {"Geometry", "int"}, returnTypes = "Geometry") public static String ST_SubDivide(String geometry, int maxVertices) { return GeometrySerde.serGeoJson( diff --git a/spark/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala b/spark/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala index a41b780d48..7550f566a8 100644 --- a/spark/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala +++ b/spark/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala @@ -107,6 +107,7 @@ object Catalog { function[ST_Y](), function[ST_Z](), function[ST_StartPoint](), + function[ST_Snap](), function[ST_ClosestPoint](), function[ST_Boundary](), function[ST_MinimumBoundingRadius](), diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala index 50dab461e2..08ad6d6a46 100644 --- a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala +++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Functions.scala @@ -445,6 +445,14 @@ case class ST_StartPoint(inputExpressions: Seq[Expression]) } } +case class ST_Snap(inputExpressions: Seq[Expression]) + extends InferredExpression(Functions.snap _) { + + protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = { + copy(inputExpressions = newChildren) + } +} + case class ST_Boundary(inputExpressions: Seq[Expression]) extends InferredExpression(Functions.boundary _) { diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_functions.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_functions.scala index b0ef539d8e..cd9ae0fa2b 100644 --- a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_functions.scala +++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_functions.scala @@ -284,6 +284,9 @@ object st_functions extends DataFrameAPI { def ST_StartPoint(lineString: Column): Column = wrapExpression[ST_StartPoint](lineString) def ST_StartPoint(lineString: String): Column = wrapExpression[ST_StartPoint](lineString) + def ST_Snap(input: Column, reference: Column, tolerance: Column): Column = wrapExpression[ST_Snap](input, reference, tolerance) + def ST_Snap(input: String, reference: String, tolerance: Double): Column = wrapExpression[ST_Snap](input, reference, tolerance) + def ST_SubDivide(geometry: Column, maxVertices: Column): Column = wrapExpression[ST_SubDivide](geometry, maxVertices) def ST_SubDivide(geometry: String, maxVertices: Int): Column = wrapExpression[ST_SubDivide](geometry, maxVertices) diff --git a/spark/common/src/test/scala/org/apache/sedona/sql/dataFrameAPITestScala.scala b/spark/common/src/test/scala/org/apache/sedona/sql/dataFrameAPITestScala.scala index e5006261c8..be5f10ae8d 100644 --- a/spark/common/src/test/scala/org/apache/sedona/sql/dataFrameAPITestScala.scala +++ b/spark/common/src/test/scala/org/apache/sedona/sql/dataFrameAPITestScala.scala @@ -603,6 +603,17 @@ class dataFrameAPITestScala extends TestBaseScala { assert(actualResult == expectedResult) } + it("Passed ST_Snap") { + val baseDf = sparkSession.sql("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))') AS poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') AS line") + var actual = baseDf.select(ST_Snap("poly", "line", 2.525)).take(1)(0).get(0).asInstanceOf[Geometry].toText + var expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" + assert(expected.equals(actual)) + + actual = baseDf.select(ST_Snap("poly", "line", 3.125)).take(1)(0).get(0).asInstanceOf[Geometry].toText + expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))" + assert(expected.equals(actual)) + } + it("Passed ST_Boundary") { val baseDf = sparkSession.sql("SELECT ST_GeomFromWKT('POLYGON ((0 0, 1 0, 1 1, 0 0))') AS geom") val df = baseDf.select(ST_Boundary("geom")) diff --git a/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala b/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala index 0efa67ee4a..65954aef21 100644 --- a/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala +++ b/spark/common/src/test/scala/org/apache/sedona/sql/functionTestScala.scala @@ -895,6 +895,17 @@ class functionTestScala extends TestBaseScala with Matchers with GeometrySample And("Polygon DataFrame should result with empty list ") polygons.isEmpty shouldBe true } + + it("Should pass ST_Snap") { + val baseDf = sparkSession.sql("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))') AS poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') AS line") + var actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 2.525))").first().getString(0) + var expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" + assert(expected.equals(actual)) + + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 3.125))").first().getString(0) + expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))" + assert(expected.equals(actual)) + } } it("Should pass ST_Boundary") { From e8f23b4dd113e0bac4c53e0fd8753242ad82a7f5 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Thu, 14 Mar 2024 10:27:49 +0530 Subject: [PATCH 2/8] fix: lint, python test, and remove print statements --- .../test/java/org/apache/sedona/common/FunctionsTest.java | 1 - docs/api/flink/Function.md | 4 ++-- docs/api/snowflake/vector-data/Function.md | 4 ++-- docs/api/sql/Function.md | 6 +++--- python/tests/sql/test_function.py | 4 ++-- 5 files changed, 9 insertions(+), 10 deletions(-) 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 95f551ed6a..01cef8d389 100644 --- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java +++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java @@ -1184,7 +1184,6 @@ public void testSnap() throws ParseException { String expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))"; assertEquals(expected, actual); - System.out.println(distance * 1.25); actual = Functions.asWKT(Functions.snap(poly, line, distance * 1.25)); expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))"; assertEquals(expected, actual); diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index 04c5bf4801..9028d7d84f 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -2499,9 +2499,9 @@ SQL Example: ```sql SELECT ST_Snap( - ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), + ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), - 2.525 + 2.525 ) ``` diff --git a/docs/api/snowflake/vector-data/Function.md b/docs/api/snowflake/vector-data/Function.md index 5d669682b0..ce455cdab2 100644 --- a/docs/api/snowflake/vector-data/Function.md +++ b/docs/api/snowflake/vector-data/Function.md @@ -1902,9 +1902,9 @@ SQL Example: ```sql SELECT ST_Snap( - ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), + ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), - 2.525 + 2.525 ) ``` diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md index b466f9658f..4742c4dff9 100644 --- a/docs/api/sql/Function.md +++ b/docs/api/sql/Function.md @@ -2477,7 +2477,7 @@ POLYGON ((8 25, 28 22, 15 11, 33 3, 56 30, 47 44, 35 36, 43 19, 24 39, 8 25)) ## ST_Snap -Introduction: Snaps the vertices and segments of the `input` geometry to `reference` geometry within the specified `tolerance` distance. The `tolerance` parameter controls the maximum snap distance. +Introduction: Snaps the vertices and segments of the `input` geometry to `reference` geometry within the specified `tolerance` distance. The `tolerance` parameter controls the maximum snap distance. If the minimum distance between the geometries exceeds the `tolerance`, the `input` geometry is returned unmodified. Adjusting the `tolerance` value allows tuning which vertices should snap to the `reference` and which remain untouched. @@ -2489,9 +2489,9 @@ SQL Example: ```sql SELECT ST_Snap( - ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), + ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), - 2.525 + 2.525 ) ``` diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index dd1c05d72d..fe85542a3a 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -579,11 +579,11 @@ def test_st_start_point(self): def test_st_snap(self): baseDf = self.spark.sql("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 " "))') AS poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') AS line") - actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 2.525))") + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 2.525))").take(1)[0] expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" assert (expected == actual) - actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 3.125))") + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 3.125))").take(1)[0] expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))" assert (expected == actual) From e73d5d8d414cf8594c715bb2c1c6584dbdd8e662 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Thu, 14 Mar 2024 10:44:28 +0530 Subject: [PATCH 3/8] fix: java test --- .../src/test/java/org/apache/sedona/common/FunctionsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 01cef8d389..7b2de465f4 100644 --- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java +++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java @@ -1197,7 +1197,7 @@ public void testSnap() throws ParseException { @Test public void testBufferSpheroidal() throws ParseException { Geometry polygon1 = GEOMETRY_FACTORY.createPolygon(coordArray(16.2500, 48.2500, 16.3500, 48.2500, 16.3500, 48.2000, 16.2500, 48.2000, 16.2500, 48.2500)); - Geometry polygon2 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -1204326 30))", 4269); + Geometry polygon2 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); Geometry point1 = geomFromWKT("POINT(-180 60)", 4269); Geometry linestring1 = geomFromEWKT("LINESTRING(-91.185 30.4505, -91.187 30.452, -91.189 30.4535)"); Geometry polygon3 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); From c6adebe4ee7d3a1162575743b77dab491b965e11 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Thu, 14 Mar 2024 10:46:16 +0530 Subject: [PATCH 4/8] fix: java test --- .../src/test/java/org/apache/sedona/common/FunctionsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1be322e126..0d1bd4cef1 100644 --- a/common/src/test/java/org/apache/sedona/common/FunctionsTest.java +++ b/common/src/test/java/org/apache/sedona/common/FunctionsTest.java @@ -1209,7 +1209,7 @@ public void testSnap() throws ParseException { @Test public void testBufferSpheroidal() throws ParseException { Geometry polygon1 = GEOMETRY_FACTORY.createPolygon(coordArray(16.2500, 48.2500, 16.3500, 48.2500, 16.3500, 48.2000, 16.2500, 48.2000, 16.2500, 48.2500)); - Geometry polygon2 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); + Geometry polygon2 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); Geometry point1 = geomFromWKT("POINT(-180 60)", 4269); Geometry linestring1 = geomFromEWKT("LINESTRING(-91.185 30.4505, -91.187 30.452, -91.189 30.4535)"); Geometry polygon3 = geomFromWKT("POLYGON((-120 30, -80 30, -80 50, -120 50, -120 30))", 4269); From 48b8be821b24cacbd91eb7c45eede19bf6a849f9 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Thu, 14 Mar 2024 12:42:01 +0530 Subject: [PATCH 5/8] fix: python test --- python/tests/sql/test_function.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tests/sql/test_function.py b/python/tests/sql/test_function.py index b233de60cd..99ea4e2762 100644 --- a/python/tests/sql/test_function.py +++ b/python/tests/sql/test_function.py @@ -579,11 +579,11 @@ def test_st_start_point(self): def test_st_snap(self): baseDf = self.spark.sql("SELECT ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 " "))') AS poly, ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)') AS line") - actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 2.525))").take(1)[0] + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 2.525))").take(1)[0][0] expected = "POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5))" assert (expected == actual) - actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 3.125))").take(1)[0] + actual = baseDf.selectExpr("ST_AsText(ST_Snap(poly, line, 3.125))").take(1)[0][0] expected = "POLYGON ((0.5 10.7, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 5.4 8.4, 0.5 10.7))" assert (expected == actual) From 27eabcd4a89dc22a1cdc34bc69c1276a38ae86c1 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Fri, 15 Mar 2024 10:17:58 +0530 Subject: [PATCH 6/8] fix: undo Pipfile changes --- python/Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/Pipfile b/python/Pipfile index 5a3b75b797..110203363b 100644 --- a/python/Pipfile +++ b/python/Pipfile @@ -14,7 +14,7 @@ pytest-cov = "*" shapely=">=2.0.0" pandas="<=1.3.5" geopandas="<=0.10.2" -pyspark="*" +pyspark=">=2.3.0" attrs="*" pyarrow="*" keplergl = "==0.3.2" From 8e2b1eae817e851542be57bfc8d3be3880f172d6 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Fri, 15 Mar 2024 14:12:33 +0530 Subject: [PATCH 7/8] docs: add visualizations --- docs/api/sql/Function.md | 15 +++++++++++---- docs/image/st_snap/st-snap-applied.png | Bin 0 -> 26675 bytes docs/image/st_snap/st-snap-base-example.png | Bin 0 -> 76714 bytes 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 docs/image/st_snap/st-snap-applied.png create mode 100644 docs/image/st_snap/st-snap-base-example.png diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md index 3f9d778555..a878631f80 100644 --- a/docs/api/sql/Function.md +++ b/docs/api/sql/Function.md @@ -2508,20 +2508,27 @@ Since: `v1.6.0` Format: `ST_Snap(input: Geometry, reference: Geometry, tolerance: double)` +Input geometry: + + + SQL Example: ```sql SELECT ST_Snap( - ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), - ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), - 2.525 + ST_GeomFromWKT('POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.35 -6.62, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.50, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01))') as poly, + ST_GeomFromWKT('LINESTRING (236880.53 -8.22, 236881.15 -7.68, 236880.69 -6.81)') as line, + ST_Distance(poly, line) * 1.01 ) ``` Output: + + + ``` -POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5)) +POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.69 -6.81, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.5, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01)) ``` ## ST_Split diff --git a/docs/image/st_snap/st-snap-applied.png b/docs/image/st_snap/st-snap-applied.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8ef6fd2085d93ebb27ab720c7cdfb2a3662eb8 GIT binary patch literal 26675 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 K)CyJZ2mL?D3a<44 literal 0 HcmV?d00001 diff --git a/docs/image/st_snap/st-snap-base-example.png b/docs/image/st_snap/st-snap-base-example.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7a4ff58445e461911cf684055543f18a5c1d68 GIT binary patch literal 76714 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 literal 0 HcmV?d00001 From b0b819bdcb5ab06ea68748b46f0ed84146216d94 Mon Sep 17 00:00:00 2001 From: Furqaanahmed Khan Date: Fri, 15 Mar 2024 14:18:35 +0530 Subject: [PATCH 8/8] docs: fix lint, and add docs to flink and snowflake --- docs/api/flink/Function.md | 14 ++++++++++---- docs/api/snowflake/vector-data/Function.md | 14 ++++++++++---- docs/api/sql/Function.md | 1 - 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/docs/api/flink/Function.md b/docs/api/flink/Function.md index 86359a15c5..66e4247aef 100644 --- a/docs/api/flink/Function.md +++ b/docs/api/flink/Function.md @@ -2518,20 +2518,26 @@ Since: `v1.6.0` Format: `ST_Snap(input: Geometry, reference: Geometry, tolerance: double)` +Input geometry: + + + SQL Example: ```sql SELECT ST_Snap( - ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), - ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), - 2.525 + ST_GeomFromWKT('POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.35 -6.62, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.50, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01))') as poly, + ST_GeomFromWKT('LINESTRING (236880.53 -8.22, 236881.15 -7.68, 236880.69 -6.81)') as line, + ST_Distance(poly, line) * 1.01 ) ``` Output: + + ``` -POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5)) +POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.69 -6.81, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.5, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01)) ``` ## ST_StartPoint diff --git a/docs/api/snowflake/vector-data/Function.md b/docs/api/snowflake/vector-data/Function.md index ce455cdab2..1be464633f 100644 --- a/docs/api/snowflake/vector-data/Function.md +++ b/docs/api/snowflake/vector-data/Function.md @@ -1898,20 +1898,26 @@ If the minimum distance between the geometries exceeds the `tolerance`, the `inp Format: `ST_Snap(input: Geometry, reference: Geometry, tolerance: double)` +Input geometry: + + + SQL Example: ```sql SELECT ST_Snap( - ST_GeomFromWKT('POLYGON((2.6 12.5, 2.6 20.0, 12.6 20.0, 12.6 12.5, 2.6 12.5 ))'), - ST_GeomFromWKT('LINESTRING (0.5 10.7, 5.4 8.4, 10.1 10.0)'), - 2.525 + ST_GeomFromWKT('POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.35 -6.62, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.50, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01))') as poly, + ST_GeomFromWKT('LINESTRING (236880.53 -8.22, 236881.15 -7.68, 236880.69 -6.81)') as line, + ST_Distance(poly, line) * 1.01 ) ``` Output: + + ``` -POLYGON ((2.6 12.5, 2.6 20, 12.6 20, 12.6 12.5, 10.1 10, 2.6 12.5)) +POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.69 -6.81, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.5, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01)) ``` ## ST_Split diff --git a/docs/api/sql/Function.md b/docs/api/sql/Function.md index a878631f80..9f94e591ac 100644 --- a/docs/api/sql/Function.md +++ b/docs/api/sql/Function.md @@ -2526,7 +2526,6 @@ Output: - ``` POLYGON ((236877.58 -6.61, 236878.29 -8.35, 236879.98 -8.33, 236879.72 -7.63, 236880.69 -6.81, 236877.58 -6.61), (236878.45 -7.01, 236878.43 -7.52, 236879.29 -7.5, 236878.63 -7.22, 236878.76 -6.89, 236878.45 -7.01)) ```