From e4d5abc63b10210db074e71a2979308d74ca8e41 Mon Sep 17 00:00:00 2001 From: Dan Mahr Date: Mon, 10 Apr 2023 20:28:05 -0400 Subject: [PATCH] ENH: Added `allow_superseded` kwargs to `TransformerGroup` (#1269) --- docs/history.rst | 1 + pyproj/_transformer.pyi | 1 + pyproj/_transformer.pyx | 6 ++++++ pyproj/proj.pxi | 5 +++++ pyproj/transformer.py | 7 +++++++ test/test_transformer.py | 17 +++++++++++++++++ 6 files changed, 37 insertions(+) diff --git a/docs/history.rst b/docs/history.rst index 522290c00..4ea3d7c6b 100644 --- a/docs/history.rst +++ b/docs/history.rst @@ -3,6 +3,7 @@ Change Log Latest ------ +- ENH: Added allow_superseded kwargs to :class:`pyproj.transformer.TransformerGroup` (pull #1269) - ENH: Added :meth:`CRS.to_2d` to demote 3D CRS to 2D (issue #1266) diff --git a/pyproj/_transformer.pyi b/pyproj/_transformer.pyi index 37de4eb6f..0908829fd 100644 --- a/pyproj/_transformer.pyi +++ b/pyproj/_transformer.pyi @@ -41,6 +41,7 @@ class _TransformerGroup: authority: Optional[str], accuracy: Optional[float], allow_ballpark: bool, + allow_superseded: bool, ) -> None: ... class _Transformer(Base): diff --git a/pyproj/_transformer.pyx b/pyproj/_transformer.pyx index 7bc6f3886..13491e08e 100644 --- a/pyproj/_transformer.pyx +++ b/pyproj/_transformer.pyx @@ -141,6 +141,7 @@ cdef class _TransformerGroup: bint allow_ballpark, str authority, double accuracy, + bint allow_superseded, ): """ From PROJ docs: @@ -202,6 +203,11 @@ cdef class _TransformerGroup: operation_factory_context, allow_ballpark, ) + proj_operation_factory_context_set_discard_superseded( + self.context, + operation_factory_context, + not allow_superseded, + ) proj_operation_factory_context_set_grid_availability_use( self.context, operation_factory_context, diff --git a/pyproj/proj.pxi b/pyproj/proj.pxi index a28d5e6c6..96bab8c48 100644 --- a/pyproj/proj.pxi +++ b/pyproj/proj.pxi @@ -478,6 +478,11 @@ cdef extern from "proj.h" nogil: PJ_OPERATION_FACTORY_CONTEXT *factory_ctx, int allow ) + void proj_operation_factory_context_set_discard_superseded( + PJ_CONTEXT *ctx, + PJ_OPERATION_FACTORY_CONTEXT *factory_ctx, + int discard + ) void proj_operation_factory_context_set_desired_accuracy( PJ_CONTEXT *ctx, PJ_OPERATION_FACTORY_CONTEXT *factory_ctx, diff --git a/pyproj/transformer.py b/pyproj/transformer.py index c088e2220..a827294b1 100644 --- a/pyproj/transformer.py +++ b/pyproj/transformer.py @@ -161,11 +161,13 @@ def __init__( authority: Optional[str] = None, accuracy: Optional[float] = None, allow_ballpark: bool = True, + allow_superseded: bool = False, ) -> None: """Get all possible transformations from a :obj:`pyproj.crs.CRS` or input used to create one. .. versionadded:: 3.4.0 authority, accuracy, allow_ballpark + .. versionadded:: 3.6.0 allow_superseded Parameters ---------- @@ -195,6 +197,10 @@ def __init__( allow_ballpark: bool, default=True Set to False to disallow the use of Ballpark transformation in the candidate coordinate operations. Default is to allow. + allow_superseded: bool, default=False + Set to True to allow the use of superseded (but not deprecated) + transformations in the candidate coordinate operations. Default is + to disallow. """ super().__init__( @@ -205,6 +211,7 @@ def __init__( authority=authority, accuracy=-1 if accuracy is None else accuracy, allow_ballpark=allow_ballpark, + allow_superseded=allow_superseded, ) for iii, transformer in enumerate(self._transformers): # pylint: disable=unsupported-assignment-operation diff --git a/test/test_transformer.py b/test/test_transformer.py index c18ba1d25..55a436963 100644 --- a/test/test_transformer.py +++ b/test/test_transformer.py @@ -1651,6 +1651,23 @@ def test_transformer_group_allow_ballpark_filter(): assert not group.unavailable_operations +@pytest.mark.parametrize( + "from_crs, to_crs, allow_superseded, expected_num_transformers", + [ + (6319, 5703, 0, 2), + (6319, 5703, False, 2), + (6319, 5703, True, 3), + (6319, 5703, 123456789, 3), + (6319, 5703, "blah", 3), + ], +) +def test_transformer_group_allow_superseded_filter( + from_crs, to_crs, allow_superseded, expected_num_transformers +): + group = TransformerGroup(from_crs, to_crs, allow_superseded=allow_superseded) + assert len(group.transformers) == expected_num_transformers + + def test_transformer_group_authority_filter(): group = TransformerGroup("EPSG:4326", "EPSG:4258", authority="PROJ") assert len(group.transformers) == 1