SlideRule is an on-demand science data processing service that runs in on Amazon Web Services and responds to REST API calls to process and return science results. SlideRule was designed to enable researchers and other data systems to have low-latency access to custom-generated, high-level, analysis-ready data products using processing parameters supplied at the time of the request.
Documentation for using SlideRule is available from the project website
SlideRule can subset ATL03 geolocated photon height data on-demand and calculate photon classifications to suit different needs.
Jupyter widgets are used to set parameters for the SlideRule API.
Regions of interest for submitting to SlideRule are drawn on a ipyleaflet map.
The results from SlideRule can be displayed on the interactive ipyleaflet map along with additional contextual layers.
from sliderule import icesat2, ipysliderule, io
import ipywidgets as widgets
import logging
import warnings
# autoreload
%load_ext autoreload
%autoreload 2
# turn off warnings for demo
warnings.filterwarnings('ignore')
# set the url for the sliderule service
# set the logging level
icesat2.init("slideruleearth.io", loglevel=logging.WARNING)
SlideRule can provide different sources for photon classification. This is useful for example in cases using the photon returns to estimate ocean or lake bathymetry, vegetated canopy heights, or ground position in the presence of a vegetated canopy.
# display widgets for setting SlideRule parameters
SRwidgets = ipysliderule.widgets()
SRwidgets.set_atl03_defaults()
widgets.VBox([
SRwidgets.asset,
SRwidgets.release,
SRwidgets.start_date,
SRwidgets.end_date,
SRwidgets.classification,
SRwidgets.surface_type,
SRwidgets.confidence,
SRwidgets.quality,
SRwidgets.land_class,
SRwidgets.yapc_knn,
SRwidgets.yapc_win_h,
SRwidgets.yapc_win_x,
SRwidgets.yapc_min_ph,
])
Interactive maps within the SlideRule python API are built upon ipyleaflet.
There are 3 projections available within SlideRule for mapping (Global, North and South). There are also contextual layers available for each projection.
Global (Web Mercator, EPSG:3857) | North (Alaska Polar Stereographic, EPSG:5936) | South (Antarctic Polar Stereographic, EPSG:3031) |
---|---|---|
In addition, most xyzservice providers can be added as contextual layers to the global Web Mercator maps
widgets.VBox([
SRwidgets.projection,
SRwidgets.layers,
SRwidgets.raster_functions
])
Here, we create polygons or bounding boxes for our regions of interest.
This map is also our viewer for inspecting our SlideRule ICESat-2 data returns.
# create ipyleaflet map in specified projection
m = ipysliderule.leaflet(SRwidgets.projection.value)
# install click handler callback
m.add_selected_callback(SRwidgets.atl03_click_handler)
m.map
m.add_layer(
layers=SRwidgets.layers.value,
rendering_rule=SRwidgets.rendering_rule
)
%%time
# sliderule asset and data release
asset = SRwidgets.asset.value
release = SRwidgets.release.value
# find granule for each region of interest
granules_list = []
# for each region of interest
for poly in m.regions:
granules = icesat2.cmr(polygon=poly,
time_start=SRwidgets.time_start,
time_end=SRwidgets.time_end,
version=release)
granules_list.extend(granules)
# inspect granules list
print(f'Available granules: {len(granules_list)}')
nsidc-s3
asset, the ICESat-2 ATL03 data are then accessed from the NSIDC AWS s3 bucket in us-west-2
# build sliderule parameters using latest values from widget
parms = SRwidgets.build_atl03()
# create an empty geodataframe
gdf = icesat2.__emptyframe()
# for each region of interest
for poly in m.regions:
# add polygon from map to sliderule parameters
parms["poly"] = poly
# make the request to the SlideRule (ATL03-SR) endpoint
# and pass it the request parameters to request ATL03 Data
gdf = gdf.append(icesat2.atl03sp(parms, asset=asset,
version=release, resources=granules_list))
Can inspect the columns, number of returns and returns at the top of the GeoDataFrame.
See the ICESat-2 documentation for descriptions of each column
print(f'Returned {gdf.shape[0]} records')
gdf.head()
For stability of the leaflet map, SlideRule will as a default limit the plot to have up to 10000 points from the GeoDataFrame
GeoDataFrames can be plotted in any available matplotlib colormap
widgets.VBox([
SRwidgets.variable,
SRwidgets.cmap,
SRwidgets.reverse,
])
%matplotlib inline
# ATL03 fields for hover tooltip
fields = m.default_atl03_fields()
m.GeoData(gdf, column_name=SRwidgets.variable.value, cmap=SRwidgets.colormap,
max_plot_points=10000, tooltip=True, colorbar=True, fields=fields)
widgets.VBox([
SRwidgets.plot_classification,
SRwidgets.rgt,
SRwidgets.ground_track,
SRwidgets.cycle,
])
%matplotlib widget
SRwidgets.plot(atl03=gdf, kind='scatter', title='Photon Cloud',
cmap=SRwidgets.colormap, legend=True, legend_frameon=True,
classification=SRwidgets.plot_classification.value,
segments=False)
display(SRwidgets.filesaver)
# append sliderule api version to attributes
version = icesat2.get_version()
parms['version'] = version['icesat2']['version']
parms['commit'] = version['icesat2']['commit']
# save to file in format (HDF5 or netCDF)
io.to_file(gdf, SRwidgets.file,
format=SRwidgets.format,
driver='pytables',
parameters=parms,
regions=m.regions,
verbose=True)
display(SRwidgets.fileloader)
# read from file in format (HDF5 or netCDF)
gdf,parms,regions = io.from_file(SRwidgets.file,
format=SRwidgets.format,
driver='pytables',
return_parameters=True,
return_regions=True)
gdf.head()
SRwidgets.set_values(parms)
m.add_region(regions)