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 <Point Tagged Text> 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]](