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 e8ba4479a [SEDONA-605] Fix rasterization when useGeometryExtent=false 
(#1473)
e8ba4479a is described below

commit e8ba4479a3f72e368fc7e88ef5703204deeee0dc
Author: Kristin Cowalcijk <[email protected]>
AuthorDate: Mon Jun 10 14:33:32 2024 +0800

    [SEDONA-605] Fix rasterization when useGeometryExtent=false (#1473)
---
 .../sedona/common/raster/RasterConstructors.java   | 26 +++++----------
 .../common/raster/RasterBandAccessorsTest.java     | 10 +++---
 .../common/raster/RasterConstructorsTest.java      | 39 +++++++++++++++-------
 .../scala/org/apache/sedona/sql/rasterIOTest.scala | 10 +++---
 .../org/apache/sedona/sql/rasteralgebraTest.scala  | 10 +++---
 5 files changed, 50 insertions(+), 45 deletions(-)

diff --git 
a/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java 
b/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java
index c7635c70b..78b5434e2 100644
--- 
a/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java
+++ 
b/common/src/main/java/org/apache/sedona/common/raster/RasterConstructors.java
@@ -178,29 +178,19 @@ public class RasterConstructors
 
         Envelope2D bound = null;
 
+        int width, height;
         if (useGeometryExtent) {
             bound = JTS.getEnvelope2D(geom.getEnvelopeInternal(), 
raster.getCoordinateReferenceSystem2D());
+            double scaleX = Math.abs(metadata[4]), scaleY = 
Math.abs(metadata[5]);
+            width = Math.max((int) Math.ceil(bound.getWidth() / scaleX), 1);
+            height = Math.max((int) Math.ceil(bound.getHeight() / scaleY), 1);
+            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), 
bound.getMinX(), bound.getMinY(), width * scaleX, height * scaleY);
         } else {
             ReferencedEnvelope envelope = 
ReferencedEnvelope.create(raster.getEnvelope(), 
raster.getCoordinateReferenceSystem());
             bound = JTS.getEnvelope2D(envelope, 
raster.getCoordinateReferenceSystem2D());
-        }
-
-        double scaleX = Math.abs(metadata[4]), scaleY = Math.abs(metadata[5]);
-        int width = (int) bound.getWidth(), height = (int) bound.getHeight();
-        if (width == 0 && height == 0) {
-            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), 
bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, scaleX, 
scaleY);
-            width = 1;
-            height = 1;
-        } else if (height == 0) {
-            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), 
bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, width, 
scaleY);
-            height = 1;
-        } else if (width == 0) {
-            bound = new Envelope2D(bound.getCoordinateReferenceSystem(), 
bound.getCenterX() - scaleX * 0.5, bound.getCenterY() - scaleY * 0.5, scaleX, 
height);
-            width = 1;
-        } else {
-            // To preserve scale of reference raster
-            width = (int) (width / scaleX);
-            height = (int) (height / scaleY);
+            GridEnvelope2D gridRange = 
raster.getGridGeometry().getGridRange2D();
+            width = gridRange.width;
+            height = gridRange.height;
         }
 
         VectorToRasterProcess rasterProcess = new VectorToRasterProcess();
diff --git 
a/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
 
