@@ -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
198222def __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