28
28
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
30
30
import itertools
31
+ import copy
31
32
import json
32
33
import ssl
33
34
import urllib .request
@@ -166,13 +167,31 @@ def __cmr_filter_urls(search_results):
166
167
167
168
return urls
168
169
169
- def __cmr_search (short_name , version , time_start , time_end , polygon = None ):
170
+ def __cmr_granule_polygons (search_results ):
171
+ """Get the polygons for CMR returned granules"""
172
+ if 'feed' not in search_results or 'entry' not in search_results ['feed' ]:
173
+ return []
174
+ granule_polygons = []
175
+ # for each CMR entry
176
+ for e in search_results ['feed' ]['entry' ]:
177
+ # for each polygon
178
+ for polys in e ['polygons' ]:
179
+ coords = [float (i ) for i in polys [0 ].split ()]
180
+ region = [{'lon' :x ,'lat' :y } for y ,x in zip (coords [::2 ],coords [1 ::2 ])]
181
+ granule_polygons .append (region )
182
+ # return granule polygons in sliderule region format
183
+ return granule_polygons
184
+
185
+ def __cmr_search (short_name , version , time_start , time_end , ** kwargs ):
170
186
"""Perform a scrolling CMR query for files matching input criteria."""
187
+ kwargs .setdefault ('polygon' ,None )
188
+ kwargs .setdefault ('return_polygons' ,False )
189
+ # build params
171
190
params = '&short_name={0}' .format (short_name )
172
191
params += __build_version_query_params (version )
173
192
params += '&temporal[]={0},{1}' .format (time_start , time_end )
174
- if polygon :
175
- params += '&polygon={0}' .format (polygon )
193
+ if kwargs [ ' polygon' ] :
194
+ params += '&polygon={0}' .format (kwargs [ ' polygon' ] )
176
195
cmr_query_url = CMR_FILE_URL + params
177
196
logger .debug ('cmr request={0}\n ' .format (cmr_query_url ))
178
197
@@ -182,6 +201,7 @@ def __cmr_search(short_name, version, time_start, time_end, polygon=None):
182
201
ctx .verify_mode = ssl .CERT_NONE
183
202
184
203
urls = []
204
+ polys = [] if kwargs ['return_polygons' ] else None
185
205
while True :
186
206
req = urllib .request .Request (cmr_query_url )
187
207
if cmr_scroll_id :
@@ -198,8 +218,15 @@ def __cmr_search(short_name, version, time_start, time_end, polygon=None):
198
218
if not url_scroll_results :
199
219
break
200
220
urls += url_scroll_results
221
+ # append granule polygons
222
+ if kwargs ['return_polygons' ]:
223
+ polygon_results = __cmr_granule_polygons (search_page )
224
+ polys .extend (polygon_results )
201
225
202
- return urls
226
+ if kwargs ['return_polygons' ]:
227
+ return (urls ,polys )
228
+ else :
229
+ return urls
203
230
204
231
###############################################################################
205
232
# SLIDERULE UTILITIES
@@ -226,28 +253,33 @@ def __get_values(data, dtype, size):
226
253
#
227
254
# __query_resources
228
255
#
229
- def __query_resources (parm , version ):
256
+ def __query_resources (parm , version , return_polygons = False ):
230
257
231
258
# Check Parameters are Valid
232
259
if ("poly" not in parm ) and ("t0" not in parm ) and ("t1" not in parm ):
233
260
logger .error ("Must supply some bounding parameters with request (poly, t0, t1)" )
234
261
return []
235
262
263
+ # submission arguments for cmr
264
+ kwargs = {}
265
+ kwargs ['version' ] = version
266
+ kwargs ['return_polygons' ] = return_polygons
236
267
# Pull Out Polygon #
237
- polygon = None
238
268
if "poly" in parm :
239
- polygon = parm ["poly" ]
269
+ kwargs [ ' polygon' ] = parm ["poly" ]
240
270
241
271
# Pull Out Time Period #
242
- time_start = None
243
- time_end = None
244
272
if "t0" in parm :
245
- time_start = parm ["t0" ]
273
+ kwargs [ ' time_start' ] = parm ["t0" ]
246
274
if "t1" in parm :
247
- time_end = parm ["t1" ]
275
+ kwargs [ ' time_end' ] = parm ["t1" ]
248
276
249
277
# Make CMR Request #
250
- resources = cmr (polygon , time_start , time_end , version )
278
+ if return_polygons :
279
+ resources ,polygons = cmr (** kwargs )
280
+ else :
281
+ resources = cmr (** kwargs )
282
+ # check that resources are under limit
251
283
if (len (resources ) > max_requested_resources ):
252
284
logger .warning ("Exceeded maximum requested resources: %d (current max is %d)" , len (resources ), max_requested_resources )
253
285
logger .warning ("Consider using icesat2.set_max_resources to set a higher limit" )
@@ -256,7 +288,10 @@ def __query_resources(parm, version):
256
288
logger .info ("Identified %d resources to process" , len (resources ))
257
289
258
290
# Return Resources #
259
- return resources
291
+ if return_polygons :
292
+ return (resources ,polygons )
293
+ else :
294
+ return resources
260
295
261
296
#
262
297
# __query_servers
@@ -510,7 +545,7 @@ def set_max_resources (max_resources):
510
545
#
511
546
# COMMON METADATA REPOSITORY
512
547
#
513
- def cmr ( polygon = None , time_start = None , time_end = None , version = '004' , short_name = 'ATL03' ):
548
+ def cmr ( ** kwargs ):
514
549
"""
515
550
polygon: list of longitude,latitude in counter-clockwise order with first and last point matching;
516
551
- e.g. [ {"lon": -115.43, "lat": 37.40},
@@ -521,16 +556,22 @@ def cmr (polygon=None, time_start=None, time_end=None, version='004', short_name
521
556
time_*: UTC time (i.e. "zulu" or "gmt");
522
557
expressed in the following format: <year>-<month>-<day>T<hour>:<minute>:<second>Z
523
558
"""
524
-
525
- url_list = []
526
-
559
+ # set default keyword arguments
560
+ kwargs .setdefault ('polygon' ,None )
527
561
# set default start time to start of ICESat-2 mission
528
- if not time_start :
529
- time_start = '2018-10-13T00:00:00Z'
562
+ kwargs .setdefault ('time_start' ,'2018-10-13T00:00:00Z' )
530
563
# set default stop time to current time
531
- if not time_end :
532
- now = datetime .datetime .utcnow ()
533
- time_end = now .strftime ("%Y-%m-%dT%H:%M:%SZ" )
564
+ kwargs .setdefault ('time_end' ,datetime .datetime .utcnow ().strftime ("%Y-%m-%dT%H:%M:%SZ" ))
565
+ # set default version and product short name
566
+ kwargs .setdefault ('version' ,'004' )
567
+ kwargs .setdefault ('short_name' ,'ATL03' )
568
+ # return polygons for each requested granule
569
+ kwargs .setdefault ('return_polygons' ,False )
570
+ # copy polygon
571
+ polygon = copy .copy (kwargs ['polygon' ])
572
+
573
+ url_list = []
574
+ poly_list = []
534
575
535
576
# issue CMR request
536
577
for tolerance in [0.0001 , 0.001 , 0.01 , 0.1 , 1.0 , None ]:
@@ -547,7 +588,19 @@ def cmr (polygon=None, time_start=None, time_end=None, version='004', short_name
547
588
548
589
# call into NSIDC routines to make CMR request
549
590
try :
550
- url_list = __cmr_search (short_name , version , time_start , time_end , polystr )
591
+ if kwargs ['return_polygons' ]:
592
+ url_list ,poly_list = __cmr_search (kwargs ['short_name' ],
593
+ kwargs ['version' ],
594
+ kwargs ['time_start' ],
595
+ kwargs ['time_end' ],
596
+ polygon = polystr ,
597
+ return_polygons = True )
598
+ else :
599
+ url_list = __cmr_search (kwargs ['short_name' ],
600
+ kwargs ['version' ],
601
+ kwargs ['time_start' ],
602
+ kwargs ['time_end' ],
603
+ polygon = polystr )
551
604
break # exit loop because cmr search was successful
552
605
except urllib .error .HTTPError as e :
553
606
logger .error ('HTTP Request Error: {}' .format (e .reason ))
@@ -570,7 +623,10 @@ def cmr (polygon=None, time_start=None, time_end=None, version='004', short_name
570
623
else :
571
624
break # exit here because nothing can be done
572
625
573
- return url_list
626
+ if kwargs ['return_polygons' ]:
627
+ return (url_list ,poly_list )
628
+ else :
629
+ return url_list
574
630
575
631
#
576
632
# ATL06
0 commit comments