b/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
index 306aed86f..cb9ef0b57 100644
--- 
a/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
+++ 
b/common/src/test/java/org/apache/sedona/common/raster/RasterBandAccessorsTest.java
@@ -86,11 +86,11 @@ public class RasterBandAccessorsTest extends RasterTestBase 
{
         Geometry geom = Constructors.geomFromWKT(polygon, 
RasterAccessors.srid(raster));
 
         double actual = RasterBandAccessors.getZonalStats(raster, geom, 1, 
"sum", false);
-        double expected = 1.0690406E7;
+        double expected = 1.0719726E7;
         assertEquals(expected, actual, 0d);
 
         actual = RasterBandAccessors.getZonalStats(raster, geom, 2, "mean", 
false);
-        expected = 220.6062;
+        expected = 220.7527;
         assertEquals(expected, actual, FP_TOLERANCE);
 
         actual = RasterBandAccessors.getZonalStats(raster, geom, 1, "count");
@@ -98,7 +98,7 @@ public class RasterBandAccessorsTest extends RasterTestBase {
         assertEquals(expected, actual, 0.1d);
 
         actual = RasterBandAccessors.getZonalStats(raster, geom, 3, 
"variance", false);
-        expected = 13554.5057;
+        expected = 13549.6263;
         assertEquals(expected, actual, FP_TOLERANCE);
 
         actual = RasterBandAccessors.getZonalStats(raster, geom, "max");
@@ -110,7 +110,7 @@ public class RasterBandAccessorsTest extends RasterTestBase 
{
         assertEquals(expected, actual, 1E-1);
 
         actual = RasterBandAccessors.getZonalStats(raster, geom, 1, "sd", 
false);
-        expected = 92.1327;
+        expected = 92.1500;
         assertEquals(expected, actual, FP_TOLERANCE);
 
         geom = Constructors.geomFromWKT("POLYGON ((-77.96672569800863073 
37.91971182746296876, -77.9688630154902711 37.89620133516485367, 
-77.93936803424354309 37.90517806858776595, -77.96672569800863073 
37.91971182746296876))", 0);
@@ -166,7 +166,7 @@ public class RasterBandAccessorsTest extends RasterTestBase 
{
         Geometry geom = Constructors.geomFromWKT(polygon, 3857);
 
         double[] actual = RasterBandAccessors.getZonalStatsAll(raster, geom, 
1, false);
-        double[] expected = new double[] {184792.0, 1.0690406E7, 57.8510, 0.0, 
0.0, 92.1327, 8488.4480, 0.0, 255.0};
+        double[] expected = new double[] {184792.0, 1.0719726E7, 
58.00968656653401, 0.0, 0.0, 92.15004748703687, 8491.631251863151, 0.0, 255.0};
         assertArrayEquals(expected, actual, FP_TOLERANCE);
 
         geom = Constructors.geomFromWKT("POLYGON ((-77.96672569800863073 
37.91971182746296876, -77.9688630154902711 37.89620133516485367, 
-77.93936803424354309 37.90517806858776595, -77.96672569800863073 
37.91971182746296876))", 0);
diff --git 
a/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
 
b/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
index 56427f567..568b36419 100644
--- 
a/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
+++ 
b/common/src/test/java/org/apache/sedona/common/raster/RasterConstructorsTest.java
@@ -77,48 +77,48 @@ public class RasterConstructorsTest
         Geometry geom = Constructors.geomFromWKT("POLYGON((15 15, 18 20, 15 
24, 24 25, 15 15))", 0);
         GridCoverage2D rasterized = RasterConstructors.asRaster(geom, raster, 
"d", 3093151, 3d);
         double[] actual = MapAlgebra.bandAsArray(rasterized, 1);
-        double[] expected = new double[] {3093151.0, 3093151.0, 3093151.0, 
0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0};
+        double[] expected = new double[] {3093151.0, 3093151.0, 3093151.0, 
3093151.0, 0.0, 0.0, 3093151.0, 3093151.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         rasterized = RasterConstructors.asRaster(geom, raster, "d");
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 
1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        expected = new double[] {1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 
0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         // MultiPolygon
         geom = Constructors.geomFromWKT("MULTIPOLYGON (((15 15, 1.5 5.5, 3.5 
5.5, 3.5 1.5, 15 15)), ((4.4 2.4, 4.4 6.4, 6.4 6.4, 6.4 2.4, 4.4 2.4)))", 0);
         rasterized = RasterConstructors.asRaster(geom, raster, "d", 3093151, 
3d);
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 
0.0, 0.0, 3093151.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0};
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
3093151.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 3093151.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         rasterized = RasterConstructors.asRaster(geom, raster, "d");
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 
1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 
0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         // MultiLineString
         geom = Constructors.geomFromWKT("MULTILINESTRING ((5 5, 10 10), (10 
10, 15 15, 20 20))", 0);
         rasterized = RasterConstructors.asRaster(geom, raster, "d", 3093151, 
3d);
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0};
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
3093151.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         rasterized = RasterConstructors.asRaster(geom, raster, "d");
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         // LinearRing
         geom = Constructors.geomFromWKT("LINEARRING (10 10, 18 20, 15 24, 24 
25, 10 10)", 0);
         rasterized = RasterConstructors.asRaster(geom, raster, "d", 3093151, 
3d);
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 3093151.0, 3093151.0, 3093151.0, 
3093151.0, 3093151.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 3093151.0, 3093151.0, 
3093151.0, 0.0, 0.0, 3093151.0, 3093151.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 
3093151.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 3093151.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         rasterized = RasterConstructors.asRaster(geom, raster, "d");
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 
0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 
1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 
1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         // MultiPoints
@@ -153,14 +153,14 @@ public class RasterConstructorsTest
         Geometry geom = Constructors.geomFromEWKT("LINESTRING(1 1, 2 1, 10 
1)");
         GridCoverage2D rasterized = RasterConstructors.asRaster(geom, raster, 
"d", 3093151, 0d);
         double[] actual = MapAlgebra.bandAsArray(rasterized, 1);
