This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-1.5.2
in repository https://gitbox.apache.org/repos/asf/sedona.git


The following commit(s) were added to refs/heads/branch-1.5.2 by this push:
     new 3010082b6 [SEDONA-479] Update RS_Normalize (#1232)
3010082b6 is described below

commit 3010082b646a1b93ade1cd5c882f845ef73e438e
Author: Pranav Toggi <[email protected]>
AuthorDate: Sun Feb 4 14:32:44 2024 -0500

    [SEDONA-479] Update RS_Normalize (#1232)
---
 .../org/apache/sedona/common/raster/MapAlgebra.java   | 19 ++++++++++++-------
 .../apache/sedona/common/raster/MapAlgebraTest.java   | 18 ++++++++++++++----
 docs/api/sql/Raster-operators.md                      |  2 +-
 3 files changed, 27 insertions(+), 12 deletions(-)

diff --git 
a/common/src/main/java/org/apache/sedona/common/raster/MapAlgebra.java 
b/common/src/main/java/org/apache/sedona/common/raster/MapAlgebra.java
index f2a75a044..564077a36 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/MapAlgebra.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/MapAlgebra.java
@@ -423,18 +423,23 @@ public class MapAlgebra
     }
 
     /**
-     * @param band band values
+     * @param bandValues band values
      * @return an array with normalized band values to be within [0 - 255] 
range
      */
-    public static double[] normalize(double[] band) {
-        double[] result = new double[band.length];
-        double normalizer = Arrays.stream(band).max().getAsDouble() / 255d;
+    public static double[] normalize(double[] bandValues) {
+        Double minValue = Arrays.stream(bandValues).min().orElse(Double.NaN);
+        Double maxValue = Arrays.stream(bandValues).max().orElse(Double.NaN);
 
-        for (int i = 0; i < band.length; i++) {
-            result[i] = (int) (band[i] / normalizer);
+        if (Double.compare(maxValue, minValue) == 0) {
+            // Set default value for constant bands to 0
+            Arrays.fill(bandValues, 0);
+        } else {
+            for (int i = 0; i < bandValues.length; i++) {
+                bandValues[i] = ((bandValues[i] - minValue) * 255) / (maxValue 
- minValue);
+            }
         }
 
-        return result;
+        return bandValues;
     }
 
     /**
diff --git 
a/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java 
b/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java
index 676ab2fd4..7bf17044c 100644
--- a/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java
+++ b/common/src/test/java/org/apache/sedona/common/raster/MapAlgebraTest.java
@@ -315,10 +315,20 @@ public class MapAlgebraTest extends RasterTestBase
 
     @Test
     public void testNormalize() {
-        double[] band = new double[] {800.0, 900.0, 0.0, 255.0};
-        double[] actual = MapAlgebra.normalize(band);
-        double[] expected = new double[] {226.0, 255.0, 0.0, 72.0};
-        assertArrayEquals(expected, actual, 0.1d);
+        double[] band1 = {800.0, 900.0, 0.0, 255.0};
+        double[] band2 = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+        double[] band3 = {16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
+        double[] band4 = 
{-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1};
+        double[] actual1 = MapAlgebra.normalize(band1);
+        double[] actual2 = MapAlgebra.normalize(band2);
+        double[] actual3 = MapAlgebra.normalize(band3);
+        double[] actual4 = MapAlgebra.normalize(band4);
+        double[] expected1 = {226.66666666666666, 255.0, 0.0, 72.25};
+        double[] expected2 = {0.0, 17.0, 34.0, 51.0, 68.0, 85.0, 102.0, 119.0, 
136.0, 153.0, 170.0, 187.0, 204.0, 221.0, 238.0, 255.0};
+        assertArrayEquals(expected1, actual1, 0.1d);
+        assertArrayEquals(expected2, actual2, 0.1d);
+        assertArrayEquals(expected2, actual3, 0.1d);
+        assertArrayEquals(expected2, actual4, 0.1d);
     }
 
     @Test
diff --git a/docs/api/sql/Raster-operators.md b/docs/api/sql/Raster-operators.md
index 93c7066bd..8f49f4b4e 100644
--- a/docs/api/sql/Raster-operators.md
+++ b/docs/api/sql/Raster-operators.md
@@ -2495,7 +2495,7 @@ This function only accepts integer as factor before 
`v1.5.0`.
 
 ### RS_Normalize
 
-Introduction: Normalize the value in the array to [0, 255]
+Introduction: Normalize the value in the array to [0, 255]. Uniform arrays are 
set to 0 after normalization.
 
 Format: `RS_Normalize (Band: ARRAY[Double])`
 

Reply via email to