Skip to content

Commit afdb012

Browse files
committed
Fix rasterio rowcol operation return type
1 parent 940825f commit afdb012

2 files changed

Lines changed: 79 additions & 7 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from typing_extensions import assert_type
2+
3+
from affine import Affine
4+
from rasterio.transform import TransformMethodsMixin, rowcol
5+
6+
transform = Affine.identity()
7+
8+
assert_type(rowcol(transform, 0.5, 0.5), tuple[int, int] | tuple[list[int], list[int]])
9+
assert_type(rowcol(transform, 0.5, 0.5, op=lambda value: value), tuple[float, float] | tuple[list[float], list[float]])
10+
11+
mixin = TransformMethodsMixin()
12+
assert_type(mixin.index(0.5, 0.5, op=lambda value: value), tuple[int, int] | tuple[list[int], list[int]])

‎stubs/rasterio/rasterio/transform.pyi‎

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
from _typeshed import ConvertibleToInt
12
from collections.abc import Callable, Sequence
23
from typing import Final, Literal, TypeAlias, overload
3-
from typing_extensions import Self, deprecated
4+
from typing_extensions import Self, TypeVar, deprecated
45

56
from affine import Affine as Affine
67
from rasterio._transform import GCPTransformerBase, RPCTransformerBase
@@ -12,7 +13,8 @@ from rasterio.rpc import RPC
1213

1314
_Sextuple: TypeAlias = tuple[float, float, float, float, float, float]
1415
_OffsetOptions: TypeAlias = Literal["center", "ul", "ur", "ll", "lr"]
15-
_RoundOperation: TypeAlias = Callable[[float], int]
16+
_T = TypeVar("_T")
17+
_RoundOperation: TypeAlias = Callable[[float], _T]
1618

1719
IDENTITY: Final[Affine]
1820
GDAL_IDENTITY: Final[_Sextuple]
@@ -32,7 +34,7 @@ class TransformMethodsMixin:
3234
x: float | Sequence[float],
3335
y: float | Sequence[float],
3436
z: float | Sequence[float] | None = None,
35-
op: _RoundOperation | None = None,
37+
op: _RoundOperation[ConvertibleToInt] | None = None,
3638
precision: int | None = None,
3739
transform_method: TransformMethod = ...,
3840
**rpc_options: _GDALOption,
@@ -52,15 +54,39 @@ def xy(
5254
offset: _OffsetOptions = "center",
5355
**rpc_options: _GDALOption,
5456
) -> tuple[float, float] | tuple[list[float], list[float]]: ...
57+
58+
@overload
5559
def rowcol(
5660
transform: Affine | Sequence[GroundControlPoint] | RPC,
5761
xs: float | Sequence[float],
5862
ys: float | Sequence[float],
5963
zs: float | Sequence[float] | None = None,
60-
op: _RoundOperation | None = None,
64+
op: None = None,
6165
precision: int | None = None,
6266
**rpc_options: _GDALOption,
6367
) -> tuple[int, int] | tuple[list[int], list[int]]: ...
68+
@overload
69+
def rowcol(
70+
transform: Affine | Sequence[GroundControlPoint] | RPC,
71+
xs: float | Sequence[float],
72+
ys: float | Sequence[float],
73+
zs: float | Sequence[float] | None,
74+
op: _RoundOperation[_T],
75+
precision: int | None = None,
76+
**rpc_options: _GDALOption,
77+
) -> tuple[_T, _T] | tuple[list[_T], list[_T]]: ...
78+
@overload
79+
def rowcol(
80+
transform: Affine | Sequence[GroundControlPoint] | RPC,
81+
xs: float | Sequence[float],
82+
ys: float | Sequence[float],
83+
zs: float | Sequence[float] | None = None,
84+
*,
85+
op: _RoundOperation[_T],
86+
precision: int | None = None,
87+
**rpc_options: _GDALOption,
88+
) -> tuple[_T, _T] | tuple[list[_T], list[_T]]: ...
89+
6490
def get_transformer(
6591
transform: Affine | Sequence[GroundControlPoint] | RPC, **rpc_options: _GDALOption
6692
) -> type[TransformerBase]: ...
@@ -77,24 +103,58 @@ class TransformerBase:
77103
offset: _OffsetOptions = "center",
78104
) -> tuple[float, float] | tuple[list[float], list[float]]: ...
79105

106+
@overload
107+
def rowcol(
108+
self, xs: float | Sequence[float], ys: float | Sequence[float], zs: float | Sequence[float] | None = None, op: None = None
109+
) -> tuple[int, int] | tuple[list[int], list[int]]: ...
110+
@overload
111+
def rowcol(
112+
self,
113+
xs: float | Sequence[float],
114+
ys: float | Sequence[float],
115+
zs: float | Sequence[float] | None,
116+
op: _RoundOperation[_T],
117+
) -> tuple[_T, _T] | tuple[list[_T], list[_T]]: ...
80118
@overload
81119
def rowcol(
82120
self,
83121
xs: float | Sequence[float],
84122
ys: float | Sequence[float],
85123
zs: float | Sequence[float] | None = None,
86-
op: _RoundOperation | None = None,
87-
) -> tuple[int, int] | tuple[list[int], list[int]]: ...
124+
*,
125+
op: _RoundOperation[_T],
126+
) -> tuple[_T, _T] | tuple[list[_T], list[_T]]: ...
88127
@overload
89128
@deprecated("The `precision` parameter is unused since rasterio 1.3 and will be removed in 2.0.0.")
90129
def rowcol(
91130
self,
92131
xs: float | Sequence[float],
93132
ys: float | Sequence[float],
94133
zs: float | Sequence[float] | None = None,
95-
op: _RoundOperation | None = None,
134+
op: None = None,
96135
precision: int | None = None,
97136
) -> tuple[int, int] | tuple[list[int], list[int]]: ...
137+
@overload
138+
@deprecated("The `precision` parameter is unused since rasterio 1.3 and will be removed in 2.0.0.")
139+
def rowcol(
140+
self,
141+
xs: float | Sequence[float],
142+
ys: float | Sequence[float],
143+
zs: float | Sequence[float] | None,
144+
op: _RoundOperation[_T],
145+
precision: int | None = None,
146+
) -> tuple[_T, _T] | tuple[list[_T], list[_T]]: ...
147+
@overload
148+
@deprecated("The `precision` parameter is unused since rasterio 1.3 and will be removed in 2.0.0.")
149+
def rowcol(
150+
self,
151+
xs: float | Sequence[float],
152+
ys: float | Sequence[float],
153+
zs: float | Sequence[float] | None = None,
154+
*,
155+
op: _RoundOperation[_T],
156+
precision: int | None = None,
157+
) -> tuple[_T, _T] | tuple[list[_T], list[_T]]: ...
98158

99159
class GDALTransformerBase(TransformerBase):
100160
def __init__(self) -> None: ...

0 commit comments

Comments
 (0)