Metadata-Version: 2.4
Name: xdem
Version: 0.2.0
Summary: Analysis of digital elevation models and elevation point clouds
Home-page: https://github.com/GlacioHack/xdem
Download-URL: https://pypi.org/project/xdem/
Author: xDEM developers
License: Apache-2.0
Keywords: dem,elevation,geoutils,xarray
Platform: any
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: Topic :: Scientific/Engineering :: GIS
Classifier: Topic :: Scientific/Engineering :: Image Processing
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: <3.14,>=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: geoutils==0.2.2
Requires-Dist: geopandas>=0.12.0
Requires-Dist: rasterio<2,>=1.3
Requires-Dist: scipy==1.*
Requires-Dist: numpy<3,>=1
Requires-Dist: pyproj<4,>=3.4
Requires-Dist: affine
Requires-Dist: pandas
Requires-Dist: pyogrio
Requires-Dist: shapely
Provides-Extra: opt
Requires-Dist: numba; extra == "opt"
Requires-Dist: matplotlib; extra == "opt"
Requires-Dist: scikit-learn; extra == "opt"
Requires-Dist: scikit-gstat>=1.0.18; extra == "opt"
Requires-Dist: laspy[lazrs]; extra == "opt"
Requires-Dist: cerberus; extra == "opt"
Requires-Dist: pyyaml; extra == "opt"
Requires-Dist: weasyprint; extra == "opt"
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-xdist; extra == "test"
Requires-Dist: pytest-instafail; extra == "test"
Requires-Dist: pytest-socket; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Requires-Dist: coveralls; extra == "test"
Requires-Dist: flake8; extra == "test"
Requires-Dist: pylint; extra == "test"
Requires-Dist: pre-commit; extra == "test"
Provides-Extra: doc
Requires-Dist: sphinx; extra == "doc"
Requires-Dist: sphinx-book-theme; extra == "doc"
Requires-Dist: sphinxcontrib-programoutput; extra == "doc"
Requires-Dist: sphinx-design; extra == "doc"
Requires-Dist: sphinx-autodoc-typehints; extra == "doc"
Requires-Dist: sphinx-gallery; extra == "doc"
Requires-Dist: autovizwidget; extra == "doc"
Requires-Dist: graphviz; extra == "doc"
Requires-Dist: myst-nb; extra == "doc"
Requires-Dist: numpydoc; extra == "doc"
Requires-Dist: sphinx-tabs; extra == "doc"
Provides-Extra: dev
Requires-Dist: numba; extra == "dev"
Requires-Dist: matplotlib; extra == "dev"
Requires-Dist: scikit-learn; extra == "dev"
Requires-Dist: scikit-gstat>=1.0.18; extra == "dev"
Requires-Dist: laspy[lazrs]; extra == "dev"
Requires-Dist: cerberus; extra == "dev"
Requires-Dist: pyyaml; extra == "dev"
Requires-Dist: weasyprint; extra == "dev"
Requires-Dist: sphinx; extra == "dev"
Requires-Dist: sphinx-book-theme; extra == "dev"
Requires-Dist: sphinxcontrib-programoutput; extra == "dev"
Requires-Dist: sphinx-design; extra == "dev"
Requires-Dist: sphinx-autodoc-typehints; extra == "dev"
Requires-Dist: sphinx-gallery; extra == "dev"
Requires-Dist: autovizwidget; extra == "dev"
Requires-Dist: graphviz; extra == "dev"
Requires-Dist: myst-nb; extra == "dev"
Requires-Dist: numpydoc; extra == "dev"
Requires-Dist: sphinx-tabs; extra == "dev"
Requires-Dist: pytest; extra == "dev"
Requires-Dist: pytest-xdist; extra == "dev"
Requires-Dist: pytest-instafail; extra == "dev"
Requires-Dist: pytest-socket; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: coveralls; extra == "dev"
Requires-Dist: flake8; extra == "dev"
Requires-Dist: pylint; extra == "dev"
Requires-Dist: pre-commit; extra == "dev"
Provides-Extra: all
Requires-Dist: numba; extra == "all"
Requires-Dist: matplotlib; extra == "all"
Requires-Dist: scikit-learn; extra == "all"
Requires-Dist: scikit-gstat>=1.0.18; extra == "all"
Requires-Dist: laspy[lazrs]; extra == "all"
Requires-Dist: cerberus; extra == "all"
Requires-Dist: pyyaml; extra == "all"
Requires-Dist: weasyprint; extra == "all"
Requires-Dist: sphinx; extra == "all"
Requires-Dist: sphinx-book-theme; extra == "all"
Requires-Dist: sphinxcontrib-programoutput; extra == "all"
Requires-Dist: sphinx-design; extra == "all"
Requires-Dist: sphinx-autodoc-typehints; extra == "all"
Requires-Dist: sphinx-gallery; extra == "all"
Requires-Dist: autovizwidget; extra == "all"
Requires-Dist: graphviz; extra == "all"
Requires-Dist: myst-nb; extra == "all"
Requires-Dist: numpydoc; extra == "all"
Requires-Dist: sphinx-tabs; extra == "all"
Requires-Dist: pytest; extra == "all"
Requires-Dist: pytest-xdist; extra == "all"
Requires-Dist: pytest-instafail; extra == "all"
Requires-Dist: pytest-socket; extra == "all"
Requires-Dist: pytest-cov; extra == "all"
Requires-Dist: coveralls; extra == "all"
Requires-Dist: flake8; extra == "all"
Requires-Dist: pylint; extra == "all"
Requires-Dist: pre-commit; extra == "all"
Dynamic: download-url
Dynamic: license-file

