first commit
This commit is contained in:
@@ -0,0 +1,367 @@
|
||||
"""
|
||||
Functions for easily defining widgets in the context of DE Africa notebooks.
|
||||
|
||||
These are largely customised wrappers around existing widgets.
|
||||
"""
|
||||
|
||||
import ipyleaflet as leaflet
|
||||
from ipyleaflet import LayersControl
|
||||
import ipywidgets as widgets
|
||||
from traitlets import Unicode
|
||||
|
||||
|
||||
def create_datepicker(description='', value=None, layout={'width': '85%'}):
|
||||
'''
|
||||
Create a DatePicker widget
|
||||
|
||||
Last modified: July 2022
|
||||
|
||||
Parameters
|
||||
----------
|
||||
description : string
|
||||
descirption label to attach
|
||||
layout : dictionary
|
||||
any layout commands for the widget
|
||||
|
||||
Returns
|
||||
-------
|
||||
date_picker : ipywidgets.widgets.widget_date.DatePicker
|
||||
|
||||
'''
|
||||
|
||||
date_picker = widgets.DatePicker(
|
||||
description=description,
|
||||
layout=layout,
|
||||
disabled=False,
|
||||
value=value
|
||||
)
|
||||
|
||||
return date_picker
|
||||
|
||||
|
||||
def create_inputtext(value, placeholder, description="", layout={'width': '85%'}):
|
||||
'''
|
||||
Create a Text widget
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
value : string
|
||||
initial value of the widget
|
||||
placeholder : string
|
||||
placeholder text to display to the user before intput
|
||||
description : string
|
||||
descirption label to attach
|
||||
layout : dictionary
|
||||
any layout commands for the widget
|
||||
|
||||
Returns
|
||||
-------
|
||||
input_text : ipywidgets.widgets.widget_string.Text
|
||||
|
||||
'''
|
||||
|
||||
input_text = widgets.Text(
|
||||
value=value,
|
||||
placeholder=placeholder,
|
||||
description=description,
|
||||
layout=layout,
|
||||
disabled=False
|
||||
)
|
||||
|
||||
return input_text
|
||||
|
||||
|
||||
def create_boundedfloattext(value, min_val, max_val, step_val, description="", layout={'width': '85%'}):
|
||||
'''
|
||||
Create a BoundedFloatText widget
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
value : float
|
||||
initial value of the widget
|
||||
min_val : float
|
||||
minimum allowed value for the float
|
||||
max_val : float
|
||||
maximum allowed value for the float
|
||||
step_val : float
|
||||
allowed increment for the float
|
||||
description : string
|
||||
descirption label to attach
|
||||
layout : dictionary
|
||||
any layout commands for the widget
|
||||
|
||||
Returns
|
||||
-------
|
||||
float_text : ipywidgets.widgets.widget_float.BoundedFloatText
|
||||
|
||||
'''
|
||||
|
||||
float_text = widgets.BoundedFloatText(
|
||||
value=value,
|
||||
min=min_val,
|
||||
max=max_val,
|
||||
step=step_val,
|
||||
description=description,
|
||||
layout=layout,
|
||||
disabled=False,
|
||||
)
|
||||
|
||||
return float_text
|
||||
|
||||
|
||||
def create_dropdown(options, value, description="", layout={'width': '85%'}):
|
||||
'''
|
||||
Create a Dropdown widget
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
options : list
|
||||
a list of options for the user to select from
|
||||
value : string
|
||||
initial value of the widget
|
||||
description : string
|
||||
descirption label to attach
|
||||
layout : dictionary
|
||||
any layout commands for the widget
|
||||
|
||||
Returns
|
||||
-------
|
||||
dropdown : ipywidgets.widgets.widget_selection.Dropdown
|
||||
|
||||
'''
|
||||
|
||||
dropdown = widgets.Dropdown(
|
||||
options=options,
|
||||
value=value,
|
||||
description=description,
|
||||
layout=layout,
|
||||
disabled=False,
|
||||
)
|
||||
|
||||
return dropdown
|
||||
|
||||
|
||||
def create_html(value):
|
||||
'''
|
||||
Create a HTML widget
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
value : string
|
||||
HTML text to display
|
||||
|
||||
Returns
|
||||
-------
|
||||
html : ipywidgets.widgets.widget_string.HTML
|
||||
|
||||
'''
|
||||
|
||||
html = widgets.HTML(
|
||||
value=value,
|
||||
)
|
||||
|
||||
return html
|
||||
|
||||
|
||||
def create_map(map_center=(4, 20), zoom_level=3, basemap=leaflet.basemaps.OpenStreetMap.Mapnik, basemap_name='Open Street Map'):
|
||||
'''
|
||||
Create an interactive ipyleaflet map
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
map_center : tuple
|
||||
A tuple containing the latitude and longitude to focus on.
|
||||
Defaults to center of Africa, (4, 20)
|
||||
zoom_level : integer
|
||||
Zoom level for the map
|
||||
Defaults to 3 to view all of Africa
|
||||
basemap : ipyleaflet basemap (dict)
|
||||
Basemap to use, can be any from https://ipyleaflet.readthedocs.io/en/latest/api_reference/basemaps.html
|
||||
Defaults to Open Street Map (basemaps.OpenStreetMap.Mapnik)
|
||||
basemap_name : string
|
||||
Layer name for the basemap
|
||||
|
||||
Returns
|
||||
-------
|
||||
m : ipyleaflet.leaflet.Map
|
||||
interactive ipyleaflet map
|
||||
|
||||
'''
|
||||
|
||||
basemap_tiles = leaflet.basemap_to_tiles(basemap)
|
||||
basemap_tiles.name = basemap_name
|
||||
|
||||
m = leaflet.Map(center=map_center, zoom=zoom_level, basemap=basemap_tiles, scroll_wheel_zoom=True)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
def create_dea_wms_layer(product, date):
|
||||
'''
|
||||
Create a Digital Earth Africa WMS layer to add to a map
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
product : string
|
||||
The Digital Earth Africa product to load
|
||||
(e.g. 'gm_s2_annual')
|
||||
date : string (yyyy-mm-dd format)
|
||||
The date to load the product for
|
||||
|
||||
Returns
|
||||
-------
|
||||
time_wms : ipyleaflet WMS layer
|
||||
|
||||
'''
|
||||
|
||||
|
||||
# Load DEA WMS
|
||||
class TimeWMSLayer(leaflet.WMSLayer):
|
||||
time = Unicode("").tag(sync=True, o=True)
|
||||
|
||||
time_wms = TimeWMSLayer(
|
||||
url="https://ows.digitalearth.africa/",
|
||||
layers=product,
|
||||
time=date,
|
||||
format="image/png",
|
||||
transparent=True,
|
||||
attribution="Digital Earth Africa",
|
||||
)
|
||||
|
||||
return time_wms
|
||||
|
||||
|
||||
def create_drawcontrol(
|
||||
draw_controls = ['rectangle', 'polygon', 'circle', 'polyline', 'marker', 'circlemarker'],
|
||||
rectangle_options={},
|
||||
polygon_options={},
|
||||
circle_options={},
|
||||
polyline_options={},
|
||||
marker_options={},
|
||||
circlemarker_options={},
|
||||
):
|
||||
'''
|
||||
Create a draw control widget to add to ipyleaflet maps
|
||||
|
||||
Last modified: October 2021
|
||||
|
||||
Parameters
|
||||
----------
|
||||
draw_controls : list
|
||||
List of draw controls to add to the map. Defaults to adding all
|
||||
Viable options are 'rectangle', 'polygon', 'circle', 'polyline', 'marker', 'circlemarker'
|
||||
rectangle_options : dict
|
||||
Options to customise the appearence of the relevant shape
|
||||
User can supply, or leave blank to get default DE Africa appearence
|
||||
polygon_options : dict
|
||||
Options to customise the appearence of the relevant shape
|
||||
User can supply, or leave blank to get default DE Africa appearence
|
||||
circle_options : dict
|
||||
Options to customise the appearence of the relevant shape
|
||||
User can supply, or leave blank to get default DE Africa appearence
|
||||
polyline_options : dict
|
||||
Options to customise the appearence of the relevant shape
|
||||
User can supply, or leave blank to get default DE Africa appearence
|
||||
marker_options : dict
|
||||
Options to customise the appearence of the relevant shape
|
||||
User can supply, or leave blank to get default DE Africa appearence
|
||||
circlemarker_options : dict
|
||||
Options to customise the appearence of the relevant shape
|
||||
User can supply, or leave blank to get default DE Africa appearence
|
||||
|
||||
|
||||
Returns
|
||||
-------
|
||||
draw_control : ipyleaflet.leaflet.DrawControl
|
||||
|
||||
'''
|
||||
|
||||
# Set defualt DE Africa styling options for polygons
|
||||
default_shapeoptions = {
|
||||
"color": "#FFFFFF",
|
||||
"opacity": 0.8,
|
||||
"fillColor": "#336699",
|
||||
"fillOpacity": 0.4,
|
||||
}
|
||||
default_drawerror = {
|
||||
"color": "#FF6633",
|
||||
"message": "Drawing error, clear all and try again"
|
||||
}
|
||||
|
||||
# Set draw control appearence to DE Africa defaults
|
||||
# Do this if user has requested a control, but has not provided a corresponding options dict
|
||||
|
||||
if ('rectangle' in draw_controls) and (not rectangle_options):
|
||||
rectangle_options = {"shapeOptions": default_shapeoptions}
|
||||
|
||||
if ('polygon' in draw_controls) and (not polygon_options):
|
||||
polygon_options = {
|
||||
"shapeOptions": default_shapeoptions,
|
||||
"drawError": default_drawerror,
|
||||
"allowIntersection": False,
|
||||
}
|
||||
|
||||
if ('circle' in draw_controls) and (not circle_options):
|
||||
circle_options = {"shapeOptions": default_shapeoptions}
|
||||
|
||||
if ('polyline' in draw_controls) and (not polyline_options):
|
||||
polyline_options = {"shapeOptions": default_shapeoptions}
|
||||
|
||||
if ('marker' in draw_controls) and (not marker_options):
|
||||
marker_options = {'shapeOptions': {'opacity': 1.0}}
|
||||
|
||||
if ('circlemarker' in draw_controls) and (not circlemarker_options):
|
||||
circlemarker_options = {"shapeOptions": default_shapeoptions}
|
||||
|
||||
# Instantiate draw control and add options
|
||||
draw_control = leaflet.DrawControl()
|
||||
draw_control.rectangle = rectangle_options
|
||||
draw_control.polygon = polygon_options
|
||||
draw_control.marker = marker_options
|
||||
draw_control.circle = circle_options
|
||||
draw_control.circlemarker = circlemarker_options
|
||||
draw_control.polyline = polyline_options
|
||||
|
||||
return draw_control
|
||||
|
||||
|
||||
def create_checkbox(value, description="", layout={'width': '85%'}):
|
||||
'''
|
||||
Create a Checkbox widget
|
||||
|
||||
Last modified: July 2022
|
||||
|
||||
Parameters
|
||||
----------
|
||||
value : string
|
||||
initial value of the widget; True or False
|
||||
description : string
|
||||
description label to attach
|
||||
layout : dictionary
|
||||
any layout commands for the widget
|
||||
|
||||
Returns
|
||||
-------
|
||||
dropdown : ipywidgets.widgets.widget_selection.Dropdown
|
||||
|
||||
'''
|
||||
|
||||
checklist = widgets.Checkbox(value=value,
|
||||
description=description,
|
||||
layout=layout,
|
||||
disabled=False,
|
||||
indent=False)
|
||||
|
||||
return checklist
|
||||
Reference in New Issue
Block a user