From ba291193de8c241f10a8bd39723e82cb514bc1f4 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 14:08:06 -0400 Subject: [PATCH 01/11] Add getUpperLeftX implementation --- .../org/apache/sedona/common/raster/RasterAccessors.java | 5 ++++- 1 file changed, 4 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 2794f93a2c..0e6f02b0b4 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 @@ -61,7 +61,10 @@ public static int getHeight(GridCoverage2D raster) { return raster.getGridGeometry().getGridRange().getSpan(1); } - + public static double getUpperLeftX(GridCoverage2D raster) { + Envelope2D envelope2D = raster.getEnvelope2D(); + return envelope2D.getMinX(); + } public static Geometry envelope(GridCoverage2D raster) throws FactoryException { Envelope2D envelope2D = raster.getEnvelope2D(); From 3588c8a22b2d81ebb0a57530bf0d3eaa838c0088 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 14:26:50 -0400 Subject: [PATCH 02/11] Add getUpperLeftX testcases --- .../sedona/common/raster/RasterAccessorsTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 c47570c076..8c37af2117 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,17 @@ public void testSrid() throws FactoryException { 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 testMetaData() throws FactoryException From 2a5d3e0422ae1323d68576583561b17d25e46ba1 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 14:45:04 -0400 Subject: [PATCH 03/11] docs of RS_UpperLeftX --- docs/api/sql/Raster-operators.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/api/sql/Raster-operators.md b/docs/api/sql/Raster-operators.md index 9157ccf852..9897e55e31 100644 --- a/docs/api/sql/Raster-operators.md +++ b/docs/api/sql/Raster-operators.md @@ -18,6 +18,26 @@ Output: 512 ``` +### 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_Width Introduction: Returns the width of the raster. From ed2aeac8358bf40949740232bf17fa68cf2e816d Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 14:53:01 -0400 Subject: [PATCH 04/11] Port RS_UpperLeftX to spark --- .../src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala | 3 ++- .../sql/sedona_sql/expressions/raster/RasterAccessors.scala | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) 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 95473c0553..d40ca8dda4 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 @@ -205,7 +205,8 @@ object Catalog { function[RS_AsGeoTiff](), function[RS_AsArcGrid](), function[RS_Width](), - function[RS_Height]() + function[RS_Height](), + function[RS_UpperLeftX]() ) val aggregateExpressions: Seq[Aggregator[Geometry, Geometry, Geometry]] = Seq( 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 13b477243f..5825b40699 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,12 @@ 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_Height(inputExpressions: Seq[Expression]) extends InferredExpression(RasterAccessors.getHeight _) { protected def withNewChildrenInternal(newChildren: IndexedSeq[Expression]) = { copy(inputExpressions = newChildren) From 37725e5d9059a200e1425f839b9859088992288a Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 15:18:17 -0400 Subject: [PATCH 05/11] Add RS_UpperLeftX testcase in spark sql --- .../scala/org/apache/sedona/sql/rasteralgebraTest.scala | 7 +++++++ 1 file changed, 7 insertions(+) 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 11e75e6dab..4071d5b8cd 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,13 @@ 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, 1e12) + } + 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) From fbfb7e4cbc06362351a78c6294efcde83502606a Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 15:20:33 -0400 Subject: [PATCH 06/11] Add getUpperLeftY implementation --- .../org/apache/sedona/common/raster/RasterAccessors.java | 5 +++++ 1 file changed, 5 insertions(+) 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 0e6f02b0b4..5f29076fee 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 @@ -66,6 +66,11 @@ public static double getUpperLeftX(GridCoverage2D raster) { return envelope2D.getMinX(); } + public static double getUpperLeftY(GridCoverage2D raster) { + Envelope2D envelope2D = raster.getEnvelope2D(); + return envelope2D.getMaxY(); + } + public static Geometry envelope(GridCoverage2D raster) throws FactoryException { Envelope2D envelope2D = raster.getEnvelope2D(); From b830eb68f7bf4974bfe08badfe43feb3acb8551c Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 15:29:39 -0400 Subject: [PATCH 07/11] Add getUpperLeftY testcases --- .../sedona/common/raster/RasterAccessorsTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 8c37af2117..095adccdc1 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 @@ -67,6 +67,16 @@ public void testUpperLeftX() throws FactoryException { 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 testMetaData() throws FactoryException From 96b783374cf50d018851282e7a59b332e7f48bc4 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 15:32:03 -0400 Subject: [PATCH 08/11] docs of RS_UpperLeftY --- docs/api/sql/Raster-operators.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/api/sql/Raster-operators.md b/docs/api/sql/Raster-operators.md index 9897e55e31..9fb0ce11e7 100644 --- a/docs/api/sql/Raster-operators.md +++ b/docs/api/sql/Raster-operators.md @@ -38,6 +38,26 @@ 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. From ea2dec991b7012bac210f632bb01e6e5b00f8572 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 15:34:36 -0400 Subject: [PATCH 09/11] Port RS_UpperLeftY to spark sql --- .../src/main/scala/org/apache/sedona/sql/UDF/Catalog.scala | 3 ++- .../sql/sedona_sql/expressions/raster/RasterAccessors.scala | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) 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 d40ca8dda4..5f35d03f85 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,7 +206,8 @@ object Catalog { function[RS_AsArcGrid](), function[RS_Width](), function[RS_Height](), - function[RS_UpperLeftX]() + function[RS_UpperLeftX](), + function[RS_UpperLeftY]() ) val aggregateExpressions: Seq[Aggregator[Geometry, Geometry, Geometry]] = Seq( 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 5825b40699..703fe89596 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 @@ -59,6 +59,12 @@ case class RS_UpperLeftX(inputExpressions: Seq[Expression]) extends InferredExpr } } +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) From 6a381d7935edce7dc56e15b924d69c040c680636 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 15:46:34 -0400 Subject: [PATCH 10/11] Add RS_UpperLeftY testcase in spark sql --- .../scala/org/apache/sedona/sql/rasteralgebraTest.scala | 7 +++++++ 1 file changed, 7 insertions(+) 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 4071d5b8cd..e7ae8b55e2 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 @@ -410,6 +410,13 @@ class rasteralgebraTest extends TestBaseScala with BeforeAndAfter with GivenWhen assertEquals(expected, result, 1e12) } + 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, 1e8) + } + 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) From d437fd9c2fe2b1b4912c13e6f9b047b9da847044 Mon Sep 17 00:00:00 2001 From: furqaankhan Date: Mon, 31 Jul 2023 18:01:12 -0400 Subject: [PATCH 11/11] Corrected exponential notion mistake --- .../test/scala/org/apache/sedona/sql/rasteralgebraTest.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e7ae8b55e2..ada7579d8d 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 @@ -407,14 +407,14 @@ class rasteralgebraTest extends TestBaseScala with BeforeAndAfter with GivenWhen 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, 1e12) + 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, 1e8) + assertEquals(expected, result, 1e-8) } it("Passed RS_Metadata") {