# xDEM: robust analysis of DEMs in Python.

[![Documentation Status](https://readthedocs.org/projects/xdem/badge/?version=latest)](https://xdem.readthedocs.io/en/latest/?badge=latest)
[![build](https://github.com/GlacioHack/xdem/actions/workflows/python-tests.yml/badge.svg)](https://github.com/GlacioHack/xdem/actions/workflows/python-tests.yml)
[![Conda Version](https://img.shields.io/conda/vn/conda-forge/xdem.svg)](https://anaconda.org/conda-forge/xdem)
[![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/xdem.svg)](https://anaconda.org/conda-forge/xdem)
[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/xdem.svg)](https://anaconda.org/conda-forge/xdem)
[![PyPI version](https://badge.fury.io/py/xdem.svg)](https://badge.fury.io/py/xdem)
[![Coverage Status](https://coveralls.io/repos/github/GlacioHack/xdem/badge.svg?branch=main)](https://coveralls.io/github/GlacioHack/xdem?branch=main)

[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/GlacioHack/xdem/main)
[![Pre-Commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
[![Formatted with black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)
[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)

**xDEM** is an open source project to develop a core Python package for the analysis of digital elevation models (DEMs) and elevation point clouds (EPCs).

It aims at **providing modular and robust tools for the most common analyses needed with elevation data**, including geospatial
operations (vertical referencing), terrain analysis/geomorphometry (e.g., slope, aspect, curvatures, roughness indexes), 3D coregistration, corrections
and uncertainty analysis from a wide range of peer-reviewed studies (see :ref:`methods` below for the full list).

The core manipulation of elevation data is **conveniently centered around `DEM` and `EPC` classes**. Terrain analysis
is implemented in a modular way to support state-of-the art methods (and, notably, re-implements all tools
of [gdalDEM](https://gdal.org/programs/gdaldem.html)). More complex pipelines (e.g., 3D rigid coregistration, bias corrections) are **built around
modular `Coreg` objects that easily interface between themselves**.

Additionally, for raster and point cloud functionalities, xDEM inherits many convenient functionalities from [GeoUtils](https://github.com/GlacioHack/geoutils).
Those include **implicit loading**, **numerical interfacing** and **convenient object-based geospatial methods** to easily perform
the most common higher-level tasks needed by geospatial users (e.g., reprojection, cropping, vector masking). Through [GeoUtils](https://github.com/GlacioHack/geoutils), xDEM
relies on [Rasterio](https://github.com/rasterio/rasterio), [GeoPandas](https://github.com/geopandas/geopandas) and [Pyproj](https://github.com/pyproj4/pyproj) for georeferenced calculations, and on [NumPy](https://github.com/numpy/numpy). It allows easy access to
the functionalities of these packages through interfacing or composition, and quick inter-operability through object conversion.

If you are looking for an accessible Python package to write the Python equivalent of your [GDAL](https://gdal.org/) command lines, or of your
[QGIS](https://www.qgis.org/en/site/) analysis pipeline **without a steep learning curve** on Python GIS syntax, xDEM is perfect for you! For more advanced
users, xDEM also aims at being efficient and scalable by supporting lazy loading and parallel computing (ongoing).

## Documentation

For a quick start, full feature description or search through the API, see xDEM's documentation at: https://xdem.readthedocs.io.

## Installation

### With `mamba`

```bash
mamba install -c conda-forge xdem
```
See [mamba's documentation](https://mamba.readthedocs.io/en/latest/) to install `mamba`, which will solve your environment much faster than `conda`.

### With `pip`

```bash
pip install xdem
```

(methods=)
## Methods implemented in the package

Below is a summary of the methods implemented in xDEM.

- **Terrain attributes**:
  - Partial derivatives (for slope, aspect, curvatures) of [Horn (1981)](http://dx.doi.org/10.1109/PROC.1981.11918) or [Zevenbergen and Thorne (1987)](http://dx.doi.org/10.1002/esp.3290120107) or [Florinsky (2009)](https://doi.org/10.1080/13658810802527499) (default),
  - Slope, aspect and hillshade of either [Horn (1981)](http://dx.doi.org/10.1109/PROC.1981.11918) or [Zevenbergen and Thorne (1987)](http://dx.doi.org/10.1002/esp.3290120107) (default),
  - Profile curvature, either geometric from Krcho (1973) and Evans (1979), or directional from [Zevenbergen and Thorne, 1987](http://dx.doi.org/10.1002/esp.3290120107),
  - Tangential curvature, either geometric from Krcho (1983), or directional from [Zevenbergen and Thorne, 1987](http://dx.doi.org/10.1002/esp.3290120107),
  - Planform curvature, only geometric from Sobolevsky (1932),
  - Flowline curvature, either geometric from [Minár et al. (2020)](https://doi.org/10.1016/j.earscirev.2020.103414), or directional from Shary (1991),
  - Maximal/maximum and minimal/minimum curvature, either geometric from [Shary (1995)](https://doi.org/10.1007/BF02084608), or directional from [Wood (1996)](https://lra.le.ac.uk/handle/2381/34503),
  - Topographic position index of [Weiss (2001)](http://www.jennessent.com/downloads/TPI-poster-TNC_18x22.pdf),
  - Terrain ruggedness index of either [Riley et al. (1999)](http://download.osgeo.org/qgis/doc/reference-docs/Terrain_Ruggedness_Index.pdf) or [Wilson et al. (2007)](http://dx.doi.org/10.1080/01490410701295962),
  - Roughness of [Dartnell (2000)](http://dx.doi.org/10.14358/PERS.70.9.1081),
  - Rugosity of [Jenness (2004)](https://doi.org/10.2193/0091-7648(2004)032[0829:CLSAFD]2.0.CO;2),
  - Fractal roughness of [Taud et Parrot (2005)](https://doi.org/10.4000/geomorphologie.622),
  - Texture shading of [Brown (2010)](https://mountaincartography.icaci.org/activities/workshops/banff_canada/papers/brown.pdf) and [Allmendinger and Karabinos (2023)](https://doi.org/10.1130/GES02531.1),
- **3D coregistration**:
  - Iterative closest point (ICP) of [Besl and McKay (1992)](http://dx.doi.org/10.1109/34.121791) and [Chen and Medioni (1992)](https://doi.org/10.1016/0262-8856(92)90066-C),
  - Least Z-difference (LZD) of [Rosenholm and Torlegård (1988)](https://www.asprs.org/wp-content/uploads/pers/1988journal/oct/1988_oct_1385-1389.pdf),
  - Coherent point drift (CPD) of [Myronenko and Song (2010)](https://doi.org/10.1109/TPAMI.2010.46),
  - Horizontal shift from aspect/slope relationship of [Nuth and Kääb (2011)](https://doi.org/10.5194/tc-5-271-2011),
- **3D bias-correction**:
  - Along-track multi-sinusoidal noise by basin-hopping of [Girod et al. (2017)](https://doi.org/10.3390/rs9070704),
  - Curvature-based correction of [Gardelle et al. (2012)](https://doi.org/10.3189/2012JoG11J175),
  - Elevation-based correction of [Nuth and Kääb (2011)](https://doi.org/10.5194/tc-5-271-2011),
- **Uncertainty analysis**:
  - Heteroscedasticity and multi-range correlations from stable terrain of [Rolstad et al. (2009)](http://dx.doi.org/10.3189/002214309789470950) and [Hugonnet et al. (2022)](https://doi.org/10.1109/JSTARS.2022.3188922),

When using a method implemented in xDEM, please cite both the package and the related study.
For xDEM, use the following DOI: [![Zenodo](https://zenodo.org/badge/doi/10.5281/zenodo.4809697.svg)](https://zenodo.org/doi/10.5281/zenodo.4809697)

## Contributing

We welcome new contributions, and will happily help you integrate your own DEM routines into xDEM!

After discussing a new feature or bug fix in an issue, you can open a PR to xDEM with the following steps:

1. Fork the repository, make a feature branch and push changes.
2. When ready, submit a pull request from the feature branch of your fork to `GlacioHack/xdem:main`.
3. The PR will be reviewed by at least one maintainer, discussed, then merged.

More details on [our contributing page](CONTRIBUTING.md).
