import warnings
warnings.filterwarnings('ignore') # turn off warnings for demo
from sliderule import icesat2, ipysliderule, io, sliderule
import geopandas
import logging
%load_ext autoreload
%autoreload 2
# set the url for the sliderule service
# set the logging level
icesat2.init("slideruleearth.io", loglevel=logging.WARNING)
SlideRule follows a streamlined version of the ATL06 land ice height algorithm.
SlideRule also can use different sources for photon classification before calculating the average segment height.
This is useful for example, in cases where there may be a vegetated canopy affecting the spread of the photon returns.
# display widgets for setting SlideRule parameters
SRwidgets = ipysliderule.widgets()
SRwidgets.VBox(SRwidgets.atl06())
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
SRwidgets.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)
m.map
m.add_layer(
layers=SRwidgets.layers.value,
rendering_rule=SRwidgets.rendering_rule
)
icesat2
asset, the ICESat-2 ATL03 data are then accessed from the NSIDC AWS s3 bucket in us-west-2
%%time
# build sliderule parameters using latest values from widget
parms = SRwidgets.build_atl06()
# clear existing geodataframe results
elevations = [sliderule.emptyframe()]
# for each region of interest
sliderule.logger.warning('No valid regions to run') if not m.regions else None
for poly in m.regions:
# add polygon from map to sliderule parameters
parms["poly"] = poly
# make the request to the SlideRule (ATL06-SR) endpoint
# and pass it the request parameters to request ATL06 Data
elevations.append(icesat2.atl06p(parms))
gdf = geopandas.pd.concat(elevations)
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
SRwidgets.VBox([
SRwidgets.variable,
SRwidgets.cmap,
SRwidgets.reverse,
])
%matplotlib inline
# ATL06-SR fields for hover tooltip
fields = gdf.leaflet.default_atl06_fields()
gdf.leaflet.GeoData(m.map, column_name=SRwidgets.variable.value, cmap=SRwidgets.colormap,
max_plot_points=10000, tooltip=True, colorbar=True, fields=fields)
# install handlers and callbacks
gdf.leaflet.set_observables(SRwidgets)
gdf.leaflet.add_selected_callback(SRwidgets.atl06_click_handler)
m.add_region_callback(gdf.leaflet.handle_region)
The cycles plots should only be used in regions with repeat Reference Ground Track (RGT) pointing
SRwidgets.VBox([
SRwidgets.plot_kind,
SRwidgets.rgt,
SRwidgets.ground_track,
SRwidgets.cycle,
])
%matplotlib widget
# default is to skip cycles with significant off-pointing
gdf.icesat2.plot(kind=SRwidgets.plot_kind.value, cycle_start=3,
legend=True, legend_frameon=False, **SRwidgets.plot_kwargs)
display(SRwidgets.filesaver)
# append sliderule api version to attributes
version = sliderule.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,
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,
return_parameters=True,
return_regions=True)
gdf.head()
SRwidgets.set_values(parms)
m.add_region(regions)