@@ -34,6 +34,7 @@ import org.apache.spark.sql.types.{DataType, StructType}
3434import org .apache .spark .sql .{Column , Row , TypedColumn }
3535
3636class ProjectedLayerMetadataAggregate (destCRS : CRS , destDims : Dimensions [Int ]) extends UserDefinedAggregateFunction {
37+
3738 import ProjectedLayerMetadataAggregate ._
3839
3940 def inputSchema : StructType = InputRecord .inputRecordEncoder.schema
@@ -47,10 +48,10 @@ class ProjectedLayerMetadataAggregate(destCRS: CRS, destDims: Dimensions[Int]) e
4748 def initialize (buffer : MutableAggregationBuffer ): Unit = ()
4849
4950 def update (buffer : MutableAggregationBuffer , input : Row ): Unit = {
50- if (! input.isNullAt(0 )) {
51+ if (! input.isNullAt(0 )) {
5152 val in = input.as[InputRecord ]
5253
53- if (buffer.isNullAt(0 )) {
54+ if (buffer.isNullAt(0 )) {
5455 in.toBufferRecord(destCRS).write(buffer)
5556 } else {
5657 val br = buffer.as[BufferRecord ]
@@ -71,16 +72,15 @@ class ProjectedLayerMetadataAggregate(destCRS: CRS, destDims: Dimensions[Int]) e
7172 case _ => ()
7273 }
7374
74- def evaluate (buffer : Row ): Any = {
75- val buf = buffer.as[BufferRecord ]
76- if (buf.isEmpty) throw new IllegalArgumentException (" Can not collect metadata from empty data frame." )
75+ def evaluate (buffer : Row ): Any =
76+ Option (buffer).map(_.as[BufferRecord ]).filter(! _.isEmpty).map(buf => {
77+ val re = RasterExtent (buf.extent, buf.cellSize)
78+ val layout = LayoutDefinition (re, destDims.cols, destDims.rows)
7779
78- val re = RasterExtent (buf.extent, buf.cellSize )
79- val layout = LayoutDefinition (re, destDims.cols, destDims.rows)
80+ val kb = KeyBounds (layout.mapTransform( buf.extent) )
81+ TileLayerMetadata (buf.cellType, layout, buf.extent, destCRS, kb).toRow
8082
81- val kb = KeyBounds (layout.mapTransform(buf.extent))
82- TileLayerMetadata (buf.cellType, layout, buf.extent, destCRS, kb).toRow
83- }
83+ }).getOrElse(throw new IllegalArgumentException (" Can not collect metadata from empty data frame." ))
8484}
8585
8686object ProjectedLayerMetadataAggregate {
0 commit comments