Metadata-Version: 2.4
Name: laserchicken
Version: 0.8.1
Summary: Python toolkit for ALS point clouds.
Author: Christiaan Meijer, Romulo Goncalves, Nicolas Renaud, Bouwe Andela, Yifat Dzigan, Faruk Diblen, Elena Ranguelova, Gijs van den Oord, Meiert W. Grootes, Francesco Nattino, Ou Ku, Zsófia Koma
License-Expression: Apache-2.0
Project-URL: repository, https://github.com/eEcoLiDAR/laserchicken
Project-URL: documentation, https://laserchicken.readthedocs.io
Project-URL: changelog, https://github.com/eEcoLiDAR/laserchicken/blob/master/CHANGELOG.md
Project-URL: doi, https://doi.org/10.5281/zenodo.1219422
Keywords: airborne laser scanning,machine learning,point cloud,digital terrain map
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: laspy[lazrs]
Requires-Dist: scipy>=0.11
Requires-Dist: plyfile
Requires-Dist: python-dateutil
Requires-Dist: PyShp
Requires-Dist: shapely>=2
Requires-Dist: pandas
Requires-Dist: click
Requires-Dist: colorama
Requires-Dist: psutil
Requires-Dist: numpy
Provides-Extra: dev
Requires-Dist: pytest>=6.0; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Provides-Extra: docs
Requires-Dist: sphinx; extra == "docs"
Requires-Dist: sphinxcontrib-bibtex; extra == "docs"
Requires-Dist: docutils; extra == "docs"
Requires-Dist: recommonmark; extra == "docs"
Dynamic: license-file

Please cite the software if you are using it in your scientific publication.
<p align="left">
  <img src="https://raw.githubusercontent.com/eEcoLiDAR/laserchicken/master/laserchicken_logo.png" width="500"/>
</p>

[![Build Status](https://github.com/eEcoLiDAR/laserchicken/workflows/Build/badge.svg)](https://github.com/eEcoLiDAR/laserchicken/actions)
[![Coverage Status](https://coveralls.io/repos/github/eEcoLiDAR/laserchicken/badge.svg)](https://coveralls.io/github/eEcoLiDAR/laserchicken)
[![DOI](https://zenodo.org/badge/95649056.svg)](https://zenodo.org/badge/latestdoi/95649056)
[![Documentation Status](https://readthedocs.org/projects/laserchicken/badge/?version=latest)](https://laserchicken.readthedocs.io/en/latest/)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4524/badge)](https://bestpractices.coreinfrastructure.org/projects/4524)

Toolkit for handling point clouds created using airborne laser scanning (ALS). Find neighboring points in your point cloud and describe them as feature values. Read our [user manual](https://laserchicken.readthedocs.io/) and our (very modest) [tutorial](https://github.com/eEcoLiDAR/laserchicken/blob/master/tutorial.ipynb).

# Installation
Prerequisites:
- Python 3.10 or higher
- pip
```
pip install laserchicken
```

#### Necessary steps for making a new release

* Set new version number in the following files:
  * `laserchicken/__version__.py`
  * `pyproject.toml`
  * `CITATION.cff`
* Create .zenodo.json file from CITATION.cff (using cffconvert)
```cffconvert --validate```
```cffconvert --format zenodo --outfile .zenodo.json```
* Check that documentation uses the correct version
* Edit Changelog (based on commits in https://github.com/eecolidar/laserchicken/compare/v0.3.2...master)
* Test if package can be installed with pip (`pip install .`)
* Create Github release (release to PyPI is implemented via GitHub Actions)
* Check doi on zenodo


## Feature testing

All features were tested for the following general conditions:
- Output consistent point clouds and don't crash with artificial data, real data, all zero data (x, y or z), data without points, data with very low number of neighbors (0, 1, 2)
- Input should not be changed by the feature extractor

The specific features were tested as follows.

*Echo ratio*

A test was written with artificial data to check the correctness of the calculation with manually calculated ratio. Also tested on real data to make sure it doesn't crash, without checking for correctness. We could add a test for correctness with real data but we would need both that data and a verified ground truth.

*Eigenvalues*

Only sanity tests (l1>l2>l3) on real data and corner cases but no actual test for correctness. The code is very simple though and mainly calls numpy.linalg.eig.

*Height statistics (max_z','min_z','mean_z','median_z','std_z','var_z','coeff_var_z','skew_z','kurto_z)*

Tested on real data for correctness. It is however unclear where the ground truths come from. Code is mainly calling numpy methods that do all the work already. Only calculations in our code are:

```
range_z = max_z - min_z
coeff_var_z = np.std(z) / np.mean(z)
```

I don't know about any packages that could provide an out of the box coefficient of variance. This is probably because the calculation is so simple.

*Pulse penetration ratio*

Tested for correctness using artificial data against manually calculated values. No comparison was made with other implementations.

*Sigma_z*

Tested for correctness using artificial data against manually calculated values. No comparison was made with other implementations.

*Percentiles*

Tested for correctness using a simple case with artificial data against manually calculated values.

*point_density*

Tested for correctness on artificial data.
