Package: coastsat-package
CoastSat-PackageThis is coastsat-package the pip and conda package extension ofCoastSat. CoastSat-package is a slightly modified version of coastsat to make it compatible withCoastSeg.What's Changed?JPGs for RGB, NIR,and SWIR are created within the jpg_files folder for each downloaded sessionExtracted shorelines are saved as .json files instead of pkl filesThe download progress bar shows which image is being downloaded and which stage of the download process the image is atUsers can turn on / off the cloud mask with the 'apply_cloud_mask' settingMinor organizational changes to make CoastSat more organized and compatible to be packaged.Install CoastSat with condaCreate a conda environmentWe will install the CoastSat package and its dependencies in this environment.conda create --name coastsat_pkg -yInstall coastsat-package using the conda forge channelconda install -c conda-forge coastsat-package -y(Optional) At any time you upgrade coastsat with the command:conda update -c conda-forge coastsat-package -yInstall CoastSat with PipPyPi RepoNote: This package is still in beta and being actively developed.Create a conda environmentWe will install the CoastSat package and its dependencies in this environment.conda create --name coastsat_pkg -yActivate your conda environmentconda activate coastsat_pkgInstall jupyter and geopandas with Conda using the conda forge channelGeopandashasGDALas a dependency so its best to install it with conda.conda install -c conda-forge geopandas jupyterlab -yInstall pip in your conda environmentWe will use pip to install the coastsat package fromPyPiconda install pip -yInstall the pip package-U(upgrade flag) this gets the latest release of the CoastSat packagepip install coastsat_package -UIssuesHaving a problem? Post an issue in theIssues page(please do not email).ContributingIf you would like to contribute to the further development of coastsat-package please follow the steps below. We appreciate all contributions!Fork the repository (https://github.com/2320sharon/coastsat_package/fork).
A fork is a copy on which you can make your changes.Create a new branch on your forkCommit your changes and push them to your branchWhen the branch is ready to be merged, create a Pull Request (how to make a clean pull request explainedhere)CoastSatThe following description is from the official CoastSat page. Go check out the originalCoastSat.Project descriptionSatellite remote sensing can provide low-cost long-term shoreline data capable of resolving the temporal scales of interest to coastal scientists and engineers at sites where no in-situ field measurements are available. CoastSat enables the non-expert user to extract shorelines from Landsat 5, Landsat 7, Landsat 8, Landsat 9 and Sentinel-2 images.
The shoreline detection algorithm implemented in CoastSat is optimised for sandy beach coastlines. It combines a sub-pixel border segmentation and an image classification component, which refines the segmentation into four distinct categories such that the shoreline detection is specific to the sand/water interface.The toolbox has four main functionalities:assisted retrieval from Google Earth Engine of all available satellite images spanning the user-defined region of interest and time period.automated extraction of shorelines from all the selected images using a sub-pixel resolution technique.intersection of the 2D shorelines with user-defined shore-normal transects.tidal correction using measured water levels and an estimate of the beach slope.post-processing of the shoreline time-series, despiking and seasonal averaging.validation example at Narrabeen1. Installation1.1 Create an environment with AnacondaTo run the toolbox you first need to install the required Python packages in an environment. To do this we will useAnaconda, which can be downloaded freelyhere.Once you have it installed on your PC, open the Anaconda prompt (in Mac and Linux, open a terminal window) and use thecdcommand (change directory) to go the folder where you have downloaded this repository.Create a new environment namedcoastsatwith all the required packages by entering these commands in succession:conda create -n coastsat python=3.8
conda activate coastsat
conda install -c conda-forge geopandas earthengine-api scikit-image matplotlib astropy notebook -y
pip install pyqt5All the required packages have now been installed in an environment calledcoastsat. Always make sure that the environment is activated with:conda activate coastsatTo confirm that you have successfully activated CoastSat, your terminal command line prompt should now start with (coastsat).:warning:In case errors are raised:warning:: clean things up with the following command (better to have the Anaconda Prompt open as administrator) before attempting to installcoastsatagain:conda clean --allYou can also install the packages with theAnaconda Navigator, in theEnvironmentstab. For more details, the followinglinkshows how to create and manage an environment with Anaconda.1.2 Activate Google Earth Engine Python APIFirst, you need to request access to Google Earth Engine athttps://signup.earthengine.google.com/. It takes about 1 day for Google to approve requests.Once your request has been approved, with thecoastsatenvironment activated, run the following command on the Anaconda Prompt to link your environment to the GEE server:earthengine authenticateA web browser will open, login with a gmail account and accept the terms and conditions. Then copy the authorization code into the Anaconda terminal.
In the latest version of theearthengine-api, the authentication is done withgcloud. If an error is raised aboutgcloudmissing, go tohttps://cloud.google.com/sdk/docs/installand installgcloud. After you have installed it, close the Anaconda Prompt and restart it, then activate the environenment before runningearthengine authenticateagain.Now you are ready to start using the CoastSat toolbox!Note: remember to always activate the environment withconda activate coastsateach time you are preparing to use the toolbox.2. UsageAn example of how to run the software in a Jupyter Notebook is provided in the repository (example_jupyter.ipynb). To run this, first activate yourcoastsatenvironment withconda activate coastsat(if not already active), and then type:jupyter labA web browser window will open. Point to the directory where you downloaded this repository and click onexample_jupyter.ipynb.The following sections guide the reader through the different functionalities of CoastSat with an example at Narrabeen-Collaroy beach (Australia). If you prefer to useSpyder,PyCharmor other integrated development environments (IDEs), a Python script namedexample.pyis also included in the repository.If usingexample.pyonSpyder, make sure that the Graphics Backend is set toAutomaticand notInline(as this mode doesn't allow to interact with the figures). To change this setting go under Preferences>IPython console>Graphics.A Jupyter Notebook combines formatted text and code. To run the code, place your cursor inside one of the code sections and click on therun cellbutton (or pressShift+Enter) and progress forward.2.1 Retrieval of the satellite imagesTo retrieve from the GEE server the available satellite images cropped around the user-defined region of coastline for the particular time period of interest, the following variables are required:polygon: the coordinates of the region of interest (longitude/latitude pairs in WGS84)dates: dates over which the images will be retrieved (e.g.,dates = ['2017-12-01', '2018-01-01'])sat_list: satellite missions to consider (e.g.,sat_list = ['L5', 'L7', 'L8', 'L9', 'S2']for Landsat 5, 7, 8, 9 and Sentinel-2 collections)sitename: name of the site (this is the name of the subfolder where the images and other accompanying files will be stored)filepath: filepath to the directory where the data will be stored:new:landsat_collection: whether to use Collection 1 (C01) or Collection 2 (C02). Note that after 2022/01/01, Landsat images are only available in Collection 2. Landsat 9 is therefore only available as Collection 2. So if the user has selectedC01, images prior to 2022/01/01 will be downloaded from Collection 1, while images captured after that date will be automatically taken fromC02. Also note that at the time of writingC02is not complete in Google Earth Engine and still being uploaded.The callmetadata = SDS_download.retrieve_images(inputs)will launch the retrieval of the images and store them as .TIF files (under/filepath/sitename). The metadata contains the exact time of acquisition (in UTC time) of each image, its projection and its geometric accuracy. If the images have already been downloaded previously and the user only wants to run the shoreline detection, the metadata can be loaded directly by runningmetadata = SDS_download.get_metadata(inputs).The screenshot below shows an example of inputs that will retrieve all the images of Collaroy-Narrabeen (Australia) acquired by Sentinel-2 in December 2017.Note:The area of the polygon should not exceed 100 km2, so for very long beaches split it into multiple smaller polygons.2.2 Shoreline detectionTo map the shorelines, the following user-defined settings are needed:cloud_thresh: threshold on maximum cloud cover that is acceptable on the images (value between 0 and 1 - this may require some initial experimentation).dist_clouds: buffer around cloud pixels where shoreline is not mapped (in metres)output_epsg: epsg code defining the spatial reference system of the shoreline coordinates. It has to be a cartesian coordinate system (i.e. projected) and not a geographical coordinate system (in latitude and longitude angles). Seehttp://spatialreference.org/to find the EPSG number corresponding to your local coordinate system. If unsure, use 3857 which is the web-mercator.check_detection: if set toTruethe user can quality control each shoreline detection interactively (recommended when mapping shorelines for the first time) and accept/reject each shoreline.adjust_detection: in case users wants more control over the detected shorelines, they can set this parameter toTrue, then they will be able to manually adjust the threshold used to map the shoreline on each image.save_figure: if set toTruea figure of each mapped shoreline is saved under/filepath/sitename/jpg_files/detection, even if the two previous parameters are set toFalse. Note that this may slow down the process.There are additional parameters (min_beach_size,buffer_size,min_length_sl,cloud_mask_issue,sand_colorandpan_offthat can be tuned to optimise the shoreline detection (for Advanced users only). For the moment leave these parameters set to their default values, we will see later how they can be modified.An example of settings is provided here:Once all the settings have been defined, the batch shoreline detection can be launched by calling:output = SDS_shoreline.extract_shorelines(metadata, settings)Whencheck_detectionis set toTrue, a figure like the one below appears and asks the user to manually accept/reject each detection by pressingon the keyboardtheright arrow(⇨) tokeepthe shoreline orleft arrow(⇦) toskipthe mapped shoreline. The user can break the loop at any time by pressingescape(nothing will be saved though).Whenadjust_detectionis set toTrue, a figure like the one below appears and the user can adjust the position of the shoreline by clicking on the histogram of MNDWI pixel intensities. Once the threshold has been adjusted, pressEnterand then accept/reject the image with the keyboard arrows.Once all the shorelines have been mapped, the output is available in two different formats (saved under/filepath/data/sitename):sitename_output.pkl: contains a list with the shoreline coordinates, the exact timestamp at which the image was captured (UTC time), the geometric accuracy and the cloud cover of each individual image. This list can be manipulated with Python, a snippet of code to plot the results is provided in the example script.sitename_output.geojson: this output can be visualised in a GIS software (e.g., QGIS, ArcGIS).The figure below shows how the satellite-derived shorelines can be opened in a GIS software (QGIS) using the.geojsonoutput. Note that the coordinates in the.geojsonfile are in the spatial reference system defined by theoutput_epsg.Reference shorelineBefore running the batch shoreline detection, there is the option to manually digitize a reference shoreline on one cloud-free image. This reference shoreline helps to reject outliers and false detections when mapping shorelines as it only considers as valid shorelines the points that are within a defined distance from this reference shoreline.It is highly recommended to use a reference shoreline.The user can manually digitize one or several reference shorelines on one of the images by calling:settings['reference_shoreline'] = SDS_preprocess.get_reference_sl_manual(metadata, settings)
settings['max_dist_ref'] = 100 # max distance (in meters) allowed from the reference shorelineThis function allows the user to click points along the shoreline on cloud-free satellite images, as shown in the animation below.The maximum distance (in metres) allowed from the reference shoreline is defined by the parametermax_dist_ref. This parameter is set to a default value of 100 m. If you think that 100 m buffer from the reference shoreline will not capture the shoreline variability at your site, increase the value of this parameter. This may be the case for large nourishments or eroding/accreting coastlines.Advanced shoreline detection parametersAs mentioned above, there are some additional parameters that can be modified to optimise the shoreline detection:min_beach_area: minimum allowable object area (in metres^2) for the class 'sand'. During the image classification, some features (for example, building roofs) may be incorrectly labelled as sand. To correct this, all the objects classified as sand containing less than a certain number of connected pixels are removed from the sand class. The default value is 4500 m^2, which corresponds to 20 connected pixels of 15 m^2. If you are looking at a very small beach (<20 connected pixels on the images), try decreasing the value of this parameter.min_length_sl: minimum length (in metres) of shoreline perimeter to be valid. This can be used to discard small features that are detected but do not correspond to the actual shoreline. The default value is 500 m. If the shoreline that you are trying to map is shorter than 500 m, decrease the value of this parameter.cloud_mask_issue: the cloud mask algorithm applied to Landsat images by USGS, namely CFMASK, does have difficulties sometimes with very bright features such as beaches or white-water in the ocean. This may result in pixels corresponding to a beach being identified as clouds and appear as masked pixels on your images. If this issue seems to be present in a large proportion of images from your local beach, you can switch this parameter toTrueand CoastSat will remove from the cloud mask the pixels that form very thin linear features, as often these are beaches and not clouds. Only activate this parameter if you observe this very specific cloud mask issue, otherwise leave to the default value ofFalse.sand_color: this parameter can take 3 values:default,latest,darkorbright. Only change this parameter if you are seing that with thedefaultthe sand pixels are not being classified as sand (in orange). If your beach has dark sand (grey/black sand beaches), you can set this parameter todarkand the classifier will be able to pick up the dark sand. On the other hand, if your beach has white sand and thedefaultclassifier is not picking it up, switch this parameter tobright. Thelatestclassifier contains all the training data and can pick up sand in most environments (but not as accurately). At this stage the different classifiers are only available for Landsat images (soon for Sentinel-2 as well).pan_off: by default Landsat 7, 8 and 9 images are pan-sharpened using the panchromatic band and a PCA algorithm. If for any reason you prefer not to pan-sharpen the Landsat images, switch it off by settingpan_offtoTrue.Re-training the classifierCoastSat's shoreline mapping alogorithm uses an image classification scheme to label each pixel into 4 classes: sand, water, white-water and other land features. While this classifier has been trained using a wide range of different beaches, it may be that it does not perform very well at specific sites that it has never seen before. You can train a new classifier with site-specific training data in a few minutes by following the Jupyter notebook inre-train CoastSat classifier.2.3 Shoreline change analysisThis section shows how to obtain time-series of shoreline change along shore-normal transects. Each transect is defined by two points, its origin and a second point that defines its length and orientation. The origin is always defined first and located landwards, the second point is located seawards. There are 3 options to define the coordinates of the transects:Interactively draw shore-normal transects along the mapped shorelines:transects = SDS_transects.draw_transects(output, settings)Load the transect coordinates from a .geojson file:transects = SDS_tools.transects_from_geojson(path_to_geojson_file)Create the transects by manually providing the coordinates of two points:transects = dict([])
transects['Transect 1'] = np.array([[342836, ,6269215], [343315, 6269071]])
transects['Transect 2'] = np.array([[342482, 6268466], [342958, 6268310]])
transects['Transect 3'] = np.array([[342185, 6267650], [342685, 6267641]])Note:if you choose option 2 or 3, make sure that the points that you are providing are in the spatial reference system defined bysettings['output_epsg'].Once the shore-normal transects have been defined, the intersection between the 2D shorelines and the transects is computed with the following function:settings['along_dist'] = 25
cross_distance = SDS_transects.compute_intersection(output, transects, settings)The parameteralong_distdefines the along-shore distance around the transect over which shoreline points are selected to compute the intersection. The default value is 25 m, which means that the intersection is computed as the median of the points located within 25 m of the transect (50 m alongshore-median). This helps to smooth out localised water levels in the swash zone.An example is shown in the animation below:There is also the option to runSDS_transects.compute_intersection_QA(), this function provides more quality-control when computing the intersections between shorelines and transects (small loops, multiple intersections etc).It is recommended to use this function as it can provide cleaner shoreline time-series. See theJupyter Notebookfor a detailed description of the parameters. An example of parameters for the quality control are provided below:2.4 Tidal CorrectionEach satellite image is captured at a different stage of the tide, therefore a tidal correction is necessary to remove the apparent shoreline changes cause by tidal fluctuations.In order to tidally-correct the time-series of shoreline change you will need the following data:Time-series of water/tide level: this can be formatted as a .csv file, an example is providedhere. Make sure that the dates are in UTC time as the CoastSat shorelines are always in UTC time. Also the vertical datum needs to be approx. Mean Sea Level.An estimate of the beach-face slope along each transect. If you don't have this data you can obtain it usingCoastSat.slope, seeVos et al. 2020for more details (preprint availablehere).Wave setup and runup corrections are not included in the toolbox, but for more information on these additional corrections seeCastelle et al. 2021.2.5 Post-processingThe tidally-corrected time-series can be post-processed to remove outliers with a despiking algorithm inSDS_transects.reject_outliers().Functions to compute seasonal and monthly averages on the shoreline time-series are also provided:SDS_transects.seasonal_averages()andSDS_transects.monthly_averages().2.6 Validation against survey dataThis section provides code to compare the satellite-derived shorelines against the survey data for Narrabeen, available athttp://narrabeen.wrl.unsw.edu.au/.ReferencesVos K., Splinter K.D., Harley M.D., Simmons J.A., Turner I.L. (2019). CoastSat: a Google Earth Engine-enabled Python toolkit to extract shorelines from publicly available satellite imagery.Environmental Modelling and Software. 122, 104528.https://doi.org/10.1016/j.envsoft.2019.104528(Open Access)Vos K., Harley M.D., Splinter K.D., Simmons J.A., Turner I.L. (2019). Sub-annual to multi-decadal shoreline variability from publicly available satellite imagery.Coastal Engineering. 150, 160–174.https://doi.org/10.1016/j.coastaleng.2019.04.004Vos K., Harley M.D., Splinter K.D., Walker A., Turner I.L. (2020). Beach slopes from satellite-derived shorelines.Geophysical Research Letters. 47(14).https://doi.org/10.1029/2020GL088365(Open Access preprinthere)Castelle B., Masselink G., Scott T., Stokes C., Konstantinou A., Marieu V., Bujan S. (2021). Satellite-derived shoreline detection at a high-energy meso-macrotidal beach.Geomorphology. volume 383, 107707.https://doi.org/10.1016/j.geomorph.2021.107707Vos, K. and Deng, W. and Harley, M. D. and Turner, I. L. and Splinter, K. D. M. (2022). Beach-face slope dataset for Australia.Earth System Science Data. volume 14, 3, p. 1345--1357.https://doi.org/10.5194/essd-14-1345-2022Training dataset used for pixel-wise classification in CoastSat:https://doi.org/10.5281/zenodo.3334147