protected boolean RenderImage()

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;
  }