From c4a19b79ce80deab23f80007e6056e13ed393a10 Mon Sep 17 00:00:00 2001 From: huziy Date: Wed, 21 Oct 2020 00:31:31 -0400 Subject: [PATCH 1/3] Fix arcgisimage for cylindrical coordinates, remove imread as it is not able to open urls --- lib/mpl_toolkits/basemap/__init__.py | 21 ++++++++++++++++++--- lib/mpl_toolkits/basemap/test.py | 11 ++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/mpl_toolkits/basemap/__init__.py b/lib/mpl_toolkits/basemap/__init__.py index e4fdc40a3..be69303bc 100644 --- a/lib/mpl_toolkits/basemap/__init__.py +++ b/lib/mpl_toolkits/basemap/__init__.py @@ -4228,6 +4228,21 @@ def arcgisimage(self,server='http://server.arcgisonline.com/ArcGIS',\ returns a matplotlib.image.AxesImage instance. """ + + + # fix PIL import on some versions of OSX and scipy + try: + from PIL import Image + except ImportError: + try: + import Image + except ImportError: + msg = ('warpimage method requires PIL ' + '(http://pillow.readthedocs.io)') + raise ImportError(msg) + + + if not hasattr(self,'epsg'): msg = dedent(""" Basemap instance must be creating using an EPSG code @@ -4247,7 +4262,7 @@ def arcgisimage(self,server='http://server.arcgisonline.com/ArcGIS',\ arcgisimage cannot handle images that cross the dateline for cylindrical projections.""") raise ValueError(msg) - if self.projection == 'cyl': + if self.projection != 'cyl': xmin = (180./np.pi)*xmin; xmax = (180./np.pi)*xmax ymin = (180./np.pi)*ymin; ymax = (180./np.pi)*ymax # ypixels not given, find by scaling xpixels by the map aspect ratio. @@ -4268,8 +4283,8 @@ def arcgisimage(self,server='http://server.arcgisonline.com/ArcGIS',\ # print URL? if verbose: print(basemap_url) # return AxesImage instance. - return self.imshow(imread(urlopen(basemap_url)),ax=ax, - origin='upper') + img = Image.open(urlopen(basemap_url)) + return self.imshow(img, ax=ax, origin='upper') def wmsimage(self,server,\ xpixels=400,ypixels=None,\ diff --git a/lib/mpl_toolkits/basemap/test.py b/lib/mpl_toolkits/basemap/test.py index 8dfa7dae0..ac05f05ad 100644 --- a/lib/mpl_toolkits/basemap/test.py +++ b/lib/mpl_toolkits/basemap/test.py @@ -244,11 +244,20 @@ def test_optional_casting(self): class TestOrthoProjPolygons(TestCase): def test_basemapcreation_should_not_fail(self): - # different resolutions should work + # different resolutions should work for r in ['c', 'l', 'i', 'h', 'f']: m = Basemap(projection='ortho',resolution=r,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.) pass +class TestArcgisimage(TestCase): + def test_cyl_proj_should_not_fail(self): + m = Basemap(projection='cyl', + llcrnrlon=-90,llcrnrlat=30, + urcrnrlon=-60,urcrnrlat=60) + m.arcgisimage(verbose=True) + + + def test(): """ Run some tests. From 8c52a6f144f4eb025085add9d42d9f76f7be26c2 Mon Sep 17 00:00:00 2001 From: huziy Date: Wed, 21 Oct 2020 08:04:17 -0400 Subject: [PATCH 2/3] Fix importerror message to refer to the arcgisimage --- lib/mpl_toolkits/basemap/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/basemap/__init__.py b/lib/mpl_toolkits/basemap/__init__.py index be69303bc..3b2859aed 100644 --- a/lib/mpl_toolkits/basemap/__init__.py +++ b/lib/mpl_toolkits/basemap/__init__.py @@ -4237,7 +4237,7 @@ def arcgisimage(self,server='http://server.arcgisonline.com/ArcGIS',\ try: import Image except ImportError: - msg = ('warpimage method requires PIL ' + msg = ('arcgisimage method requires PIL ' '(http://pillow.readthedocs.io)') raise ImportError(msg) From 73a6285c548834c5dd851399da100cd6cbf12b2b Mon Sep 17 00:00:00 2001 From: huziy Date: Wed, 21 Oct 2020 08:18:54 -0400 Subject: [PATCH 3/3] Skip arcgisimage tests for Python 2.x, as it requires PIL and 2.x is approaching end of support --- lib/mpl_toolkits/basemap/test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/mpl_toolkits/basemap/test.py b/lib/mpl_toolkits/basemap/test.py index ac05f05ad..c7325a1ff 100644 --- a/lib/mpl_toolkits/basemap/test.py +++ b/lib/mpl_toolkits/basemap/test.py @@ -249,6 +249,7 @@ def test_basemapcreation_should_not_fail(self): m = Basemap(projection='ortho',resolution=r,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.) pass +@skipIf(not PY3, "Test skipped for Python 2.x as it requires PIL installed") class TestArcgisimage(TestCase): def test_cyl_proj_should_not_fail(self): m = Basemap(projection='cyl',