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 1ed45aa56d [GH-2263] add new constructor ST_GeogFromEWKT (#2262)
1ed45aa56d is described below

commit 1ed45aa56da23441dc27b2dc8bef5f040b0fdea6
Author: Zhuocheng Shang <[email protected]>
AuthorDate: Tue Aug 12 21:55:52 2025 -0700

    [GH-2263] add new constructor ST_GeogFromEWKT (#2262)
    
    * add new constructor ST_GeogFromEWKT
    
    * fix ParseException return geography type
    
    * Apply suggestions from code review
    
    Co-authored-by: Copilot <[email protected]>
    
    * add API documentation
    
    * clean up API doc
    
    * clean up doc API
    
    * add SRID writing output in WKT
    
    * fix SRID writing on WKB test
    
    * fix exception check for geography type
    
    * add SRID example in api doc
    
    * fix API doc and SRID writing in text
    
    ---------
    
    Co-authored-by: Jia Yu <[email protected]>
    Co-authored-by: Copilot <[email protected]>
---
 .../sedona/common/S2Geography/WKTReader.java       |  2 +-
 .../sedona/common/S2Geography/WKTWriter.java       | 19 ++++++++
 .../sedona/common/geography/Constructors.java      | 20 ++++++++
 .../sedona/common/Geography/ConstructorsTest.java  | 31 ++++++++++--
 docs/api/sql/geography/Constructor.md              | 55 ++++++++++++++++++++++
 .../scala/org/apache/sedona/sql/UDF/Catalog.scala  |  3 +-
 .../expressions/geography/Constructors.scala       | 22 +++++++--
 .../sedona_sql/expressions/st_constructors.scala   |  5 +-
 .../apache/sedona/sql/dataFrameAPITestScala.scala  |  4 +-
 .../geography/ConstructorsDataFrameAPITest.scala   | 12 ++++-
 .../sedona/sql/geography/ConstructorsTest.scala    | 26 +++++++++-
 11 files changed, 183 insertions(+), 16 deletions(-)

diff --git 
a/common/src/main/java/org/apache/sedona/common/S2Geography/WKTReader.java 
b/common/src/main/java/org/apache/sedona/common/S2Geography/WKTReader.java
index 598832514e..1375af7e49 100644
--- a/common/src/main/java/org/apache/sedona/common/S2Geography/WKTReader.java
+++ b/common/src/main/java/org/apache/sedona/common/S2Geography/WKTReader.java
@@ -615,7 +615,7 @@ public class WKTReader {
     } else if (isTypeName(tokenizer, type, WKTConstants.GEOMETRYCOLLECTION)) {
       return readGeographyCollectionText(tokenizer, ordinateFlags);
     }
-    throw parseErrorWithLine(tokenizer, "Unknown geometry type: " + type);
+    throw parseErrorWithLine(tokenizer, "Unknown geography type: " + type);
   }
 
   private boolean isTypeName(StreamTokenizer tokenizer, String type, String 
typeName)
diff --git 
a/common/src/main/java/org/apache/sedona/common/S2Geography/WKTWriter.java 
b/common/src/main/java/org/apache/sedona/common/S2Geography/WKTWriter.java
index 56266cd7a7..dc416fc136 100644
--- a/common/src/main/java/org/apache/sedona/common/S2Geography/WKTWriter.java
+++ b/common/src/main/java/org/apache/sedona/common/S2Geography/WKTWriter.java
@@ -374,6 +374,18 @@ public class WKTWriter {
     Assert.shouldNeverReachHere("Unsupported Geometry implementation: " + 
geography.getClass());
   }
 
+  /** Check if need to write SRID */
+  public void writeSRID(Geography geography, Writer writer) throws IOException 
{
+    if (geography == null || writer == null) return;
+
+    int srid = geography.getSRID();
+    if (srid > 0) {
+      writer.write("SRID=");
+      writer.write(Integer.toString(srid));
+      writer.write(';');
+      writer.write(' ');
+    }
+  }
   /**
    * Converts a <code>Coordinate</code> to &lt;Point Tagged Text&gt; format, 
then appends it to the
    * writer.
@@ -392,6 +404,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(point, writer);
     writer.write(WKTConstants.POINT);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
@@ -424,6 +437,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(lineString, writer);
     writer.write(WKTConstants.LINESTRING);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
@@ -455,6 +469,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(polygon, writer);
     writer.write(WKTConstants.POLYGON);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
@@ -480,6 +495,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(multipoint, writer);
     writer.write(WKTConstants.MULTIPOINT);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
@@ -505,6 +521,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(multiLineString, writer);
     writer.write(WKTConstants.MULTILINESTRING);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
@@ -531,6 +548,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(multiPolygon, writer);
     writer.write(WKTConstants.MULTIPOLYGON);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
@@ -556,6 +574,7 @@ public class WKTWriter {
       Writer writer,
       OrdinateFormat formatter)
       throws IOException {
+    writeSRID(geometryCollection, writer);
     writer.write(WKTConstants.GEOMETRYCOLLECTION);
     writer.write(" ");
     appendOrdinateText(outputOrdinates, writer);
diff --git 
a/common/src/main/java/org/apache/sedona/common/geography/Constructors.java 
b/common/src/main/java/org/apache/sedona/common/geography/Constructors.java
index d5e56d4683..5f70b1daca 100644
--- a/common/src/main/java/org/apache/sedona/common/geography/Constructors.java
+++ b/common/src/main/java/org/apache/sedona/common/geography/Constructors.java
@@ -41,6 +41,26 @@ public class Constructors {
     return geog;
   }
 
+  public static Geography geogFromEWKT(String ewkt) throws ParseException {
+    if (ewkt == null) {
+      return null;
+    }
+    int SRID = 0;
+    String wkt = ewkt;
+
+    int index = ewkt.indexOf("SRID=");
+    if (index != -1) {
+      int semicolonIndex = ewkt.indexOf(';', index);
+      if (semicolonIndex != -1) {
+        SRID = Integer.parseInt(ewkt.substring(index + 5, semicolonIndex));
+        wkt = ewkt.substring(semicolonIndex + 1);
+      } else {
+        throw new ParseException("Invalid EWKT string");
+      }
+    }
+    return geogFromWKT(wkt, SRID);
+  }
+
   public static Geography geogCollFromText(String wkt, int srid) throws 
ParseException {
     if (wkt == null || !wkt.startsWith("GEOMETRYCOLLECTION")) {
       return null;
diff --git 
a/common/src/test/java/org/apache/sedona/common/Geography/ConstructorsTest.java 
b/common/src/test/java/org/apache/sedona/common/Geography/ConstructorsTest.java
index d1d949f1a7..4d1100c446 100644
--- 
a/common/src/test/java/org/apache/sedona/common/Geography/ConstructorsTest.java
+++ 
b/common/src/test/java/org/apache/sedona/common/Geography/ConstructorsTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.sedona.common.Geography;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import com.google.common.geometry.S2LatLng;
 import com.google.common.geometry.S2Point;
@@ -31,6 +31,27 @@ import org.locationtech.jts.io.ParseException;
 
 public class ConstructorsTest {
 
+  @Test
+  public void geogFromEWKT() throws ParseException {
+    assertNull(Constructors.geogFromEWKT(null));
+
+    Geography geog = Constructors.geogFromEWKT("POINT (1 1)");
+    assertEquals(0, geog.getSRID());
+    assertEquals("POINT (1 1)", geog.toString());
+
+    geog = Constructors.geogFromEWKT("SRID=4269; POINT (1 1)");
+    assertEquals(4269, geog.getSRID());
+    assertEquals("SRID=4269; POINT (1 1)", geog.toString());
+
+    geog = Constructors.geogFromEWKT("SRID=4269;POINT (1 1)");
+    assertEquals(4269, geog.getSRID());
+    assertEquals("SRID=4269; POINT (1 1)", geog.toString());
+
+    ParseException invalid =
+        assertThrows(ParseException.class, () -> 
Constructors.geogFromEWKT("not valid"));
+    assertEquals("Unknown geography type: NOT (line 1)", invalid.getMessage());
+  }
+
   @Test
   public void geogFromWKB() throws ParseException {
     S2Point pt = S2LatLng.fromDegrees(45, -64).toPoint();
@@ -46,7 +67,7 @@ public class ConstructorsTest {
 
     // Test specifying SRID
     result = Constructors.geogFromWKB(wkb, 1000);
-    assertEquals(geog.toString(), result.toString());
+    assertEquals("SRID=1000; POINT (-64 45)", result.toString());
     assertEquals(1000, result.getSRID());
 
     // Test EWKB with SRID
@@ -54,15 +75,15 @@ public class ConstructorsTest {
     geog.setSRID(2000);
     wkb = wkbWriter.write(geog);
     result = Constructors.geogFromWKB(wkb);
-    assertEquals(geog.toString(), result.toString());
+    assertEquals("SRID=2000; POINT (-64 45)", result.toString());
     assertEquals(2000, result.getSRID());
 
     // Test overriding SRID
     result = Constructors.geogFromWKB(wkb, 3000);
-    assertEquals(geog.toString(), result.toString());
+    assertEquals("SRID=3000; POINT (-64 45)", result.toString());
     assertEquals(3000, result.getSRID());
     result = Constructors.geogFromWKB(wkb, 0);
-    assertEquals(geog.toString(), result.toString());
+    assertEquals("POINT (-64 45)", result.toString());
     assertEquals(0, result.getSRID());
   }
 }
diff --git a/docs/api/sql/geography/Constructor.md 
b/docs/api/sql/geography/Constructor.md
index e106bea8d1..d9dc329252 100644
--- a/docs/api/sql/geography/Constructor.md
+++ b/docs/api/sql/geography/Constructor.md
@@ -18,3 +18,58 @@
  -->
 
 ## ST_GeogFromWKT
+
+Introduction: Construct a Geography from WKT. If SRID is not set, it defaults 
to 0 (unknown).
+
+Format:
+
+`ST_GeogFromWKT (Wkt: String)`
+
+`ST_GeogFromWKT (Wkt: String, srid: Integer)`
+
+Since: `v1.8.0`
+
+SQL Example
+
+```sql
+SELECT ST_GeogFromWKT('LINESTRING (1 2, 3 4, 5 6)')
+```
+
+Output:
+
+```
+LINESTRING (1 2, 3 4, 5 6)
+```
+
+SQL Example
+
+```sql
+SELECT ST_GeogFromWKT('LINESTRING (1 2, 3 4, 5 6)', 4326)
+```
+
+Output:
+
+```
+SRID=4326; LINESTRING (1 2, 3 4, 5 6)
+```
+
+## ST_GeogFromEWKT
+
+Introduction: Construct a Geography from OGC Extended WKT.
+
+Format:
+`ST_GeogFromEWKT (EWkt: String)`
+
+Since: `v1.8.0`
+
+SQL example:
+
+```sql
+SELECT ST_GeogFromEWKT('SRID=4326; LINESTRING (0 0, 3 3, 4 4)')
+```
+
+Output:
+
+```
+SRID=4326; LINESTRING (0 0, 3 3, 4 4)
+```
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 fea04a6a04..b119620493 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
@@ -22,7 +22,7 @@ import org.apache.spark.sql.expressions.Aggregator
 import org.apache.spark.sql.sedona_sql.expressions.collect.ST_Collect
 import org.apache.spark.sql.sedona_sql.expressions.raster._
 import org.apache.spark.sql.sedona_sql.expressions._
-import 
org.apache.spark.sql.sedona_sql.expressions.geography.{ST_GeogCollFromText, 
ST_GeogFromText, ST_GeogFromWKB, ST_GeogFromWKT}
+import 
org.apache.spark.sql.sedona_sql.expressions.geography.{ST_GeogCollFromText, 
ST_GeogFromEWKT, ST_GeogFromText, ST_GeogFromWKB, ST_GeogFromWKT}
 import org.locationtech.jts.geom.Geometry
 import org.locationtech.jts.operation.buffer.BufferParameters
 
@@ -46,6 +46,7 @@ object Catalog extends AbstractCatalog {
     function[ST_GeogFromWKT](0),
     function[ST_GeogFromText](0),
     function[ST_GeogFromWKB](0),
+    function[ST_GeogFromEWKT](),
     function[ST_GeomFromWKT](0),
     function[ST_GeomFromEWKT](),
     function[ST_GeomFromWKB](),
diff --git 
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/geography/Constructors.scala
 
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/geography/Constructors.scala
index 491012a383..ba390220f1 100644
--- 
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/geography/Constructors.scala
+++ 
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/geography/Constructors.scala
@@ -27,7 +27,7 @@ import 
org.apache.spark.sql.sedona_sql.expressions.InferredExpression
  * Return a Geography from a WKT string
  *
  * @param inputExpressions
- *   This function takes a geometry string and a srid. The string format must 
be WKT.
+ *   This function takes a geography string and a srid. The string format must 
be WKT.
  */
 private[apache] case class ST_GeogFromWKT(inputExpressions: Seq[Expression])
     extends InferredExpression(Constructors.geogFromWKT _) {
@@ -37,11 +37,25 @@ private[apache] case class ST_GeogFromWKT(inputExpressions: 
Seq[Expression])
   }
 }
 
