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)