[Git][debian-gis-team/pyresample][master] 3 commits: Fix pyproj inf (new patch)
Antonio Valentino
gitlab at salsa.debian.org
Tue Dec 3 07:48:00 GMT 2019
Antonio Valentino pushed to branch master at Debian GIS Project / pyresample
Commits:
ecbffe8a by Antonio Valentino at 2019-12-03T07:13:48Z
Fix pyproj inf (new patch)
- - - - -
2df73394 by Antonio Valentino at 2019-12-03T07:32:53Z
Replace the deprecated ADTTMP with AUTOPKGTEST_TMP
- - - - -
36841536 by Antonio Valentino at 2019-12-03T07:33:24Z
Set distribution to unstable
- - - - -
4 changed files:
- debian/changelog
- + debian/patches/0007-Fix-pyproj-inf.patch
- debian/patches/series
- debian/tests/python3
Changes:
=====================================
debian/changelog
=====================================
@@ -1,8 +1,13 @@
-pyresample (1.13.2-2) UNRELEASED; urgency=medium
+pyresample (1.13.2-2) unstable; urgency=medium
* Drop Provides: ${python3:Provides}.
+ * debian/patches:
+ - new 0007-Fix-pyproj-inf.patch, imported form
+ upstream to fix unittest failures
+ * debian/tests:
+ - replace the deprecated ADTTMP with AUTOPKGTEST_TMP
- -- Antonio Valentino <antonio.valentino at tiscali.it> Thu, 07 Nov 2019 18:41:13 +0100
+ -- Antonio Valentino <antonio.valentino at tiscali.it> Tue, 03 Dec 2019 07:33:10 +0000
pyresample (1.13.2-1) unstable; urgency=medium
=====================================
debian/patches/0007-Fix-pyproj-inf.patch
=====================================
@@ -0,0 +1,325 @@
+From: Antonio Valentino <antonio.valentino at tiscali.it>
+Date: Tue, 3 Dec 2019 07:10:43 +0000
+Subject: Fix pyproj inf
+
+See https://github.com/pytroll/pyresample/pull/236 and
+https://github.com/pytroll/pyresample/issues/237.
+---
+ pyresample/ewa/__init__.py | 4 ++--
+ pyresample/ewa/_ll2cr.pyx | 4 ++--
+ pyresample/geometry.py | 17 ++++++++++-------
+ pyresample/grid.py | 2 +-
+ pyresample/kd_tree.py | 12 +++++++-----
+ pyresample/spherical_geometry.py | 2 +-
+ pyresample/test/test_geometry.py | 22 +++++++++++-----------
+ pyresample/test/test_spherical.py | 6 +++---
+ pyresample/test/test_utils.py | 8 ++++----
+ pyresample/test/utils.py | 2 +-
+ 10 files changed, 42 insertions(+), 37 deletions(-)
+
+diff --git a/pyresample/ewa/__init__.py b/pyresample/ewa/__init__.py
+index d6c1195..62f3f11 100644
+--- a/pyresample/ewa/__init__.py
++++ b/pyresample/ewa/__init__.py
+@@ -119,8 +119,8 @@ def ll2cr(swath_def, area_def, fill=np.nan, copy=True):
+ cw = area_def.pixel_size_x
+ # cell height must be negative for this to work as expected
+ ch = -abs(area_def.pixel_size_y)
+- w = area_def.x_size
+- h = area_def.y_size
++ w = area_def.width
++ h = area_def.height
+ ox = area_def.area_extent[0] + cw / 2.
+ oy = area_def.area_extent[3] + ch / 2.
+ swath_points_in_grid = _ll2cr.ll2cr_static(lons, lats, fill,
+diff --git a/pyresample/ewa/_ll2cr.pyx b/pyresample/ewa/_ll2cr.pyx
+index 883613a..34ef568 100644
+--- a/pyresample/ewa/_ll2cr.pyx
++++ b/pyresample/ewa/_ll2cr.pyx
+@@ -159,13 +159,13 @@ def ll2cr_dynamic(numpy.ndarray[cr_dtype, ndim=2] lon_arr, numpy.ndarray[cr_dtyp
+ continue
+ elif x_tmp < xmin or npy_isnan(xmin):
+ xmin = x_tmp
+- elif x_tmp > xmax or npy_isnan(xmax) or xmax == 1e30:
++ elif x_tmp > xmax or npy_isnan(xmax) or xmax >= 1e30:
+ # Note: technically 2 valid points are required to get here if there are a lot of NaNs
+ xmax = x_tmp
+
+ if y_tmp < ymin or npy_isnan(ymin):
+ ymin = y_tmp
+- elif y_tmp > ymax or npy_isnan(ymax) or ymax == 1e30:
++ elif y_tmp > ymax or npy_isnan(ymax) or ymax >= 1e30:
+ # Note: technically 2 valid points are required to get here if there are a lot of NaNs
+ ymax = y_tmp
+
+diff --git a/pyresample/geometry.py b/pyresample/geometry.py
+index 697e4ed..9ed645b 100644
+--- a/pyresample/geometry.py
++++ b/pyresample/geometry.py
+@@ -935,7 +935,7 @@ class DynamicAreaDefinition(object):
+ def invproj(data_x, data_y, proj_dict):
+ """Perform inverse projection."""
+ # XXX: does pyproj copy arrays? What can we do so it doesn't?
+- target_proj = Proj(**proj_dict)
++ target_proj = Proj(proj_dict)
+ return np.dstack(target_proj(data_x, data_y, inverse=True))
+
+
+@@ -1591,7 +1591,7 @@ class AreaDefinition(BaseDefinition):
+
+ """
+ lon, lat = self.get_lonlats(nprocs=None, data_slice=(row, col))
+- return np.asscalar(lon), np.asscalar(lat)
++ return lon.item(), lat.item()
+
+ @staticmethod
+ def _do_rotation(xspan, yspan, rot_deg=0):
+@@ -1803,18 +1803,19 @@ class AreaDefinition(BaseDefinition):
+ raise ValueError("Can't specify 'nprocs' and 'chunks' at the same time")
+
+ # Proj.4 definition of target area projection
++ proj_def = self.crs if hasattr(self, 'crs') else self.proj_dict
+ if hasattr(target_x, 'chunks'):
+ # we are using dask arrays, map blocks to th
+ from dask.array import map_blocks
+ res = map_blocks(invproj, target_x, target_y,
+ chunks=(target_x.chunks[0], target_x.chunks[1], 2),
+- new_axis=[2], proj_dict=self.proj_dict)
++ new_axis=[2], proj_dict=proj_def)
+ return res[:, :, 0], res[:, :, 1]
+
+ if nprocs > 1:
+- target_proj = Proj_MP(**self.proj_dict)
++ target_proj = Proj_MP(proj_def)
+ else:
+- target_proj = Proj(**self.proj_dict)
++ target_proj = Proj(proj_def)
+
+ # Get corresponding longitude and latitude values
+ lons, lats = target_proj(target_x, target_y, inverse=True, nprocs=nprocs)
+@@ -1841,10 +1842,12 @@ class AreaDefinition(BaseDefinition):
+ raise NotImplementedError('Only AreaDefinitions can be used')
+
+ # Intersection only required for two different projections
+- if area_to_cover.proj_str == self.proj_str:
++ proj_def_to_cover = area_to_cover.crs if hasattr(area_to_cover, 'crs') else area_to_cover.proj_str
++ proj_def = self.crs if hasattr(self, 'crs') else self.proj_str
++ if proj_def_to_cover == proj_def:
+ logger.debug('Projections for data and slice areas are'
+ ' identical: %s',
+- area_to_cover.proj_dict.get('proj', area_to_cover.proj_dict.get('init')))
++ proj_def_to_cover)
+ # Get xy coordinates
+ llx, lly, urx, ury = area_to_cover.area_extent
+ x, y = self.get_xy_from_proj_coords([llx, urx], [lly, ury])
+diff --git a/pyresample/grid.py b/pyresample/grid.py
+index 05afb1e..3b21203 100644
+--- a/pyresample/grid.py
++++ b/pyresample/grid.py
+@@ -210,7 +210,7 @@ def get_resampled_image(target_area_def, source_area_def, source_image_data,
+
+ # Calculate number of segments if needed
+ if segments is None:
+- rows = target_area_def.y_size
++ rows = target_area_def.height
+ cut_off = 500
+ if rows > cut_off:
+ segments = int(rows / cut_off)
+diff --git a/pyresample/kd_tree.py b/pyresample/kd_tree.py
+index c45c499..c3b0136 100644
+--- a/pyresample/kd_tree.py
++++ b/pyresample/kd_tree.py
+@@ -430,7 +430,7 @@ def _get_valid_input_index(source_geo_def,
+ source_lons, source_lats,
+ radius_of_influence)
+
+- if (isinstance(valid_input_index, np.ma.core.MaskedArray)):
++ if isinstance(valid_input_index, np.ma.core.MaskedArray):
+ # Make sure valid_input_index is not a masked array
+ valid_input_index = valid_input_index.filled(False)
+
+@@ -1003,7 +1003,7 @@ class XArrayResamplerNN(object):
+
+ def _create_resample_kdtree(self, chunks=CHUNK_SIZE):
+ """Set up kd tree on input"""
+- source_lons, source_lats = self.source_geo_def.get_lonlats_dask(
++ source_lons, source_lats = self.source_geo_def.get_lonlats(
+ chunks=chunks)
+ valid_input_idx = ((source_lons >= -180) & (source_lons <= 180) &
+ (source_lats <= 90) & (source_lats >= -90))
+@@ -1058,7 +1058,8 @@ class XArrayResamplerNN(object):
+ self.valid_input_index = valid_input_idx
+ self.delayed_kdtree = resample_kdtree
+
+- target_lons, target_lats = self.target_geo_def.get_lonlats_dask()
++ # TODO: Add 'chunks' keyword argument to this method and use it
++ target_lons, target_lats = self.target_geo_def.get_lonlats(chunks=CHUNK_SIZE)
+ valid_output_idx = ((target_lons >= -180) & (target_lons <= 180) &
+ (target_lats <= 90) & (target_lats >= -90))
+
+@@ -1094,7 +1095,7 @@ class XArrayResamplerNN(object):
+ and/or pykdtree.
+
+ Args:
+- data (dask.array.Array): Source data pixels to sample
++ data (xarray.DataArray): Source data pixels to sample
+ fill_value (float): Output fill value when no source data is
+ near the target pixel. When omitted, if the input data is an
+ integer array then the maximum value for that integer type is
+@@ -1147,7 +1148,8 @@ class XArrayResamplerNN(object):
+ coords = {c: c_var for c, c_var in data.coords.items()
+ if not contain_coords(c_var, src_geo_dims + dst_geo_dims)}
+ try:
+- coord_x, coord_y = self.target_geo_def.get_proj_vectors_dask()
++ # TODO: Add 'chunks' kwarg
++ coord_x, coord_y = self.target_geo_def.get_proj_vectors(chunks=CHUNK_SIZE)
+ coords['y'] = coord_y
+ coords['x'] = coord_x
+ except AttributeError:
+diff --git a/pyresample/spherical_geometry.py b/pyresample/spherical_geometry.py
+index 091c6d7..4e8eac7 100644
+--- a/pyresample/spherical_geometry.py
++++ b/pyresample/spherical_geometry.py
+@@ -24,7 +24,7 @@ import numpy as np
+ import warnings
+
+ warnings.warn("This module will be removed in pyresample 2.0, please use the "
+- "`pyresample.spherical` module functions and classe instead.",
++ "`pyresample.spherical` module functions and class instead.",
+ DeprecationWarning)
+
+ try:
+diff --git a/pyresample/test/test_geometry.py b/pyresample/test/test_geometry.py
+index c30c392..d516cbb 100644
+--- a/pyresample/test/test_geometry.py
++++ b/pyresample/test/test_geometry.py
+@@ -849,7 +849,7 @@ class Test(unittest.TestCase):
+ @unittest.skipIf(not dask, 'dask not available')
+ def test_get_proj_coords_dask(self):
+ """Test get_proj_coords usage with dask arrays."""
+- from pyresample import utils
++ from pyresample import get_area_def
+ area_id = 'test'
+ area_name = 'Test area with 2x2 pixels'
+ proj_id = 'test'
+@@ -857,9 +857,9 @@ class Test(unittest.TestCase):
+ y_size = 10
+ area_extent = [1000000, 0, 1050000, 50000]
+ proj_dict = {"proj": 'laea', 'lat_0': '60', 'lon_0': '0', 'a': '6371228.0', 'units': 'm'}
+- area_def = utils.get_area_def(area_id, area_name, proj_id, proj_dict, x_size, y_size, area_extent)
++ area_def = get_area_def(area_id, area_name, proj_id, proj_dict, x_size, y_size, area_extent)
+
+- xcoord, ycoord = area_def.get_proj_coords_dask()
++ xcoord, ycoord = area_def.get_proj_coords(chunks=4096)
+ xcoord = xcoord.compute()
+ ycoord = ycoord.compute()
+ self.assertTrue(np.allclose(xcoord[0, :],
+@@ -1588,7 +1588,7 @@ class TestStackedAreaDefinition(unittest.TestCase):
+ (5567747.7409681147, 2787374.2399544837,
+ -1000.3358822065015, 2323311.9002169576))
+
+- self.assertEqual(adef.y_size, 4 * 464)
++ self.assertEqual(adef.height, 4 * 464)
+ self.assertIsInstance(adef.squeeze(), geometry.StackedAreaDefinition)
+
+ adef2 = geometry.StackedAreaDefinition()
+@@ -1600,7 +1600,7 @@ class TestStackedAreaDefinition(unittest.TestCase):
+ (5567747.7409681147, 2787374.2399544837,
+ -1000.3358822065015, 2323311.9002169576))
+
+- self.assertEqual(adef2.y_size, 4 * 464)
++ self.assertEqual(adef2.height, 4 * 464)
+
+ def test_get_lonlats(self):
+ """Test get_lonlats on StackedAreaDefinition."""
+@@ -1659,12 +1659,12 @@ class TestStackedAreaDefinition(unittest.TestCase):
+ """Fail appending areas."""
+ area1 = MagicMock()
+ area1.proj_dict = {"proj": 'A'}
+- area1.x_size = 4
+- area1.y_size = 5
++ area1.width = 4
++ area1.height = 5
+ area2 = MagicMock()
+ area2.proj_dict = {'proj': 'B'}
+- area2.x_size = 4
+- area2.y_size = 6
++ area2.width = 4
++ area2.height = 6
+ # res = combine_area_extents_vertical(area1, area2)
+ self.assertRaises(IncompatibleAreas,
+ concatenate_area_defs, area1, area2)
+@@ -1851,8 +1851,8 @@ class TestDynamicAreaDefinition(unittest.TestCase):
+ np.testing.assert_allclose(result.area_extent,
+ [-336277.698941, 5513145.392745,
+ 192456.651909, 7749649.63914])
+- self.assertEqual(result.x_size, 4)
+- self.assertEqual(result.y_size, 18)
++ self.assertEqual(result.width, 4)
++ self.assertEqual(result.height, 18)
+ # Test for properties and shape usage in freeze.
+ area = geometry.DynamicAreaDefinition('test_area', 'A test area', {'proj': 'merc'},
+ width=4, height=18)
+diff --git a/pyresample/test/test_spherical.py b/pyresample/test/test_spherical.py
+index bd7513f..f9aba63 100644
+--- a/pyresample/test/test_spherical.py
++++ b/pyresample/test/test_spherical.py
+@@ -37,7 +37,7 @@ class TestSCoordinate(unittest.TestCase):
+ """Test Vincenty formula
+ """
+ d = SCoordinate(0, 0).distance(SCoordinate(1, 1))
+- self.assertEquals(d, 1.2745557823062943)
++ self.assertEqual(d, 1.2745557823062943)
+
+ def test_hdistance(self):
+ """Test Haversine formula
+@@ -185,7 +185,7 @@ class TestArc(unittest.TestCase):
+ lon, lat = arc1.intersection(arc2)
+
+ self.assertTrue(np.allclose(np.rad2deg(lon), 5))
+- self.assertEquals(np.rad2deg(lat).round(7), round(5.0575148968282093, 7))
++ self.assertEqual(np.rad2deg(lat).round(7), round(5.0575148968282093, 7))
+
+ arc1 = Arc(SCoordinate(0, 0),
+ SCoordinate(np.deg2rad(10), np.deg2rad(10)))
+@@ -202,7 +202,7 @@ class TestArc(unittest.TestCase):
+ np.deg2rad(50.935830837274324)))
+ inter = SCoordinate(np.deg2rad(20.165957021925202),
+ np.deg2rad(46.177022633103398))
+- self.assertEquals(arc1.intersection(arc2), inter)
++ self.assertEqual(arc1.intersection(arc2), inter)
+
+ arc1 = Arc(SCoordinate(np.deg2rad(-2.4982818108326734),
+ np.deg2rad(48.596644847869655)),
+diff --git a/pyresample/test/test_utils.py b/pyresample/test/test_utils.py
+index 209e6c2..93104a4 100644
+--- a/pyresample/test/test_utils.py
++++ b/pyresample/test/test_utils.py
+@@ -324,10 +324,10 @@ class TestMisc(unittest.TestCase):
+ def test_unicode_proj4_string(self):
+ """Test that unicode is accepted for area creation.
+ """
+- from pyresample import utils
+- utils.get_area_def(u"eurol", u"eurol", u"bla",
+- u'+proj=stere +a=6378273 +b=6356889.44891 +lat_0=90 +lat_ts=70 +lon_0=-45',
+- 1000, 1000, (-1000, -1000, 1000, 1000))
++ from pyresample import get_area_def
++ get_area_def(u"eurol", u"eurol", u"bla",
++ u'+proj=stere +a=6378273 +b=6356889.44891 +lat_0=90 +lat_ts=70 +lon_0=-45',
++ 1000, 1000, (-1000, -1000, 1000, 1000))
+
+ def test_proj4_radius_parameters_provided(self):
+ """Test proj4_radius_parameters with a/b."""
+diff --git a/pyresample/test/utils.py b/pyresample/test/utils.py
+index 74f7a21..7704004 100644
+--- a/pyresample/test/utils.py
++++ b/pyresample/test/utils.py
+@@ -107,7 +107,7 @@ def treat_deprecations_as_exceptions():
+ warnings.filterwarnings(
+ "ignore",
+ r"This module will be removed in pyresample 2\.0\, please use the"
+- r"\`pyresample.spherical\` module functions and classe instead\.",
++ r"\`pyresample.spherical\` module functions and class instead\.",
+ DeprecationWarning)
+
+ if sys.version_info[:2] >= (3, 5):
=====================================
debian/patches/series
=====================================
@@ -4,3 +4,4 @@
0004-Detect-broken-basemap.patch
0005-Comapt-with-dask-1.0.patch
0006-Skip-test-on-deprecatet-basemap.patch
+0007-Fix-pyproj-inf.patch
=====================================
debian/tests/python3
=====================================
@@ -4,7 +4,7 @@ set -efu
PYS=${PYS:-"$(py3versions -r 2>/dev/null)"}
TESTPKG=${TESTPKG:-pyresample}
-cd "$ADTTMP"
+cd "$AUTOPKGTEST_TMP"
for py in $PYS; do
echo "=== $py ==="
View it on GitLab: https://salsa.debian.org/debian-gis-team/pyresample/compare/c52f7b1f15c7971f1d36d57b389e523f480e4b4c...368415368730ccbee9249156f56f389a1c67efe9
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/pyresample/compare/c52f7b1f15c7971f1d36d57b389e523f480e4b4c...368415368730ccbee9249156f56f389a1c67efe9
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/20191203/764666c3/attachment-0001.html>
More information about the Pkg-grass-devel
mailing list