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/incubator-sedona.git
The following commit(s) were added to refs/heads/master by this push:
new ec852a9d [SEDONA-106] add st line from text (#608)
ec852a9d is described below
commit ec852a9d22fa7694f58b03a5172583a8ae168fc6
Author: ngaur9 <[email protected]>
AuthorDate: Wed Apr 20 18:16:58 2022 -0700
[SEDONA-106] add st line from text (#608)
---
docs/api/sql/Constructor.md | 19 ++++++++++++
python/tests/sql/test_constructor_test.py | 7 +++++
.../scala/org/apache/sedona/sql/UDF/Catalog.scala | 1 +
.../sql/sedona_sql/expressions/Constructors.scala | 34 ++++++++++++++++++++++
.../apache/sedona/sql/constructorTestScala.scala | 7 +++++
5 files changed, 68 insertions(+)
diff --git a/docs/api/sql/Constructor.md b/docs/api/sql/Constructor.md
index 41455933..cae9bf0c 100644
--- a/docs/api/sql/Constructor.md
+++ b/docs/api/sql/Constructor.md
@@ -172,6 +172,25 @@ FROM linestringtable
SELECT
ST_LineStringFromText('-74.0428197,40.6867969,-74.0421975,40.6921336,-74.0508020,40.6912794',
',') AS linestringshape
```
+## ST_LineFromText
+
+Introduction: Construct a Line from Wkt text
+
+Format:
+`ST_LineFromText (Wkt:string)`
+
+Since: `v1.2.1`
+
+Spark SQL example:
+```SQL
+SELECT ST_LineFromText(linetable._c0) AS lineshape
+FROM linetable
+```
+
+```SQL
+SELECT ST_LineFromText('Linestring(1 2, 3 4)') AS line
+```
+
## ST_PolygonFromEnvelope
Introduction: Construct a Polygon from MinX, MinY, MaxX, MaxY.
diff --git a/python/tests/sql/test_constructor_test.py
b/python/tests/sql/test_constructor_test.py
index 4ea5ee24..aefb3763 100644
--- a/python/tests/sql/test_constructor_test.py
+++ b/python/tests/sql/test_constructor_test.py
@@ -111,3 +111,10 @@ class TestConstructors(TestBase):
polygon_df = self.spark.sql("select
ST_GeomFromGeoJSON(polygontable._c0) as countyshape from polygontable")
polygon_df.show()
assert polygon_df.count() == 1000
+
+ def test_line_from_text(self) :
+ input_df = self.spark.createDataFrame([("LineString(1 2, 3 4)",)],
["wkt"])
+ input_df.createOrReplaceTempView("input_wkt")
+ line_df = self.spark.sql("select ST_LineFromText(wkt) as geom from
input_wkt")
+ assert line_df.count() == 1
+
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 baa03592..30a1ce50 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
@@ -32,6 +32,7 @@ object Catalog {
ST_PolygonFromText,
ST_LineStringFromText,
ST_GeomFromText,
+ ST_LineFromText,
ST_GeomFromWKT,
ST_GeomFromWKB,
ST_GeomFromGeoJSON,
diff --git
a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Constructors.scala
b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Constructors.scala
index bd99f79f..9025be4a 100644
---
a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Constructors.scala
+++
b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/Constructors.scala
@@ -94,6 +94,40 @@ case class ST_PolygonFromText(inputExpressions:
Seq[Expression])
}
}
+/**
+ * Return a line from a string. The string must be plain string and each
coordinate must be separated by a delimiter.
+ *
+ * @param inputExpressions
+ */
+case class ST_LineFromText(inputExpressions: Seq[Expression])
+ extends Expression with CodegenFallback with UserDataGeneratator {
+ // This is an expression which takes one input expressions.
+ assert(inputExpressions.length == 1)
+
+ override def nullable: Boolean = true
+
+ override def eval(inputRow: InternalRow): Any = {
+ val lineString =
inputExpressions(0).eval(inputRow).asInstanceOf[UTF8String].toString
+
+ var fileDataSplitter = FileDataSplitter.WKT
+ var formatMapper = new FormatMapper(fileDataSplitter, false)
+ var geometry = formatMapper.readGeometry(lineString)
+ if(geometry.getGeometryType.contains("LineString")) {
+ new GenericArrayData(GeometrySerializer.serialize(geometry))
+ } else {
+ null
+ }
+ }
+
+ override def dataType: DataType = GeometryUDT
+
+ override def children: Seq[Expression] = inputExpressions
+
+ protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) =
{
+ copy(inputExpressions = newChildren)
+ }
+}
+
/**
* Return a linestring from a string. The string must be plain string and
each coordinate must be separated by a delimiter.
*
diff --git
a/sql/src/test/scala/org/apache/sedona/sql/constructorTestScala.scala
b/sql/src/test/scala/org/apache/sedona/sql/constructorTestScala.scala
index fe1f69ac..50abcc3d 100644
--- a/sql/src/test/scala/org/apache/sedona/sql/constructorTestScala.scala
+++ b/sql/src/test/scala/org/apache/sedona/sql/constructorTestScala.scala
@@ -69,6 +69,13 @@ class constructorTestScala extends TestBaseScala {
assert(polygonDf.count() == 100)
}
+ it("Passed ST_LineFromText") {
+ val geometryDf = Seq("Linestring(1 2, 3 4)").map(wkt =>
Tuple1(wkt)).toDF("geom")
+ geometryDf.createOrReplaceTempView("linetable")
+ var lineDf = sparkSession.sql("select ST_LineFromText(linetable.geom)
from linetable")
+ assert(lineDf.count() == 1)
+ }
+
it("Passed ST_GeomFromWKT 3D") {
val geometryDf = Seq(
"Point(21 52 87)",