OpenDSAS is a high-performance, cross-platform reimplementation of the USGS
Digital Shoreline Analysis System (DSAS).
It is designed for fast, memory-efficient shoreline change analysis in command-line workflows.
Compared to the official USGS DSAS:
- π Up to 100Γ faster execution
- πΎ Uses only ~5% of the memory
- π₯οΈ Optimized for Linux + CLI/HPC environments
OpenDSAS is ideal if:
- Your shoreline analysis is large-scale, time-consuming, or memory-intensive
- You prefer command-line workflows and Linux HPC environments
- You need parallelized computation on large datasets
pip install opendsasThis installs the same static dsas binary published in Releases, wrapped in a platform wheel β no compiler or build step required.
Download the pre-built static binary β this URL always points to the latest release:
curl -LO https://github.com/lubyant/OpenDSAS/releases/latest/download/opendsas-linux-x86_64
chmod +x opendsas-linux-x86_64
sudo mv opendsas-linux-x86_64 /usr/local/bin/dsasFor ARM (servers, Raspberry Pi), use opendsas-linux-arm64 instead of opendsas-linux-x86_64.
The binary is fully statically linked β it runs on any Linux distribution (Ubuntu, Debian, RHEL, Alpine, etc.) with no dependencies.
Install via Homebrew using the OpenDSAS tap:
brew tap lubyant/opendsas https://github.com/lubyant/OpenDSAS
brew install lubyant/opendsas/opendsasRequires Apple Silicon (M1/M2/M3). An Intel build is not provided.
Download opendsas-vX.Y-windows-x86_64.exe from Releases, rename it to dsas.exe, and add it to your PATH.
Prerequisites
- CMake β₯ 3.14
- C++20-compatible compiler (GCC 11+, Clang 14+, MSVC 2022+)
- macOS only:
brew install libomp
All other dependencies (nlohmann/json, shapelib, argparse) are fetched automatically by CMake.
git clone https://github.com/lubyant/OpenDSAS.git
cd OpenDSAS
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
# optional: install to system PATH
sudo cmake --install buildBoth Shapefile (.shp) and GeoJSON (.geojson / .json) are accepted for all input files.
All input and output files in a single command must use the same format β mixing formats (e.g. a .geojson input with a .shp output) is an error.
# Shapefile inputs
dsas --baseline baseline.shp --shoreline shoreline.shp --transect-length 1000 --transect-spacing 10
# GeoJSON inputs
dsas --baseline baseline.geojson --shoreline shoreline.geojson \
--output-intersect intersects.geojson --output-transect transects.geojson \
--transect-length 1000 --transect-spacing 10| Option | Description | Default |
|---|---|---|
-h, --help |
Show help message | β |
-v, --version |
Print version info | β |
--baseline [FILE] |
Path to baseline file (.shp or .geojson) |
β |
--bid-field [STR] |
Field name for baseline ID in baseline data | id |
--shoreline [FILE] |
Path to shoreline file (.shp or .geojson) |
β |
--date-field [STR] |
Field name for date in shoreline data | Date |
--date-format [STR] |
Date format in shoreline data | %Y/%m/%d |
--output-intersect [FILE] |
Output intersections file (must match input format) | intersects.shp |
--output-transect [FILE] |
Output transects file (must match input format) | transects.shp |
--smooth-factor [N] |
Smoothing factor | 1 |
--transect-length [N] |
Transect length | 500 |
--transect-spacing [N] |
Spacing between transects | 30 |
--intersection-mode [MODE] |
Intersection rule: closest or farthest |
closest |
--transect-orientation [MODE] |
Transect orientation: left, right, or mix (half left, half right) |
mix |
-bi, --build_index |
Build spatial index (faster queries, slower initial build) | false |
Generate transects from a baseline.
Click to expand cast options
| Option | Description | Default |
|---|---|---|
-h, --help |
Show help message | β |
-v, --version |
Print version info | β |
--baseline [FILE] |
Path to baseline file (.shp or .geojson) (required) |
β |
--bid-field [STR] |
Field name for baseline ID in baseline data | id |
--output-transect [FILE] |
Output transects file (must match input format) | transects.shp |
--smooth-factor [N] |
Smoothing factor | 1 |
--transect-length [N] |
Transect length | 500 |
--transect-spacing [N] |
Spacing between transects | 30 |
--intersection-mode [MODE] |
Intersection rule: closest or farthest |
closest |
--transect-orientation [MODE] |
Transect orientation: left, right, or mix |
mix |
Generate intersections and calculate erosion rates using predefined transects.
Click to expand cal options
| Option | Description | Default |
|---|---|---|
-h, --help |
Show help message | β |
-v, --version |
Print version info | β |
--transect [FILE] |
Path to transect file (.shp or .geojson) (required) |
β |
--shoreline [FILE] |
Path to shoreline file (.shp or .geojson) (required) |
β |
--date-field [STR] |
Field name for date in shoreline data | Date |
--date-format [STR] |
Date format in shoreline data | %Y/%m/%d |
--output-intersect [FILE] |
Output intersections file (must match input format) | intersects.shp |
--intersection-mode [MODE] |
Intersection rule: closest or farthest |
closest |
--transect-orientation [MODE] |
Transect orientation: left, right, or mix |
mix |
-bi, --build_index |
Build spatial index (faster queries, slower initial build) | false |
Input files may be Shapefile (.shp) or GeoJSON (.geojson / .json).
All files in one command invocation must use the same format.
Must contain a Date field (or the name given by --date-field):
| Date |
|---|
| YYYY/MM/DD |
- Example:
2000/01/01 - A shoreline ID field is auto-generated (custom IDs not yet supported)
Must contain an Id field (or the name given by --bid-field):
| Id |
|---|
| baseline id |
OpenDSAS generates two output files (Shapefile by default; format matches your inputs):
| BaselineId | TransectId | ShoreID | Date | ref_dist | X | Y |
|---|---|---|---|---|---|---|
| baseline id | transect id | shoreline id | intersection date | distance to baseline | x | y |
| TransectId | BaselineId | ChangeRate |
|---|---|---|
| transect id | baseline id | shoreline change rate |
- GUI frontend
If you use OpenDSAS in your research, please cite it as:
@misc{OpenDSAS,
author = {Lu, Boyuan; Wang, wei},
title = {OpenDSAS: A High-Performance Digital Shoreline Analysis System},
year = {2025},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/lubyant/OpenDSAS}},
}