-        double[] expected = new double[] {3093151.0, 3093151.0, 3093151.0, 
3093151.0, 3093151.0, 3093151.0, 0.0, 0.0, 0.0};
+        double[] expected = new double[] {3093151.0, 3093151.0, 3093151.0, 
3093151.0, 3093151.0};
         assertArrayEquals(expected, actual, 0.1d);
 
         // Vertical LineString
         geom = Constructors.geomFromEWKT("LINESTRING(1 1, 1 2, 1 10)");
         rasterized = RasterConstructors.asRaster(geom, raster, "d", 3093151, 
0d);
         actual = MapAlgebra.bandAsArray(rasterized, 1);
-        expected = new double[] {0.0, 0.0, 0.0, 3093151.0, 3093151.0, 
3093151.0, 3093151.0, 3093151.0, 3093151.0};
+        expected = new double[] {3093151.0, 3093151.0, 3093151.0, 3093151.0, 
3093151.0};
         assertArrayEquals(expected, actual, 0.1d);
     }
 
@@ -171,12 +171,12 @@ public class RasterConstructorsTest
         Geometry geom = Constructors.geomFromWKT("POLYGON((1.5 1.5, 3.8 3.0, 
4.5 4.4, 3.4 3.5, 1.5 1.5))", 0);
         GridCoverage2D rasterized = RasterConstructors.asRaster(geom, raster, 
"d", 612028, 5d);
         double[] actual = Arrays.stream(MapAlgebra.bandAsArray(rasterized, 
1)).toArray();
-        double[] expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 612028.0, 612028.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 612028.0, 612028.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 612028.0, 612028.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 612028.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 0.0, 0.0, 
0.0, 0.0, 0.0,  [...]
+        double[] expected = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 612028.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 612028.0, 612028.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 612028.0, 612028.0, 612028.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
612028.0, 612028.0, 612028.0, 612028.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
612028.0, 612028.0 [...]
         assertArrayEquals(expected, actual, 0.1d);
 
         rasterized = RasterConstructors.asRaster(geom, raster, "d", 5484);
         actual = Arrays.stream(MapAlgebra.bandAsArray(rasterized, 
1)).toArray();
-        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 5484.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 5484.0, 5484.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
5484.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0 [...]
+        expected = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 5484.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 5484.0, 5484.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
5484.0, 5484.0, 5484.0, 5484.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5484.0, 
5484.0, 5484.0, 5484.0, 0.0, 0 [...]
         assertArrayEquals(expected, actual, 0.1d);
     }
 
@@ -195,6 +195,21 @@ public class RasterConstructorsTest
         assertEquals(heightExpected, heightActual);
     }
 
