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

Reply via email to