@@ -22,10 +22,9 @@ use datafusion_common::cast::{as_int64_array, as_string_array};
2222use datafusion_common:: error:: Result ;
2323use datafusion_common:: exec_err;
2424use datafusion_expr:: { ColumnarValue , Volatility } ;
25- use sedona_common:: sedona_internal_datafusion_err;
2625use sedona_expr:: scalar_udf:: { SedonaScalarKernel , SedonaScalarUDF } ;
27- use sedona_raster:: builder:: { RasterBuilder , StartBandArgs } ;
28- use sedona_raster:: traits:: { BandRef , RasterRef } ;
26+ use sedona_raster:: builder:: { RasterBuilder , RasterOverrides , StartBandArgs } ;
27+ use sedona_raster:: traits:: { BandOverrides , BandRef , RasterRef } ;
2928use sedona_schema:: datatypes:: SedonaType ;
3029use sedona_schema:: matchers:: ArgMatcher ;
3130
@@ -98,11 +97,7 @@ impl SedonaScalarKernel for RsSlice {
9897 }
9998 validate_not_spatial ( raster, name, "RS_Slice" ) ?;
10099
101- let t: [ f64 ; 6 ] = raster. transform ( ) . try_into ( ) . map_err ( |_| {
102- sedona_internal_datafusion_err ! ( "raster transform is not 6 elements" )
103- } ) ?;
104- let spatial_dims = raster. spatial_dims ( ) ;
105- new_builder. start_raster_nd ( & t, & spatial_dims, raster. spatial_shape ( ) , raster. crs ( ) ) ?;
100+ new_builder. start_raster_from ( raster, RasterOverrides :: default ( ) ) ?;
106101
107102 require_any_band_has_dim ( raster, name, "RS_Slice" ) ?;
108103
@@ -114,16 +109,7 @@ impl SedonaScalarKernel for RsSlice {
114109 // RS_DimToBand, and matches xarray's `isel` — variables
115110 // without the indexed dim are left alone.
116111 let Some ( dim_idx) = band. dim_index ( name) else {
117- let dim_names = band. dim_names ( ) ;
118- let band_name = raster. band_name ( band_idx) ;
119- new_builder. start_band ( StartBandArgs {
120- name : band_name,
121- nodata : band. nodata ( ) ,
122- ..StartBandArgs :: new ( & dim_names, band. shape ( ) , band. data_type ( ) )
123- } ) ?;
124- let ndb = band. nd_buffer ( ) ?;
125- let data = ndb. as_contiguous ( ) ?;
126- new_builder. band_data_writer ( ) . append_value ( data) ;
112+ band. copy_into ( & mut new_builder, BandOverrides :: default ( ) ) ?;
127113 new_builder. finish_band ( ) ?;
128114 continue ;
129115 } ;
@@ -257,11 +243,7 @@ impl SedonaScalarKernel for RsSliceRange {
257243 ) ;
258244 }
259245
260- let t: [ f64 ; 6 ] = raster. transform ( ) . try_into ( ) . map_err ( |_| {
261- sedona_internal_datafusion_err ! ( "raster transform is not 6 elements" )
262- } ) ?;
263- let spatial_dims = raster. spatial_dims ( ) ;
264- new_builder. start_raster_nd ( & t, & spatial_dims, raster. spatial_shape ( ) , raster. crs ( ) ) ?;
246+ new_builder. start_raster_from ( raster, RasterOverrides :: default ( ) ) ?;
265247
266248 require_any_band_has_dim ( raster, name, "RS_SliceRange" ) ?;
267249
@@ -272,16 +254,7 @@ impl SedonaScalarKernel for RsSliceRange {
272254 // dimension are emitted unchanged. Same convention as
273255 // RS_Slice and RS_DimToBand.
274256 let Some ( dim_idx) = band. dim_index ( name) else {
275- let dim_names = band. dim_names ( ) ;
276- let band_name = raster. band_name ( band_idx) ;
277- new_builder. start_band ( StartBandArgs {
278- name : band_name,
279- nodata : band. nodata ( ) ,
280- ..StartBandArgs :: new ( & dim_names, band. shape ( ) , band. data_type ( ) )
281- } ) ?;
282- let ndb = band. nd_buffer ( ) ?;
283- let data = ndb. as_contiguous ( ) ?;
284- new_builder. band_data_writer ( ) . append_value ( data) ;
257+ band. copy_into ( & mut new_builder, BandOverrides :: default ( ) ) ?;
285258 new_builder. finish_band ( ) ?;
286259 continue ;
287260 } ;
@@ -420,7 +393,9 @@ mod tests {
420393 RasterSpec :: nd ( & [ "time" , "y" , "x" ] , & [ 3 , 2 , 3 ] )
421394 . crs ( None )
422395 . band_nd ( & [ "y" , "x" ] , & [ 2 , 3 ] , BandDataType :: UInt8 )
396+ . name ( "elevation" )
423397 . band ( BandDataType :: UInt8 )
398+ . name ( "temperature" )
424399 . build ( )
425400 }
426401
@@ -449,7 +424,9 @@ mod tests {
449424 let expected = RasterSpec :: nd ( & [ "time" , "y" , "x" ] , & [ 3 , 2 , 3 ] )
450425 . crs ( None )
451426 . band_values_nd ( & [ "y" , "x" ] , & [ 2 , 3 ] , & ( 0u8 ..6 ) . collect :: < Vec < u8 > > ( ) )
452- . band_values_nd ( & [ "y" , "x" ] , & [ 2 , 3 ] , & ( 6u8 ..12 ) . collect :: < Vec < u8 > > ( ) ) ;
427+ . name ( "elevation" )
428+ . band_values_nd ( & [ "y" , "x" ] , & [ 2 , 3 ] , & ( 6u8 ..12 ) . collect :: < Vec < u8 > > ( ) )
429+ . name ( "temperature" ) ;
453430 assert_rasters_equal ( & result, & [ Some ( expected) ] ) ;
454431 }
455432
@@ -481,11 +458,13 @@ mod tests {
481458 let expected = RasterSpec :: nd ( & [ "time" , "y" , "x" ] , & [ 3 , 2 , 3 ] )
482459 . crs ( None )
483460 . band_values_nd ( & [ "y" , "x" ] , & [ 2 , 3 ] , & ( 0u8 ..6 ) . collect :: < Vec < u8 > > ( ) )
461+ . name ( "elevation" )
484462 . band_values_nd (
485463 & [ "time" , "y" , "x" ] ,
486464 & [ 2 , 2 , 3 ] ,
487465 & ( 6u8 ..18 ) . collect :: < Vec < u8 > > ( ) ,
488- ) ;
466+ )
467+ . name ( "temperature" ) ;
489468 assert_rasters_equal ( & result, & [ Some ( expected) ] ) ;
490469 }
491470
0 commit comments