+    @Test
+    public void testAsRasterWithRasterExtent2() throws FactoryException, 
ParseException {
+        GridCoverage2D raster = RasterConstructors.makeEmptyRaster(1, 5, 5, 0, 
0.5, 0.1, -0.1, 0, 0, 4326);
+        Geometry geom = Constructors.geomFromWKT("POLYGON((0.1 0.1, 0.1 0.4, 
0.4 0.4, 0.4 0.1, 0.1 0.1))", 0);
+        GridCoverage2D rasterized = 
RasterConstructors.asRasterWithRasterExtent(geom, raster, "d", 100d, 0d);
+        assertEquals(0, rasterized.getEnvelope2D().x, 1e-6);
+        assertEquals(0, rasterized.getEnvelope2D().y, 1e-6);
+        assertEquals(0.5, rasterized.getEnvelope2D().width, 1e-6);
+        assertEquals(0.5, rasterized.getEnvelope2D().height, 1e-6);
+        assertEquals(5, RasterAccessors.getWidth(rasterized));
+        assertEquals(5, RasterAccessors.getHeight(rasterized));
+        double sum = Arrays.stream(MapAlgebra.bandAsArray(rasterized, 
1)).sum();
+        assertEquals(900, sum, 1e-6);  // Covers 3x3 grid
+    }
+
     @Test
     public void makeEmptyRaster() throws FactoryException {
         double upperLeftX = 0;
diff --git 
a/spark/common/src/test/scala/org/apache/sedona/sql/rasterIOTest.scala 
b/spark/common/src/test/scala/org/apache/sedona/sql/rasterIOTest.scala
index 2dba6679a..49ea0ddc2 100644
--- a/spark/common/src/test/scala/org/apache/sedona/sql/rasterIOTest.scala
+++ b/spark/common/src/test/scala/org/apache/sedona/sql/rasterIOTest.scala
@@ -76,17 +76,17 @@ class rasterIOTest extends TestBaseScala with 
BeforeAndAfter with GivenWhenThen
       var df = sparkSession.sql("SELECT RS_MakeEmptyRaster(2, 255, 255, 3, 
-215, 2, -2, 0, 0, 4326) as raster, ST_GeomFromWKT('POLYGON((15 15, 18 20, 15 
24, 24 25, 15 15))') as geom")
       var rasterized = df.selectExpr("RS_AsRaster(geom, raster, 'd', 255, 0d) 
as rasterized")
       var actual = rasterized.selectExpr("RS_BandAsArray(rasterized, 
1)").first().getSeq(0).mkString("Array(", ", ", ")")
-      var expected = "Array(255.0, 255.0, 255.0, 0.0, 0.0, 255.0, 0.0, 0.0, 
0.0, 255.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)"
+      var expected = "Array(255.0, 255.0, 255.0, 255.0, 0.0, 0.0, 255.0, 
255.0, 0.0, 0.0, 0.0, 255.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0)"
       assertEquals(expected, actual)
 
       rasterized = df.selectExpr("RS_AsRaster(geom, raster, 'd', 3093151) as 
rasterized")
       actual = rasterized.selectExpr("RS_BandAsArray(rasterized, 
1)").first().getSeq(0).mkString("Array(", ", ", ")")
-      expected = "Array(3093151.0, 3093151.0, 3093151.0, 0.0, 0.0, 3093151.0, 
0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)"
+      expected = "Array(3093151.0, 3093151.0, 3093151.0, 3093151.0, 0.0, 0.0, 
3093151.0, 3093151.0, 0.0, 0.0, 0.0, 3093151.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)"
       assertEquals(expected, actual)
 
       rasterized = df.selectExpr("RS_AsRaster(geom, raster, 'd') as 
rasterized")
       actual = rasterized.selectExpr("RS_BandAsArray(rasterized, 
1)").first().getSeq(0).mkString("Array(", ", ", ")")
-      expected = "Array(1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)"
+      expected = "Array(1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 
1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)"
       assertEquals(expected, actual)
     }
 
