Skip to content

Commit ecd352d

Browse files
committed
Backend overhaul.
1 parent 5f1782e commit ecd352d

File tree

7 files changed

+1015
-0
lines changed

7 files changed

+1015
-0
lines changed

ArcDEA/Toolboxes/toolboxes/geoprocessors/aggregate_resample_time.py

Whitespace-only changes.
Lines changed: 349 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,349 @@
1+
2+
def execute(parameters):
3+
4+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
5+
# region IMPORTS
6+
7+
import time
8+
import arcpy
9+
import cuber
10+
import ui
11+
12+
from cuber import shared
13+
14+
# endregion
15+
16+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
17+
# region EXTRACT PARAMETERS
18+
19+
ext = parameters[0].value
20+
out_nc = parameters[1].valueAsText
21+
start_date = parameters[2].value
22+
end_date = parameters[3].value
23+
collections = parameters[4].value
24+
assets = parameters[5].value
25+
quality_flags = parameters[6].value
26+
remove_slc_off = parameters[7].value
27+
remove_mask = parameters[8].value
28+
max_empty = parameters[9].value
29+
max_invalid = parameters[10].value
30+
out_nodata = parameters[11].value
31+
out_srs = parameters[12].value
32+
out_res = parameters[13].value
33+
max_threads = parameters[14].value
34+
35+
# endregion
36+
37+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
38+
# region PREPARE ENVIRONMENT
39+
40+
arcpy.SetProgressor('default', 'Preparing environment...')
41+
42+
arcpy.env.overwriteOutput = True
43+
cuber.set_messenger(arcpy.AddMessage)
44+
arc_progress_bar = ui.make_progress_bar()
45+
46+
time.sleep(1)
47+
48+
# endregion
49+
50+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
51+
# region QUERY STAC ENDPOINT
52+
53+
arcpy.SetProgressor('default', 'Querying DEA STAC endpoint...')
54+
55+
in_bbox = (ext.XMin, ext.YMin, ext.XMax, ext.YMax)
56+
in_epsg = ext.spatialReference.factoryCode
57+
58+
out_epsg = ui.extract_epsg_code(out_srs)
59+
out_bbox = shared.reproject_bbox(in_bbox, in_epsg, out_epsg)
60+
61+
if out_epsg == 4326:
62+
out_res *= 9.466833186042272E-06
63+
64+
start_date = start_date.strftime('%Y-%m-%d')
65+
end_date = end_date.strftime('%Y-%m-%d')
66+
67+
collections = ui.convert_collections('ga_ls_ard_3', collections)
68+
assets = ui.convert_assets('ga_ls_ard_3', assets)
69+
70+
mask_asset = 'oa_fmask' # landsat only supports fmask
71+
assets += [mask_asset]
72+
73+
try:
74+
ds = cuber.fetch(
75+
collections=collections,
76+
assets=assets,
77+
date=(start_date, end_date),
78+
out_bbox=out_bbox,
79+
out_epsg=out_epsg,
80+
out_res=out_res,
81+
remove_slc_off=remove_slc_off,
82+
ignore_errors=True # TODO: add to ui
83+
)
84+
85+
except Exception as e:
86+
arcpy.AddError('Error occurred during DEA STAC query. See messages.')
87+
arcpy.AddMessage(str(e))
88+
return
89+
90+
if ds is None or 'time' not in ds.dims:
91+
arcpy.AddWarning('No STAC features were found.')
92+
return
93+
94+
time.sleep(1)
95+
96+
# endregion
97+
98+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
99+
# region REMOVE DUPLICATE DATES
100+
101+
arcpy.SetProgressor('default', 'Removing duplicate dates...')
102+
103+
try:
104+
ds = cuber.drop_duped_dates(ds)
105+
106+
except Exception as e:
107+
arcpy.AddError('Error occurred while removing duplicate dates. See messages.')
108+
arcpy.AddMessage(str(e))
109+
return
110+
111+
time.sleep(1)
112+
113+
# endregion
114+
115+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
116+
# region DOWNLOAD WCS MASK DATA
117+
118+
arcpy.SetProgressor('step', 'Downloading mask data...', 0, 100, 1)
119+
120+
try:
121+
with arc_progress_bar:
122+
ds[mask_asset].load(num_workers=max_threads)
123+
124+
except Exception as e:
125+
arcpy.AddError('Error occurred while downloading mask data. See messages.')
126+
arcpy.AddMessage(str(e))
127+
return
128+
129+
time.sleep(1)
130+
131+
arcpy.ResetProgressor()
132+
133+
# endregion
134+
135+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
136+
# region APPLY WCS MASK DATA
137+
138+
arcpy.SetProgressor('default', 'Applying mask data...')
139+
140+
quality_flags = ui.convert_mask_flags(quality_flags)
141+
142+
try:
143+
ds = cuber.apply_mask(ds=ds,
144+
mask_asset=mask_asset,
145+
max_empty=max_empty,
146+
mask_flags=quality_flags,
147+
max_invalid=max_invalid,
148+
mask_pixels=True, # TODO: maybe allow user to set in UI
149+
nodata=out_nodata,
150+
drop_mask_asset=remove_mask)
151+
152+
if mask_asset in list(ds.data_vars):
153+
ds = ds.rename({mask_asset: 'mask'}) # makes life easier later
154+
155+
except Exception as e:
156+
arcpy.AddError('Error occurred while applying mask data. See messages.')
157+
arcpy.AddMessage(str(e))
158+
return
159+
160+
if 'time' not in ds.dims or len(ds['time']) == 0:
161+
arcpy.AddWarning('No valid downloads were found.')
162+
return
163+
164+
time.sleep(1)
165+
166+
# endregion
167+
168+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
169+
# region DOWNLOAD WCS VALID DATA
170+
171+
arcpy.SetProgressor('step', 'Downloading valid data...', 0, 100, 1)
172+
173+
try:
174+
with arc_progress_bar:
175+
ds.load(num_workers=max_threads)
176+
177+
except Exception as e:
178+
arcpy.AddError('Error occurred while downloading valid data. See messages.')
179+
arcpy.AddMessage(str(e))
180+
return
181+
182+
time.sleep(1)
183+
184+
arcpy.ResetProgressor()
185+
186+
# endregion
187+
188+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
189+
# region CONFORM DATA TYPES
190+
191+
arcpy.SetProgressor('default', 'Conforming data types...')
192+
193+
try:
194+
ds = shared.elevate_xr_dtypes(ds)
195+
196+
except Exception as e:
197+
arcpy.AddError('Error occurred while conforming data types. See messages.')
198+
arcpy.AddMessage(str(e))
199+
return
200+
201+
time.sleep(1)
202+
203+
# endregion
204+
205+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
206+
# region EXPORT NETCDF
207+
208+
arcpy.SetProgressor('default', 'Exporting NetCDF...')
209+
210+
try:
211+
ds.to_netcdf(out_nc)
212+
213+
except Exception as e:
214+
arcpy.AddError('Error occurred while exporting NetCDF. See messages.')
215+
arcpy.AddMessage(str(e))
216+
return
217+
218+
time.sleep(1)
219+
220+
# endregion
221+
222+
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
223+
# region WRAP UP
224+
225+
arcpy.SetProgressor('default', 'Wrapping up...')
226+
227+
ui.print_dates(ds)
228+
229+
time.sleep(1)
230+
231+
# endregion
232+
233+
return
234+
235+
236+
def _make_test_params():
237+
"""For testing outside ArcGIS Pro only."""
238+
239+
import arcpy
240+
241+
p00 = arcpy.Parameter(name='in_extent',
242+
datatype='GPExtent',
243+
parameterType='Required',
244+
direction='Input')
245+
246+
p01 = arcpy.Parameter(name='out_nc',
247+
datatype='DEFile',
248+
parameterType='Required',
249+
direction='Output')
250+
251+
p02 = arcpy.Parameter(name='in_start_date',
252+
datatype='GPDate',
253+
parameterType='Required',
254+
direction='Input')
255+
256+
p03 = arcpy.Parameter(name='in_end_date',
257+
datatype='GPDate',
258+
parameterType='Required',
259+
direction='Input')
260+
261+
p04 = arcpy.Parameter(name='in_collections',
262+
datatype='GPString',
263+
parameterType='Required',
264+
direction='Input',
265+
multiValue=True)
266+
p04.filter.type = 'ValueList'
267+
268+
p05 = arcpy.Parameter(name='in_assets',
269+
datatype='GPString',
270+
parameterType='Required',
271+
direction='Input',
272+
multiValue=True)
273+
p05.filter.type = 'ValueList'
274+
275+
p06 = arcpy.Parameter(name='in_quality_flags',
276+
datatype='GPString',
277+
parameterType='Required',
278+
direction='Input',
279+
multiValue=True)
280+
p06.filter.type = 'ValueList'
281+
282+
p07 = arcpy.Parameter(name='in_remove_slc_off',
283+
datatype='GPBoolean',
284+
parameterType='Required',
285+
direction='Input')
286+
287+
p08 = arcpy.Parameter(name='in_remove_mask',
288+
datatype='GPBoolean',
289+
parameterType='Required',
290+
direction='Input')
291+
292+
p09 = arcpy.Parameter(name='in_max_empty',
293+
datatype='GPLong',
294+
parameterType='Required',
295+
direction='Input')
296+
p09.filter.type = 'Range'
297+
298+
p10 = arcpy.Parameter(name='in_max_invalid',
299+
datatype='GPLong',
300+
parameterType='Required',
301+
direction='Input')
302+
p10.filter.type = 'Range'
303+
304+
p11 = arcpy.Parameter(name='in_nodata_value',
305+
datatype='GPLong',
306+
parameterType='Required',
307+
direction='Input')
308+
309+
p12 = arcpy.Parameter(name='in_srs',
310+
datatype='GPString',
311+
parameterType='Required',
312+
direction='Input')
313+
p12.filter.type = 'ValueList'
314+
315+
p13 = arcpy.Parameter(name='in_res',
316+
datatype='GPDouble',
317+
parameterType='Required',
318+
direction='Input')
319+
320+
p14 = arcpy.Parameter(name='in_max_threads',
321+
datatype='GPLong',
322+
parameterType='Optional',
323+
direction='Input')
324+
p14.filter.type = 'Range'
325+
326+
bbox = (-1516346, -3589160, -1514698, -3586324)
327+
srs = arcpy.SpatialReference(3577)
328+
329+
p00.value = arcpy.Extent(*bbox, spatial_reference=srs)
330+
p01.value = r'C:\Users\Lewis\Desktop\arcdea\ls.nc'
331+
p02.value = '2020-01-01'
332+
p03.value = '2023-12-31'
333+
p04.value = ['Landsat 8 OLI', 'Landsat 9 OLI-2']
334+
p05.value = ['Blue', 'Green', 'Red', 'NIR']
335+
p06.value = ['Valid', 'Snow', 'Shadow', 'Water']
336+
p07.value = True
337+
p08.value = True
338+
p09.value = 10
339+
p10.value = 5
340+
p11.value = -999
341+
p12.value = 'GDA94 Australia Albers (EPSG: 3577)'
342+
p13.value = 30
343+
p14.value = None
344+
345+
params = [p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14]
346+
347+
return params
348+
349+
# execute(_make_test_params()) # testing, comment out when done

0 commit comments

Comments
 (0)