From b79bcb179d4df80e6ddc9e06058d08ea90024d12 Mon Sep 17 00:00:00 2001 From: snowman2 Date: Wed, 27 Mar 2019 08:55:51 -0500 Subject: [PATCH] fixed projection equivalence testing & projecting with time transformations --- pyproj/_transformer.pyx | 37 +++++------------------------------- pyproj/transformer.py | 10 +++------- unittest/test_transformer.py | 20 +++++++++---------- 3 files changed, 18 insertions(+), 49 deletions(-) diff --git a/pyproj/_transformer.pyx b/pyproj/_transformer.pyx index 4d2bfd408..2b6f96e20 100644 --- a/pyproj/_transformer.pyx +++ b/pyproj/_transformer.pyx @@ -39,14 +39,14 @@ cdef class _Transformer: cdef _Transformer transformer = _Transformer() transformer.projpj = proj_create_crs_to_crs( transformer.projctx, - _Transformer._definition_from_object(proj_from), - _Transformer._definition_from_object(proj_to), + cstrencode(proj_from.crs.srs), + cstrencode(proj_to.crs.srs), NULL) if transformer.projpj is NULL: raise ProjError("Error creating CRS to CRS.") transformer.set_radians_io() - transformer.projections_exact_same = proj_from.is_exact_same(proj_to) - transformer.projections_equivalent = proj_from == proj_to + transformer.projections_exact_same = proj_from.crs.is_exact_same(proj_to.crs) + transformer.projections_equivalent = proj_from.crs == proj_to.crs transformer.skip_equivalent = skip_equivalent transformer.is_pipeline = False return transformer @@ -62,17 +62,6 @@ cdef class _Transformer: transformer.output_geographic = proj_to.crs.is_geographic return transformer - @staticmethod - def from_crs(crs_from, crs_to, skip_equivalent=False): - if not isinstance(crs_from, CRS): - crs_from = CRS.from_user_input(crs_from) - if not isinstance(crs_to, CRS): - crs_to = CRS.from_user_input(crs_to) - transformer = _Transformer._init_crs_to_crs(crs_from, crs_to, skip_equivalent=skip_equivalent) - transformer.input_geographic = crs_from.is_geographic - transformer.output_geographic = crs_to.is_geographic - return transformer - @staticmethod def from_pipeline(const char *proj_pipeline): cdef _Transformer transformer = _Transformer() @@ -85,22 +74,6 @@ cdef class _Transformer: transformer.is_pipeline = True return transformer - @staticmethod - def _definition_from_object(in_proj): - """ - Parameters - ---------- - in_proj: :obj:`pyproj.Proj` or :obj:`pyproj.CRS` - - Returns - ------- - char*: Definition string for `proj_create_crs_to_crs`. - - """ - if isinstance(in_proj, Proj): - return cstrencode(in_proj.crs.srs) - return cstrencode(in_proj.srs) - def _transform(self, inx, iny, inz, intime, radians, errcheck=False): if self.projections_exact_same or (self.projections_equivalent and self.skip_equivalent): return @@ -130,7 +103,7 @@ cdef class _Transformer: else: buflent = bufleny - if not (buflenx == bufleny == buflenz == buflent): + if not buflenx or not (buflenx == bufleny == buflenz == buflent): raise ProjError('x,y,z, and time must be same size') xx = xdata yy = ydata diff --git a/pyproj/transformer.py b/pyproj/transformer.py index 66436a126..cc22ba79a 100644 --- a/pyproj/transformer.py +++ b/pyproj/transformer.py @@ -84,11 +84,7 @@ def from_crs(crs_from, crs_to, skip_equivalent=False): :obj:`pyproj.Transformer` """ - transformer = Transformer() - transformer._transformer = _Transformer.from_crs( - crs_from, crs_to, skip_equivalent - ) - return transformer + return Transformer.from_proj(crs_from, crs_to, skip_equivalent=skip_equivalent) @staticmethod def from_pipeline(proj_pipeline): @@ -154,7 +150,7 @@ def transform(self, xx, yy, zz=None, tt=None, radians=False, errcheck=False): >>> xpjr, ypjr, zpjr = transprojr.transform(xpj, ypj, zpj, radians=True) >>> "%.3f %.3f %.3f" % (xpjr, ypjr, zpjr) '-2704026.010 -4253051.810 3895878.820' - >>> transformer = Transformer.from_crs("epsg:4326", 4326, skip_equivalent=True) + >>> transformer = Transformer.from_proj("epsg:4326", 4326, skip_equivalent=True) >>> xeq, yeq = transformer.transform(33, 98) >>> "%.0f %.0f" % (xeq, yeq) '33 98' @@ -230,7 +226,7 @@ def itransform( >>> transprojr = Transformer.from_proj('+init=EPSG:4326', {"proj":'geocent', "ellps":'WGS84', "datum":'WGS84'}) >>> for pt in transprojr.itransform([(-2.137, 0.661, -20.531)], radians=True): '{:.3f} {:.3f} {:.3f}'.format(*pt) '-2704214.394 -4254414.478 3894270.731' - >>> transproj_eq = Transformer.from_proj('+init=EPSG:4326', 4326, skip_equivalent=True) + >>> transproj_eq = Transformer.from_proj('+init=EPSG:4326', '+proj=longlat +datum=WGS84 +no_defs +type=crs', skip_equivalent=True) >>> for pt in transproj_eq.itransform([(-2.137, 0.661)]): '{:.3f} {:.3f}'.format(*pt) '-2.137 0.661' diff --git a/unittest/test_transformer.py b/unittest/test_transformer.py index d4eba8bbf..92ad37d08 100644 --- a/unittest/test_transformer.py +++ b/unittest/test_transformer.py @@ -84,14 +84,14 @@ def test_equivalent_proj(): ) assert transformer._transformer.skip_equivalent assert transformer._transformer.projections_equivalent - assert transformer._transformer.projections_exact_same + assert not transformer._transformer.projections_exact_same def test_equivalent_proj__disabled(): transformer = Transformer.from_proj(3857, pyproj.Proj(3857).crs.to_proj4()) assert not transformer._transformer.skip_equivalent - assert transformer._transformer.projections_equivalent - assert transformer._transformer.projections_exact_same + assert not transformer._transformer.projections_equivalent + assert not transformer._transformer.projections_exact_same def test_equivalent_proj__different(): @@ -135,14 +135,14 @@ def test_4d_transform_crs_obs1(): transformer.transform( xx=3496737.2679, yy=743254.4507, zz=5264462.9620, tt=2019.0 ), - (3496737.2679, 743254.4507, 5264462.962, 2019.0), + (3496737.757717311, 743253.9940103051, 5264462.701132784, 2019.0), ) def test_4d_transform_orginal_crs_obs1(): assert_almost_equal( transform(7789, 8401, x=3496737.2679, y=743254.4507, z=5264462.9620, tt=2019.0), - (3496737.2679, 743254.4507, 5264462.962, 2019.0), + (3496737.757717311, 743253.9940103051, 5264462.701132784, 2019.0), ) @@ -152,7 +152,7 @@ def test_4d_transform_crs_obs2(): transformer.transform( xx=3496737.2679, yy=743254.4507, zz=5264462.9620, tt=2019.0 ), - (3496737.2679, 743254.4507, 5264462.962, 2019.0), + (3496737.7857162016, 743254.0394113371, 5264462.643659916, 2019.0), ) @@ -160,14 +160,14 @@ def test_2d_with_time_transform_crs_obs2(): transformer = Transformer.from_proj(4896, 7930) assert_almost_equal( transformer.transform(xx=3496737.2679, yy=743254.4507, tt=2019.0), - (3496737.2679, 743254.4507, 2019.0), + (3496737.4105305015, 743254.1014318303, 2019.0), ) def test_2d_with_time_transform_original_crs_obs2(): assert_almost_equal( transform(4896, 7930, x=3496737.2679, y=743254.4507, tt=2019.0), - (3496737.2679, 743254.4507, 2019.0), + (3496737.4105305015, 743254.1014318303, 2019.0), ) @@ -200,7 +200,7 @@ def test_4d_itransform_orginal_crs_obs1(): list( itransform(7789, 8401, [(3496737.2679, 743254.4507, 5264462.9620, 2019.0)]) ), - [(3496737.2679, 743254.4507, 5264462.962, 2019.0)], + [(3496737.757717311, 743253.9940103051, 5264462.701132784, 2019.0)], ) @@ -209,7 +209,7 @@ def test_2d_with_time_itransform_original_crs_obs2(): list( itransform(4896, 7930, [(3496737.2679, 743254.4507, 2019.0)], time_3rd=True) ), - [(3496737.2679, 743254.4507, 2019.0)], + [(3496737.4105305015, 743254.1014318303, 2019.0)], )