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 e83a55b02 [SEDONA-633,SEDONA-629] Add tileWidth and tileHeight to the
result of RS_Metadata, changed the data types of fields of the result struct of
RS_Metadata (#1539)
e83a55b02 is described below
commit e83a55b029ef33d3221ab8787e83448fb9453d5f
Author: Kristin Cowalcijk <[email protected]>
AuthorDate: Tue Aug 6 00:47:41 2024 +0800
[SEDONA-633,SEDONA-629] Add tileWidth and tileHeight to the result of
RS_Metadata, changed the data types of fields of the result struct of
RS_Metadata (#1539)
Changed the data types of fields of the result struct of RS_Metadata
---
.../sedona/common/raster/RasterAccessors.java | 74 ++++++++++++-
.../sedona/common/raster/RasterAccessorsTest.java | 31 +++++-
.../sedona/common/raster/RasterEditorsTest.java | 22 ++--
docs/api/sql/Raster-operators.md | 8 +-
.../expressions/raster/RasterFunctions.scala | 26 +++--
.../org/apache/sedona/sql/rasteralgebraTest.scala | 114 ++++++++++-----------
6 files changed, 194 insertions(+), 81 deletions(-)
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 0baccaff0..cdf08d56a 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
@@ -19,6 +19,7 @@
package org.apache.sedona.common.raster;
import java.awt.geom.Point2D;
+import java.awt.image.RenderedImage;
import java.util.Arrays;
import java.util.Set;
import org.apache.sedona.common.utils.RasterUtils;
@@ -266,6 +267,7 @@ public class RasterAccessors {
// Get Geo-reference metadata
GridEnvelope2D gridRange = raster.getGridGeometry().getGridRange2D();
AffineTransform2D affine = RasterUtils.getGDALAffineTransform(raster);
+ RenderedImage image = raster.getRenderedImage();
// Get the affine parameters
double upperLeftX = affine.getTranslateX();
@@ -274,6 +276,8 @@ public class RasterAccessors {
double scaleY = affine.getScaleY();
double skewX = affine.getShearX();
double skewY = affine.getShearY();
+ double tileWidth = image.getTileWidth();
+ double tileHeight = image.getTileHeight();
return new double[] {
upperLeftX,
upperLeftY,
@@ -284,7 +288,75 @@ public class RasterAccessors {
skewX,
skewY,
srid(raster),
- raster.getNumSampleDimensions()
+ raster.getNumSampleDimensions(),
+ tileWidth,
+ tileHeight
};
}
+
+ public static class RasterMetadata {
+ public double upperLeftX;
+ public double upperLeftY;
+ public int gridWidth;
+ public int gridHeight;
+ public double scaleX;
+ public double scaleY;
+ public double skewX;
+ public double skewY;
+ public int srid;
+ public int numBands;
+ public int tileWidth;
+ public int tileHeight;
+
+ public RasterMetadata(
+ double upperLeftX,
+ double upperLeftY,
+ int gridWidth,
+ int gridHeight,
+ double scaleX,
+ double scaleY,
+ double skewX,
+ double skewY,
+ int srid,
+ int numBands,
+ int tileWidth,
+ int tileHeight) {
+ this.upperLeftX = upperLeftX;
+ this.upperLeftY = upperLeftY;
+ this.gridWidth = gridWidth;
+ this.gridHeight = gridHeight;
+ this.scaleX = scaleX;
+ this.scaleY = scaleY;
+ this.skewX = skewX;
+ this.skewY = skewY;
+ this.srid = srid;
+ this.numBands = numBands;
+ this.tileWidth = tileWidth;
+ this.tileHeight = tileHeight;
+ }
+ }
+
+ /**
+ * Returns the metadata of a raster as a {@link RasterMetadata} object.
+ *
+ * @param raster the raster
+ * @return a {@link RasterMetadata} object
+ * @throws FactoryException
+ */
+ public static RasterMetadata rasterMetadata(GridCoverage2D raster) throws
FactoryException {
+ double[] meta = metadata(raster);
+ return new RasterMetadata(
+ meta[0],
+ meta[1],
+ (int) meta[2],
+ (int) meta[3],
+ meta[4],
+ meta[5],
+ meta[6],
+ meta[7],
+ (int) meta[8],
+ (int) meta[9],
+ (int) meta[10],
+ (int) meta[11]);
+ }
}
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 8bc26fc17..f1a256d2c 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
@@ -379,7 +379,9 @@ public class RasterAccessorsTest extends RasterTestBase {
assertEquals(0, metadata[7], 1e-9);
assertEquals(0, metadata[8], 1e-9);
assertEquals(numBands, metadata[9], 1e-9);
- assertEquals(10, metadata.length);
+ assertEquals(widthInPixel, metadata[10], 1e-9);
+ assertEquals(heightInPixel, metadata[11], 1e-9);
+ assertEquals(12, metadata.length);
upperLeftX = 5;
upperLeftY = 6;
@@ -404,8 +406,29 @@ public class RasterAccessorsTest extends RasterTestBase {
assertEquals(0, metadata[7], 1e-9);
assertEquals(0, metadata[8], 1e-9);
assertEquals(numBands, metadata[9], 1e-9);
+ assertEquals(widthInPixel, metadata[10], 1e-9);
+ assertEquals(heightInPixel, metadata[11], 1e-9);
- assertEquals(10, metadata.length);
+ assertEquals(12, metadata.length);
+ }
+
+ @Test
+ public void testMetadataOfTiledRasters() throws IOException,
FactoryException {
+ GridCoverage2D raster = rasterFromGeoTiff(resourceFolder +
"raster/test1.tiff");
+ double[] metadata = RasterAccessors.metadata(raster);
+ assertEquals(-13095817.809, metadata[0], 0.01);
+ assertEquals(4021262.749, metadata[1], 0.01);
+ assertEquals(512, metadata[2], 1e-9);
+ assertEquals(517, metadata[3], 1e-9);
+ assertEquals(72.328612721326948, metadata[4], 0.001);
+ assertEquals(-72.328612721326948, metadata[5], 0.001);
+ assertEquals(0, metadata[6], 1e-9);
+ assertEquals(0, metadata[7], 1e-9);
+ assertEquals(3857, metadata[8], 1e-9);
+ assertEquals(1, metadata[9], 1e-9);
+ assertEquals(256, metadata[10], 1e-9);
+ assertEquals(256, metadata[11], 1e-9);
+ assertEquals(12, metadata.length);
}
@Test
@@ -443,6 +466,8 @@ public class RasterAccessorsTest extends RasterTestBase {
assertEquals(skewY, metadata[7], 1e-9);
assertEquals(3857, metadata[8], 1e-9);
assertEquals(numBands, metadata[9], 1e-9);
- assertEquals(10, metadata.length);
+ assertEquals(widthInPixel, metadata[10], 1e-9);
+ assertEquals(heightInPixel, metadata[11], 1e-9);
+ assertEquals(12, metadata.length);
}
}
diff --git
a/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
b/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
index 378f9783f..809052d3f 100644
---
a/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
+++
b/common/src/test/java/org/apache/sedona/common/raster/RasterEditorsTest.java
@@ -3600,7 +3600,7 @@ public class RasterEditorsTest extends RasterTestBase {
-0.33333333333333326, 0.19999999999999996, 6, 5, 1.388888888888889,
-1.24, 0, 0, 0, 1
};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
@@ -3621,7 +3621,7 @@ public class RasterEditorsTest extends RasterTestBase {
-0.20000000298023224, 0.4000000059604645, 7.0, 5.0, 1.2, -1.4, 0.0,
0.0, 0.0, 1.0
};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
}
@@ -3679,7 +3679,7 @@ public class RasterEditorsTest extends RasterTestBase {
};
assertEquals(expectedRes1, res1);
assertEquals(expectedRes2, res2);
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
@@ -3716,7 +3716,7 @@ public class RasterEditorsTest extends RasterTestBase {
};
assertEquals(expectedRes1, res1);
assertEquals(expectedRes2, res2);
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
@@ -3749,7 +3749,7 @@ public class RasterEditorsTest extends RasterTestBase {
};
assertEquals(expectedRes1, res1);
assertEquals(expectedRes2, res2);
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
}
@@ -3772,7 +3772,7 @@ public class RasterEditorsTest extends RasterTestBase {
double[] metadata = RasterAccessors.metadata(newRaster);
double[] expectedMetadata = {0, 0, 6, 5, 1.3333333333333333, -1.2, 0, 0,
0, 1};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
@@ -3790,7 +3790,7 @@ public class RasterEditorsTest extends RasterTestBase {
metadata = RasterAccessors.metadata(newRaster);
expectedMetadata = new double[] {0, 0, 7, 5, 1.2, -1.4, 0, 0, 0, 1};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
}
@@ -3819,7 +3819,7 @@ public class RasterEditorsTest extends RasterTestBase {
-0.33333333333333326, 0.19999999999999996, 6, 5, 1.388888888888889,
-1.24, 0, 0, 0, 1
};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
@@ -3840,7 +3840,7 @@ public class RasterEditorsTest extends RasterTestBase {
-0.20000000298023224, 0.4000000059604645, 7.0, 5.0, 1.2, -1.4, 0.0,
0.0, 0.0, 1.0
};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
}
@@ -3868,7 +3868,7 @@ public class RasterEditorsTest extends RasterTestBase {
double[] metadata = RasterAccessors.metadata(newRaster);
double[] expectedMetadata = {0, 0, 5, 5, 1.2, -1.2, 0, 0, 0, 1};
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
@@ -3885,7 +3885,7 @@ public class RasterEditorsTest extends RasterTestBase {
assertEquals(expectedRes, res);
metadata = RasterAccessors.metadata(newRaster);
// verify correct raster geometry
- for (int i = 0; i < metadata.length; i++) {
+ for (int i = 0; i < expectedMetadata.length; i++) {
assertEquals(expectedMetadata[i], metadata[i], 1e-6);
}
}
diff --git a/docs/api/sql/Raster-operators.md b/docs/api/sql/Raster-operators.md
index 08b2d6295..91c72ee25 100644
--- a/docs/api/sql/Raster-operators.md
+++ b/docs/api/sql/Raster-operators.md
@@ -1553,9 +1553,15 @@ Introduction: Returns the metadata of the raster as a
struct. The struct has the
- skewY: skew in y direction (rotation y)
- srid: srid of the raster
- numSampleDimensions: number of bands
+- tileWidth: (Since `v1.6.1`) width of tiles in the raster
+- tileHeight: (Since `v1.6.1`) height of tiles in the raster
For more information about ScaleX, ScaleY, SkewX, SkewY, please refer to the
[Affine Transformations](Raster-affine-transformation.md) section.
+`tileWidth` and `tileHeight` are available since `v1.6.1`, they are the
dimensions of the tiles in the raster. For example,
+rasters written by `RS_FromGeoTiff` uses the tiling scheme of the loaded
GeoTIFF file. For rasters that has only 1 tile,
+`tileWidth` and `tileHeight` will be equal to `gridWidth` and `gridHeight`
respectively.
+
Format: `RS_MetaData (raster: Raster)`
Since: `v1.4.1`
@@ -1569,7 +1575,7 @@ SELECT RS_MetaData(raster) FROM raster_table
Output:
```
-{-1.3095817809482181E7, 4021262.7487925636, 512.0, 517.0, 72.32861272132695,
-72.32861272132695, 0.0, 0.0, 3857.0, 1.0}
+{-1.3095817809482181E7, 4021262.7487925636, 512, 517, 72.32861272132695,
-72.32861272132695, 0.0, 0.0, 3857, 1, 256, 256}
```
### RS_NormalizeAll
diff --git
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterFunctions.scala
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterFunctions.scala
index 971be31ae..04da5704a 100644
---
a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterFunctions.scala
+++
b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/RasterFunctions.scala
@@ -38,14 +38,16 @@ case class RS_Metadata(inputExpressions: Seq[Expression])
Seq(
StructField("upperLeftX", DoubleType, nullable = false),
StructField("upperLeftY", DoubleType, nullable = false),
- StructField("gridWidth", DoubleType, nullable = false),
- StructField("gridHeight", DoubleType, nullable = false),
+ StructField("gridWidth", IntegerType, nullable = false),
+ StructField("gridHeight", IntegerType, nullable = false),
StructField("scaleX", DoubleType, nullable = false),
StructField("scaleY", DoubleType, nullable = false),
StructField("skewX", DoubleType, nullable = false),
StructField("skewY", DoubleType, nullable = false),
- StructField("srid", DoubleType, nullable = false),
- StructField("numSampleDimensions", DoubleType, nullable = false)))
+ StructField("srid", IntegerType, nullable = false),
+ StructField("numSampleDimensions", IntegerType, nullable = false),
+ StructField("tileWidth", IntegerType, nullable = false),
+ StructField("tileHeight", IntegerType, nullable = false)))
override def eval(input: InternalRow): Any = {
// Evaluate the input expressions
@@ -56,10 +58,22 @@ case class RS_Metadata(inputExpressions: Seq[Expression])
null
} else {
// Get the metadata using the Java method
- val metaData = RasterAccessors.metadata(rasterGeom)
+ val metaData = RasterAccessors.rasterMetadata(rasterGeom)
// Create an InternalRow with the metadata
- InternalRow.fromSeq(metaData.map(_.asInstanceOf[Any]))
+ InternalRow(
+ metaData.upperLeftX,
+ metaData.upperLeftY,
+ metaData.gridWidth,
+ metaData.gridHeight,
+ metaData.scaleX,
+ metaData.scaleY,
+ metaData.skewX,
+ metaData.skewY,
+ metaData.srid,
+ metaData.numBands,
+ metaData.tileWidth,
+ metaData.tileHeight)
}
}
diff --git
a/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
b/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
index 3343ae64e..ea81708ae 100644
--- a/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
+++ b/spark/common/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
@@ -23,7 +23,7 @@ import org.apache.sedona.common.utils.RasterUtils
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{DataFrame, Row, SaveMode}
import org.apache.spark.sql.functions.{col, collect_list, expr, lit,
row_number}
-import org.apache.spark.sql.types.{DoubleType, StructField, StructType}
+import org.apache.spark.sql.types.{DoubleType, IntegerType, StructField,
StructType}
import org.geotools.coverage.grid.GridCoverage2D
import org.junit.Assert.{assertEquals, assertNotNull, assertNull, assertTrue}
import org.locationtech.jts.geom.{Coordinate, Geometry}
@@ -446,28 +446,30 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
Seq(
StructField("upperLeftX", DoubleType, nullable = false),
StructField("upperLeftY", DoubleType, nullable = false),
- StructField("gridWidth", DoubleType, nullable = false),
- StructField("gridHeight", DoubleType, nullable = false),
+ StructField("gridWidth", IntegerType, nullable = false),
+ StructField("gridHeight", IntegerType, nullable = false),
StructField("scaleX", DoubleType, nullable = false),
StructField("scaleY", DoubleType, nullable = false),
StructField("skewX", DoubleType, nullable = false),
StructField("skewY", DoubleType, nullable = false),
- StructField("srid", DoubleType, nullable = false),
- StructField("numSampleDimensions", DoubleType, nullable = false)))
+ StructField("srid", IntegerType, nullable = false),
+ StructField("numSampleDimensions", IntegerType, nullable = false),
+ StructField("tileWidth", IntegerType, nullable = false),
+ StructField("tileHeight", IntegerType, nullable = false)))
assert(dfResult.schema("metadata").dataType == expectedSchema)
assert(dfResult.schema("metadata_4326").dataType == expectedSchema)
// Assert metadata fields
- assert(metadata.getDouble(0) == metadata_4326.getDouble(0))
- assert(metadata.getDouble(1) == metadata_4326.getDouble(1))
- assert(metadata.getDouble(2) == metadata_4326.getDouble(2))
- assert(metadata.getDouble(3) == metadata_4326.getDouble(3))
- assert(metadata.getDouble(4) == metadata_4326.getDouble(4))
- assert(metadata.getDouble(5) == metadata_4326.getDouble(5))
- assert(metadata.getDouble(6) == metadata_4326.getDouble(6))
- assert(metadata.getDouble(7) == metadata_4326.getDouble(7))
- assert(metadata.getDouble(9) == metadata_4326.getDouble(9))
+ assert(metadata(0) == metadata_4326(0))
+ assert(metadata(1) == metadata_4326(1))
+ assert(metadata(2) == metadata_4326(2))
+ assert(metadata(3) == metadata_4326(3))
+ assert(metadata(4) == metadata_4326(4))
+ assert(metadata(5) == metadata_4326(5))
+ assert(metadata(6) == metadata_4326(6))
+ assert(metadata(7) == metadata_4326(7))
+ assert(metadata(9) == metadata_4326(9))
}
it("Passed RS_SetGeoReference should handle null values") {
@@ -967,14 +969,9 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
.first()
.getStruct(0)
- // Convert Struct to Seq[Double]
- def structToSeq(struct: Row): Seq[Double] = {
- (0 until struct.size).map(struct.getDouble)
- }
-
// Compare the metadata
- val clippedMetadataSeq = structToSeq(clippedMetadata).slice(0, 9)
- val originalMetadataSeq = structToSeq(originalMetadata).slice(0, 9)
+ val clippedMetadataSeq = metadataStructToSeq(clippedMetadata).slice(0, 9)
+ val originalMetadataSeq = metadataStructToSeq(originalMetadata).slice(0,
9)
assert(
clippedMetadataSeq == originalMetadataSeq,
s"Expected: $originalMetadataSeq, but got: $clippedMetadataSeq")
@@ -1189,19 +1186,12 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val result =
df.selectExpr("RS_Metadata(RS_FromGeoTiff(content)) as
metadata").first().getStruct(0)
- // Function to convert Struct to Seq[Double]
- def structToSeq(struct: Row): Seq[Double] = {
- (0 until struct.size).map(struct.getDouble)
- }
-
- // Convert the struct to a sequence of doubles
- val metadataSeq = structToSeq(result)
-
- // Assertions
- assert(metadataSeq.length == 10)
- assert(metadataSeq(2) == 512.0)
- assert(metadataSeq(3) == 517.0)
- assert(metadataSeq(9) == 1.0)
+ assert(result.length == 12)
+ assert(result(2) == 512)
+ assert(result(3) == 517)
+ assert(result(9) == 1)
+ assert(result(10) == 256)
+ assert(result(11) == 256)
}
it("Passed RS_MakeEmptyRaster") {
@@ -1217,7 +1207,7 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
s"SELECT RS_Metadata(RS_MakeEmptyRaster($numBands, $widthInPixel,
$heightInPixel, $upperLeftX, $upperLeftY, $cellSize))")
.first()
.getStruct(0)
- assertEquals(numBands, result.getDouble(9), 0.001)
+ assertEquals(numBands, result.getInt(9))
// Test without skewX, skewY, srid
result = sparkSession
@@ -1225,7 +1215,7 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
s"SELECT RS_Metadata(RS_MakeEmptyRaster($numBands, 'I',
$widthInPixel, $heightInPixel, $upperLeftX, $upperLeftY, $cellSize))")
.first()
.getStruct(0)
- assertEquals(numBands, result.getDouble(9), 0.001)
+ assertEquals(numBands, result.getInt(9))
// Test with integer type input
result = sparkSession
@@ -1233,7 +1223,7 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
s"SELECT RS_Metadata(RS_MakeEmptyRaster($numBands, $widthInPixel,
$heightInPixel, ${upperLeftX.toInt}, ${upperLeftY.toInt}, ${cellSize.toInt}))")
.first()
.getStruct(0)
- assertEquals(numBands, result.getDouble(9), 0.001)
+ assertEquals(numBands, result.getInt(9))
// Test with skewX, skewY, srid but WITHOUT datatype
val skewX = 0.0
@@ -1244,7 +1234,7 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
s"SELECT RS_Metadata(RS_MakeEmptyRaster($numBands, $widthInPixel,
$heightInPixel, $upperLeftX, $upperLeftY, $cellSize, -$cellSize, $skewX,
$skewY, $srid))")
.first()
.getStruct(0)
- assertEquals(numBands, result.getDouble(9), 0.001)
+ assertEquals(numBands, result.getInt(9))
// Test with skewX, skewY, srid and datatype
result = sparkSession
@@ -1252,7 +1242,7 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
s"SELECT RS_Metadata(RS_MakeEmptyRaster($numBands, 'I',
$widthInPixel, $heightInPixel, $upperLeftX, $upperLeftY, $cellSize, -$cellSize,
$skewX, $skewY, $srid))")
.first()
.getStruct(0)
- assertEquals(numBands, result.getDouble(9), 0.001)
+ assertEquals(numBands, result.getInt(9))
}
it("Passed RS_MakeRaster") {
@@ -1261,8 +1251,8 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
.load(resourceFolder + "raster/test1.tiff")
.withColumn("rast", expr("RS_FromGeoTiff(content)"))
val metadata =
df.selectExpr("RS_Metadata(rast)").first().getStruct(0).toSeq
- val width = metadata(2).asInstanceOf[Double].toInt
- val height = metadata(3).asInstanceOf[Double].toInt
+ val width = metadata(2).asInstanceOf[Int]
+ val height = metadata(3).asInstanceOf[Int]
val values = Array.tabulate(width * height) { i => i * i }
// Attach values as a new column to the dataframe
@@ -1293,8 +1283,8 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val df = sparkSession.read.format("binaryFile").load(resourceFolder +
"raster/test1.tiff")
val metadata =
df.selectExpr("RS_Metadata(RS_FromGeoTiff(content))").first().getStruct(0).toSeq
- val width = metadata(2).asInstanceOf[Double].toInt
- val height = metadata(3).asInstanceOf[Double].toInt
+ val width = metadata(2).asInstanceOf[Int]
+ val height = metadata(3).asInstanceOf[Int]
val result = df.selectExpr("RS_BandAsArray(RS_FromGeoTiff(content),
1)").first().getSeq(0)
assertEquals(width * height, result.length)
val resultOutOfBound =
@@ -2505,13 +2495,14 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val rasterDf = df.selectExpr("RS_Resample(raster, 6, 5, 1, -1, false,
null) as raster")
val rasterOutput =
rasterDf.selectExpr("RS_AsMatrix(raster)").first().getString(0)
val rasterMetadata =
rasterDf.selectExpr("RS_Metadata(raster)").first().getStruct(0)
+ val rasterMetadataSeq = metadataStructToSeq(rasterMetadata)
val expectedOutput =
"| 1.0 1.0 2.0 3.0 3.0 5.0|\n" + "| 1.0 1.0 2.0 3.0
3.0 5.0|\n" + "| 4.0 4.0 5.0 6.0 6.0 9.0|\n" + "| 7.0 7.0 8.0
9.0 9.0 10.0|\n" + "| 7.0 7.0 8.0 9.0 9.0 10.0|\n"
val expectedMetadata: Seq[Double] =
Seq(-0.33333333333333326, 0.19999999999999996, 6, 5,
1.388888888888889, -1.24, 0, 0, 0, 1)
assertEquals(expectedOutput, rasterOutput)
for (i <- expectedMetadata.indices) {
- assertEquals(expectedMetadata(i), rasterMetadata.getDouble(i), 1e-6)
+ assertEquals(expectedMetadata(i), rasterMetadataSeq(i), 1e-6)
}
}
@@ -2522,12 +2513,13 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val rasterDf = df.selectExpr("RS_Resample(raster, 1.2, -1.4, true, null)
as raster")
val rasterOutput =
rasterDf.selectExpr("RS_AsMatrix(raster)").first().getString(0)
val rasterMetadata =
rasterDf.selectExpr("RS_Metadata(raster)").first().getStruct(0)
+ val rasterMetadataSeq = metadataStructToSeq(rasterMetadata)
val expectedOutput =
"| 1.0 1.0 2.0 3.0 3.0 5.0 5.0|\n" + "| 4.0 4.0
5.0 6.0 6.0 9.0 9.0|\n" + "| 4.0 4.0 5.0 6.0 6.0
9.0 9.0|\n" + "| 7.0 7.0 8.0 9.0 9.0 10.0 10.0|\n" + "|
NaN NaN NaN NaN NaN NaN NaN|\n"
val expectedMetadata: Seq[Double] = Seq(0, 0, 7, 5, 1.2, -1.4, 0, 0, 0,
1)
assertEquals(expectedOutput, rasterOutput)
for (i <- expectedMetadata.indices) {
- assertEquals(expectedMetadata(i), rasterMetadata.getDouble(i), 1e-6)
+ assertEquals(expectedMetadata(i), rasterMetadataSeq(i), 1e-6)
}
}
@@ -2539,13 +2531,14 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val rasterDf = df.selectExpr("RS_Resample(raster, refRaster, true, null)
as raster")
val rasterOutput =
rasterDf.selectExpr("RS_AsMatrix(raster)").first().getString(0)
val rasterMetadata =
rasterDf.selectExpr("RS_Metadata(raster)").first().getStruct(0)
+ val rasterMetadataSeq = metadataStructToSeq(rasterMetadata)
val expectedOutput =
"| 1.0 1.0 2.0 3.0 3.0 5.0 5.0|\n" + "| 1.0 1.0 2.0
3.0 3.0 5.0 5.0|\n" + "| 4.0 4.0 5.0 6.0 6.0 9.0 9.0|\n" + "|
7.0 7.0 8.0 9.0 9.0 10.0 10.0|\n" + "| 7.0 7.0 8.0 9.0 9.0
10.0 10.0|\n"
val expectedMetadata: Seq[Double] =
Seq(-0.20000000298023224, 0.4000000059604645, 7.0, 5.0, 1.2, -1.4,
0.0, 0.0, 0.0, 1.0)
assertEquals(expectedOutput, rasterOutput)
for (i <- expectedMetadata.indices) {
- assertEquals(expectedMetadata(i), rasterMetadata.getDouble(i), 1e-6)
+ assertEquals(expectedMetadata(i), rasterMetadataSeq(i), 1e-6)
}
}
@@ -2577,9 +2570,9 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val expectedMetadata = Seq(4.9375, 50.9375, 80, 48, 0.125, -0.125, 0, 0,
0, 4)
val actualMetadata =
rasterDf.selectExpr("RS_Metadata(raster) as
metadata").first().getStruct(0)
-
+ val actualMetadataSeq = metadataStructToSeq(actualMetadata)
for (i <- expectedMetadata.indices) {
- assertEquals(expectedMetadata(i), actualMetadata.getDouble(i), 1e-6)
+ assertEquals(expectedMetadata(i), actualMetadataSeq(i), 1e-6)
}
val expectedFirstVal = 60.95357131958008
@@ -2595,10 +2588,9 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
val expectedMetadata = Seq(4.9375, 50.9375, 80, 48, 0.125, -0.125, 0, 0,
0, 4)
val actualMetadata =
rasterDf.selectExpr("RS_Metadata(raster) as
metadata").first().getStruct(0)
-
- for (i <- expectedMetadata.indices) {
- assertEquals(expectedMetadata(i), actualMetadata.getDouble(i), 1e-6)
- }
+ val actualMetadataSeq = metadataStructToSeq(actualMetadata)
+ for (i <- expectedMetadata.indices)
+ assertEquals(expectedMetadata(i), actualMetadataSeq(i), 1e-6)
val expectedFirstVal = 60.95357131958008
val actualFirstVal =
@@ -2628,18 +2620,22 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
// Extract the expected metadata struct
val expectedMetadataStruct =
expectedDf.selectExpr(expectedCol).first().getStruct(0)
- // Function to convert Struct to Seq[Double]
- def structToSeq(struct: Row): Seq[Double] = {
- (0 until struct.size).map(struct.getDouble)
- }
-
// Convert Structs to Seqs
- val actualMetadata = structToSeq(actualMetadataStruct).slice(0, 9)
- val expectedMetadata = structToSeq(expectedMetadataStruct).slice(0, 9)
+ val actualMetadata = metadataStructToSeq(actualMetadataStruct).slice(0, 9)
+ val expectedMetadata =
metadataStructToSeq(expectedMetadataStruct).slice(0, 9)
// Compare the actual and expected metadata
assert(
actualMetadata == expectedMetadata,
s"Expected: $expectedMetadata, but got: $actualMetadata")
}
+
+ private def metadataStructToSeq(struct: Row): Seq[Double] = {
+ (0 until struct.length).map { k =>
+ struct(k) match {
+ case value: Int => value.toDouble
+ case value: Double => value
+ }
+ }
+ }
}