diff --git a/.nojekyll b/.nojekyll index 1116bb6..b1ba4cd 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -7579c094 \ No newline at end of file +983968d9 \ No newline at end of file diff --git a/CHANGE_LOG.html b/CHANGE_LOG.html index 22a1f94..d2e3e1c 100644 --- a/CHANGE_LOG.html +++ b/CHANGE_LOG.html @@ -2,7 +2,7 @@ - + @@ -11,15 +11,10 @@ @@ -38,8 +33,8 @@ - - + + @@ -69,18 +63,11 @@
- @@ -88,138 +75,128 @@
-
diff --git a/python/04_Dangermond_Land_Cover.html b/python/04_Dangermond_Land_Cover.html index 8861e15..544cf67 100644 --- a/python/04_Dangermond_Land_Cover.html +++ b/python/04_Dangermond_Land_Cover.html @@ -2,25 +2,19 @@ - + -VITALS - 4 Exploring Canopy Water Content (CWC) and Land Surface Temperature (LST) across Vegetation Types in the Jack and Laura Dangermond Preserve +VITALS – dangermond_land_cover @@ -63,6 +87,8 @@ + + @@ -72,8 +98,8 @@ - - + + @@ -106,18 +131,11 @@
- @@ -125,155 +143,154 @@
-
" }, { - "objectID": "python/04_Dangermond_Land_Cover.html#generate-boxplots-of-cwc-across-vegetation-types", - "href": "python/04_Dangermond_Land_Cover.html#generate-boxplots-of-cwc-across-vegetation-types", - "title": "4 Exploring Canopy Water Content (CWC) and Land Surface Temperature (LST) across Vegetation Types in the Jack and Laura Dangermond Preserve", - "section": "4.3 Generate Boxplots of CWC Across Vegetation types", - "text": "4.3 Generate Boxplots of CWC Across Vegetation types\nGreat! We manged to extract all the pixel values, but we are more interested in investigating the differences across type and vegetation plot type. Here, we separate the above plot into three faceted plots, one for each vegetation type. The final plot is called p_class.\n\nwarnings.filterwarnings('ignore') # We are supressing warnings for this cell since the package is just warning us that the function will change in a future package version.\n\np_class = sns.catplot(\n x='rasDate', \n y='CWC', \n col='Class', # This will create a separate plot for each unique value in the 'Class' column\n data=ex_cwc, \n kind='box',\n col_wrap=3, # Adjust this depending on how many plots per row you want\n sharex=False, \n sharey=False,\n height=5, \n aspect=1,\n width = 0.3,\n palette = {\"#56B4E9\", \"#009E73\", \"#CC79A7\"}\n)\n\np_class.set_titles(size = 18)\np_class.set_xlabels(\"Date\", fontsize = 18)\np_class.set_ylabels(\"Canopy Water Content g/cm$\\mathregular{^2}$\", fontsize = 18)\n\n\n\n\n\nWhat changes in CWC do you see across vegetation types and dates?" - }, - { - "objectID": "python/04_Dangermond_Land_Cover.html#extract-lst-values-and-create-corresponding-boxplot", - "href": "python/04_Dangermond_Land_Cover.html#extract-lst-values-and-create-corresponding-boxplot", - "title": "4 Exploring Canopy Water Content (CWC) and Land Surface Temperature (LST) across Vegetation Types in the Jack and Laura Dangermond Preserve", - "section": "4.4 Extract LST values and create corresponding boxplot", - "text": "4.4 Extract LST values and create corresponding boxplot\nWe are also interested in looking at changes in LST across time, so let’s repeat a similar process to extract LST values by vegetation type. The final extracted data frame is called final_df_lst\n#TODO - NEED to update, so that files list is simlar to CWC recommend final dataset be called ex_lst\n\n# data directory - location of all images cropped to dangermond. Includes subfolders for ewt and lst. \n# data_dir = \"../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond\" # already loaded\n# list all files in the ewt sub-directory of the data_dir path that end in tif\nlst_list = glob.glob(os.path.join(data_dir, \"lst\", \"*.tif\"))\nlst_list\n\n['../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_26921_001_10SGD_20230405T190258_0710_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_29901_007_10SGD_20231014T223936_0711_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_29576_005_10SGD_20230923T232104_0710_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_28238_012_10SGD_20230629T170416_0710_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_26860_001_10SGD_20230401T203733_0710_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_26223_012_10SGD_20230219T202943_0710_01_LST_dangermond.tif']\n\n\n\n# the date and time codes strings we want to select from our larger lst_list\nlst_dates = ['20230401T203733', '20230629T170416', '20230923T232104']\n# this is written as a loop so that the files appear dates would appear chronologically like our cwc_date list\nfil_lst_list = [] # empty list\nfor date in lst_dates:\n # filter for appropriate dates and then add back\n fil_lst_list.extend([file for file in lst_list if date in file])\nfil_lst_list\n\n['../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_26860_001_10SGD_20230401T203733_0710_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_28238_012_10SGD_20230629T170416_0710_01_LST_dangermond.tif',\n '../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_29576_005_10SGD_20230923T232104_0710_01_LST_dangermond.tif']\n\n\n\n# Initialize an empty list to store the plots\nplots = []\n\n# Iterate over each LST file and create a plot\nfor file in fil_lst_list:\n # Open the raster file\n ras = rxr.open_rasterio(file).squeeze('band', drop=True)\n \n # extract the date string from the file name using string matching\n ras_date = re.search(r\"\\d{8}\", file).group()\n date_object = datetime.strptime(ras_date, \"%Y%m%d\")\n date_only = date_object.date()#.strftime(\"%Y-%m-%d\")\n ras -= 273.15 # Convert Kelvin to Celsius\n \n # Add attributes for plotting\n long_name_value = \"Land Surface Temperature\"\n ras.attrs['long_name'] = long_name_value\n units_value = \"°C\" # Change the units to Celsius\n ras.attrs['units'] = units_value\n \n # Create a plot using geoviews\n plot = ras.hvplot.image(x='x', y='y', geo=True, cmap='reds',\n tiles='ESRI', \n title=f\"{date_only} {ras.long_name} ({ras.units})\",\n xlabel='Longitude', ylabel='Latitude',\n frame_width=400, frame_height= 300,\n fontscale=1, alpha=0.7)\n \n # Add the plot to the list\n plots.append(plot)\n\n# Display all plots in a grid layout using Panel\ngrid = pn.GridSpec(sizing_mode='stretch_both')\nfor i, plot in enumerate(plots):\n grid[i // 2, i % 2] = plot # Adjust 3 to change the number of columns\n\ngrid.servable()\n\n\n\n\n\n\n\n\n \n\n\n\n\n\nlst_april = \"../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_26860_001_10SGD_20230401T203733_0710_01_LST_dangermond.tif\"\nlst_june = \"../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_28238_012_10SGD_20230629T170416_0710_01_LST_dangermond.tif\"\nlst_sep = \"../../shared/2023-VITALS-Workshop-AGU/data/cropped/dangermond/lst/ECOv002_L2T_LSTE_29576_005_10SGD_20230923T232104_0710_01_LST_dangermond.tif\"\n\n\nlst_List = [lst_april, lst_june, lst_sep]\nex_df_lst = []\nfor r in lst_List:\n # extract values \n ras = rxr.open_rasterio(r).squeeze('band',drop=True)\n ex_ras = extract_raster_values(ras, veg_poly)\n \n # add date to the dataframe\n rDate = re.search(r\"\\d{8}\", r).group()\n date_object = datetime.strptime(rDate, \"%Y%m%d\")\n date_only = date_object.date()#.strftime(\"%Y-%m-%d\")\n \n # add column \n ex_ras['rasDate'] = date_only\n # add back to data frame with all values\n ex_df_lst.append(ex_ras)\n\nfinal_df_lst = pd.concat(ex_df_lst).reset_index(drop=True)\nfinal_df_lst.rename(columns = {'value':'LST'}, inplace = True) # Rename values column to LST\nfinal_df_lst = final_df_lst[final_df_lst['LST'] > 0 ] # Removes any value less than 0\n\n\nfinal_df_lst.head()\n\n\n\n\n\n\n\n\nx\ny\nspatial_ref\nLST\ncell_number\nid\nClass\ngeometry\nrasDate\n\n\n\n\n0\n-120.461840\n34.452859\n0\n296.619995\n34.45285946671181_-120.46183955389516\n0\nice_plant\nMULTIPOLYGON (((-120.46214771722677 34.4533973...\n2023-04-01\n\n\n1\n-120.461840\n34.452317\n0\n296.619995\n34.45231723419155_-120.46183955389516\n0\nice_plant\nMULTIPOLYGON (((-120.46214771722677 34.4533973...\n2023-04-01\n\n\n2\n-120.461840\n34.451775\n0\n296.720001\n34.451775001671294_-120.46183955389516\n0\nice_plant\nMULTIPOLYGON (((-120.46214771722677 34.4533973...\n2023-04-01\n\n\n3\n-120.461840\n34.451233\n0\n296.760010\n34.451232769151034_-120.46183955389516\n0\nice_plant\nMULTIPOLYGON (((-120.46214771722677 34.4533973...\n2023-04-01\n\n\n4\n-120.461297\n34.452859\n0\n296.619995\n34.45285946671181_-120.4612973213749\n0\nice_plant\nMULTIPOLYGON (((-120.46214771722677 34.4533973...\n2023-04-01\n\n\n\n\n\n\n\nLet’s take these values and make a box plot similar to before.\n\np_class_lst = sns.catplot(\n x='rasDate', \n y='LST', \n col='Class', # This will create a separate plot for each unique value in the 'Class' column\n data=final_df_lst, \n kind='box',\n col_wrap=3, # Adjust this depending on how many plots per row you want\n sharex=False, \n sharey=False,\n height=5, \n aspect=1,\n width = 0.3,\n palette = {\"#56B4E9\", \"#009E73\", \"#CC79A7\"}\n)\np_class_lst.set_titles(size = 18)\np_class_lst.set_xlabels(\"Date\", fontsize = 18)\np_class_lst.set_ylabels(\"Land Surface Temperature C\", fontsize = 18)\n\n\n\n\n\nWhat changes in LST do you see across vegetation types and dates?" - }, - { - "objectID": "python/04_Dangermond_Land_Cover.html#look-at-cwc-and-lst-together", - "href": "python/04_Dangermond_Land_Cover.html#look-at-cwc-and-lst-together", - "title": "4 Exploring Canopy Water Content (CWC) and Land Surface Temperature (LST) across Vegetation Types in the Jack and Laura Dangermond Preserve", - "section": "4.5 Look at CWC and LST together", - "text": "4.5 Look at CWC and LST together\nOften times we want to visualize two variables together, so lets look at LST and CWC side by side. We have to re-write the plotting code because of the structure of seaborne plotting.\n#TODO Update - Make plotting notes more clear and more easy to use in the interactive portion?\n\n# Generate subplots with boxplots for different vegetation classes comparing CWC and LST\nn_classes = ex_cwc['Class'].nunique()\nfig, axes = plt.subplots(n_classes, 2, figsize=(15, 5 * n_classes), sharex='col')\n\n# Iterate over each class and plot\nfor i, class_name in enumerate(ex_cwc['Class'].unique()):\n # Filter data for each class\n class_subset = ex_cwc[ex_cwc['Class'] == class_name]\n class_lst_subset = final_df_lst[final_df_lst['Class'] == class_name]\n\n # Create boxplot for CWC on the first column\n sns.boxplot(\n x='rasDate', \n y='CWC', \n data=class_subset, \n ax=axes[i, 0], # Plot on the first column\n width=0.3, \n palette={\"#56B4E9\", \"#009E73\", \"#CC79A7\"}\n )\n\n # Create boxplot for LST on the second column\n sns.boxplot(\n x='rasDate', \n y='LST', \n data=class_lst_subset, \n ax=axes[i, 1], # Plot on the second column\n width=0.3, \n palette={\"#56B4E9\", \"#009E73\", \"#CC79A7\"}\n )\n\n # Set titles and labels\n axes[i, 0].set_title(f'Class {class_name} - CWC')\n axes[i, 1].set_title(f'Class {class_name} - LST')\n axes[i, 0].set_xlabel('Date')\n axes[i, 0].set_ylabel('CWC')\n axes[i, 1].set_xlabel('Date')\n axes[i, 1].set_ylabel('LST')\n\n# Adjust layout\nplt.tight_layout()\nplt.show()\n\n\n\n\n#TODO\n\nUPDATE WRITE SOMETHING ABOUT THE CHANGES" - }, - { - "objectID": "python/04_Dangermond_Land_Cover.html#interactive-playground", - "href": "python/04_Dangermond_Land_Cover.html#interactive-playground", - "title": "4 Exploring Canopy Water Content (CWC) and Land Surface Temperature (LST) across Vegetation Types in the Jack and Laura Dangermond Preserve", - "section": "4.6 Interactive playground", - "text": "4.6 Interactive playground\n\nNow let's have some fun with what you have learned and let you draw your own polygons to study vegetation change!\n</div>\nThere are several functions in the jldp_ras_funcs.py script that this section relies on. The interactive polygon portion is based on this notebook # https://github.com/auspatious/hyperspectral-notebooks/blob/main/04_EMIT_Interactive_Polygons.ipynb with added functions to reformat the output polygons into a geopandas dataframe that we can use in the same extract_raster_values function as before.\nHere we are limiting the amount of polygons you can draw using POLY_LIMIT = 5 and are only displaying the canopy water content\nTo draw a polygon activate the Polygon Draw Tool on the right hand side. Then double click somewhere on the map to start your polygon and double click to end draing your polygon\n\n# required functions \ndef hv_to_rio_geometry(hv_polygon: hv.Polygons) -> list:\n \"\"\"Convert a HoloViews Polygons object to a GeoJSON-like geometry\"\"\"\n coordinates = [[x, y] for x, y in zip(hv_polygon[\"xs\"], hv_polygon[\"ys\"])]\n return [\n {\n \"type\": \"Polygon\",\n \"coordinates\": [coordinates],\n }\n ]\ndef hv_stream_to_rio_geometries(hv_polygon: hv.Polygons) -> list:\n \"\"\"Convert a HoloViews polygon_stream object to a GeoJSON-like geometry\"\"\"\n\n geoms = [[x, y] for x, y in zip(hv_polygon[\"xs\"], hv_polygon[\"ys\"])]\n\n for geom in geoms:\n xs, ys = geom\n coordinates = [[x, y] for x, y in zip(xs, ys)]\n # Holoviews is stupid.\n coordinates.append(coordinates[0])\n\n yield [\n {\n \"type\": \"Polygon\",\n \"coordinates\": [coordinates],\n }\n ]\n\n\n\ndef transform_to_wgs84(geometry, original_crs='EPSG:3857', target_crs='EPSG:4326'):\n \"\"\"\n Transform coordinates of a geometry from the original CRS to the target CRS.\n\n Args:\n geometry (shapely.geometry): The geometry to transform.\n original_crs (str): The original CRS of the geometry.\n target_crs (str): The target CRS to transform to.\n\n Returns:\n shapely.geometry: Transformed geometry.\n \"\"\"\n project = pyproj.Transformer.from_crs(original_crs, target_crs, always_xy=True).transform\n return transform(project, geometry)\n\ndef create_geodataframe(contents, transform_needed=True):\n \"\"\"\n Create a GeoDataFrame from polygon data, with an option to transform coordinates.\n\n Args:\n contents (list): List of polygon data.\n transform_needed (bool): Flag to indicate if coordinate transformation is needed.\n\n Returns:\n geopandas.GeoDataFrame: GeoDataFrame with polygons and their unique identifiers.\n \"\"\"\n transformed_polygons = []\n for feature in contents:\n for geom in feature:\n polygon = Polygon(geom[0]['coordinates'][0])\n if transform_needed:\n transformed_polygon = transform_to_wgs84(polygon)\n else:\n transformed_polygon = polygon\n transformed_polygons.append(transformed_polygon)\n\n poly_fid = list(range(len(transformed_polygons)))\n poly_selected = gp.GeoDataFrame({'poly_fid': poly_fid, 'geometry': transformed_polygons})\n poly_selected.set_crs(\"EPSG:4326\", inplace=True)\n return poly_selected\n\n\nds = cw3\n# if you wanted to change the background display do it here\n# for example set to the Spring image\n# ds = rxr.open_rasterio(fil_cwc_list[0]).squeeze('band',drop=True)\n\n# Limit the number of drawn polygons\nPOLY_LIMIT = 5\n\n# create color cycle and list of colors for the number of polygons \ncolor_cycle = hv.Cycle('Category10')\ncolors = [color_cycle[i] for i in range(POLY_LIMIT)]\n\n# add map variable similar to before\nmap = ds.hvplot.image(x='x',y='y',geo=True, cmap='blues',tiles='ESRI',\n title=f\"{ds.long_name} ({ds.units})\",\n xlabel='Longitude',ylabel='Latitude', frame_width=500,\n frame_height=500, fontscale=1.5, alpha = 0.7)\n\n\n# Set up a holoviews points array to enable plotting of the clicked points\nxmid = ds.x.values[int(len(ds.x) / 2)]\nymid = ds.y.values[int(len(ds.y) / 2)]\n\n# create holoview polygons\npolygons = hv.Polygons(\n [],\n kdims=[\"Longitude\", \"latitude\"],\n)\n# stream the drawn polygons\npolygons_stream = hv.streams.PolyDraw(\n data=polygons.columns(),\n source=polygons,\n num_objects=POLY_LIMIT,\n styles={'fill_color': color_cycle.values[0:POLY_LIMIT]}\n)\n\n# Plot the Map and Dynamic Map side by side\n(map * polygons)\n\n\n\n\n\n\n \n\n\n\n\nuse hv_stream_to_rio_geometries to create a geojson like list of your drawn polygons TODO add more explain\n\n# list out the geometries of the different polygons \n# TODO name something better\ngeometries = hv_stream_to_rio_geometries(polygons_stream.data)\ncontents = list(geometries)\ncontents\n\n[]\n\n\nnow use the create_geodataframe function from jldp_ras_funcs.py to format your drawn polygons similarly to our veg_plot_outline file. This time we will not have a class column, but will have a poly_fid column instead which represents the order in which the polygons were drawn starting with 0\n\n# create a geodataframe from contents\nmy_poly_gdf = create_geodataframe(contents, transform_needed=True)\nmy_poly_gdf\n\n\n\n\n\n\n\n\npoly_fid\ngeometry\n\n\n\n\n\n\n\n\n\nPlot box plots for that individual raster\n\nex_ras = extract_raster_values(, gdf)\nex_ras = ex_ras[ex_ras['value'] > 0 ] \n\nSyntaxError: invalid syntax (2618225530.py, line 1)\n\n\n\np_class_selected = sns.catplot(\n # x='september', \n y='value', \n col='poly_fid', # This will create a separate plot for each unique value in the 'Class' column\n data=ex_ras, \n kind='box',\n col_wrap=3, # Adjust this depending on how many plots per row you want\n sharex=False, \n sharey=False,\n height=5, \n aspect=1,\n width = 0.3,\n palette = {\"#56B4E9\", \"#009E73\", \"#CC79A7\"}\n)\np_class_lst.set_titles(size = 18)\np_class_lst.set_xlabels(\"Date\", fontsize = 18)\np_class_lst.set_ylabels(\"Canopy Water Content\", fontsize = 18)\n\n\nnow if you noticed from before there are a few CWC images available that we did not us. Let’s add two more and extract all the data from those and plot 5 CWC dates\n\n# the date and time codes strings we want to select from our larger cwc_list\n# for the first one we are using the merged 0219 dataset\ncwc_dates = ['20230219T202939_2305013_002_dangermond_cwc_merged',\n '20230401T203751', '20230629T170449', '20230923T232101',\n '20231014T224006']\n# this is written as a loop so that the files appear dates would appear chronologically like our cwc_date list\nfil_cwc_list = [] # empty list\nfor date in cwc_dates:\n # filter for appropriate dates and then add back\n fil_cwc_list.extend([file for file in cwc_list if date in file])\nfil_cwc_list\n\n\n# Initialize an empty list to store the plots\nplots = []\n\n# Iterate over each CWC file and create a plot\nfor file in fil_cwc_list:\n # Open the raster file\n ras = rxr.open_rasterio(file).squeeze('band', drop=True)\n \n # extract the date string from the file name using string matching\n ras_date = re.search(r\"\\d{8}\", file).group()\n date_object = datetime.strptime(ras_date, \"%Y%m%d\")\n date_only = date_object.date()#.strftime(\"%Y-%m-%d\")\n \n # Create a plot using geoviews\n plot = ras.hvplot.image(x='x', y='y', geo=True, cmap='blues',\n tiles='ESRI', \n title=f\"{date_only} {ras.long_name} ({ras.units})\",\n xlabel='Longitude', ylabel='Latitude',\n frame_width=400, frame_height= 300,\n fontscale=1, alpha=0.7)\n \n # Add the plot to the list\n plots.append(plot)\n\n# Display all plots in a grid layout using Panel\ngrid = pn.GridSpec(sizing_mode='stretch_both')\nfor i, plot in enumerate(plots):\n grid[i // 2, i % 2] = plot # Adjust 3 to change the number of columns\n\ngrid.servable()\n\n\n# create an empty list for the extracted valeus\nex_df = []\nfor r in fil_cwc_list:\n ## extract values\n # read in raster\n ras = rxr.open_rasterio(r).squeeze('band',drop=True)\n # set raster negative values to na\n ras.data[ras.data == -9999] = np.nan\n # use the extract function with the vegetation function\n ## HERE WE REPLACED VEG_POLY with my_poly_gdf\n ex_ras = extract_raster_values(ras, my_poly_gdf)\n \n # add date to the dataframe\n # pull the date from \n date_object = datetime.strptime(ras.attrs['time_coverage_end'], \"%Y-%m-%dT%H:%M:%S%z\")\n date_only = date_object.date()\n \n # add column \n ex_ras['rasDate'] = date_only\n # add back to data frame with all values\n ex_df.append(ex_ras)\n\nex_cwc_five = pd.concat(ex_df).reset_index(drop=True)\n\n# change the name of the extracted data column\nex_cwc_five.rename(columns = {'value':'CWC'}, inplace = True)\n# remove all nan values from the raster\n# TODO - MARIE -- can you update this so it isn't being rehard coded like that? I don't like it \nex_cwc_five = ex_cwc_five[ex_cwc_five['CWC'] != -9999 ] \n\n\n# we are supressing warnings for this cell since the package \n# is just warning us that the function will change in a future package version.\nwarnings.filterwarnings('ignore')\np_class_sel = sns.catplot(\n x='rasDate', \n y='CWC', \n col='poly_fid', # This will create a separate plot for each unique value in the 'Class' column\n data=ex_cwc_five, \n kind='box',\n col_wrap=2, # Adjust this depending on how many plots per row you want\n sharex=False, \n sharey=False,\n height=5, \n aspect=1,\n width = 0.3#,\n #palette = {\"#56B4E9\", \"#009E73\", \"#CC79A7\"}\n)\n\np_class_sel.set_titles(size = 18)\np_class_sel.set_xlabels(\"Date\", fontsize = 18)\np_class_sel.set_ylabels(\"Canopy Water Content g/cm$\\mathregular{^2}$\", fontsize = 18)" + "objectID": "schedule.html", + "href": "schedule.html", + "title": "2023 AGU Workshop Schedule", + "section": "", + "text": "Space Station Synergies: Applying ECOSTRESS and EMIT ecological problems for Scientific Insight\n\n\n\nTime\nDescription\nLeads/Instructors\n\n\n\n\n8:00-8:30 AM\nIntroduction, overview, learning objectives\nDana Chadwick Madeleine Pascolini-Campbell\n\n\n8:30-9:30 AM\nFinding EMIT and ECOSTRESS Data: - Earthdata Search - AppEEARS - VISIONS\nAaron Friesz Dana Chadwick\n\n\n9:30-9:45 AM\nBreak\n\n\n\n9:45-10:05 AM\nIntroduction to Cloud Computing Environment\nAaron Friesz\n\n\n10:05-10:50 AM\nFinding Concurrent EMIT and ECOSTRESS Data\nErik Bolch\n\n\n10:50-11:05 AM\nBreak\n\n\n\n11:05-12:00 PM\nExploring EMIT Reflectance and ECOSTRESS LST\nErik Bolch\n\n\n12:00-1:00 PM\nLunch Break\n\n\n\n1:00-2:00 PM\nEstimating Canopy Water Content\nDana Chadwick Niklas Bohn Erik Bolch\n\n\n2:00-2:30 PM\nUse Case 1: Dangermond Preserve Land Cover\nChristiana Ade Marie Johnson\n\n\n2:30-3:00 PM\nUse Case 2: Santa Barbara Agriculture\nClaire Villanueva-Weeks Gregory Halverson\n\n\n3:00-3:30 PM\nDiscussion, feedback, resources to take home\nAll" }, { "objectID": "setup/prerequisites.html", "href": "setup/prerequisites.html", - "title": "Prerequisites", + "title": "VITALS", "section": "", - "text": "Prerequisites\nTo follow along during the workshop, or to run through the notebooks contained within the repository using the Openscapes 2i2c Cloud JupyterHub (cloud workspace), the following are required. All software or accounts are free.\n\nGitHub username\n\nCreate a GitHub account (if you don’t already have one) at https://github.com. Follow optional advice on choosing your username\nYour GitHub username is used to enable you access to a cloud environment during the workshop. To gain access, please request access to the NASA Openscapes JupyterHub using this form. You will receive an email invitation to join the organization on GitHub. You must join to gain access to the workspace.\n\n\nEarthdata Login account\n\nCreate an Earthdata Login account (if you don’t already have one) at https://urs.earthdata.nasa.gov\nRemember your username and password; you will need to download or access cloud data during the workshop and beyond.\n\nNetrc file\n\nThis file is needed to access NASA Earthdata assets from a scripting environment like Python.\nThere are multiple methods to create a .netrc file. For this workshop, earthaccess package is used to automatically create a netrc file using your Earthdata login credentials if one does not exist. There are detailed instruction available for creating a .netrc file using other methods here.\n\nLaptop or tablet\n\nParticipation in the exercises requires a laptop or tablet. Yes, a tablet works too! All workshop participants will have access to a 2i2c Jupyter Lab instance running in AWS us-west 2." + "text": "To follow along during the workshop, or to run through the notebooks contained within the repository using the Openscapes 2i2c Cloud JupyterHub (cloud workspace), the following are required. All software or accounts are free.\n\nEarthdata Login account\n\nCreate an Earthdata Login account (if you don’t already have one) at https://urs.earthdata.nasa.gov/users/new\nRemember your username and password; you will need them to download or access data during the workshop and beyond.\n\nGitHub username\n\nCreate a GitHub account (if you don’t already have one) at https://github.com/join. Follow optional advice on choosing your username\nYour GitHub username is used to enable you access to a cloud environment during the workshop. To gain access, please request access to the NASA Openscapes JupyterHub using this form. You will receive an email invitation to join the organization on GitHub. You must join to gain access to the workspace.\n\n\nNetrc file\n\nThis file is needed to access NASA Earthdata assets from a scripting environment like Python.\nThere are multiple methods to create a .netrc file. For this workshop, earthaccess package is used to automatically create a netrc file using your Earthdata login credentials if one does not exist. There are detailed instruction available for creating a .netrc file using other methods here.\n\nLaptop or tablet\n\nParticipation in the exercises requires a laptop or tablet. Yes, a tablet works too! All workshop participants will have access to a 2i2c Jupyter Lab instance running in AWS us-west 2." + }, + { + "objectID": "setup/setup_instructions.html", + "href": "setup/setup_instructions.html", + "title": "VITALS", + "section": "", + "text": "Resources in the VITALS repository have been developed using the Openscapes 2i2c JupyterHub cloud workspace. These resources will not work as-is from a local python environment without modification. A local environment and setup instructions to run these notebooks is forthcoming.\n\n\n\nEmail: LPDAAC@usgs.gov\nVoice: +1-866-573-3222\nOrganization: Land Processes Distributed Active Archive Center (LP DAAC)¹\nWebsite: https://lpdaac.usgs.gov/\nDate last modified: 12-07-2023\n¹Work performed under USGS contract G15PD00467 for NASA contract NNG14HH33I." }, { "objectID": "setup/workshop_setup.html", "href": "setup/workshop_setup.html", "title": "Cloud Workspace Setup", "section": "", - "text": "If you plan to use this repository with the Openscapes 2i2c JupyterHub Cloud Workspace there are no additonal setup requirements for the Python environment. All packages needed are included unless specified within a notebook, in which case a cell will be dedicated to installing the necessary Python libraries using the appropriate package manager.\nAfter completing the prerequisistes you will have access to the Openscapes 2i2c JupyterHub cloud workspace. Follow the link and sign in using your GitHub username and password. After signing in you will be prompted for some server options:\nBe sure to select the radio button for Python and a size of 14.8 GB RAM and up to 3.75 CPUs.\nTo open the JupyterHub and clone the VITALS repository automatically you can use the following link: https://tinyurl.com/yckery74." + "text": "If you plan to use this repository with the Openscapes 2i2c JupyterHub Cloud Workspace there are no additonal setup requirements for the Python environment. All packages needed are included unless specified within a notebook, in which case a cell will be dedicated to installing the necessary Python libraries using the appropriate package manager.\nAfter completing the prerequisistes you will have access to the Openscapes 2i2c JupyterHub cloud workspace. Click here to start JupyterLab. Use your GitHub username and password to sign in. After signing in you will be prompted for some server options:\nBe sure to select the radio button for Python and a size of 14.8 GB RAM and up to 3.75 CPUs." }, { "objectID": "setup/workshop_setup.html#troubleshooting", @@ -418,5 +131,19 @@ "title": "Cloud Workspace Setup", "section": "Contact Info", "text": "Contact Info\nEmail: LPDAAC@usgs.gov\nVoice: +1-866-573-3222\nOrganization: Land Processes Distributed Active Archive Center (LP DAAC)¹\nWebsite: https://lpdaac.usgs.gov/\nDate last modified: 12-05-2023\n¹Work performed under USGS contract G15PD00467 for NASA contract NNG14HH33I." + }, + { + "objectID": "vitals.html", + "href": "vitals.html", + "title": "VITALS", + "section": "", + "text": "Please view the AGU Workshop Page for workshop details. Resources in the VITALS repository have been developed using the Openscapes 2i2c JupyterHub cloud workspace. These resources will not work as-is from a local python environment without modification.\nWelcome to the VSWIR Imaging and Thermal Applications, Learning, and Science Repository! This repository provides Python Jupyter notebooks to help users work with visibile to short-wave infrared imaging spectroscopy data, thermal infrared data, and other products from the Earth Surface Mineral Dust Source Investigation (EMIT) and ECOsystem Spaceborne Thermal Radiometer Experiment on Space Station (ECOSTRESS) missions. The instruments overlapping fields of view provide an unprecedented opportunity to demonstrate the compounded benefits of working with both datasets.\nIn the interest of open science this repository has been made public but is still under active development. Make sure to consult the change log for the most recent changes to the repository. Contributions from all parties are welcome." + }, + { + "objectID": "vitals.html#contact-info", + "href": "vitals.html#contact-info", + "title": "VITALS", + "section": "Contact Info", + "text": "Contact Info\nEmail: LPDAAC@usgs.gov\nVoice: +1-866-573-3222\nOrganization: Land Processes Distributed Active Archive Center (LP DAAC)¹\nWebsite: https://lpdaac.usgs.gov/\nDate last modified: 12-07-2023\n¹Work performed under USGS contract G15PD00467 for NASA contract NNG14HH33I." } ] \ No newline at end of file diff --git a/setup/prerequisites.html b/setup/prerequisites.html index 7379002..e76a426 100644 --- a/setup/prerequisites.html +++ b/setup/prerequisites.html @@ -2,7 +2,7 @@ - + @@ -11,15 +11,10 @@ @@ -40,8 +35,8 @@ - - + + @@ -71,16 +65,11 @@
- @@ -88,138 +77,128 @@
-