jiayuasu opened a new issue, #3324:
URL: https://github.com/apache/sedona/issues/3324

   ## Expected behavior
   
   Clearing NoData on band 2 should leave band 1's NoData handling unchanged. 
If band 1 still reports NoData `0`, MapAlgebra should continue treating its 
zero-valued pixels as NoData.
   
   This is a follow-up to #3312, tracked separately from the SQL NULL-handling 
fix in #3311.
   
   ## Actual behavior
   
   Starting with a two-band GeoTIFF whose bands both use NoData `0`, clearing 
only band 2 leaves the band metadata at `(0, null)`, but changes band 1's 
result for `out = rast[0] + 1;` from `NaN` to `1.0`.
   
   That change happens in memory, before writing the cleared raster. The clear 
path removes the shared `GC_NODATA` property from the coverage and image, while 
band 1's sample dimension still declares NoData `0`. Jiffle reads the image 
property, so it starts treating band 1's zeros as ordinary data.
   
   A subsequent GeoTIFF round-trip also changes `(0, null)` back to `(0, 0)`. 
The writer uses one dataset-wide NoData value, so mixed per-band states cannot 
be preserved by the current path.
   
   ## Steps to reproduce
   
   Run in JShell with `sedona-common` and its dependencies on the classpath. 
The first GeoTIFF round-trip creates an input with the image-level NoData 
property used by real GeoTIFFs. `rast[0]` refers to band 1.
   
   ```java
   import org.apache.sedona.common.raster.*;
   
   var raster = RasterConstructors.makeEmptyRaster(
       2, 20, 20, 0, 0, 1, -1, 0, 0, 4326);
   raster = RasterBandEditors.setBandNoDataValue(raster, 1, 0.0);
   raster = RasterBandEditors.setBandNoDataValue(raster, 2, 0.0);
   var loaded = RasterConstructors.fromGeoTiff(RasterOutputs.asGeoTiff(raster));
   
   var before = MapAlgebra.mapAlgebra(loaded, "d", "out = rast[0] + 1;");
   System.out.println(before.getRenderedImage().getData().getSampleDouble(0, 0, 
0));
   // NaN
   
   var cleared = RasterBandEditors.setBandNoDataValue(loaded, 2, null);
   System.out.println(RasterBandAccessors.getBandNoDataValue(cleared, 1));
   // 0.0
   System.out.println(RasterBandAccessors.getBandNoDataValue(cleared, 2));
   // null
   
   var after = MapAlgebra.mapAlgebra(cleared, "d", "out = rast[0] + 1;");
   System.out.println(after.getRenderedImage().getData().getSampleDouble(0, 0, 
0));
   // 1.0 (expected NaN: band 1 was not cleared)
   
   var roundTrip = 
RasterConstructors.fromGeoTiff(RasterOutputs.asGeoTiff(cleared));
   System.out.println(RasterBandAccessors.getBandNoDataValue(roundTrip, 2));
   // 0.0 (band 2's cleared NoData is restored)
   ```
   
   The regression coverage should check both bands after clearing either one, 
including MapAlgebra before serialization. For GeoTIFF output, rejecting 
unsupported mixed NoData states would be preferable to silently changing them.
   
   ## Sedona version
   
   `2.0.0-SNAPSHOT`, reproduced on #3312 at 
`2b06236af00c0789c9e0eff69d9562caf6e90209`.
   
   ## API type
   
   Java (`sedona-common`; used by the SQL raster functions).
   
   ## JRE version
   
   17, GeoTools 33.1.
   
   ## Environment
   
   Local macOS. The reproducer does not require Spark.
   
   ## Existing issues
   
   - [x] I searched the existing issues and did not find a duplicate.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to