From ec62897be337fbcba6c30b944560a414e24b7d5e Mon Sep 17 00:00:00 2001 From: Alex-Lewandowski Date: Thu, 22 Jan 2026 14:55:15 -0900 Subject: [PATCH] update NISAR DEM endpoints and add informative error handling to fetch.download_file() --- src/multirtc/dem.py | 6 +++--- src/multirtc/fetch.py | 28 ++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/multirtc/dem.py b/src/multirtc/dem.py index f071570..73fa7ca 100644 --- a/src/multirtc/dem.py +++ b/src/multirtc/dem.py @@ -15,7 +15,7 @@ gdal.UseExceptions() -URL = 'https://nisar.asf.earthdatacloud.nasa.gov/STATIC/DEM/v1.1/EPSG4326' +URL = 'https://nisar.asf.earthdatacloud.nasa.gov/NISAR/DEM/v1.2/EPSG4326' EGM2008_GEOID = { 'WORLD': [ '/vsicurl/https://asf-dem-west.s3.amazonaws.com/GEOID/us_nga_egm2008_1.tif', @@ -133,8 +133,8 @@ def get_dem_granule_url(lat: int, lon: int) -> str: lon_tens = np.floor_divide(lon, 20) * 20 lon_cardinal = 'W' if lon_tens < 0 else 'E' - prefix = f'{lat_cardinal}{np.abs(lat_tens):02d}_{lon_cardinal}{np.abs(lon_tens):03d}' - filename = f'DEM_{lat_cardinal}{np.abs(lat):02d}_00_{lon_cardinal}{np.abs(lon):03d}_00.tif' + prefix = f'{lat_cardinal}{np.abs(lat_tens):02d}/{lat_cardinal}{np.abs(lat_tens):02d}_{lon_cardinal}{np.abs(lon_tens):03d}' + filename = f'DEM_{lat_cardinal}{np.abs(lat):02d}_00_{lon_cardinal}{np.abs(lon):03d}_00_C01.tif' file_url = f'{URL}/{prefix}/{filename}' return file_url diff --git a/src/multirtc/fetch.py b/src/multirtc/fetch.py index 2f50081..2a5ed43 100644 --- a/src/multirtc/fetch.py +++ b/src/multirtc/fetch.py @@ -63,13 +63,25 @@ def download_file( session.mount('https://', HTTPAdapter(max_retries=retry_strategy)) session.mount('http://', HTTPAdapter(max_retries=retry_strategy)) - with session.get(url, stream=True) as s: - download_path = _get_download_path(s.url, s.headers.get('content-disposition'), directory) - s.raise_for_status() - with open(download_path, 'wb') as f: - for chunk in s.iter_content(chunk_size=chunk_size): - if chunk: - f.write(chunk) - session.close() + try: + with session.get(url, stream=True) as s: + download_path = _get_download_path(s.url, s.headers.get('content-disposition'), directory) + s.raise_for_status() + bytes_written = 0 + with open(download_path, 'wb') as f: + for chunk in s.iter_content(chunk_size=chunk_size): + if chunk: + f.write(chunk) + bytes_written += len(chunk) + if bytes_written == 0: + msg = f'Downloaded 0 bytes from {url}' + logging.error(msg) + return '' + logging.info(f'Download successful: {url}') + except requests.exceptions.RequestException as e: + logging.exception('Download failed: {url}, {e}') + return '' + finally: + session.close() return str(download_path)