Skip to content

Commit 5a86caf

Browse files
authored
ENH: Added support to pickle Transformer (#1060)
1 parent 57ecfc8 commit 5a86caf

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

docs/history.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Latest
1111
- BUG: :func:`pyproj.datadir.get_data_dir` support for conda Windows (issue #1029)
1212
- ENH: warn when :meth:`pyproj.crs.CRS.to_wkt()`, :meth:`pyproj.crs.CRS.to_proj4()`, or :meth:`pyproj.crs.CRS.to_json()` returns None (issue #1036)
1313
- ENH: Added support for int-like strings and numpy dtypes (issues #1026 and #1835)
14+
- ENH: Added support to pickle :class:`pyproj.transformer.Transformer` (issues #1058)
1415

1516
3.3.0
1617
-------

pyproj/transformer.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from dataclasses import dataclass
1616
from itertools import chain, islice
1717
from pathlib import Path
18-
from typing import Any, Iterable, Iterator, List, Optional, Tuple, Union, overload
18+
from typing import Any, Dict, Iterable, Iterator, List, Optional, Tuple, Union, overload
1919

2020
from pyproj import CRS
2121
from pyproj._compat import cstrencode
@@ -310,6 +310,14 @@ def __init__(
310310
self._local.transformer = transformer_maker()
311311
self._transformer_maker = transformer_maker
312312

313+
def __getstate__(self) -> Dict[str, Any]:
314+
return {"_transformer_maker": self._transformer_maker}
315+
316+
def __setstate__(self, state: Dict[str, Any]):
317+
self.__dict__.update(state)
318+
self._local = TransformerLocal()
319+
self._local.transformer = self._transformer_maker()
320+
313321
@property
314322
def _transformer(self):
315323
"""

test/test_transformer.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import concurrent.futures
22
import os
3+
import pickle
34
from array import array
45
from functools import partial
56
from glob import glob
@@ -1534,3 +1535,18 @@ def test_transformer_source_target_crs__none():
15341535
transformer = Transformer.from_pipeline("+init=ITRF2008:ITRF2000")
15351536
assert transformer.source_crs is None
15361537
assert transformer.target_crs is None
1538+
1539+
1540+
def test_pickle_transformer_from_pipeline():
1541+
transformer = Transformer.from_pipeline("+init=ITRF2008:ITRF2000")
1542+
assert transformer == pickle.loads(pickle.dumps(transformer))
1543+
1544+
1545+
def test_pickle_transformer_from_crs():
1546+
transformer = Transformer.from_crs(
1547+
"EPSG:4326",
1548+
"EPSG:2964",
1549+
always_xy=True,
1550+
area_of_interest=AreaOfInterest(-136.46, 49.0, -60.72, 83.17),
1551+
)
1552+
assert transformer == pickle.loads(pickle.dumps(transformer))

0 commit comments

Comments
 (0)