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 b90dd6bf [SEDONA-336] Add RS_UpperLeftX and RS_UpperLeftY (#935)
b90dd6bf is described below

commit b90dd6bfc4c7a178aecc3f278a9058f8caf9228e
Author: Furqaanahmed Khan <[email protected]>
AuthorDate: Tue Aug 1 14:16:52 2023 -0400

    [SEDONA-336] Add RS_UpperLeftX and RS_UpperLeftY (#935)
---
 .../sedona/common/raster/RasterAccessors.java      | 10 +++++-
 .../sedona/common/raster/RasterAccessorsTest.java  | 22 ++++++++++++
 docs/api/sql/Raster-operators.md                   | 40 ++++++++++++++++++++++
 .../scala/org/apache/sedona/sql/UDF/Catalog.scala  |  2 ++
 .../expressions/raster/RasterAccessors.scala       | 12 +++++++
 .../org/apache/sedona/sql/rasteralgebraTest.scala  | 14 ++++++++
 6 files changed, 99 insertions(+), 1 deletion(-)

diff --git 
a/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java 
b/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java
index 9d232d1f..e5841680 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/RasterAccessors.java
@@ -63,6 +63,15 @@ public class RasterAccessors
         return raster.getGridGeometry().getGridRange().getSpan(1);
     }
 
+    public static double getUpperLeftX(GridCoverage2D raster) {
+        Envelope2D envelope2D = raster.getEnvelope2D();
+        return envelope2D.getMinX();
+    }
+
+    public static double getUpperLeftY(GridCoverage2D raster) {
+        Envelope2D envelope2D = raster.getEnvelope2D();
+        return envelope2D.getMaxY();
+    }
 
     public static double getScaleX(GridCoverage2D raster) {
         return getAffineTransform(raster).getScaleX();
@@ -81,7 +90,6 @@ public class RasterAccessors
         return (AffineTransform2D) crsTransform;
     }
 
-
     public static Geometry envelope(GridCoverage2D raster) throws 
FactoryException {
         Envelope2D envelope2D = raster.getEnvelope2D();
 
diff --git 
a/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java 
b/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java
index 60ab8346..d70ad0f8 100644
--- 
a/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java
+++ 
b/common/src/test/java/org/apache/sedona/common/raster/RasterAccessorsTest.java
@@ -56,6 +56,28 @@ public class RasterAccessorsTest extends RasterTestBase
         assertEquals(4326, RasterAccessors.srid(multiBandRaster));
     }
 
+    @Test
+    public void testUpperLeftX() throws FactoryException {
+        GridCoverage2D gridCoverage2D = RasterConstructors.makeEmptyRaster(1, 
3, 4, 1,2, 5);
+        double upperLeftX = RasterAccessors.getUpperLeftX(gridCoverage2D);
+        assertEquals(1, upperLeftX, 0.1d);
+
+        gridCoverage2D = RasterConstructors.makeEmptyRaster(10, 7, 8, 5, 6, 9);
+        upperLeftX = RasterAccessors.getUpperLeftX(gridCoverage2D);
+        assertEquals(5, upperLeftX, 0.1d);
+    }
+
+    @Test
+    public void testUpperLeftY() throws FactoryException {
+        GridCoverage2D gridCoverage2D = RasterConstructors.makeEmptyRaster(1, 
3, 4, 1,2, 5);
+        double upperLeftY = RasterAccessors.getUpperLeftY(gridCoverage2D);
+        assertEquals(2, upperLeftY, 0.1d);
+
+        gridCoverage2D = RasterConstructors.makeEmptyRaster(10, 7, 8, 5, 6, 9);
+        upperLeftY = RasterAccessors.getUpperLeftY(gridCoverage2D);
+        assertEquals(6, upperLeftY, 0.1d);    
+    }
+
     @Test
     public void testScaleX() throws UnsupportedOperationException, 
FactoryException {
         GridCoverage2D emptyRaster = RasterConstructors.makeEmptyRaster(2, 10, 
15, 0, 0, 1, 2, 0, 0, 0);
diff --git a/docs/api/sql/Raster-operators.md b/docs/api/sql/Raster-operators.md
index 25cca45b..5bead932 100644
--- a/docs/api/sql/Raster-operators.md
+++ b/docs/api/sql/Raster-operators.md
@@ -64,6 +64,46 @@ Output:
 -2
 ```
 
+### RS_UpperLeftX
+
+Introduction: Returns the X coordinate of the upper-left corner of the raster.
+
+Format: `RS_UpperLeftX(raster: Raster)`
+
+Since: `v1.5.0`
+
+Spark SQL Example:
+
+```sql
+SELECT RS_UpperLeftX(raster) FROM rasters
+```
+
+Output:
+
+```
+5
+```
+
+### RS_UpperLeftY
+
+Introduction: Returns the Y coordinate of the upper-left corner of the raster.
+
+Format: `RS_UpperLeftY(raster: Raster)`
+
+Since: `v1.5.0`
+
+Spark SQL Example:
+
+```sql
+SELECT RS_UpperLeftY(raster) FROM rasters
+```
+
+Output:
+
+```
+6
+```
+
 ### RS_Width
 
 Introduction: Returns the width of the raster.
diff --git a/sql/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala 
b/sql/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala
index 8ed7d61c..b392399a 100644
--- a/sql/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala
+++ b/sql/common/src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala
@@ -206,6 +206,8 @@ object Catalog {
     function[RS_AsArcGrid](),
     function[RS_Width](),
     function[RS_Height](),
+    function[RS_UpperLeftX](),
+    function[RS_UpperLeftY](),
     function[RS_ScaleX](),
     function[RS_ScaleY]()
   )
diff --git 
a/sql/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
 
b/sql/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
index 284ec3fc..39c45d8e 100644
--- 
a/sql/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
+++ 
b/sql/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterAccessors.scala
@@ -53,6 +53,18 @@ case class RS_Width(inputExpressions: Seq[Expression]) 
extends InferredExpressio
   }
 }
 
+case class RS_UpperLeftX(inputExpressions: Seq[Expression]) extends 
InferredExpression(RasterAccessors.getUpperLeftX _) {
+  protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = 
{
+    copy(inputExpressions = newChildren)
+  }
+}
+
+case class RS_UpperLeftY(inputExpressions: Seq[Expression]) extends 
InferredExpression(RasterAccessors.getUpperLeftY _) {
+  protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = 
{
+    copy(inputExpressions = newChildren)
+  }
+}
+
 case class RS_Height(inputExpressions: Seq[Expression]) extends 
InferredExpression(RasterAccessors.getHeight _) {
   protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = 
{
     copy(inputExpressions = newChildren)
diff --git 
a/sql/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala 
b/sql/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
index 1689099d..36d21b73 100644
--- a/sql/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
+++ b/sql/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
@@ -403,6 +403,20 @@ class rasteralgebraTest extends TestBaseScala with 
BeforeAndAfter with GivenWhen
       assertEquals(rasterDf.count(), binaryDf.count())
     }
 
+    it("Passed RS_UpperLeftX"){
+      val df = sparkSession.read.format("binaryFile").load(resourceFolder + 
"raster/test1.tiff")
+      val result = 
df.selectExpr("RS_UpperLeftX(RS_FromGeoTiff(content))").first().getDouble(0)
+      val expected: Double = -1.3095817809482181E7
+      assertEquals(expected, result, 1e-12)
+    }
+
+    it("Passed RS_UpperLeftY") {
+      val df = sparkSession.read.format("binaryFile").load(resourceFolder + 
"raster/test1.tiff")
+      val result = 
df.selectExpr("RS_UpperLeftY(RS_FromGeoTiff(content))").first().getDouble(0)
+      val expected: Double = 4021262.7487925636
+      assertEquals(expected, result, 1e-8)
+    }
+
     it("Passed RS_Metadata") {
       val df = sparkSession.read.format("binaryFile").load(resourceFolder + 
"raster/test1.tiff")
       val result = 
df.selectExpr("RS_Metadata(RS_FromGeoTiff(content))").first().getSeq(0)

Reply via email to