1414
1515import numpy as np
1616import rasterio as rio
17- from PIL import Image
17+ from PIL import Image , UnidentifiedImageError
1818from joblib import Memory as _Memory
1919from joblib import Parallel , delayed
2020from rasterio .transform import from_origin
@@ -288,11 +288,7 @@ def _process_source(source):
288288
289289
290290def _fetch_tile (tile_url , wait , max_retries ):
291- request = _retryer (tile_url , wait , max_retries )
292- with io .BytesIO (request .content ) as image_stream :
293- image = Image .open (image_stream ).convert ("RGBA" )
294- array = np .asarray (image )
295- image .close ()
291+ array = _retryer (tile_url , wait , max_retries )
296292 return array
297293
298294
@@ -412,7 +408,7 @@ def _warper(img, transform, s_crs, t_crs, resampling):
412408
413409def _retryer (tile_url , wait , max_retries ):
414410 """
415- Retry a url many times in attempt to get a tile
411+ Retry a url many times in attempt to get a tile and read the image
416412
417413 Arguments
418414 ---------
@@ -428,25 +424,32 @@ def _retryer(tile_url, wait, max_retries):
428424
429425 Returns
430426 -------
431- request object containing the web response.
427+ array of the tile
432428 """
433429 try :
434430 request = requests .get (tile_url , headers = {"user-agent" : USER_AGENT })
435431 request .raise_for_status ()
436- except requests .HTTPError :
432+ with io .BytesIO (request .content ) as image_stream :
433+ image = Image .open (image_stream ).convert ("RGBA" )
434+ array = np .asarray (image )
435+ image .close ()
436+
437+ return array
438+
439+ except (requests .HTTPError , UnidentifiedImageError ):
437440 if request .status_code == 404 :
438441 raise requests .HTTPError (
439442 "Tile URL resulted in a 404 error. "
440443 "Double-check your tile url:\n {}" .format (tile_url )
441444 )
442- elif request .status_code == 104 :
445+ elif request .status_code == 104 or request . status_code == 200 :
443446 if max_retries > 0 :
444447 os .wait (wait )
445448 max_retries -= 1
446449 request = _retryer (tile_url , wait , max_retries )
447450 else :
448451 raise requests .HTTPError ("Connection reset by peer too many times." )
449- return request
452+
450453
451454
452455def howmany (w , s , e , n , zoom , verbose = True , ll = False ):
0 commit comments