@@ -209,10 +209,13 @@ def sel(self, labels, method=None, tolerance=None):
209
209
label = labels [coord_name ]
210
210
211
211
if isinstance (label , slice ):
212
+ if label .start is None :
213
+ label = slice (0 , label .stop , label .step )
212
214
if label .step is None :
213
215
# continuous interval slice indexing (preserves the index)
214
216
pos = self .transform .reverse ({coord_name : np .array ([label .start , label .stop ])})
215
- pos = np .round (pos [self .dim ]).astype ("int" )
217
+ # np.round rounds to even, this way we round upwards
218
+ pos = np .floor (pos [self .dim ] + 0.5 ).astype ("int" )
216
219
new_start = max (pos [0 ], 0 )
217
220
new_stop = min (pos [1 ], self .axis_transform .size )
218
221
return IndexSelResult ({self .dim : slice (new_start , new_stop )})
@@ -368,7 +371,7 @@ def sel(self, labels: dict[Any, Any], method=None, tolerance=None) -> IndexSelRe
368
371
for coord_names , index in self ._wrapped_indexes .items ():
369
372
if not isinstance (coord_names , tuple ):
370
373
coord_names = (coord_names ,)
371
- index_labels = {k : v for k , v in labels if k in coord_names }
374
+ index_labels = {k : v for k , v in labels . items () if k in coord_names }
372
375
if index_labels :
373
376
results .append (index .sel (index_labels , method = method , tolerance = tolerance ))
374
377
@@ -403,3 +406,14 @@ def __repr__(self):
403
406
items += [repr (coord_names ) + ":" , textwrap .indent (repr (index ), " " )]
404
407
405
408
return "RasterIndex\n " + "\n " .join (items )
409
+
410
+ def transform (self ) -> Affine :
411
+ """Returns Affine transform for top-left corners."""
412
+ if len (self ._wrapped_indexes ) > 1 :
413
+ x = self ._wrapped_indexes ["x" ].axis_transform .affine
414
+ y = self ._wrapped_indexes ["y" ].axis_transform .affine
415
+ aff = Affine (x .a , x .b , x .c , y .d , y .e , y .f )
416
+ else :
417
+ index = next (iter (self ._wrapped_indexes .values ()))
418
+ aff = index .affine
419
+ return aff * Affine .translation (- 0.5 , - 0.5 )
0 commit comments