[Git][debian-gis-team/pyresample][master] 5 commits: New upstream version 1.13.1

Antonio Valentino gitlab at salsa.debian.org
Mon Sep 30 07:07:20 BST 2019



Antonio Valentino pushed to branch master at Debian GIS Project / pyresample


Commits:
44db96dd by Antonio Valentino at 2019-09-30T05:59:43Z
New upstream version 1.13.1
- - - - -
703badc0 by Antonio Valentino at 2019-09-30T05:59:43Z
New upstream release

- - - - -
421c1631 by Antonio Valentino at 2019-09-30T05:59:43Z
Refresh all patches

- - - - -
c5a15af1 by Antonio Valentino at 2019-09-30T06:00:59Z
Explicitly specify Rules-Requires-Root

- - - - -
be1169b3 by Antonio Valentino at 2019-09-30T06:01:34Z
Set distribution to unstable

- - - - -


11 changed files:

- CHANGELOG.md
- debian/changelog
- debian/control
- debian/patches/0001-fix-proj4-initialization.patch
- debian/patches/0002-Skip-dask-related-tests-if-dask-is-not-available.patch
- debian/patches/0003-Make-xarray-optional-for-testing.patch
- pyresample/geometry.py
- pyresample/test/test_geometry.py
- pyresample/test/test_utils.py
- pyresample/utils/_proj4.py
- pyresample/version.py


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -1,3 +1,15 @@
+## Version 1.13.1 (2019/09/26)
+
+### Pull Requests Merged
+
+#### Bugs fixed
+
+* [PR 218](https://github.com/pytroll/pyresample/pull/218) - Fix proj_str returning invalid PROJ strings when towgs84 was included
+* [PR 217](https://github.com/pytroll/pyresample/pull/217) - Fix get_geostationary_angle_extent assuming a/b definitions
+* [PR 216](https://github.com/pytroll/pyresample/pull/216) - Fix proj4 radius parameters for spherical cases
+
+In this release 3 pull requests were closed.
+
 ## Version 1.13.0 (2019/09/13)
 
 ### Issues Closed


=====================================
debian/changelog
=====================================
@@ -1,3 +1,13 @@
+pyresample (1.13.1-1) unstable; urgency=medium
+
+  * New upstream release.
+  * debian/patches:
+    - refresh all patches
+  * debian/control:
+    - explicitly specify Rules-Requires-Root: no
+
+ -- Antonio Valentino <antonio.valentino at tiscali.it>  Mon, 30 Sep 2019 08:01:23 +0200
+
 pyresample (1.13.0-1) unstable; urgency=medium
 
   * New upstream release.


=====================================
debian/control
=====================================
@@ -3,6 +3,7 @@ Maintainer: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
 Uploaders: Antonio Valentino <antonio.valentino at tiscali.it>
 Section: python
 Priority: optional
+Rules-Requires-Root: no
 Build-Depends: cython3,
                debhelper-compat (= 12),
                dh-python,


=====================================
debian/patches/0001-fix-proj4-initialization.patch
=====================================
@@ -21,7 +21,7 @@ index 063264d..620e665 100644
    YSIZE: 480
    AREA_EXTENT:  (-20037508.342789244, -10018754.171394622, 20037508.342789244, 10018754.171394622)
 diff --git a/pyresample/test/test_geometry.py b/pyresample/test/test_geometry.py
-index ba3341e..7a9630b 100644
+index 387546f..2c6375b 100644
 --- a/pyresample/test/test_geometry.py
 +++ b/pyresample/test/test_geometry.py
 @@ -560,7 +560,7 @@ class Test(unittest.TestCase):


=====================================
debian/patches/0002-Skip-dask-related-tests-if-dask-is-not-available.patch
=====================================
@@ -9,7 +9,7 @@ Subject: Skip dask-related tests if dask is not available
  3 files changed, 18 insertions(+), 2 deletions(-)
 
 diff --git a/pyresample/test/test_geometry.py b/pyresample/test/test_geometry.py
-index 7a9630b..0cd6ed2 100644
+index 2c6375b..c3f58dc 100644
 --- a/pyresample/test/test_geometry.py
 +++ b/pyresample/test/test_geometry.py
 @@ -9,7 +9,8 @@ import numpy as np
@@ -42,7 +42,7 @@ index 7a9630b..0cd6ed2 100644
      def test_get_proj_coords_dask(self):
          """Test get_proj_coords usage with dask arrays."""
          from pyresample import utils
-@@ -1424,6 +1431,8 @@ class TestSwathDefinition(unittest.TestCase):
+@@ -1456,6 +1463,8 @@ class TestSwathDefinition(unittest.TestCase):
          assert_np_dict_allclose(res.proj_dict, proj_dict)
          self.assertEqual(res.shape, (6, 3))
  
@@ -51,7 +51,7 @@ index 7a9630b..0cd6ed2 100644
      def test_aggregation(self):
          """Test aggregation on SwathDefinitions."""
          if (sys.version_info < (3, 0)):
-@@ -1441,6 +1450,7 @@ class TestSwathDefinition(unittest.TestCase):
+@@ -1473,6 +1482,7 @@ class TestSwathDefinition(unittest.TestCase):
          np.testing.assert_allclose(res.lons, [[179, -179]])
          np.testing.assert_allclose(res.lats, [[0.5, 0.5]], atol=2e-5)
  


=====================================
debian/patches/0003-Make-xarray-optional-for-testing.patch
=====================================
@@ -9,7 +9,7 @@ Subject: Make xarray optional for testing
  3 files changed, 17 insertions(+), 1 deletion(-)
 
 diff --git a/pyresample/test/test_geometry.py b/pyresample/test/test_geometry.py
-index 0cd6ed2..de5fd7e 100644
+index c3f58dc..c63fa9c 100644
 --- a/pyresample/test/test_geometry.py
 +++ b/pyresample/test/test_geometry.py
 @@ -24,6 +24,11 @@ if sys.version_info < (2, 7):
@@ -24,7 +24,7 @@ index 0cd6ed2..de5fd7e 100644
  try:
      import dask
  except ImportError:
-@@ -1330,6 +1335,7 @@ class TestSwathDefinition(unittest.TestCase):
+@@ -1362,6 +1367,7 @@ class TestSwathDefinition(unittest.TestCase):
          self.assertFalse(
              swath_def == swath_def2, 'swath_defs are not expected to be equal')
  
@@ -32,7 +32,7 @@ index 0cd6ed2..de5fd7e 100644
      def test_compute_omerc_params(self):
          """Test omerc parameters computation."""
          lats = np.array([[85.23900604248047, 62.256004333496094, 35.58000183105469],
-@@ -1401,6 +1407,7 @@ class TestSwathDefinition(unittest.TestCase):
+@@ -1433,6 +1439,7 @@ class TestSwathDefinition(unittest.TestCase):
          np.testing.assert_allclose(lats, [80., 80., 80., 80., 80., 80., 80.,
                                            80., 80., 80., 80., 80.])
  
@@ -40,7 +40,7 @@ index 0cd6ed2..de5fd7e 100644
      def test_compute_optimal_bb(self):
          """Test computing the bb area."""
          from pyresample.utils import is_pyproj2
-@@ -1431,6 +1438,7 @@ class TestSwathDefinition(unittest.TestCase):
+@@ -1463,6 +1470,7 @@ class TestSwathDefinition(unittest.TestCase):
          assert_np_dict_allclose(res.proj_dict, proj_dict)
          self.assertEqual(res.shape, (6, 3))
  
@@ -48,7 +48,7 @@ index 0cd6ed2..de5fd7e 100644
      @unittest.skipIf(not hasattr(DataArray, 'coarsen'), 'DataArray.coarsen not available')
      @unittest.skipIf(not dask, 'dask not available')
      def test_aggregation(self):
-@@ -1450,6 +1458,7 @@ class TestSwathDefinition(unittest.TestCase):
+@@ -1482,6 +1490,7 @@ class TestSwathDefinition(unittest.TestCase):
          np.testing.assert_allclose(res.lons, [[179, -179]])
          np.testing.assert_allclose(res.lats, [[0.5, 0.5]], atol=2e-5)
  
@@ -56,7 +56,7 @@ index 0cd6ed2..de5fd7e 100644
      @unittest.skipIf(not dask, 'dask not available')
      def test_striding(self):
          """Test striding."""
-@@ -1776,6 +1785,7 @@ class TestDynamicAreaDefinition(unittest.TestCase):
+@@ -1808,6 +1817,7 @@ class TestDynamicAreaDefinition(unittest.TestCase):
          self.assertEqual(result.width, 395)
          self.assertEqual(result.height, 539)
  


=====================================
pyresample/geometry.py
=====================================
@@ -36,7 +36,8 @@ from pyproj import Geod, transform
 from pyresample import CHUNK_SIZE
 from pyresample._spatial_mp import Cartesian, Cartesian_MP, Proj, Proj_MP
 from pyresample.boundary import AreaDefBoundary, Boundary, SimpleBoundary
-from pyresample.utils import proj4_str_to_dict, proj4_dict_to_str, convert_proj_floats
+from pyresample.utils import (proj4_str_to_dict, proj4_dict_to_str,
+                              convert_proj_floats, proj4_radius_parameters)
 from pyresample.area_config import create_area_def
 
 try:
@@ -1346,7 +1347,17 @@ class AreaDefinition(BaseDefinition):
     @property
     def proj_str(self):
         """Return PROJ projection string."""
-        return proj4_dict_to_str(self.proj_dict, sort=True)
+        proj_dict = self.proj_dict.copy()
+        if 'towgs84' in proj_dict and isinstance(proj_dict['towgs84'], list):
+            # pyproj 2+ creates a list in the dictionary
+            # but the string should be comma-separated
+            if all(x == 0 for x in proj_dict['towgs84']):
+                # all 0s in towgs84 are technically equal to not having them
+                # specified, but PROJ considers them different
+                proj_dict.pop('towgs84')
+            else:
+                proj_dict['towgs84'] = ','.join(str(x) for x in proj_dict['towgs84'])
+        return proj4_dict_to_str(proj_dict, sort=True)
 
     def __str__(self):
         """Return string representation of the AreaDefinition."""
@@ -1904,8 +1915,9 @@ class AreaDefinition(BaseDefinition):
 def get_geostationary_angle_extent(geos_area):
     """Get the max earth (vs space) viewing angles in x and y."""
     # get some projection parameters
-    req = geos_area.proj_dict['a'] / 1000.0
-    rp = geos_area.proj_dict['b'] / 1000.0
+    a, b = proj4_radius_parameters(geos_area.proj_dict)
+    req = a / 1000.0
+    rp = b / 1000.0
     h = geos_area.proj_dict['h'] / 1000.0 + req
 
     # compute some constants


=====================================
pyresample/test/test_geometry.py
=====================================
@@ -1133,6 +1133,38 @@ class Test(unittest.TestCase):
                 area_extent=[-40000., -40000., 40000., 40000.])
             self.assertEqual(area.proj_str, expected_proj)
 
+        if utils.is_pyproj2():
+            # CRS with towgs84 in it
+            # we remove towgs84 if they are all 0s
+            projection = {'proj': 'laea', 'lat_0': 52, 'lon_0': 10, 'x_0': 4321000, 'y_0': 3210000,
+                          'ellps': 'GRS80', 'towgs84': '0,0,0,0,0,0,0', 'units': 'm', 'no_defs': True}
+            area = geometry.AreaDefinition(
+                area_id='test_towgs84',
+                description='',
+                proj_id='',
+                projection=projection,
+                width=123, height=123,
+                area_extent=[-40000., -40000., 40000., 40000.])
+            self.assertEqual(area.proj_str,
+                             '+ellps=GRS80 +lat_0=52 +lon_0=10 +no_defs +proj=laea '
+                             # '+towgs84=0.0,0.0,0.0,0.0,0.0,0.0,0.0 '
+                             '+type=crs +units=m '
+                             '+x_0=4321000 +y_0=3210000')
+            projection = {'proj': 'laea', 'lat_0': 52, 'lon_0': 10, 'x_0': 4321000, 'y_0': 3210000,
+                          'ellps': 'GRS80', 'towgs84': '0,5,0,0,0,0,0', 'units': 'm', 'no_defs': True}
+            area = geometry.AreaDefinition(
+                area_id='test_towgs84',
+                description='',
+                proj_id='',
+                projection=projection,
+                width=123, height=123,
+                area_extent=[-40000., -40000., 40000., 40000.])
+            self.assertEqual(area.proj_str,
+                             '+ellps=GRS80 +lat_0=52 +lon_0=10 +no_defs +proj=laea '
+                             '+towgs84=0.0,5.0,0.0,0.0,0.0,0.0,0.0 '
+                             '+type=crs +units=m '
+                             '+x_0=4321000 +y_0=3210000')
+
     def test_striding(self):
         """Test striding AreaDefinitions."""
         from pyresample import utils
@@ -1867,6 +1899,13 @@ class TestCrop(unittest.TestCase):
 
         expected = (0.15185342867090912, 0.15133555510297725)
 
+        np.testing.assert_allclose(expected,
+                                   geometry.get_geostationary_angle_extent(geos_area))
+
+        geos_area.proj_dict = {'ellps': 'GRS80',
+                               'h': 35785831.00}
+        expected = (0.15185277703584374, 0.15133971368991794)
+
         np.testing.assert_allclose(expected,
                                    geometry.get_geostationary_angle_extent(geos_area))
 


=====================================
pyresample/test/test_utils.py
=====================================
@@ -330,6 +330,7 @@ class TestMisc(unittest.TestCase):
                            1000, 1000, (-1000, -1000, 1000, 1000))
 
     def test_proj4_radius_parameters_provided(self):
+        """Test proj4_radius_parameters with a/b."""
         from pyresample import utils
         a, b = utils._proj4.proj4_radius_parameters(
             '+proj=stere +a=6378273 +b=6356889.44891',
@@ -338,6 +339,7 @@ class TestMisc(unittest.TestCase):
         np.testing.assert_almost_equal(b, 6356889.44891)
 
     def test_proj4_radius_parameters_ellps(self):
+        """Test proj4_radius_parameters with ellps."""
         from pyresample import utils
         a, b = utils._proj4.proj4_radius_parameters(
             '+proj=stere +ellps=WGS84',
@@ -346,6 +348,7 @@ class TestMisc(unittest.TestCase):
         np.testing.assert_almost_equal(b, 6356752.314245, decimal=6)
 
     def test_proj4_radius_parameters_default(self):
+        """Test proj4_radius_parameters with default parameters."""
         from pyresample import utils
         a, b = utils._proj4.proj4_radius_parameters(
             '+proj=lcc',
@@ -354,6 +357,15 @@ class TestMisc(unittest.TestCase):
         np.testing.assert_almost_equal(a, 6378137.)
         np.testing.assert_almost_equal(b, 6356752.314245, decimal=6)
 
+    def test_proj4_radius_parameters_spherical(self):
+        """Test proj4_radius_parameters in case of a spherical earth."""
+        from pyresample import utils
+        a, b = utils._proj4.proj4_radius_parameters(
+            '+proj=stere +R=6378273',
+        )
+        np.testing.assert_almost_equal(a, 6378273.)
+        np.testing.assert_almost_equal(b, 6378273.)
+
     def test_convert_proj_floats(self):
         from collections import OrderedDict
         import pyresample.utils as utils


=====================================
pyresample/utils/_proj4.py
=====================================
@@ -113,6 +113,9 @@ def proj4_radius_parameters(proj4_dict):
             new_info['b'] = float(new_info['a']) * (1 - float(new_info['f']))
         elif 'b' in new_info and 'f' in new_info:
             new_info['a'] = float(new_info['b']) / (1 - float(new_info['f']))
+        elif 'R' in new_info:
+            new_info['a'] = new_info['R']
+            new_info['b'] = new_info['R']
         else:
             geod = Geod(**{'ellps': 'WGS84'})
             new_info['a'] = geod.a


=====================================
pyresample/version.py
=====================================
@@ -23,9 +23,9 @@ def get_keywords():
     # setup.py/versioneer.py will grep for the variable names, so they must
     # each be defined on a line of their own. _version.py will just call
     # get_keywords().
-    git_refnames = " (HEAD -> master, tag: v1.13.0)"
-    git_full = "790a0bae85cb243c17f0150011e30c834f244e04"
-    git_date = "2019-09-13 08:32:20 +0200"
+    git_refnames = " (HEAD -> master, tag: v1.13.1)"
+    git_full = "d9ff2c9012a4dbfd0f39172fde2e21bb34c04e4a"
+    git_date = "2019-09-26 20:22:21 +0200"
     keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
     return keywords
 



View it on GitLab: https://salsa.debian.org/debian-gis-team/pyresample/compare/44d53d73f4a56ca27fed046c8baff194f4b4b3d6...be1169b316646e8e82b084cfd0319efd85fa8bf2

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pyresample/compare/44d53d73f4a56ca27fed046c8baff194f4b4b3d6...be1169b316646e8e82b084cfd0319efd85fa8bf2
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20190930/02f1cb3b/attachment-0001.html>


More information about the Pkg-grass-devel mailing list