{"id":34086057,"url":"https://github.com/npucino/sandpyper","last_synced_at":"2026-04-07T06:31:24.176Z","repository":{"id":46868841,"uuid":"341092845","full_name":"npucino/sandpyper","owner":"npucino","description":"Tools for beach volumetric and behavioral dynamics monitoring from multitemporal UAV-SfM datasets.","archived":false,"fork":false,"pushed_at":"2025-09-30T04:07:07.000Z","size":94977,"stargazers_count":11,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-03-03T17:57:16.106Z","etag":null,"topics":["beach","coastal-dynamics","erosion","remote-sensing","satellite-data","shoreline","uav-imagery"],"latest_commit_sha":null,"homepage":"https://npucino.github.io/sandpyper/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/npucino.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":".zenodo.json","notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-02-22T05:45:37.000Z","updated_at":"2025-09-30T04:07:12.000Z","dependencies_parsed_at":"2025-04-14T15:42:40.424Z","dependency_job_id":"ffb3acc7-f8aa-410e-8252-714f7dc2582b","html_url":"https://github.com/npucino/sandpyper","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/npucino/sandpyper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/npucino%2Fsandpyper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/npucino%2Fsandpyper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/npucino%2Fsandpyper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/npucino%2Fsandpyper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/npucino","download_url":"https://codeload.github.com/npucino/sandpyper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/npucino%2Fsandpyper/sbom","scorecard":{"id":696555,"data":{"date":"2025-08-11","repo":{"name":"github.com/npucino/sandpyper","commit":"8f51ddb98b17009c12abd2246c8a308fb814778f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/docs.yml:1","Warn: no topLevel permission defined: .github/workflows/draft-pdf.yml:1","Warn: no topLevel permission defined: .github/workflows/pypi.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"14 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-6p56-wp2h-9hxr","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2024-110 / GHSA-jw8x-6495-233v","Warn: Project is vulnerable to: GHSA-jxfp-4rvq-9h9m","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114","Warn: Project is vulnerable to: GHSA-g7vv-2v7x-gj9p","Warn: Project is vulnerable to: PYSEC-2013-9 / GHSA-4gv5-qhvr-36vv","Warn: Project is vulnerable to: PYSEC-2021-437 / GHSA-5xp3-jfq3-5q8x","Warn: Project is vulnerable to: PYSEC-2019-160 / GHSA-c5h8-cq4v-cvfm","Warn: Project is vulnerable to: PYSEC-2013-8 / GHSA-g3p5-fjj9-h8gj","Warn: Project is vulnerable to: PYSEC-2020-173 / GHSA-gpvv-69j7-gwj8","Warn: Project is vulnerable to: PYSEC-2023-228 / GHSA-mq26-g339-26xf","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/docs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/docs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/draft-pdf.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/draft-pdf.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/draft-pdf.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/draft-pdf.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/draft-pdf.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/draft-pdf.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/pypi.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pypi.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/npucino/sandpyper/pypi.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:40","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:41","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:42","Warn: pipCommand not pinned by hash: .github/workflows/pypi.yml:23","Warn: pipCommand not pinned by hash: .github/workflows/pypi.yml:24","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   5 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-22T03:52:50.555Z","repository_id":46868841,"created_at":"2025-08-22T03:52:50.556Z","updated_at":"2025-08-22T03:52:50.556Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31374081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T17:53:18.093Z","status":"ssl_error","status_checked_at":"2026-04-03T17:53:17.617Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["beach","coastal-dynamics","erosion","remote-sensing","satellite-data","shoreline","uav-imagery"],"created_at":"2025-12-14T13:21:47.326Z","updated_at":"2026-04-07T06:31:24.157Z","avatar_url":"https://github.com/npucino.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![image](https://img.shields.io/pypi/v/sandpyper.svg)](https://pypi.python.org/pypi/sandpyper)\n[![Contributors][contributors-shield]][contributors-url]\n[![image](https://github.com/npucino/sandpyper/workflows/build/badge.svg)](https://github.com/npucino/sandpyper/actions/workflows/build.yml/badge.svg)\n[![image](https://github.com/npucino/sandpyper/workflows/docs/badge.svg)](https://github.com/npucino/sandpyper/actions/workflows/docs.yml/badge.svg)\n[![image](https://github.com/npucino/sandpyper/workflows/pypi/badge.svg)](https://github.com/npucino/sandpyper/actions/workflows/pypi.yml/badge.svg)\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![License][license-shield]][license-url]\n[![joss](https://joss.theoj.org/papers/ff00f33cd9152b1834727ffb8be4122a/status.svg)](https://joss.theoj.org/papers/ff00f33cd9152b1834727ffb8be4122a)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5565487.svg)](https://doi.org/10.5281/zenodo.5565487)\n\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n\n\u003c!-- PROJECT logo --\u003e\n\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/npucino/sandpyper/\"\u003e\n    \u003cimg src=\"sandpiper2nowords-01.png\" alt=\"Logo\" width=\"30%\" height=\"30%\"\u003e\n  \u003c/a\u003e\n\n  \u003ch1 align=\"center\"\u003eSandpyper\u003c/h1\u003e\n\n  \u003ch3 align=\"center\"\u003e- Sandy beaches SfM-UAV analysis tools -\u003c/h3\u003e\n\n  \u003cp align=\"justify\"\u003e\n    \u003cem\u003eSandpyper\u003c/em\u003e performs an organised and automated extraction of color and elevation profiles from as many DSM and orthophotos as you like. It is thought to be used when a considerable number of DSMs and orthophotos from many different locations and coordinate reference systems need to be processed.\n    Then, it computes volumetric and behavioural analysis of sandy beachfaces, speeding up an otherwise long and difficult to handle job.\n    It has some specialised functions to help dealing with the common limitations found in working with Unoccupied Aerial Vehicles (UAVs) and Structure from Motion (SfM) in beach environments, which are:\n  \u003col\u003e\n    \u003cli\u003eSwash zone: the water motion of waves washing in and out of the swash zone prevents SfM algorithm to reliably model elevation. It is commonly discarded.\u003c/li\u003e\n    \u003cli\u003eVegetation: both dune vegetation and beach wracks (macroalgae, woody debris) should be removed or filtered as anything that is not sand would compromise sediment volumetric computation and behavioural analysis.\u003c/li\u003e\n    \u003cli\u003eFile size: a few km long beach surveyed with a DJI Phantom 4-Advanced at 100 meters altitude creates roughly 10 Gb (uncompressed) of data, which can be cumbersome for some GIS to handle.\u003c/li\u003e\n  \u003c/ol\u003e\n\n  From user-defined cross-shore transects, \u003cem\u003eSandpyper\u003c/em\u003e helps with:\n  \u003col\u003e\n    \u003cli\u003e cleaning profiles from unwanted non-sand points\u003c/li\u003e\n    \u003cli\u003e computing period-specific limits of detection to obtain reliable estimates of changes\u003c/li\u003e\n    \u003cli\u003e detecting statistically significant clusters of change (also referred to hotspots/coldspots) of beach change\u003c/li\u003e\n    \u003cli\u003e computing multiscale volumetric analysis\u003c/li\u003e\n    \u003cli\u003e modeling multiscale Beachface Cluster Dynamics indices\u003c/li\u003e\n    \u003cli\u003e visualising beach changes, limits of detection, transects and BCDs with a variety of in-built plotting methods\u003c/li\u003e\n  \u003c/ol\u003e\n\n  Additionally, \u003cem\u003eSandpyper\u003c/em\u003e has some useful functions that can come at hand, such as:\n   automatic transect creation from a vector line, grid creation along a line and subsequent tiles extraction and others.\n   \u003col\u003e\n     \u003cli\u003e automatic transects creation from a vector line \u003c/li\u003e\n     \u003cli\u003e spatial grid creation of specified tile size along a line \u003c/li\u003e\n     \u003cli\u003e tiles extraction from spatial grid \u003c/li\u003e\n   \u003c/ol\u003e\n\n  \u003cem\u003eSandpyper\u003c/em\u003e is very easy to use.\n\n  \u003cbr\u003e\n  \u003cimg src=\"docs/images/sandpyper_scheme.png\" alt=\"banner\" width=\"80%\"\u003e\n  \u003cbr\u003e\n\n  As the above image shows, \u003cem\u003eSandpyper\u003c/em\u003e processing pipeline is mainly composed of **3 main components**:\n \u003col\u003e\n  \u003cli\u003e Raw data extraction \u003c/li\u003e\n  \u003cli\u003e Data correction \u003c/li\u003e\n  \u003cli\u003e Sediment dynamics analysis \u003c/li\u003e\n \u003c/ol\u003e\n\n  To achieve this in an organised and coherent way, \u003cem\u003eSandpyper\u003c/em\u003e provides two core objects, the ```ProfileSet``` and the ```ProfileDynamics``` classes.\n  \u003cbr\u003e\n  The ```ProfileSet``` class sets up the monitoring global parameters, extracts the change data and Limit of Detections, implements iterative silhouette analysis with inflexion point search and facilitates point cleaning by using user-provided watermasks, shoremasks and class dictionaries.\n  \u003cbr\u003e\n  The ```ProfileDynamics``` class is the core processor for beach dynamics. It computes multitemporal and multiscale elevation change, performs Hotspot/Coldspot analysis at the location level, discretises the data into classes of magnitude of change, models multiscale behavioural dynamics and provides many different plotting options. \u003cbr\u003e\n  After instantiation, both classes will gradually store more and more beach change information in their attributes.\n\n  Follow the [Jupyter Notebook tutorials](https://github.com/npucino/sandpyper/tree/master/examples) to understand how it works!\n\n  \u003e**This code has supported the analysis and publication of the article [\"Citizen science for monitoring seasonal-scale beach erosion and behaviour with aerial drones\"](https://rdcu.be/cfgvu  \"link to paper\"), in the open access Nature Scientific Report journal.**\n\n  \u003cbr/\u003e\n  \u003ca href=\"https://npucino.github.io/sandpyper/\"\u003e\u003cstrong\u003eExplore the docs \u003c/strong\u003e\u003c/a\u003e\n  »\n  \u003ca href=\"https://github.com/npucino/sandpyper/issues\"\u003e\u003cstrong\u003eReport Bug\u003c/strong\u003e\u003c/a\u003e\n  »\n  \u003ca href=\"https://github.com/npucino/sandpyper/issues\"\u003e\u003cstrong\u003eRequest Feature\u003c/strong\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails open=\"open\"\u003e\n  \u003csummary\u003e\u003ch2 style=\"display: inline-block\"\u003eTable of Contents\u003c/h2\u003e\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#Background\"\u003eBackground\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#Modules\"\u003eModules\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#Installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#publications\"\u003ePublications\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#acknowledgements\"\u003eAcknowledgements\u003c/a\u003e\u003c/li\u003e\n\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\n\n\u003cimg src=\"banner.png\" alt=\"banner\" width=\"80%\"\u003e\n\n\u003c!-- Background --\u003e\n### Background\n\u003cem\u003eSandpyper\u003c/em\u003e has been originally developed to facilitate the analysis of a large dataset coming from more than 300 Unoccupied Aerial Vehicles (UAV) surveys, performed by Citizen Scientist in Victoria, Australia. This is the [Eureka Award Winning](https://www.deakin.edu.au/about-deakin/media-releases/articles/eureka-prize-win-for-world-first-citizen-science-program) World-first [beach monitoring program powered by volunteers](https://www.marinemapping.org/vcmp-citizen-science \"info on the Citizen Science project\"), who autonomously fly UAVs on 15 sensitive sites (erosional hotspots) across the Victorian coast, every 6 weeks for 3 years, since 2018. This project is part of a broader marine mapping program called The [Victorian Coastal Monitoring Program (VCMP)](https://www.marineandcoasts.vic.gov.au/coastal-programs/victorian-coastal-monitoring-program \"VCMP website\"), funded by the [Victorian Department of Environment, Land, Water and Planning](https://www.delwp.vic.gov.au/ \"DELWP website\"), co-funded by [Deakin University](https://www.deakin.edu.au/ \"Deakin Uni website\") and [The University of Melbourne](https://www.unimelb.edu.au/ \"UniMelb website\").\n\nEach survey creates Digital Surface Models (DSMs) and orthophotos of considerable size (5-10 Gb uncompressed), which can be troublesome for some GIS to render, let alone perform raster-based computations.\n\n\u003c!-- modules --\u003e\n### Modules\n\n* **sandpyper**: main module where the ```ProfileSet``` and ```ProfileDynamics``` classes and methods are defined.\n* **common**: where all the functions are stored.\n\n\u003c!-- GETTING STARTED --\u003e\n## Getting Started\n\nCurrently Sandpyper is tested on Windows, MacOS and Ubuntu with Python 3.8 and 3.9. To get a local copy up and running follow these simple steps.\n\n### Prerequisites\n* [Install Conda] in your local machine. We need it to create the ```sandpyper_env``` virtual environment.\n* then, if you do not have it already, install **Visual Studio C++ build tools** . You can download it [here](https://visualstudio.microsoft.com/visual-cpp-build-tools/ \"standalone VS c++ build tools\").\n* If you don't have it already, add ```conda-forge``` channel to your anaconda config file, by typing this in your Anaconda Prompt terminal (base environment):\n  ```sh\n  conda config --add channels conda-forge\n  ```\n* Now, always in the (base) environment, create a new environment called ```sandpyper_env``` using ```python=3.9``` and install the required packages by typing:\n  ```sh\n  conda create --name sandpyper_env python=3.9 geopandas=0.8.2 matplotlib=3.3.4 numpy=1.20.1 pandas=1.2.2 tqdm=4.56.2 pysal=2.1 rasterio=1.2.0 richdem=0.3.4 scikit-image=0.18.1 scikit-learn=0.24.1 scipy=1.6.0 seaborn=0.11.1 tqdm=4.56.2 pooch=1.4.0 fuzzywuzzy\n  ```\n* If ```rasterio``` package cannot be installed due to __GDAL binding issues__, follow the instructions in [rasterio installation webpage](https://rasterio.readthedocs.io/en/latest/installation.html).\n\n* If you want to test the package using the provided notebooks, __download the test data (test_data.rar) [HERE](https://github.com/npucino/sandpyper/blob/master/test_data.rar)__\n\n### Installation\n\n1. ```sh\n   conda activate sandpyper_env\n   ```\n2. ```sh\n   pip install sandpyper\n   ```\n2. Install Jupyter Notebooks:\n   ```sh\n   conda install jupyter\n   ```\n3. Once you open a Jupyter Notebook with the sandpyper_env, import it to test it works.\n   ```sh\n   import sandpyper\n   ```\n\n\u003c!-- USAGE EXAMPLES --\u003e\n## Usage\n\nTo see \u003cem\u003eSandpyper\u003c/em\u003e in action, follow the Jupyter Notebooks provided [here](https://github.com/npucino/sandpyper/tree/master/examples).\u003cbr\u003e\nDownload the test data file (test_data.rar) __[HERE](https://github.com/npucino/sandpyper/blob/master/test_data.rar)__.\u003cbr\u003e\nFor the API reference, see the [Documentation](https://npucino.github.io/sandpyper/).\n\n\u003c!-- ROADMAP --\u003e\n## Roadmap\n\u003col\u003e\n    \u003cli\u003e Update CRS definition to new CRS object standard in order to upgrade Geopandas version.\u003c/li\u003e\n    \u003cli\u003e Relax all requirements to make it future-proof and available in Anaconda.org. \u003c/li\u003e\n    \u003cli\u003e Add raster support for Dems of Differences (DoDs) and LoDs.\u003c/li\u003e\n    \u003cli\u003e Add shoreline analysis from space.\u003c/li\u003e\n    \u003cli\u003e Add [leafmap](https://github.com/giswqs/leafmap) to better (interactive) plotting.\u003c/li\u003e\n    \u003cli\u003e Add automatic check for overlapping label correction polygons. \u003c/li\u003e\n\u003c/ol\u003e\n\nSee the [open issues](https://github.com/npucino/sandpyper/issues) for a list of proposed features (and known issues).\n\n\u003c!-- CONTRIBUTING --\u003e\n## Contributing\n\nContributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n\n\n\n\u003c!-- CONTACT --\u003e\n## Contact\n\nNicolas Pucino: [@NicolasPucino](https://twitter.com/@NicolasPucino) - npucino@deakin.edu.au\n\u003cbr\u003e\nProject Link: [https://github.com/npucino/sandpyper](https://github.com/npucino/sandpyper)\n\n\n\u003c!-- Publications --\u003e\n## Publications\n\n* [Pucino, N., Kennedy, D. M., Carvalho, R. C., Allan, B. \u0026 Ierodiaconou, D. Citizen science for monitoring seasonal-scale beach erosion and behaviour with aerial drones. Sci. Rep. 11, 3935 (2021)](https://rdcu.be/cfgvu)\n\n\u003c!-- ACKNOWLEDGEMENTS --\u003e\n## Acknowledgements\n\n* [Funding provided by Deakin University and the Victorian Department of Environment, Land, Water and Planning](https://www.marineandcoasts.vic.gov.au/coastal-programs/victorian-coastal-monitoring-program).\n* [Deakin University Citizen Science program webpage](https://www.marinemapping.org/vcmp-citizen-science).\n* My PhD supervisor [A/Prof Daniel Ierodiaconou](https://www.deakin.edu.au/about-deakin/people/daniel-ierodiaconou),  and the [Deakin Marine Mapping team](https://www.marinemapping.org/).\n\n\n\n\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/npucino/sandpyper.svg?style=image\n[contributors-url]: https://github.com/npucino/sandpyper/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/npucino/sandpyper.svg?style=image\n[forks-url]: https://github.com/npucino/sandpyper/network/members\n[stars-shield]: https://img.shields.io/github/stars/npucino/sandpyper.svg?style=image\n[stars-url]: https://github.com/npucino/sandpyper/stargazers\n[issues-shield]: https://img.shields.io/github/issues/npucino/sandpyper.svg?style=image\n[issues-url]: https://github.com/npucino/sandpyper/issues\n[license-shield]: https://img.shields.io/github/license/npucino/sandpyper.svg?style=image\n[license-url]: https://github.com/npucino/sandpyper/blob/master/LICENSE\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=image\u0026logo=linkedin\u0026colorB=555\n[linkedin-url]: https://www.linkedin.com/in/nicolaspucino/\n\n[Install Conda]:https://www.anaconda.com/products/individual \"Anaconda download website\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnpucino%2Fsandpyper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnpucino%2Fsandpyper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnpucino%2Fsandpyper/lists"}