in spark/common/src/main/java/org/apache/sedona/viz/core/VisualizationOperator.java [569:698]
protected boolean RenderImage(JavaSparkContext sparkContext) throws Exception {
logger.info("[Sedona-VizViz][RenderImage][Start]");
if (this.parallelRenderImage) {
if (!this.hasBeenSpatialPartitioned) {
this.spatialPartitioningWithoutDuplicates();
this.hasBeenSpatialPartitioned = true;
}
this.distributedRasterImage =
this.distributedRasterColorMatrix.mapPartitionsToPair(
new PairFlatMapFunction<
Iterator<Tuple2<Pixel, Integer>>, Integer, ImageSerializableWrapper>() {
@Override
public Iterator<Tuple2<Integer, ImageSerializableWrapper>> call(
Iterator<Tuple2<Pixel, Integer>> currentPartition) throws Exception {
BufferedImage imagePartition =
new BufferedImage(
partitionIntervalX, partitionIntervalY, BufferedImage.TYPE_INT_ARGB);
Tuple2<Pixel, Integer> pixelColor = null;
while (currentPartition.hasNext()) {
// Render color in this image partition pixel-wise.
pixelColor = currentPartition.next();
if (pixelColor._1().getX() < 0
|| pixelColor._1().getX() >= resolutionX
|| pixelColor._1().getY() < 0
|| pixelColor._1().getY() >= resolutionY) {
pixelColor = null;
continue;
}
imagePartition.setRGB(
(int) pixelColor._1().getX() % partitionIntervalX,
(partitionIntervalY - 1)
- (int) pixelColor._1().getY() % partitionIntervalY,
pixelColor._2);
}
List<Tuple2<Integer, ImageSerializableWrapper>> result =
new ArrayList<Tuple2<Integer, ImageSerializableWrapper>>();
if (pixelColor == null) {
// No pixels in this partition. Skip this subimage
return result.iterator();
}
logger.info(
"[Sedona-VizViz][Render]add a image partition into result set "
+ pixelColor._1().getCurrentPartitionId());
result.add(
new Tuple2<Integer, ImageSerializableWrapper>(
pixelColor._1().getCurrentPartitionId(),
new ImageSerializableWrapper(imagePartition)));
return result.iterator();
}
});
// logger.debug("[Sedona-VizViz][Render]output count "+this.distributedRasterImage.count());
} else if (!this.parallelRenderImage) {
// Draw full size image in parallel
this.distributedRasterImage =
this.distributedRasterColorMatrix.mapPartitionsToPair(
new PairFlatMapFunction<
Iterator<Tuple2<Pixel, Integer>>, Integer, ImageSerializableWrapper>() {
@Override
public Iterator<Tuple2<Integer, ImageSerializableWrapper>> call(
Iterator<Tuple2<Pixel, Integer>> currentPartition) throws Exception {
BufferedImage imagePartition =
new BufferedImage(resolutionX, resolutionY, BufferedImage.TYPE_INT_ARGB);
Tuple2<Pixel, Integer> pixelColor = null;
while (currentPartition.hasNext()) {
// Render color in this image partition pixel-wise.
pixelColor = currentPartition.next();
if (pixelColor._1().getX() < 0
|| pixelColor._1().getX() >= resolutionX
|| pixelColor._1().getY() < 0
|| pixelColor._1().getY() >= resolutionY) {
pixelColor = null;
continue;
}
imagePartition.setRGB(
(int) pixelColor._1().getX(),
(resolutionY - 1) - (int) pixelColor._1().getY(),
pixelColor._2);
}
List<Tuple2<Integer, ImageSerializableWrapper>> result =
new ArrayList<Tuple2<Integer, ImageSerializableWrapper>>();
if (pixelColor == null) {
// No pixels in this partition. Skip this subimage
return result.iterator();
}
result.add(
new Tuple2<Integer, ImageSerializableWrapper>(
1, new ImageSerializableWrapper(imagePartition)));
return result.iterator();
}
});
// Merge images together using reduce
this.distributedRasterImage =
this.distributedRasterImage.reduceByKey(
new Function2<
ImageSerializableWrapper, ImageSerializableWrapper, ImageSerializableWrapper>() {
@Override
public ImageSerializableWrapper call(
ImageSerializableWrapper image1, ImageSerializableWrapper image2)
throws Exception {
// The combined image should be a full size image
BufferedImage combinedImage =
new BufferedImage(resolutionX, resolutionY, BufferedImage.TYPE_INT_ARGB);
Graphics graphics = combinedImage.getGraphics();
graphics.drawImage(image1.image, 0, 0, null);
graphics.drawImage(image2.image, 0, 0, null);
return new ImageSerializableWrapper(combinedImage);
}
});
// logger.debug("[Sedona-VizViz][RenderImage]Merged all images into one image. Result size
// should be 1. Actual size is "+this.distributedRasterImage.count());
List<Tuple2<Integer, ImageSerializableWrapper>> imageList =
this.distributedRasterImage.collect();
this.rasterImage = imageList.get(0)._2().image;
/*
BufferedImage renderedImage = new BufferedImage(this.resolutionX,this.resolutionY,BufferedImage.TYPE_INT_ARGB);
List<Tuple2<Pixel,Integer>> colorMatrix = this.distributedRasterColorMatrix.collect();
for(Tuple2<Pixel,Integer> pixelColor:colorMatrix)
{
int pixelX = pixelColor._1().getX();
int pixelY = pixelColor._1().getY();
renderedImage.setRGB(pixelX, (this.resolutionY-1)-pixelY, pixelColor._2);
}
this.rasterImage = renderedImage;
*/
}
logger.info("[Sedona-VizViz][RenderImage][Stop]");
return true;
}