matplotlib/basemap

arcgisimage() fails with io.UnsupportedOperation: seek

ReagentX opened this issue · 14 comments

repo/venv/lib/python3.8/site-packages/pyproj-3.0.dev1-py3.8-macosx-10.15-x86_64.egg/pyproj/crs/crs.py:53: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  return _prepare_from_string(" ".join(pjargs))
repo/venv/lib/python3.8/site-packages/pyproj-3.0.dev1-py3.8-macosx-10.15-x86_64.egg/pyproj/crs/crs.py:294: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6
  projstring = _prepare_from_string(" ".join((projstring, projkwargs)))
http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer/export?bbox=6408577.827624549,1513410.7748487424,6817761.036725002,2005424.6213916629&bboxSR=3498&imageSR=3498&size=2000,2404&dpi=96&format=png32&transparent=true&f=image
Traceback (most recent call last):
  File "repo/scripts/plot_city.py", line 26, in <module>
    m.arcgisimage(xpixels=2000, verbose=True)
  File "/Users/chris/Downloads/basemap-1.2.2rel/lib/mpl_toolkits/basemap/__init__.py", line 4271, in arcgisimage
    return self.imshow(imread(urlopen(basemap_url)),ax=ax,
  File "repo/venv/lib/python3.8/site-packages/matplotlib/image.py", line 1486, in imread
    with img_open(fname) as image:
  File "repo/venv/lib/python3.8/site-packages/PIL/ImageFile.py", line 106, in __init__
    self._open()
  File "repo/venv/lib/python3.8/site-packages/PIL/PngImagePlugin.py", line 585, in _open
    cid, pos, length = self.png.read()
  File "repo/venv/lib/python3.8/site-packages/PIL/PngImagePlugin.py", line 121, in read
    pos = self.fp.tell()
io.UnsupportedOperation: seek

I get exactly the same issue running basemap with windows 10.

I am using basemap 1.2.2 and python 3.8.6

http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/export?bbox=2506055.846693921,4410720.871992808,2506637.203006063,4411028.421318711&bboxSR=3110&imageSR=3110&size=1000,529&dpi=100&format=png32&transparent=true&f=image
Traceback (most recent call last):
File "C:\Machine Learning\Casey Datasets\Balwyn_Map.py", line 12, in
m.arcgisimage(service='World_Street_Map',xpixels=1000,verbose=True,ypixels=None,dpi=100)
File "C:\Users\peter\AppData\Local\Programs\Python\Python38\lib\site-packages\mpl_toolkits\basemap_init_.py", line 4263, in arcgisimage
return self.imshow(imread(urlopen(basemap_url)),ax=ax,
File "C:\Users\peter\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\image.py", line 1490, in imread
with img_open(fname) as image:
File "C:\Users\peter\AppData\Local\Programs\Python\Python38\lib\site-packages\PIL\ImageFile.py", line 121, in init
self._open()
File "C:\Users\peter\AppData\Local\Programs\Python\Python38\lib\site-packages\PIL\PngImagePlugin.py", line 692, in _open
cid, pos, length = self.png.read()
File "C:\Users\peter\AppData\Local\Programs\Python\Python38\lib\site-packages\PIL\PngImagePlugin.py", line 162, in read
pos = self.fp.tell()
io.UnsupportedOperation: seek

I need to solve this issue!

I have the same issue.

# Name                    Version                   Build  Channel
basemap                   1.2.2            py38h85717e3_3    conda-forge
basemap-data-hires        1.2.2                         0    conda-forge
matplotlib                3.3.3            py38h578d9bd_0    conda-forge
matplotlib-base           3.3.3            py38h5c7f4ab_0    conda-forge
pillow                    8.0.1            py38h70fbd49_0    conda-forge
python                    3.8.6           h852b56e_0_cpython    conda-forge
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-37-05bc67db5411> in <module>
     15     linewidth=0.5
     16 )
---> 17 bm.arcgisimage(service="World_Shaded_Relief",
     18                          xpixels=3000,
     19                          verbose=True)

~/local/anaconda3/envs/py38a/lib/python3.8/site-packages/mpl_toolkits/basemap/__init__.py in arcgisimage(self, server, service, xpixels, ypixels, dpi, verbose, **kwargs)
   4271         if verbose: print(basemap_url)
   4272         # return AxesImage instance.
-> 4273         return self.imshow(imread(urlopen(basemap_url)),ax=ax,
   4274                            origin='upper')
   4275 

~/local/anaconda3/envs/py38a/lib/python3.8/site-packages/matplotlib/image.py in imread(fname, format)
   1494                     response = io.BytesIO(response.read())
   1495                 return imread(response, format=ext)
-> 1496     with img_open(fname) as image:
   1497         return (_pil_png_to_float_array(image)
   1498                 if isinstance(image, PIL.PngImagePlugin.PngImageFile) else

~/local/anaconda3/envs/py38a/lib/python3.8/site-packages/PIL/ImageFile.py in __init__(self, fp, filename)
    119         try:
    120             try:
--> 121                 self._open()
    122             except (
    123                 IndexError,  # end of data

~/local/anaconda3/envs/py38a/lib/python3.8/site-packages/PIL/PngImagePlugin.py in _open(self)
    690             # get next chunk
    691 
--> 692             cid, pos, length = self.png.read()
    693 
    694             try:

~/local/anaconda3/envs/py38a/lib/python3.8/site-packages/PIL/PngImagePlugin.py in read(self)
    160             s = self.fp.read(8)
    161             cid = s[4:]
--> 162             pos = self.fp.tell()
    163             length = i32(s)
    164 

UnsupportedOperation: seek
guziy commented

This pull request is supposed to fix the problem:

#505

You are welcome to try and test it and maybe there will be more motivation to merge it.

guziy commented

Yes Peter:

Please test the one in my repo: https://github.com/guziy/basemap/tree/fix_arcgis_image

Just use the fix_arcgis_image branch.

When you checkout the branch try using

pip install . -U --user 

You might need to specify the path to geos installation:

$(geos-config --prefix) pip install . -U --user

Cheers

guziy commented

Sorry, Peter:

I have no idea about windows, the commands I wrote are for Linux, might work on a mac...

Cheers

guziy commented

I guess you need to specify the correct branch as they say here. Sorry I just sent you the HTML view link...

https://stackoverflow.com/questions/20101834/pip-install-from-git-repo-branch

pip install git+git@github.com:guziy/basemap.git@fix_arcgis_image

or https

pip install git+https://github.com/guziy/basemap.git@fix_arcgis_image

Cheers

guziy commented

It is a good idea to move to cartopy. But your error message is still saying it is using imread, whereas in my version of the code imread is removed...

c4a19b7#diff-cd2bf9b319d30dd03cdbcd9fd49b22e0735faf3c2797ae78ab60a775d1349d1cR4286

Not sure how you install or use things, but you might still be using some other version of basemap...

PS: please use the GitHub interface for messages, it is hard to follow when your email client copies so many links...

Cheers

pip install git+https://github.com/guziy/basemap.git@fix_arcgis_image - eventually worked to install the forked version

Thanks for all your efforts!

Yes, it is now working - or at least not crashing. I am having issues getting the imagery to load up however and will do more investigation with the test codes.

this seems to now work correctly. I was having issues with the epsg parameter - If I leave it off the images install fine.

I just merged the PR #505 by @guziy into the master branch, this problem should be fixed now.