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 3a1e8c6c [SEDONA-319] Make result of RS_BandAsArray serializable (#899)
3a1e8c6c is described below
commit 3a1e8c6cb725d680cfb5c6e54b612e1e5b245645
Author: Kristin Cowalcijk <[email protected]>
AuthorDate: Thu Jul 13 01:40:13 2023 +0800
[SEDONA-319] Make result of RS_BandAsArray serializable (#899)
---
.../apache/sedona/common/raster/MapAlgebra.java | 35 +++++++++++++++++++---
.../org/apache/sedona/sql/rasteralgebraTest.scala | 11 +++++++
2 files changed, 42 insertions(+), 4 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 0a24cce2..67e8ad18 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
@@ -18,16 +18,25 @@
*/
package org.apache.sedona.common.raster;
+import com.sun.media.imageioimpl.common.BogusColorSpace;
import org.geotools.coverage.CoverageFactoryFinder;
+import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
import javax.media.jai.RasterFactory;
import java.awt.Point;
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.awt.image.WritableRaster;
+import java.util.Arrays;
public class MapAlgebra
{
@@ -118,9 +127,14 @@ public class MapAlgebra
wr.setPixel(i, j, copiedPixels);
}
}
- // Create a new GridCoverage2D with the copied image
- GridCoverageFactory gridCoverageFactory =
CoverageFactoryFinder.getGridCoverageFactory(null);
- return gridCoverageFactory.create(gridCoverage2D.getName(), wr,
gridCoverage2D.getEnvelope());
+ // Add a sample dimension for newly added band
+ int numBand = wr.getNumBands();
+ GridSampleDimension[] originalSampleDimensions =
gridCoverage2D.getSampleDimensions();
+ GridSampleDimension[] sampleDimensions = new
GridSampleDimension[numBand];
+ System.arraycopy(originalSampleDimensions, 0, sampleDimensions, 0,
originalSampleDimensions.length);
+ sampleDimensions[numBand - 1] = new GridSampleDimension("band" +
numBand);
+ // Construct a GridCoverage2D with the copied image.
+ return createCompatibleGridCoverage2D(gridCoverage2D, wr,
sampleDimensions);
}
private static GridCoverage2D copyRasterAndReplaceBand(GridCoverage2D
gridCoverage2D, int bandIndex, double[] bandValues) {
@@ -141,7 +155,20 @@ public class MapAlgebra
}
}
// Create a new GridCoverage2D with the copied image
+ return createCompatibleGridCoverage2D(gridCoverage2D, wr,
gridCoverage2D.getSampleDimensions());
+ }
+
+ private static GridCoverage2D
createCompatibleGridCoverage2D(GridCoverage2D gridCoverage2D, WritableRaster
wr, GridSampleDimension[] bands) {
+ int rasterDataType = wr.getDataBuffer().getDataType();
+ int numBand = wr.getNumBands();
+ final ColorSpace cs = new BogusColorSpace(numBand);
+ final int[] nBits = new int[numBand];
+ Arrays.fill(nBits, DataBuffer.getDataTypeSize(rasterDataType));
+ ColorModel colorModel =
+ new ComponentColorModel(cs, nBits, false, true,
Transparency.OPAQUE, rasterDataType);
+ final RenderedImage image = new BufferedImage(colorModel, wr, false,
null);
GridCoverageFactory gridCoverageFactory =
CoverageFactoryFinder.getGridCoverageFactory(null);
- return gridCoverageFactory.create(gridCoverage2D.getName(), wr,
gridCoverage2D.getEnvelope());
+ return gridCoverageFactory.create(gridCoverage2D.getName(), image,
gridCoverage2D.getCoordinateReferenceSystem(),
+ gridCoverage2D.getGridGeometry().getGridToCRS(), bands, null,
null);
}
}
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 8ef24399..7728b772 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
@@ -452,5 +452,16 @@ class rasteralgebraTest extends TestBaseScala with
BeforeAndAfter with GivenWhen
assert(df.selectExpr("RS_Intersects(raster,
ST_SetSRID(ST_Point(33.81798,-117.47993), 4326))").first().getBoolean(0))
assert(!df.selectExpr("RS_Intersects(raster,
ST_SetSRID(ST_Point(33.97896,-117.27868), 4326))").first().getBoolean(0))
}
+
+ it("Passed RS_AddBandFromArray collect generated raster") {
+ var df = sparkSession.read.format("binaryFile").load(resourceFolder +
"raster/test1.tiff")
+ df = df.selectExpr("RS_FromGeoTiff(content) as raster",
"RS_BandAsArray(RS_FromGeoTiff(content), 1) as band")
+ df = df.selectExpr("RS_AddBandFromArray(raster, band, 1) as raster",
"band")
+ var raster = df.collect().head.getAs[GridCoverage2D](0)
+ assert(raster.getNumSampleDimensions == 1)
+ df = df.selectExpr("RS_AddBandFromArray(raster, band, 2) as raster",
"band")
+ raster = df.collect().head.getAs[GridCoverage2D](0)
+ assert(raster.getNumSampleDimensions == 2)
+ }
}
}