+/**
+ * Return a Geography from a EWKT string
+ *
+ * @param inputExpressions
+ *   This function takes a geography string. The string format must be EWKT.
+ */
+private[apache] case class ST_GeogFromEWKT(inputExpressions: Seq[Expression])
+    extends InferredExpression(Constructors.geogFromEWKT _) {
+
+  protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = 
{
+    copy(inputExpressions = newChildren)
+  }
+}
+
 /**
  * Return a Geography from a WKT string
  *
  * @param inputExpressions
- *   This function takes a geometry string and a srid. The string format must 
be WKT.
+ *   This function takes a geography string and a srid. The string format must 
be WKT.
  */
 private[apache] case class ST_GeogFromText(inputExpressions: Seq[Expression])
     extends InferredExpression(Constructors.geogFromWKT _) {
@@ -55,7 +69,7 @@ private[apache] case class ST_GeogFromText(inputExpressions: 
Seq[Expression])
  * Return a Geography Collection from a WKT string
  *
  * @param inputExpressions
- *   This function takes a geometry string and a srid. The string format must 
be WKT.
+ *   This function takes a geography string and a srid. The string format must 
be WKT.
  */
 private[apache] case class ST_GeogCollFromText(inputExpressions: 
Seq[Expression])
     extends InferredExpression(Constructors.geogCollFromText _) {
@@ -69,7 +83,7 @@ private[apache] case class 
ST_GeogCollFromText(inputExpressions: Seq[Expression]
  * Return a Geography from a WKB string
  *
  * @param inputExpressions
- *   This function takes a geometry string and a srid. The string format must 
be WKB binary array
+ *   This function takes a geography string and a srid. The string format must 
be WKB binary array
  *   / string.
  */
 private[apache] case class ST_GeogFromWKB(inputExpressions: Seq[Expression])
diff --git 
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_constructors.scala
 
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_constructors.scala
index 8921a2af70..eaa0add57d 100644
--- 
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_constructors.scala
+++ 
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/st_constructors.scala
@@ -20,7 +20,7 @@ package org.apache.spark.sql.sedona_sql.expressions
 
 import org.apache.spark.sql.Column
 import org.apache.spark.sql.sedona_sql.DataFrameShims._
-import 
org.apache.spark.sql.sedona_sql.expressions.geography.{ST_GeogCollFromText, 
ST_GeogFromText, ST_GeogFromWKB, ST_GeogFromWKT}
+import 
org.apache.spark.sql.sedona_sql.expressions.geography.{ST_GeogCollFromText, 
ST_GeogFromEWKT, ST_GeogFromText, ST_GeogFromWKB, ST_GeogFromWKT}
 
 object st_constructors {
   def ST_GeomFromGeoHash(geohash: Column, precision: Column): Column =
@@ -90,6 +90,9 @@ object st_constructors {
   def ST_GeomFromEWKT(wkt: Column): Column = 
wrapExpression[ST_GeomFromEWKT](wkt)
   def ST_GeomFromEWKT(wkt: String): Column = 
wrapExpression[ST_GeomFromEWKT](wkt)
 
+  def ST_GeogFromEWKT(wkt: Column): Column = 
wrapExpression[ST_GeogFromEWKT](wkt)
+  def ST_GeogFromEWKT(wkt: String): Column = 
wrapExpression[ST_GeogFromEWKT](wkt)
+
   def ST_GeogFromWKT(wkt: Column): Column = 
wrapExpression[ST_GeogFromWKT](wkt, 0)
   def ST_GeogFromWKT(wkt: String): Column = 
wrapExpression[ST_GeogFromWKT](wkt, 0)
   def ST_GeogFromWKT(wkt: Column, srid: Column): Column =
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 ea4cd18c13..8fa0eae4d8 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
@@ -239,7 +239,9 @@ class dataFrameAPITestScala extends TestBaseScala {
       val df =
         sparkSession.sql("SELECT 'POINT(0.0 1.0)' AS 
wkt").select(ST_GeogFromWKT("wkt", 4326))
       val actualResult = df.take(1)(0).get(0).asInstanceOf[Geography]
-      assert(actualResult.toString(new PrecisionModel(PrecisionModel.FIXED)) 
== "POINT (0 1)")
+      assert(
+        actualResult.toString(
+          new PrecisionModel(PrecisionModel.FIXED)) == "SRID=4326; POINT (0 
1)")
       assert(actualResult.getSRID == 4326)
     }
 
diff --git 
a/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsDataFrameAPITest.scala
 
b/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsDataFrameAPITest.scala
index 1208ecbf8f..b44515871b 100644
--- 
a/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsDataFrameAPITest.scala
+++ 
b/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsDataFrameAPITest.scala
@@ -21,6 +21,7 @@ package org.apache.sedona.sql.geography
 import org.apache.sedona.common.S2Geography.{Geography, WKBReader}
 import org.apache.sedona.sql.TestBaseScala
 import org.apache.spark.sql.functions.col
+import org.apache.spark.sql.sedona_sql.expressions.geography.ST_GeogFromEWKT
 import org.apache.spark.sql.sedona_sql.expressions.{implicits, st_constructors}
 import org.junit.Assert.{assertEquals, assertFalse, assertTrue}
 import org.locationtech.jts.geom.PrecisionModel
@@ -58,8 +59,17 @@ class ConstructorsDataFrameAPITest extends TestBaseScala {
     val df = 
wkbSeq.toDF("wkb").select(st_constructors.ST_GeogFromWKB(col("wkb")))
     val actualResult = df.take(1)(0).get(0).asInstanceOf[Geography].toString()
     val expectedResult =
-      "GEOMETRYCOLLECTION (POINT (0 1), POINT (0 1), POINT (2 3), LINESTRING 
(2 3, 4 5), LINESTRING (0 1, 2 3), LINESTRING (4 5, 6 7), POLYGON ((0 0, 0 10, 
10 10, 10 0, 0 0), (9 1, 9 9, 1 9, 1 1, 9 1)), POLYGON ((0 0, 0 10, 10 10, 10 
0, 0 0), (9 1, 9 9, 1 9, 1 1, 9 1)), POLYGON ((-9 0, -9 10, -1 10, -1 0, -9 
0)))"
+      "GEOMETRYCOLLECTION (SRID=4326; POINT (0 1), SRID=4326; POINT (0 1), 
SRID=4326; POINT (2 3), SRID=4326; LINESTRING (2 3, 4 5), SRID=4326; LINESTRING 
(0 1, 2 3), SRID=4326; LINESTRING (4 5, 6 7), SRID=4326; POLYGON ((0 0, 0 10, 
10 10, 10 0, 0 0), (9 1, 9 9, 1 9, 1 1, 9 1)), SRID=4326; POLYGON ((0 0, 0 10, 
10 10, 10 0, 0 0), (9 1, 9 9, 1 9, 1 1, 9 1)), SRID=4326; POLYGON ((-9 0, -9 
10, -1 10, -1 0, -9 0)))"
     assert(actualResult == expectedResult)
   }
 
+  it("passed st_geomfromewkt") {
+    val df = sparkSession
+      .sql("SELECT 'SRID=4269;POINT(0.0 1.0)' AS wkt")
+      .select(st_constructors.ST_GeogFromEWKT("wkt"))
+    val actualResult = df.take(1)(0).get(0).asInstanceOf[Geography]
+    assert(actualResult.toString() == "SRID=4269; POINT (0 1)")
+    assert(actualResult.getSRID == 4269)
+  }
+
 }
diff --git 
a/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsTest.scala
 
b/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsTest.scala
index 8efb45f51b..5a07b45edd 100644
--- 
a/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsTest.scala
+++ 
b/spark/common/src/test/scala/org/apache/sedona/sql/geography/ConstructorsTest.scala
@@ -29,24 +29,26 @@ class ConstructorsTest extends TestBaseScala {
 
   it("Passed ST_GeogFromWKT") {
     val wkt = "LINESTRING (1 2, 3 4, 5 6)"
+    val wktExpected = "SRID=4326; LINESTRING (1 2, 3 4, 5 6)"
     val row = sparkSession.sql(s"SELECT ST_GeogFromWKT('$wkt', 4326) AS 
geog").first()
     // Write output with precisionModel
     val geoStr = row.get(0).asInstanceOf[Geography].toString()
     val geog = row.get(0).asInstanceOf[Geography]
     assert(geog.getSRID == 4326)
     assert(geog.isInstanceOf[Geography])
-    assert(geoStr == wkt)
+    assert(geoStr == wktExpected)
   }
 
   it("Passed ST_GeogFromText") {
     val wkt = "LINESTRING (1 2, 3 4, 5 6)"
+    val wktExpected = "SRID=4326; LINESTRING (1 2, 3 4, 5 6)"
     val row = sparkSession.sql(s"SELECT ST_GeogFromText('$wkt', 4326) AS 
geog").first()
     // Write output with precisionModel
     val geoStr = row.get(0).asInstanceOf[Geography].toString()
     val geog = row.get(0).asInstanceOf[Geography]
     assert(geog.getSRID == 4326)
     assert(geog.isInstanceOf[Geography])
-    assert(geoStr == wkt)
+    assert(geoStr == wktExpected)
   }
 
   it("Passed ST_GeogFromWKT no SRID") {
@@ -74,6 +76,26 @@ class ConstructorsTest extends TestBaseScala {
     assert(expected.equals(actual))
   }
 
+  it("Passed ST_GeogFromEWKT") {
+    val mixedWktGeometryInputLocation =
+      getClass.getResource("/county_small.tsv").getPath
+    var polygonWktDf = sparkSession.read
+      .format("csv")
+      .option("delimiter", "\t")
+      .option("header", "false")
+      .load(mixedWktGeometryInputLocation)
+    polygonWktDf.createOrReplaceTempView("polygontable")
+    var polygonDf = sparkSession.sql(
+      "select ST_GeogFromEWKT(polygontable._c0) as countyshape from 
polygontable")
+    assert(polygonDf.count() == 100)
+    val nullGeog = sparkSession.sql("select ST_GeogFromEWKT(null)")
+    assert(nullGeog.first().isNullAt(0))
+    val pointDf =
+      sparkSession.sql("select ST_GeogFromEWKT('SRID=4269;POINT(-71.064544 
42.28787)')")
+    assert(pointDf.count() == 1)
+    assert(pointDf.first().getAs[Geography](0).getSRID == 4269)
+  }
+
   it("Passed ST_GeogFromWKB") {
     // RAW binary array
     val wkbSeq = Seq[Array[Byte]](

Reply via email to