@@ -94,12 +94,12 @@ class rasterIOTest extends TestBaseScala with 
BeforeAndAfter with GivenWhenThen
       var df = sparkSession.sql("SELECT RS_MakeEmptyRaster(2, 255, 255, 3, 
-215, 2, -2, 0, 0, 4326) as raster, ST_GeomFromWKT('LINESTRING(1 1, 2 1, 10 
1)') as geom")
       var rasterized = df.selectExpr("RS_AsRaster(geom, raster, 'd', 255, 0d) 
as rasterized")
       var actual = rasterized.selectExpr("RS_BandAsArray(rasterized, 
1)").first().getSeq(0).mkString("Array(", ", ", ")")
-      var expected = "Array(255.0, 255.0, 255.0, 255.0, 255.0, 255.0, 0.0, 
0.0, 0.0)"
+      var expected = "Array(255.0, 255.0, 255.0, 255.0, 255.0)"
       assertEquals(expected, actual)
 
       rasterized = df.selectExpr("RS_AsRaster(ST_GeomFromWKT('LINESTRING(1 1, 
1 2, 1 10)'), raster, 'd', 255, 0d) as rasterized")
       actual = rasterized.selectExpr("RS_BandAsArray(rasterized, 
1)").first().getSeq(0).mkString("Array(", ", ", ")")
-      expected = "Array(0.0, 0.0, 0.0, 255.0, 255.0, 255.0, 255.0, 255.0, 
255.0)"
+      expected = "Array(255.0, 255.0, 255.0, 255.0, 255.0)"
       assertEquals(expected, actual)
     }
 
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 71aa8d7f4..cae6a6f14 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
@@ -1169,19 +1169,19 @@ class rasteralgebraTest extends TestBaseScala with 
BeforeAndAfter with GivenWhen
       var df = sparkSession.read.format("binaryFile").load(resourceFolder + 
"raster_geotiff_color/FAA_UTM18N_NAD83.tif")
       df = df.selectExpr("RS_FromGeoTiff(content) as raster", 
"ST_GeomFromWKT('POLYGON ((236722 4204770, 243900 4204770, 243900 4197590, 
221170 4197590, 236722 4204770))', 26918) as geom")
       var actual = df.selectExpr("RS_ZonalStats(raster, geom, 1, 'sum', 
true)").first().get(0)
-      assertEquals(1.0690406E7, actual)
+      assertEquals(1.0719726E7, actual)
 
       actual = df.selectExpr("RS_ZonalStats(raster, geom, 1, 'count', 
false)").first().get(0)
       assertEquals(184792.0, actual)
 
       actual = df.selectExpr("RS_ZonalStats(raster, geom, 1, 'mean', 
false)").first().get(0)
-      assertEquals(57.851021689230684, actual)
+      assertEquals(58.00968656653401, actual)
 
       actual = df.selectExpr("RS_ZonalStats(raster, geom, 1, 
'variance')").first().get(0)
-      assertEquals(8488.448098819916, actual)
+      assertEquals(8491.631251863151, actual)
 
       actual = df.selectExpr("RS_ZonalStats(raster, geom, 
'sd')").first().get(0)
-      assertEquals(92.13277429243035, actual)
+      assertEquals(92.15004748703687, actual)
 
       // Test with a polygon in EPSG:4326
       actual = df.selectExpr("RS_ZonalStats(raster, ST_GeomFromWKT('POLYGON 
((-77.96672569800863073 37.91971182746296876, -77.9688630154902711 
37.89620133516485367, -77.93936803424354309 37.90517806858776595, 
-77.96672569800863073 37.91971182746296876))'), 1, 'mean', 
false)").first().get(0)
@@ -1215,7 +1215,7 @@ class rasteralgebraTest extends TestBaseScala with 
BeforeAndAfter with GivenWhen
       var df = sparkSession.read.format("binaryFile").load(resourceFolder + 
"raster_geotiff_color/FAA_UTM18N_NAD83.tif")
       df = df.selectExpr("RS_FromGeoTiff(content) as raster", 
"ST_GeomFromWKT('POLYGON ((-8673439.6642 4572993.5327, -8673155.5737 
4563873.2099, -8701890.3259 4562931.7093, -8682522.8735 4572703.8908, 
-8673439.6642 4572993.5327))', 3857) as geom")
       val actual = df.selectExpr("RS_ZonalStatsAll(raster, geom, 1, 
true)").first().get(0)
-      val expected = Seq(184792.0, 1.0690406E7, 57.851021689230684, 0.0, 0.0, 
92.13277429243035, 8488.448098819916, 0.0, 255.0)
+      val expected = Seq(184792.0, 1.0719726E7, 58.00968656653401, 0.0, 0.0, 
92.15004748703687, 8491.631251863151, 0.0, 255.0)
       assertTrue(expected.equals(actual))
 
       // Test with a polygon that does not intersect the raster in lenient mode

Reply via email to