Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ca8c856

Browse files
committed
Merge remote-tracking branch 'origin/main' into phoreal
2 parents 0cf0e1d + 4879287 commit ca8c856

File tree

2 files changed

+80
-48
lines changed

2 files changed

+80
-48
lines changed

examples/cmr_debug_regions.ipynb

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,16 @@
126126
"granule_polygons = []\n",
127127
"for poly in m.regions:\n",
128128
" # polygon from map\n",
129-
" resources,polygons = icesat2.cmr(polygon=poly,\n",
129+
" resources,metadata = icesat2.cmr(polygon=poly,\n",
130130
" short_name=SRwidgets.product.value,\n",
131131
" time_start=SRwidgets.time_start,\n",
132132
" time_end=SRwidgets.time_end,\n",
133133
" version=SRwidgets.release.value,\n",
134-
" return_polygons=True)\n",
135-
" granule_list.extend(resources)\n",
136-
" granule_polygons.extend(polygons)\n",
134+
" return_metadata=True)\n",
135+
" # for each granule resource\n",
136+
" for i,resource in enumerate(resources):\n",
137+
" granule_list.append(resource)\n",
138+
" granule_polygons.append(metadata[i].geometry)\n",
137139
"# print list of granules\n",
138140
"num_granules = len(granule_list)\n",
139141
"logging.info('Number of Granules: {0:d}'.format(num_granules))\n",
@@ -178,16 +180,18 @@
178180
"granule_indices = list(granule_select.index)\n",
179181
"cmap = iter(cm.viridis(np.linspace(0,1,len(granule_indices))))\n",
180182
"for g in granule_indices:\n",
181-
" locations = [(p['lat'],p['lon']) for p in granule_polygons[g]]\n",
182183
" color = colors.to_hex(next(cmap))\n",
183-
" polygon = ipysliderule.ipyleaflet.Polygon(\n",
184-
" locations=locations,\n",
185-
" color=color,\n",
186-
" fill_color=color,\n",
187-
" opacity=0.8,\n",
188-
" weight=1, \n",
184+
" geojson = ipysliderule.ipyleaflet.GeoJSON(\n",
185+
" data=granule_polygons[g].__geo_interface__,\n",
186+
" style=dict(\n",
187+
" color=color,\n",
188+
" fill_color=color,\n",
189+
" opacity=0.8,\n",
190+
" weight=1,\n",
191+
" )\n",
189192
" )\n",
190-
" m.map.add_layer(polygon)"
193+
" m.map.add_layer(geojson)\n",
194+
" "
191195
]
192196
},
193197
{

sliderule/icesat2.py

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -180,25 +180,50 @@ def __cmr_filter_urls(search_results):
180180

181181
return urls
182182

183-
def __cmr_granule_polygons(search_results):
184-
"""Get the polygons for CMR returned granules"""
183+
def __cmr_granule_metadata(search_results):
184+
"""Get the metadata for CMR returned granules"""
185+
# GeoDataFrame with granule metadata
186+
granule_metadata = __emptyframe()
187+
# return empty dataframe if no CMR entries
185188
if 'feed' not in search_results or 'entry' not in search_results['feed']:
186-
return []
187-
granule_polygons = []
189+
return granule_metadata
188190
# for each CMR entry
189191
for e in search_results['feed']['entry']:
190-
# for each polygon
191-
for polys in e['polygons']:
192-
coords = [float(i) for i in polys[0].split()]
193-
region = [{'lon':x,'lat':y} for y,x in zip(coords[::2],coords[1::2])]
194-
granule_polygons.append(region)
195-
# return granule polygons in sliderule region format
196-
return granule_polygons
192+
# columns for dataframe
193+
columns = {}
194+
# time start and time end of granule
195+
columns['time_start'] = numpy.datetime64(e['time_start'])
196+
columns['time_end'] = numpy.datetime64(e['time_end'])
197+
columns['time_updated'] = numpy.datetime64(e['updated'])
198+
# get the granule size and convert to bits
199+
columns['granule_size'] = float(e['granule_size'])*(2.0**20)
200+
# Create Pandas DataFrame object
201+
# use granule id as index
202+
df = geopandas.pd.DataFrame(columns, index=[e['id']])
203+
# Generate Geometry Column
204+
if 'polygons' in e:
205+
coords = [float(i) for i in e['polygons'][0][0].split()]
206+
geometry = Polygon(zip(coords[1::2], coords[::2]))
207+
else:
208+
geometry, = geopandas.points_from_xy([None], [None])
209+
# Build GeoDataFrame (default geometry is crs=EPSG_MERCATOR)
210+
gdf = geopandas.GeoDataFrame(df, geometry=[geometry], crs=EPSG_MERCATOR)
211+
# append to combined GeoDataFrame and catch warnings
212+
with warnings.catch_warnings():
213+
warnings.simplefilter("ignore")
214+
granule_metadata = granule_metadata.append(gdf)
215+
# return granule metadata
216+
# - time start and time end
217+
# - time granule was updated
218+
# - granule size in bits
219+
# - polygons as geodataframe geometry
220+
return granule_metadata
197221

198222
def __cmr_search(short_name, version, time_start, time_end, **kwargs):
199223
"""Perform a scrolling CMR query for files matching input criteria."""
200224
kwargs.setdefault('polygon',None)
201-
kwargs.setdefault('return_polygons',False)
225+
kwargs.setdefault('name_filter',None)
226+
kwargs.setdefault('return_metadata',False)
202227
# build params
203228
params = '&short_name={0}'.format(short_name)
204229
params += __build_version_query_params(version)
@@ -217,7 +242,8 @@ def __cmr_search(short_name, version, time_start, time_end, **kwargs):
217242
ctx.verify_mode = ssl.CERT_NONE
218243

219244
urls = []
220-
polys = []
245+
# GeoDataFrame with granule metadata
246+
metadata = __emptyframe()
221247
while True:
222248
req = urllib.request.Request(cmr_query_url)
223249
if cmr_scroll_id:
@@ -234,14 +260,17 @@ def __cmr_search(short_name, version, time_start, time_end, **kwargs):
234260
if not url_scroll_results:
235261
break
236262
urls += url_scroll_results
237-
# append granule polygons
238-
if kwargs['return_polygons']:
239-
polygon_results = __cmr_granule_polygons(search_page)
263+
# query for granule metadata and polygons
264+
if kwargs['return_metadata']:
265+
metadata_results = __cmr_granule_metadata(search_page)
240266
else:
241-
polygon_results = [None for _ in url_scroll_results]
242-
polys.extend(polygon_results)
267+
metadata_results = [None for _ in url_scroll_results]
268+
# append granule metadata and catch warnings
269+
with warnings.catch_warnings():
270+
warnings.simplefilter("ignore")
271+
metadata = metadata.append(metadata_results)
243272

244-
return (urls,polys)
273+
return (urls,metadata)
245274

246275
###############################################################################
247276
# LOCAL FUNCTIONS
@@ -312,7 +341,7 @@ def __get_values(data, dtype, size):
312341
#
313342
# Query Resources from CMR
314343
#
315-
def __query_resources(parm, version, return_polygons=False):
344+
def __query_resources(parm, version, **kwargs):
316345

317346
# Latch Start Time
318347
tstart = time.perf_counter()
@@ -323,9 +352,8 @@ def __query_resources(parm, version, return_polygons=False):
323352
return []
324353

325354
# Submission Arguments for CMR
326-
kwargs = {}
327355
kwargs['version'] = version
328-
kwargs['return_polygons'] = return_polygons
356+
kwargs.setdefault('return_metadata', False)
329357

330358
# Pull Out Polygon
331359
if "clusters" in parm and parm["clusters"] and len(parm["clusters"]) > 0:
@@ -357,8 +385,8 @@ def __query_resources(parm, version, return_polygons=False):
357385
kwargs['name_filter'] = '*_' + rgt_filter + cycle_filter + region_filter + '_*'
358386

359387
# Make CMR Request
360-
if return_polygons:
361-
resources,polygons = cmr(**kwargs)
388+
if kwargs['return_metadata']:
389+
resources,metadata = cmr(**kwargs)
362390
else:
363391
resources = cmr(**kwargs)
364392

@@ -372,8 +400,8 @@ def __query_resources(parm, version, return_polygons=False):
372400
profiles[__query_resources.__name__] = time.perf_counter() - tstart
373401

374402
# Return Resources
375-
if return_polygons:
376-
return (resources,polygons)
403+
if kwargs['return_metadata']:
404+
return (resources,metadata)
377405
else:
378406
return resources
379407

@@ -564,8 +592,8 @@ def cmr(**kwargs):
564592
# set default version and product short name
565593
kwargs.setdefault('version', DEFAULT_ICESAT2_SDP_VERSION)
566594
kwargs.setdefault('short_name','ATL03')
567-
# return polygons for each requested granule
568-
kwargs.setdefault('return_polygons', False)
595+
# return metadata for each requested granule
596+
kwargs.setdefault('return_metadata', False)
569597
# set default name filter
570598
kwargs.setdefault('name_filter', None)
571599

@@ -583,7 +611,7 @@ def cmr(**kwargs):
583611
# iterate through each polygon (or none if none supplied)
584612
for polygon in polygons:
585613
urls = []
586-
polys = []
614+
metadata = __emptyframe()
587615

588616
# issue CMR request
589617
for tolerance in [0.0001, 0.001, 0.01, 0.1, 1.0, None]:
@@ -600,12 +628,12 @@ def cmr(**kwargs):
600628

601629
# call into NSIDC routines to make CMR request
602630
try:
603-
urls,polys = __cmr_search(kwargs['short_name'],
631+
urls,metadata = __cmr_search(kwargs['short_name'],
604632
kwargs['version'],
605633
kwargs['time_start'],
606634
kwargs['time_end'],
607635
polygon=polystr,
608-
return_polygons=kwargs['return_polygons'],
636+
return_metadata=kwargs['return_metadata'],
609637
name_filter=kwargs['name_filter'])
610638
break # exit loop because cmr search was successful
611639
except urllib.error.HTTPError as e:
@@ -630,15 +658,15 @@ def cmr(**kwargs):
630658
break # exit here because nothing can be done
631659

632660
# populate resources
633-
for url, poly in zip(urls, polys):
634-
resources[url] = poly
661+
for i,url, in enumerate(urls):
662+
resources[url] = metadata.iloc[i]
635663

636664
# build return lists
637665
url_list = list(resources.keys())
638-
poly_list = list(resources.values())
666+
meta_list = list(resources.values())
639667

640-
if kwargs['return_polygons']:
641-
return (url_list,poly_list)
668+
if kwargs['return_metadata']:
669+
return (url_list,meta_list)
642670
else:
643671
return url_list
644672

0 commit comments

Comments
 (0)