override def eval()

in spark/common/src/main/scala/org/apache/spark/sql/sedona_viz/expressions/Pixelize.scala [45:154]


  override def eval(input: InternalRow): Any = {
    val inputGeometry =
      GeometrySerializer.deserialize(inputExpressions(0).eval(input).asInstanceOf[Array[Byte]])
    val resolutionX = inputExpressions(1).eval(input).asInstanceOf[Integer]
    val resolutionY = inputExpressions(2).eval(input).asInstanceOf[Integer]
    val boundary = GeometrySerializer
      .deserialize(inputExpressions(3).eval(input).asInstanceOf[Array[Byte]])
      .getEnvelopeInternal
    val reverseCoordinate = false
    val pixels = inputGeometry match {
      case geometry: LineString => {
        RasterizationUtils.FindPixelCoordinates(
          resolutionX,
          resolutionY,
          boundary,
          inputGeometry.asInstanceOf[LineString],
          reverseCoordinate)
      }
      case geometry: Polygon => {
        RasterizationUtils.FindPixelCoordinates(
          resolutionX,
          resolutionY,
          boundary,
          inputGeometry.asInstanceOf[Polygon],
          reverseCoordinate)
      }
      case geometry: Point => {
        RasterizationUtils.FindPixelCoordinates(
          resolutionX,
          resolutionY,
          boundary,
          inputGeometry.asInstanceOf[Point],
          ColorizeOption.NORMAL,
          reverseCoordinate)
      }
      case geometry: MultiLineString => {
        var manyPixels =
          RasterizationUtils.FindPixelCoordinates(
            resolutionX,
            resolutionY,
            boundary,
            geometry.getGeometryN(0).asInstanceOf[LineString],
            reverseCoordinate)
        for (i <- 1 to geometry.getNumGeometries - 1) {
          manyPixels.addAll(
            RasterizationUtils.FindPixelCoordinates(
              resolutionX,
              resolutionY,
              boundary,
              geometry.getGeometryN(i).asInstanceOf[LineString],
              reverseCoordinate))
        }
        manyPixels
      }
      case geometry: MultiPolygon => {
        var manyPixels =
          RasterizationUtils.FindPixelCoordinates(
            resolutionX,
            resolutionY,
            boundary,
            geometry.getGeometryN(0).asInstanceOf[Polygon],
            reverseCoordinate)
        for (i <- 1 to geometry.getNumGeometries - 1) {
          manyPixels.addAll(
            RasterizationUtils.FindPixelCoordinates(
              resolutionX,
              resolutionY,
              boundary,
              geometry.getGeometryN(i).asInstanceOf[Polygon],
              reverseCoordinate))
        }
        manyPixels
      }
      case geometry: MultiPoint => {
        var manyPixels =
          RasterizationUtils.FindPixelCoordinates(
            resolutionX,
            resolutionY,
            boundary,
            geometry.getGeometryN(0).asInstanceOf[Point],
            ColorizeOption.NORMAL,
            reverseCoordinate)
        for (i <- 1 to geometry.getNumGeometries - 1) {
          manyPixels.addAll(
            RasterizationUtils.FindPixelCoordinates(
              resolutionX,
              resolutionY,
              boundary,
              geometry.getGeometryN(i).asInstanceOf[Point],
              ColorizeOption.NORMAL,
              reverseCoordinate))
        }
        manyPixels
      }
    }
    assert(pixels.size() > 0)

    return new GenericArrayData(
      pixels.asScala
        .map(f => {
          val out = new ByteArrayOutputStream()
          val kryo = new Kryo()
          val pixelSerializer = new PixelSerializer()
          val output = new Output(out)
          pixelSerializer.write(kryo, output, f._1)
          output.close()
          new GenericArrayData(out.toByteArray)
        })
        .toArray)
  }