From 291e5a94c90bf4f4bd2cb4c770ea78a60133417d Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Tue, 16 Jul 2019 13:55:13 +0200 Subject: [PATCH 01/26] CI job 'pages' now also runs for branch 'enhancement/improve_docs'. CI job 'test_enpt_install' only runs for 'master' and 'dev' branch. Signed-off-by: Daniel Scheffler --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index db2efc4..5dcafc3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -91,6 +91,9 @@ test_enpt_install: # test importability - python -c "import enpt; print(enpt)" - python -c "from enpt.model.images import EnMAPL1Product_SensorGeo" + only: + - master + - dev pages: @@ -121,3 +124,4 @@ pages: expire_in: 30 days only: - master + - enhancement/improve_docs -- GitLab From df651dfa7152cb0887d2c62b825f368f5be2e68c Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Tue, 16 Jul 2019 14:17:16 +0200 Subject: [PATCH 02/26] Set Sphinx docs theme to 'sphinx_rtd_theme'. Signed-off-by: Daniel Scheffler --- .gitlab-ci.yml | 1 + AUTHORS.rst | 2 +- docs/conf.py | 17 +++++++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5dcafc3..aa43f14 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,6 +29,7 @@ test_enpt: # run nosetests - make nosetests # test are called here # create the docs + - pip install sphinx_rtd_theme # Read-the-docs theme for SPHINX documentation - make docs artifacts: paths: diff --git a/AUTHORS.rst b/AUTHORS.rst index eebf492..a115a26 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -12,5 +12,5 @@ Contributors * Daniel Scheffler * André Hollstein -* Stephane Guillaso +* Stéphane Guillaso * Niklas Bohn diff --git a/docs/conf.py b/docs/conf.py index 07201b6..b3a85eb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,12 +40,19 @@ import enpt # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.todo', 'sphinxarg.ext'] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.githubpages', + 'sphinx.ext.viewcode', + 'sphinx.ext.todo', + 'sphinxarg.ext' +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. +# source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The encoding of source files. @@ -56,7 +63,7 @@ master_doc = 'index' # General information about the project. project = u'EnPT' -copyright = u"2017, Karl Segl" +copyright = u"2019, Karl Segl, Daniel Scheffler, André Hollstein, Stéphane Guillaso, Niklas Bohn" # The version info for the project you're documenting, acts as replacement # for |version| and |release|, also used in various other places throughout @@ -79,7 +86,8 @@ release = enpt.__version__ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build'] +# This pattern also affects html_static_path and html_extra_path . +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -111,7 +119,8 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +# html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # The one installed via pip install sphinx_rtd_theme in the .gitlab.yml # Theme options are theme-specific and customize the look and feel of a # theme further. For a list of options available for each theme, see the -- GitLab From def1e0350cede4299185c61f0b86348f44367f67 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Tue, 16 Jul 2019 15:19:18 +0200 Subject: [PATCH 03/26] Added the EnPT logo to the documentation main page. Added some theme options. Signed-off-by: Daniel Scheffler --- docs/Makefile | 1 + docs/conf.py | 18 ++++++++++++++++-- docs/img/EnPT_Logo.png | Bin 0 -> 13304 bytes docs/img/EnPT_Logo_transparent.png | Bin 0 -> 6665 bytes docs/index.rst | 6 ++---- 5 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 docs/img/EnPT_Logo.png create mode 100644 docs/img/EnPT_Logo_transparent.png diff --git a/docs/Makefile b/docs/Makefile index 73d556f..9dd1bba 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -21,6 +21,7 @@ I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext +# Put it first so that "make" without argument is like "make help". help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" diff --git a/docs/conf.py b/docs/conf.py index b3a85eb..d241815 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -125,7 +125,21 @@ html_theme = 'sphinx_rtd_theme' # The one installed via pip install sphinx_rtd_ # Theme options are theme-specific and customize the look and feel of a # theme further. For a list of options available for each theme, see the # documentation. -# html_theme_options = {} +html_theme_options = { + 'canonical_url': '', + 'analytics_id': '', + 'logo_only': False, + 'display_version': True, + 'prev_next_buttons_location': 'bottom', + 'style_external_links': False, + 'vcs_pageview_mode': 'view', + # Toc options + 'collapse_navigation': True, + 'sticky_navigation': True, + 'navigation_depth': 4, + 'includehidden': True, + 'titles_only': False +} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] @@ -140,7 +154,7 @@ html_theme = 'sphinx_rtd_theme' # The one installed via pip install sphinx_rtd_ # The name of an image file (relative to this directory) to place at the # top of the sidebar. -# html_logo = None +html_logo = 'img/EnPT_Logo_transparent.png' # The name of an image file (within the static path) to use as favicon # of the docs. This file should be a Windows icon file (.ico) being diff --git a/docs/img/EnPT_Logo.png b/docs/img/EnPT_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f45a41cadaaadb085c8d755260885edaf4f95140 GIT binary patch literal 13304 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 V^?Bx{#)V={1=7~ns?e~B{11LM)r9~6 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 69597fa..f5e0c27 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,5 @@ -.. image:: img/logo3.jpeg - -Welcome to EnPT's documentation! -====================================== +EnPT documentation +================== Contents: -- GitLab From 9cccfea69906a43396d170a852f3af452b9e6d48 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Tue, 16 Jul 2019 16:23:13 +0200 Subject: [PATCH 04/26] Updated README.rst file. Signed-off-by: Daniel Scheffler --- README.rst | 20 ++++++++++++++++---- docs/index.rst | 2 +- docs/modules.rst | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index af62e82..c9da1c0 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,9 @@ EnPT - EnMAP Processing Tools ============================= -* Project Description (TODO) +The EnPT Python package is an automated pre-processing pipeline for the new EnMAP hyperspectral satellite data. +It provides free and open-source features to transform EnMAP Level-1B data to Level-2A. The package has been developed +at the German Research Centre for Geosciences Potsdam (GFZ) as an alternative to the original DLR processing chain. Please check the documentation_ for usage and in depth information. @@ -13,7 +15,14 @@ Free software: GNU General Public License v3 Features -------- -* TODO +* read EnMAP Level-1B input data +* dead pixel correction +* import of an overlapping digital elevation model +* radiometric conversion to top-of-atmosphere radiance +* atmospheric correction (based on SICOR_) +* detection and correction of geometric misregistrations compared to user provided spatial reference (based on AROSICS_) +* orthorectification +* write EnMAP Level-2 output data Status ------ @@ -27,7 +36,8 @@ See also the latest coverage_ report and the nosetests_ HTML report. Credits ------- -This software was funded from BMBF under EnMAP ... +The development of the gms_preprocessing package was funded by the German Federal Ministry of Education and Research +(BMBF). This package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template. @@ -35,4 +45,6 @@ This package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypack .. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage .. _documentation: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/ .. _coverage: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/coverage/ -.. _nosetests: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/nosetests_reports/nosetests.html \ No newline at end of file +.. _nosetests: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/nosetests_reports/nosetests.html +.. _SICOR: https://gitext.gfz-potsdam.de/EnMAP/sicor +.. _AROSICS: https://gitext.gfz-potsdam.de/danschef/arosics \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index f5e0c27..4afbe28 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,7 +2,7 @@ EnPT documentation ================== -Contents: +**This documentation is structured as follows:** .. toctree:: :maxdepth: 2 diff --git a/docs/modules.rst b/docs/modules.rst index 2e7e368..6b65786 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -4,4 +4,4 @@ enpt .. toctree:: :maxdepth: 4 - enpt + API Reference -- GitLab From a7bdc8b14fac3362d5da1fa5a5d646c6911c37f3 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Tue, 16 Jul 2019 17:51:21 +0200 Subject: [PATCH 05/26] Fix. Signed-off-by: Daniel Scheffler --- docs/modules.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/modules.rst b/docs/modules.rst index 6b65786..6a09fac 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -1,7 +1,7 @@ -enpt -==== +API Reference +============= .. toctree:: :maxdepth: 4 - API Reference + enpt -- GitLab From ef8a8e9967dfdab63baae80e76995a71d094d1f9 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Wed, 17 Jul 2019 12:04:28 +0200 Subject: [PATCH 06/26] Updated installation.rst file. Signed-off-by: Daniel Scheffler --- docs/installation.rst | 67 +++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 1164669..283c3c8 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -4,48 +4,53 @@ Installation ============ +EnPT depends on some open source packages which are usually installed without problems by the automatic install +routine. However, for some projects, we strongly recommend resolving the dependency before the automatic installer +is run. This approach avoids problems with conflicting versions of the same software. +Using conda_, the recommended approach is: -Stable release --------------- - -To install EnPT, run this command in your terminal: +.. _conda: https://conda.io/docs/ .. code-block:: console - $ pip install enpt + # create virtual environment for enpt, this is optional but recommended + conda create --name enpt python=3 + source activate enpt -This is the preferred method to install EnPT, as it will always install the most recent stable release. + # clone the source code of enpt + git clone https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT.git + cd EnPT -If you don't have `pip`_ installed, this `Python installation guide`_ can guide -you through the process. + # install some enpt dependencies that may cause trouble when installed via pip + conda install -c conda-forge scipy -.. _pip: https://pip.pypa.io -.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ + # install not pip-installable deps of geoarray + conda install -c conda-forge numpy scikit-image matplotlib pandas gdal rasterio pyproj basemap shapely + conda install -c conda-forge 'icu=58.*' + # install py_tools_ds + conda install -c conda-forge pyresample + pip install 'py_tools_ds>=0.14.14' -From sources ------------- + # install sicor + conda install -c conda-forge pygrib h5py pytables pyfftw numba llvmlite scikit-learn + rm -rf context/sicor + git clone https://gitext.gfz-potsdam.de/EnMAP/sicor.git ./context/sicor + cd ./context/sicor + make install + cd ../../ -The sources for EnPT can be downloaded from the `Github repo`_. + # install enpt + make install + cd .. + pwd + ls -You can either clone the public repository: -.. code-block:: console - - $ git clone git://github.com/audreyr/enpt - -Or download the `tarball`_: - -.. code-block:: console - - $ curl -OL https://github.com/audreyr/enpt/tarball/master - -Once you have a copy of the source, you can install it with: - -.. code-block:: console - - $ python setup.py install +This is the preferred method to install EnPT, as it will always install the most recent stable release. +If you don't have `pip`_ installed, this `Python installation guide`_ can guide +you through the process. -.. _Github repo: https://github.com/audreyr/enpt -.. _tarball: https://github.com/audreyr/enpt/tarball/master +.. _pip: https://pip.pypa.io +.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ -- GitLab From bf2d6dfb3cf9586c3b26c27be508620332c63992 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Wed, 17 Jul 2019 13:25:32 +0200 Subject: [PATCH 07/26] Added empty algorithm description file. Signed-off-by: Daniel Scheffler --- docs/algorithm_descriptions.rst | 45 +++++++++++++++++++++++++++++++++ docs/index.rst | 1 + docs/usage.rst | 6 +++++ 3 files changed, 52 insertions(+) create mode 100644 docs/algorithm_descriptions.rst diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst new file mode 100644 index 0000000..fb0ca0a --- /dev/null +++ b/docs/algorithm_descriptions.rst @@ -0,0 +1,45 @@ +Algorithm descriptions +====================== + +EnMAP Level 1B data reader +************************** + +The EnPT reader module allows you to read in EnMAP Level-1B data in the official format as provided by the DLR. + +TBD - format compatibility, TOA radiance + +Dead pixel correction +********************* + +TBD + +Dead pixel correction +********************* + +TBD + +Import of an overlapping digital elevation model +************************************************ + +TBD + +Atmospheric correction +********************** + +TBD + +Spatial Co-Registration +*********************** + +TBD + + +Orthorectification +****************** + +TBD + +EnMAP Level 2A data writer +************************** + +TBD diff --git a/docs/index.rst b/docs/index.rst index 4afbe28..3ebce94 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,6 +11,7 @@ EnPT documentation installation usage modules + algorithm_descriptions.rst contributing development authors diff --git a/docs/usage.rst b/docs/usage.rst index 0fe9b4d..8ae3c0b 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -1,10 +1,16 @@ Usage ===== +Usage of the Python API +*********************** + To use EnPT in a project:: import enpt +Further documentation will come soon. + + Command line utilities ********************** -- GitLab From b796c1fe599bb5ca220f5b4047c2847b53285053 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Wed, 17 Jul 2019 17:05:20 +0200 Subject: [PATCH 08/26] Added some first algorithm descriptions. Signed-off-by: Daniel Scheffler --- docs/algorithm_descriptions.rst | 131 ++++++++++++++++-- .../dead_pixel_correction.py | 12 ++ 2 files changed, 133 insertions(+), 10 deletions(-) diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index fb0ca0a..870d6d1 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -5,18 +5,67 @@ EnMAP Level 1B data reader ************************** The EnPT reader module allows you to read in EnMAP Level-1B data in the official format as provided by the DLR. +After extraction EnPT expects a folder with the following files: + + +-----------------------------------------------+-----------------+ + | Filename | Description | + +===============================================+=================+ + |ENMAP*L1B*-HISTORY.XML | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-LOG.XML | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-METADATA.XML | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_PIXELMASK_SWIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_PIXELMASK_VNIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_CIRRUS.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_CLASSES.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_CLOUD.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_CLOUDSHADOW.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_HAZE.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_SNOW.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_TESTFLAGS_SWIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_QUALITY_TESTFLAGS_VNIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_SWIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-QL_VNIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-SPECTRAL_IMAGE_SWIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + |ENMAP*L1B*-SPECTRAL_IMAGE_VNIR.GEOTIFF | | + +-----------------------------------------------+-----------------+ + +EnPT reads the raster files lazily / on-demand to save memory during execution. Metadata read from the +`ENMAP*-METADATA.XML` file are stored in memory and used at multiple stages of the pre-processing pipeline. + +The image data is directly transformed from digital numbers (DNs, as provided by the DLR) to top-of-atmosphere radiance +in mW/m2/sr/nm. -TBD - format compatibility, TOA radiance Dead pixel correction ********************* -TBD - -Dead pixel correction -********************* +The EnPT dead pixel correction uses the pixel masks provided by DLR and interpolates the EnMAP image data at +the indicated dead pixel positions. It supports two interpolation algorithms: -TBD + 1. spectral interpolation + * Interpolates the data in the spectral domain. + * Points outside the data range are extrapolated. + * possible interpolation methods: `linear`, `nearest`, `zero`, `slinear`, `quadratic`, `cubic`, etc. + 2. spatial interpolation + * Interpolates the data spatially. + * Remaining missing data positions (e.g., outermost columns) are spectrally interpolated. + * possible interpolation methods: `linear`, `bilinear`, `cubic`, `spline` Import of an overlapping digital elevation model ************************************************ @@ -26,20 +75,82 @@ TBD Atmospheric correction ********************** -TBD +EnPT uses `SICOR`_ (Sensor Independent Atmosperic Correction of optical Earth observation data from multi- and +hyperspectral instruments) for atmospheric correction. SICOR is a Python based open-source package developed at the +German Research Centre for Geosciences (GFZ) Potsdam. For details on the underlying algorithm, please refer to the +`documentation pages of SICOR`_. + +.. _SICOR: https://gitext.gfz-potsdam.de/EnMAP/sicor +.. _`documentation pages of SICOR`: http://enmap.gitext.gfz-potsdam.de/sicor/doc/ + + Spatial Co-Registration *********************** -TBD +For the detection of spatial misregistrations with regard to a user-provided spatial reference EnPT builds on the +open-source Python package `AROSICS`_ (An Automated and Robust Open-Source Image Co-Registration Software for +Multi-Sensor Satellite Data). It has been developed at the German Research Centre for Geosciences (GFZ) Potsdam. +For detailed algorithm description and use cases refer to the corresponding (open-access) paper that can be found here: +`Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`_. + +In EnPT, AROSICS is used to automacially compute thousands of tie points between a selected EnMAP band the +user-provided reference image. + +.. _AROSICS: https://gitext.gfz-potsdam.de/danschef/arosics +.. _`Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`: http://www.mdpi.com/2072-4292/9/7/676 Orthorectification ****************** -TBD +EnMAP Level 1B data are provided in sensor geometry, i.e., the image data don't have map coordinates but only image +coordinates. For the geo-rectification of the data EnPT uses a set of Rational Polynomial Coefficients (RPCs) provided +for each band of the two EnMAP subsystems (VNIR and SWIR). Together with a user provided digital elevation model these +RPC coefficients enable a highly accurate assignment of map coordinates to each pixel of the EnMAP Level-1B images. +Resampling is done using a fast KDTree gaussian weighting neighbour approach implemented in the Python library +`pyresample`_. The spatial shifts computed during the co-registration step are respected here. + +In this processing step, the EnMAP VNIR is merged with the SWIR subsystem and from now on stored in a single 3D array. + +.. _pyresample: https://pyresample.readthedocs.io/en/latest/ EnMAP Level 2A data writer ************************** -TBD +The EnPT writer module writes the computed EnMAP Level-2A data to disk after finishing the processing pipeline. The +data format produced by EnPT is based on the official DLR Level-2A format. However, due to differences in the +underlying algorithms, EnPT also produces a slightly different Level-2A data format. The differences are summarized +below: + + +-----------------------------------------------+-----+---------+-------------+ + | Filename | DLR | EnPT | Description | + +===============================================+=====+=========+=============+ + |ENMAP*L2A*-HISTORY.XML | yes | planned | | + +-----------------------------------------------+-----+---------+-------------+ + |ENMAP*L2A*-LOG.XML | yes | planned | | + +-----------------------------------------------+-----+---------+-------------+ + |ENMAP*L2A*-METADATA.XML | yes | yes | | + +-----------------------------------------------+-----+---------+-------------+ + |ENMAP*L2A*-QL_PIXELMASK_SWIR.GEOTIFF | yes | planned | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_PIXELMASK_VNIR.GEOTIFF | yes | planned | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_QUALITY_CIRRUS.GEOTIFF | yes | planned | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_QUALITY_CLASSES.GEOTIFF | yes | planned | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_QUALITY_CLOUD.GEOTIFF | yes | yes | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_QUALITY_CLOUDSHADOW.GEOTIFF | yes | planned | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_QUALITY_HAZE.GEOTIFF | yes | planned | | + +-----------------------------------------------+---------------+-------------+ + |ENMAP*L2A*-QL_QUALITY_SNOW.GEOTIFF | yes | planned | | + +-----------------------------------------------+-----+---------+-------------+ + |ENMAP*L2A*-QL_SWIR.GEOTIFF | yes | yes | | + +-----------------------------------------------+-----+---------+-------------+ + |ENMAP*L2A*-QL_VNIR.GEOTIFF | yes | yes | | + +-----------------------------------------------+-----+---------+-------------+ + |ENMAP*L2A*-SPECTRAL_IMAGE.GEOTIFF | yes | yes | | + +-----------------------------------------------+-----+---------+-------------+ diff --git a/enpt/processors/dead_pixel_correction/dead_pixel_correction.py b/enpt/processors/dead_pixel_correction/dead_pixel_correction.py index 3dae816..b584861 100644 --- a/enpt/processors/dead_pixel_correction/dead_pixel_correction.py +++ b/enpt/processors/dead_pixel_correction/dead_pixel_correction.py @@ -16,6 +16,18 @@ from geoarray import GeoArray class Dead_Pixel_Corrector(object): + """ + The EnPT dead pixel correction uses the pixel masks provided by DLR and interpolates the EnMAP image + data at the indicated dead pixel positions. It supports two interpolation algorithms: + + 1. spectral interpolation + * Interpolates the data in the spectral domain. + * Points outside the data range are extrapolated. + 2. spatial interpolation + * Interpolates the data spatially. + * Remaining missing data positions (e.g., outermost columns) are spectrally interpolated. + """ + def __init__(self, algorithm: str = 'spectral', interp_spectral: str = 'linear', interp_spatial: str = 'linear', CPUs: int = None, logger: logging.Logger = None): """Get an instance of Dead_Pixel_Corrector. -- GitLab From 73bee01856f74e1c64676dea5b9a1a59425fe1d4 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Wed, 17 Jul 2019 18:08:29 +0200 Subject: [PATCH 09/26] Some fixes. Signed-off-by: Daniel Scheffler --- docs/algorithm_descriptions.rst | 22 ++++++++++++---------- docs/{ => api}/modules.rst | 0 docs/index.rst | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) rename docs/{ => api}/modules.rst (100%) diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index 870d6d1..c1c7382 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -95,7 +95,7 @@ For detailed algorithm description and use cases refer to the corresponding (ope `Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`_. In EnPT, AROSICS is used to automacially compute thousands of tie points between a selected EnMAP band the -user-provided reference image. +user-provided reference image. The computed shifts are later respected in the orthorectification step. .. _AROSICS: https://gitext.gfz-potsdam.de/danschef/arosics .. _`Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`: http://www.mdpi.com/2072-4292/9/7/676 @@ -109,11 +109,13 @@ coordinates. For the geo-rectification of the data EnPT uses a set of Rational P for each band of the two EnMAP subsystems (VNIR and SWIR). Together with a user provided digital elevation model these RPC coefficients enable a highly accurate assignment of map coordinates to each pixel of the EnMAP Level-1B images. Resampling is done using a fast KDTree gaussian weighting neighbour approach implemented in the Python library -`pyresample`_. The spatial shifts computed during the co-registration step are respected here. +`pyresample`_ (`find the documentation here`_). The spatial shifts computed during the co-registration step are +respected here. In this processing step, the EnMAP VNIR is merged with the SWIR subsystem and from now on stored in a single 3D array. -.. _pyresample: https://pyresample.readthedocs.io/en/latest/ +.. _pyresample: https://github.com/pytroll/pyresample +.. _find the documentation here: https://pyresample.readthedocs.io/en/latest/ EnMAP Level 2A data writer ************************** @@ -133,19 +135,19 @@ below: |ENMAP*L2A*-METADATA.XML | yes | yes | | +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_PIXELMASK_SWIR.GEOTIFF | yes | planned | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_PIXELMASK_VNIR.GEOTIFF | yes | planned | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_QUALITY_CIRRUS.GEOTIFF | yes | planned | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_QUALITY_CLASSES.GEOTIFF | yes | planned | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_QUALITY_CLOUD.GEOTIFF | yes | yes | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_QUALITY_CLOUDSHADOW.GEOTIFF | yes | planned | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_QUALITY_HAZE.GEOTIFF | yes | planned | | - +-----------------------------------------------+---------------+-------------+ + +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_QUALITY_SNOW.GEOTIFF | yes | planned | | +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-QL_SWIR.GEOTIFF | yes | yes | | diff --git a/docs/modules.rst b/docs/api/modules.rst similarity index 100% rename from docs/modules.rst rename to docs/api/modules.rst diff --git a/docs/index.rst b/docs/index.rst index 3ebce94..694a757 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,7 +10,7 @@ EnPT documentation readme installation usage - modules + api/modules.rst algorithm_descriptions.rst contributing development -- GitLab From e37818a060f7d498a24d178b8deba38b0e67da25 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Wed, 17 Jul 2019 18:25:26 +0200 Subject: [PATCH 10/26] Added a section on the QGIS GUI in usage.rst. Signed-off-by: Daniel Scheffler --- .../screenshot_enpt_enmapboxapp_874x1047.png | Bin 0 -> 144213 bytes docs/usage.rst | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 docs/img/screenshot_enpt_enmapboxapp_874x1047.png diff --git a/docs/img/screenshot_enpt_enmapboxapp_874x1047.png b/docs/img/screenshot_enpt_enmapboxapp_874x1047.png new file mode 100644 index 0000000000000000000000000000000000000000..07885e6bebb00ac6c5920d5e9857817aceadda75 GIT binary patch literal 144213 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 literal 0 HcmV?d00001 diff --git a/docs/usage.rst b/docs/usage.rst index 8ae3c0b..3b26f59 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -23,3 +23,16 @@ At the command line, EnPT provides the **enpt_cli.py** command: :filename: ./../bin/enpt_cli.py :func: get_enpt_argparser :prog: enpt_cli.py + + +QGIS GUI +******** + +There is a separate graphical user interface (GUI) for EnPT than can be installed as an EnMAP-Box application in QGIS. +To install it in QGIS, please refer to the separate repository enpt_enmapboxapp_. + +Here is screenshot of the current version: + +.. image:: img/screenshot_enpt_enmapboxapp_874x1047.png + +.. _enpt_enmapboxapp: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/enpt_enmapboxapp \ No newline at end of file -- GitLab From f269bc38a0f106c8ab64b9826ea418dd1688e9c8 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 13:33:43 +0200 Subject: [PATCH 11/26] Fixed issue of missing API reference. Signed-off-by: Daniel Scheffler --- Makefile | 6 +++--- README.rst | 7 +++++-- docs/api/modules.rst | 7 ------- docs/img/EnPT_Logo_clipped.png | Bin 0 -> 4068 bytes docs/index.rst | 2 +- 5 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 docs/api/modules.rst create mode 100644 docs/img/EnPT_Logo_clipped.png diff --git a/Makefile b/Makefile index 0ec2a7c..8dcce2d 100644 --- a/Makefile +++ b/Makefile @@ -80,9 +80,9 @@ nosetests: clean-test ## Runs nosetests with coverage, xUnit and nose-html-outpu docs: ## generate Sphinx HTML documentation, including API docs rm -f docs/enpt.rst rm -f docs/modules.rst - sphinx-apidoc -o docs/ enpt --private - $(MAKE) -C docs clean - $(MAKE) -C docs html + sphinx-apidoc enpt -o docs/ --private --doc-project 'API Reference' + $(MAKE) -C docs clean + $(MAKE) -C docs html #$(MAKE) -C docs latex #$(MAKE) -C docs latexpdf #$(BROWSER) docs/_build/html/index.html diff --git a/README.rst b/README.rst index c9da1c0..78b0726 100644 --- a/README.rst +++ b/README.rst @@ -1,3 +1,5 @@ +.. image:: docs/img/EnPT_Logo_clipped.png + ============================= EnPT - EnMAP Processing Tools ============================= @@ -27,8 +29,9 @@ Features Status ------ -.. figure:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/build.svg -.. figure:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/coverage.svg +|badge1| |badge2| +.. |badge1| figure:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/build.svg +.. |badge2| figure:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/coverage.svg See also the latest coverage_ report and the nosetests_ HTML report. diff --git a/docs/api/modules.rst b/docs/api/modules.rst deleted file mode 100644 index 6a09fac..0000000 --- a/docs/api/modules.rst +++ /dev/null @@ -1,7 +0,0 @@ -API Reference -============= - -.. toctree:: - :maxdepth: 4 - - enpt diff --git a/docs/img/EnPT_Logo_clipped.png b/docs/img/EnPT_Logo_clipped.png new file mode 100644 index 0000000000000000000000000000000000000000..494d0ae892712ac6b63e51eab6968dd7b95cc5d4 GIT binary patch literal 4068 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 W!d$oC|E?SW0000 Date: Thu, 18 Jul 2019 14:04:30 +0200 Subject: [PATCH 12/26] Revised badges. Signed-off-by: Daniel Scheffler --- README.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 78b0726..dbf7aa4 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,5 @@ .. image:: docs/img/EnPT_Logo_clipped.png + :scale: 60 % ============================= EnPT - EnMAP Processing Tools @@ -30,8 +31,10 @@ Status ------ |badge1| |badge2| -.. |badge1| figure:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/build.svg -.. |badge2| figure:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/coverage.svg + +.. |badge1| image:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/build.svg + +.. |badge2| image:: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/badges/master/coverage.svg See also the latest coverage_ report and the nosetests_ HTML report. -- GitLab From ca1489707b38c1771d8c9776d93097dbeff142ee Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 14:16:44 +0200 Subject: [PATCH 13/26] Fixed EnPT logo scaling. Signed-off-by: Daniel Scheffler --- README.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index dbf7aa4..96711ea 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,6 @@ .. image:: docs/img/EnPT_Logo_clipped.png - :scale: 60 % + :width: 180 + :alt: EnPT Logo ============================= EnPT - EnMAP Processing Tools @@ -9,7 +10,7 @@ The EnPT Python package is an automated pre-processing pipeline for the new EnMA It provides free and open-source features to transform EnMAP Level-1B data to Level-2A. The package has been developed at the German Research Centre for Geosciences Potsdam (GFZ) as an alternative to the original DLR processing chain. -Please check the documentation_ for usage and in depth information. +Please check the **documentation_** for usage and in depth information. License ------- -- GitLab From 904f9b2427329887a20236eeed26c280f1209dbd Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 14:28:17 +0200 Subject: [PATCH 14/26] Added about.rst Signed-off-by: Daniel Scheffler --- README.rst | 4 ++-- docs/about.rst | 23 +++++++++++++++++++++++ docs/index.rst | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 docs/about.rst diff --git a/README.rst b/README.rst index 96711ea..af2e275 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ .. image:: docs/img/EnPT_Logo_clipped.png - :width: 180 + :width: 180px :alt: EnPT Logo ============================= @@ -10,7 +10,7 @@ The EnPT Python package is an automated pre-processing pipeline for the new EnMA It provides free and open-source features to transform EnMAP Level-1B data to Level-2A. The package has been developed at the German Research Centre for Geosciences Potsdam (GFZ) as an alternative to the original DLR processing chain. -Please check the **documentation_** for usage and in depth information. +Please check the documentation_ for usage and in depth information. License ------- diff --git a/docs/about.rst b/docs/about.rst new file mode 100644 index 0000000..eb94d5c --- /dev/null +++ b/docs/about.rst @@ -0,0 +1,23 @@ +===== +About +===== + +.. image:: img/EnPT_Logo_clipped.png + :width: 150px + :alt: EnPT Logo + +The EnPT Python package is an automated pre-processing pipeline for the new EnMAP hyperspectral satellite data. +It provides free and open-source features to transform EnMAP Level-1B data to Level-2A. The package has been developed +at the German Research Centre for Geosciences Potsdam (GFZ) as an alternative to the original DLR processing chain. + +Features +-------- + +* read EnMAP Level-1B input data +* dead pixel correction +* import of an overlapping digital elevation model +* radiometric conversion to top-of-atmosphere radiance +* atmospheric correction (based on SICOR_) +* detection and correction of geometric misregistrations compared to user provided spatial reference (based on AROSICS_) +* orthorectification +* write EnMAP Level-2 output data diff --git a/docs/index.rst b/docs/index.rst index db47d3e..0bc36ef 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,7 +7,7 @@ EnPT documentation .. toctree:: :maxdepth: 2 - readme + about installation usage algorithm_descriptions.rst -- GitLab From 9c6be1290111c83f0809711b35aeac57adca14e2 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 14:28:46 +0200 Subject: [PATCH 15/26] Updated copyright year. Signed-off-by: Daniel Scheffler --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 7ba6892..0053c3a 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 EnMAP PT - Copyright (C) 2017 Karl Segl + Copyright (C) 2019 Karl Segl This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -- GitLab From 79b3c0d9e1e2a2d64dba25f49d13208b1c0f8aaf Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 14:30:19 +0200 Subject: [PATCH 16/26] Resized logo. Signed-off-by: Daniel Scheffler --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index af2e275..0f1c919 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ .. image:: docs/img/EnPT_Logo_clipped.png - :width: 180px + :width: 100px :alt: EnPT Logo ============================= -- GitLab From e0f8aa3b262b27c7eb53ccb974af115ddbfef2f4 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 15:29:07 +0200 Subject: [PATCH 17/26] Some documentation improvements. Signed-off-by: Daniel Scheffler --- README.rst | 3 ++- docs/about.rst | 3 +++ docs/algorithm_descriptions.rst | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 0f1c919..6cc9acc 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,6 @@ + .. image:: docs/img/EnPT_Logo_clipped.png - :width: 100px + :width: 150px :alt: EnPT Logo ============================= diff --git a/docs/about.rst b/docs/about.rst index eb94d5c..e9dc4f4 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -21,3 +21,6 @@ Features * detection and correction of geometric misregistrations compared to user provided spatial reference (based on AROSICS_) * orthorectification * write EnMAP Level-2 output data + +.. _SICOR: https://gitext.gfz-potsdam.de/EnMAP/sicor +.. _AROSICS: https://gitext.gfz-potsdam.de/danschef/arosics diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index c1c7382..8c926d4 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -48,9 +48,18 @@ After extraction EnPT expects a folder with the following files: EnPT reads the raster files lazily / on-demand to save memory during execution. Metadata read from the `ENMAP*-METADATA.XML` file are stored in memory and used at multiple stages of the pre-processing pipeline. +**Conversion to top-of-atmosphere radiance** + The image data is directly transformed from digital numbers (DNs, as provided by the DLR) to top-of-atmosphere radiance in mW/m2/sr/nm. +**Filling the gap between adjacent EnMAP images** + +There is a gap of 20 pixels between adjacent EnMAP Level-1B images provided by the DLR. To fill this gap, EnPT offers +the opportunity to provide the neighboring image which is then appended to the actual EnMAP image to be processed. + + + Dead pixel correction ********************* @@ -75,6 +84,10 @@ TBD Atmospheric correction ********************** +.. image:: https://gitext.gfz-potsdam.de/EnMAP/sicor/blob/master/docs/figs/sicor_logo_lr.png + :width: 150px + :alt: SICOR Logo + EnPT uses `SICOR`_ (Sensor Independent Atmosperic Correction of optical Earth observation data from multi- and hyperspectral instruments) for atmospheric correction. SICOR is a Python based open-source package developed at the German Research Centre for Geosciences (GFZ) Potsdam. For details on the underlying algorithm, please refer to the @@ -88,6 +101,10 @@ German Research Centre for Geosciences (GFZ) Potsdam. For details on the underly Spatial Co-Registration *********************** +.. image:: https://gitext.gfz-potsdam.de/danschef/arosics/blob/master/docs/images/arosics_logo.png + :width: 150px + :alt: AROSICS Logo + For the detection of spatial misregistrations with regard to a user-provided spatial reference EnPT builds on the open-source Python package `AROSICS`_ (An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data). It has been developed at the German Research Centre for Geosciences (GFZ) Potsdam. -- GitLab From 36d59da74dd765ceea80a08c9c7fc4592c786edf Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 16:20:29 +0200 Subject: [PATCH 18/26] Replaced logo links. Signed-off-by: Daniel Scheffler --- docs/algorithm_descriptions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index 8c926d4..eb93b04 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -84,7 +84,7 @@ TBD Atmospheric correction ********************** -.. image:: https://gitext.gfz-potsdam.de/EnMAP/sicor/blob/master/docs/figs/sicor_logo_lr.png +.. image:: https://gitext.gfz-potsdam.de/EnMAP/sicor/raw/master/docs/figs/sicor_logo_lr.png :width: 150px :alt: SICOR Logo @@ -101,7 +101,7 @@ German Research Centre for Geosciences (GFZ) Potsdam. For details on the underly Spatial Co-Registration *********************** -.. image:: https://gitext.gfz-potsdam.de/danschef/arosics/blob/master/docs/images/arosics_logo.png +.. image:: https://gitext.gfz-potsdam.de/danschef/arosics/raw/master/docs/images/arosics_logo.png :width: 150px :alt: AROSICS Logo -- GitLab From 3b0ab63dd6c35eb38250ae2290dd04681c70eb80 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 18:56:56 +0200 Subject: [PATCH 19/26] Added usage example for starting the EnPT controller. EnPT_Config class is now properly documented. Signed-off-by: Daniel Scheffler --- docs/algorithm_descriptions.rst | 4 +- docs/usage.rst | 16 ++++-- enpt/options/config.py | 88 ++++++++++++++++++++++++++++++++- 3 files changed, 101 insertions(+), 7 deletions(-) diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index eb93b04..ed75f10 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -126,13 +126,13 @@ coordinates. For the geo-rectification of the data EnPT uses a set of Rational P for each band of the two EnMAP subsystems (VNIR and SWIR). Together with a user provided digital elevation model these RPC coefficients enable a highly accurate assignment of map coordinates to each pixel of the EnMAP Level-1B images. Resampling is done using a fast KDTree gaussian weighting neighbour approach implemented in the Python library -`pyresample`_ (`find the documentation here`_). The spatial shifts computed during the co-registration step are +`pyresample`_ (find the `documentation here`_). The spatial shifts computed during the co-registration step are respected here. In this processing step, the EnMAP VNIR is merged with the SWIR subsystem and from now on stored in a single 3D array. .. _pyresample: https://github.com/pytroll/pyresample -.. _find the documentation here: https://pyresample.readthedocs.io/en/latest/ +.. _documentation here: https://pyresample.readthedocs.io/en/latest/ EnMAP Level 2A data writer ************************** diff --git a/docs/usage.rst b/docs/usage.rst index 3b26f59..bf3cf84 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -4,11 +4,21 @@ Usage Usage of the Python API *********************** -To use EnPT in a project:: +To start run whole EnPT processing pipeline via the Python API:: - import enpt + from enpt.execution.controller import EnPT_Controller -Further documentation will come soon. + config_minimal = dict( + path_l1b_enmap_image='/path/ENMAP*L1B*.zip', + path_dem='/path/to/overlapping/DEM.bsq' + ) + CTR = EnPT_Controller(**config_minimal) + CTR.run_all_processors() + +Further configuration parameters are here_. Note that the class 'EnPT_Config' takes the same keyword arguments like the +'EnPT_Controller' class. + +.. _here: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.options.html#enpt.options.config.EnPTConfig Command line utilities diff --git a/enpt/options/config.py b/enpt/options/config.py index 14f0f8f..923825f 100644 --- a/enpt/options/config.py +++ b/enpt/options/config.py @@ -80,8 +80,92 @@ class EnPTConfig(object): def __init__(self, json_config='', **user_opts): """Create a job configuration. - :param json_config path to JSON file containing configuration parameters or a string in JSON format - :param user_opts keyword arguments + :arg json_config: + path to JSON file containing configuration parameters or a string in JSON format + + :key CPUs: + number of CPU cores to be used for processing (default: "None" -> use all available + + :key path_l1b_enmap_image: + input path of the EnMAP L1B image to be processed + (zip-archive or root directory; must be given if not contained in --json-config.) + + :key path_l1b_enmap_image_gapfill: + input path of an adjacent EnMAP L1B image to be used for gap-filling (zip-archive or root directory) + + :key path_dem: + input path of digital elevation model in map or sensor geometry; GDAL compatible file format (must cover + the EnMAP L1B data completely if given in map geometry or must have the same pixel dimensions like the + EnMAP L1B data if given in sensor geometry) + + :key average_elevation: + average elevation in meters above sea level; may be provided if no DEM is available; ignored if DEM is given + + :key output_dir: + output directory where processed data and log files are saved + + :key working_dir: + directory to be used for temporary files + + :key n_lines_to_append: + number of lines to be added to the main image [if None, use the whole imgap]. + Requires 'path_l1b_enmap_image_gapfill' to be set. + + :key disable_progress_bars: + whether to disable all progress bars during processing + + :key path_earthSunDist: + input path of the earth sun distance model + + :key path_solar_irr: + input path of the solar irradiance model + + :key scale_factor_toa_ref: + scale factor to be applied to TOA reflectance result + + :key enable_keystone_correction: + Enable keystone correction + + :key enable_vnir_swir_coreg: + Enable VNIR/SWIR co-registration + + :key path_reference_image: + Reference image for co-registration. + + :key enable_ac: + Enable atmospheric correction using SICOR algorithm (default: True). + If False, the L2A output contains top-of-atmosphere reflectance. + + :key sicor_cache_dir: + SICOR cache directory + + :key auto_download_ecmwf: + Automatically download ECMWF data for atmospheric correction + + :key enable_cloud_screening: + Enable cloud screening during atmospheric correction + + :key scale_factor_boa_ref: + Scale factor to be applied to BOA reflectance result + + :key run_smile_P: + Enable extra smile detection and correction (provider smile coefficients are ignored) + + :key run_deadpix_P: + Enable dead pixel correction + + :key deadpix_P_algorithm: + Algorithm for dead pixel correction ('spectral' or 'spatial') + + :key deadpix_P_interp_spectral: + Spectral interpolation algorithm to be used during dead pixel correction + ('linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic') + + :key deadpix_P_interp_spatial: + Spatial interpolation algorithm to be used during dead pixel correction + ('linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic') + :key ortho_resampAlg: + Ortho-rectification resampling algorithm ('nearest', 'bilinear', 'gauss') """ # fixed attributes -- GitLab From 84375ef8dfc231c0e9d1962ac651506fce35d3a9 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 19:29:19 +0200 Subject: [PATCH 20/26] Fix for undocumented __init__ methods. Signed-off-by: Daniel Scheffler --- docs/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index d241815..4507eb0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -114,6 +114,10 @@ pygments_style = 'sphinx' # documents. # keep_warnings = False +# Define how to document class docstrings +# '__init__' documents only the __init__ methods, 'class' documents only the class methods and 'both' documents both +autoclass_content = 'both' + # -- Options for HTML output ------------------------------------------- -- GitLab From 11bc79170724381ccd75b2c87e65e7445693762a Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 19:31:07 +0200 Subject: [PATCH 21/26] Fix typo. Signed-off-by: Daniel Scheffler --- docs/usage.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index bf3cf84..39293c7 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -15,8 +15,8 @@ To start run whole EnPT processing pipeline via the Python API:: CTR = EnPT_Controller(**config_minimal) CTR.run_all_processors() -Further configuration parameters are here_. Note that the class 'EnPT_Config' takes the same keyword arguments like the -'EnPT_Controller' class. +Further configuration parameters are documented here_. +Note that the class 'EnPT_Config' takes the same keyword arguments like the 'EnPT_Controller' class. .. _here: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.options.html#enpt.options.config.EnPTConfig -- GitLab From 25993d2317c88b9b3119ce2227003b4e97d46ff1 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Thu, 18 Jul 2019 19:44:22 +0200 Subject: [PATCH 22/26] Added example to pass a JSON configuration file to the EnPT Controller. Signed-off-by: Daniel Scheffler --- docs/usage.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/usage.rst b/docs/usage.rst index 39293c7..4c66d29 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -16,10 +16,25 @@ To start run whole EnPT processing pipeline via the Python API:: CTR.run_all_processors() Further configuration parameters are documented here_. -Note that the class 'EnPT_Config' takes the same keyword arguments like the 'EnPT_Controller' class. +Note that the class `EnPTConfig` takes the same keyword arguments like the `EnPT_Controller` class. .. _here: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.options.html#enpt.options.config.EnPTConfig +You can also pass a JSON-File with your EnPT configuration to the `EnPT_Controller` class. This allows you to easily +copy and reuse configuration files. A template with all possible options and defaults can be found in +`enpt/options/options_default.json`_. + +The corresponding Python call looks like this:: + + from enpt.execution.controller import EnPT_Controller + from enpt.options.config import EnPTConfig + + CFG = EnPTConfig(json_config='/path/to/your/config_file.json') + CTR = EnPT_Controller(config=CFG) + CTR.run_all_processors() + +.. _enpt/options/options_default.json: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/blob/master/enpt/options/options_default.json + Command line utilities ********************** -- GitLab From f5c807d68ed1b215b643874bdd6644176d4fd577 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Fri, 19 Jul 2019 14:28:35 +0200 Subject: [PATCH 23/26] Added usage examples for running the different processors separately. Improved algorithm descriptions. Signed-off-by: Daniel Scheffler --- README.rst | 8 +-- docs/about.rst | 8 +-- docs/algorithm_descriptions.rst | 40 ++++++++++----- docs/usage.rst | 91 ++++++++++++++++++++++++++++++--- 4 files changed, 121 insertions(+), 26 deletions(-) diff --git a/README.rst b/README.rst index 6cc9acc..300ae65 100644 --- a/README.rst +++ b/README.rst @@ -17,14 +17,14 @@ License ------- Free software: GNU General Public License v3 -Features --------- +Feature overview +---------------- * read EnMAP Level-1B input data -* dead pixel correction -* import of an overlapping digital elevation model * radiometric conversion to top-of-atmosphere radiance +* dead pixel correction * atmospheric correction (based on SICOR_) +* conversion of top-of-atmosphere-radiance to top-of-atmosphere-reflectance * detection and correction of geometric misregistrations compared to user provided spatial reference (based on AROSICS_) * orthorectification * write EnMAP Level-2 output data diff --git a/docs/about.rst b/docs/about.rst index e9dc4f4..e3e8d29 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -10,14 +10,14 @@ The EnPT Python package is an automated pre-processing pipeline for the new EnMA It provides free and open-source features to transform EnMAP Level-1B data to Level-2A. The package has been developed at the German Research Centre for Geosciences Potsdam (GFZ) as an alternative to the original DLR processing chain. -Features --------- +Feature overview +---------------- * read EnMAP Level-1B input data -* dead pixel correction -* import of an overlapping digital elevation model * radiometric conversion to top-of-atmosphere radiance +* dead pixel correction * atmospheric correction (based on SICOR_) +* conversion of top-of-atmosphere-radiance to top-of-atmosphere-reflectance * detection and correction of geometric misregistrations compared to user provided spatial reference (based on AROSICS_) * orthorectification * write EnMAP Level-2 output data diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index ed75f10..c57f1ce 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -76,10 +76,8 @@ the indicated dead pixel positions. It supports two interpolation algorithms: * Remaining missing data positions (e.g., outermost columns) are spectrally interpolated. * possible interpolation methods: `linear`, `bilinear`, `cubic`, `spline` -Import of an overlapping digital elevation model -************************************************ -TBD + Atmospheric correction ********************** @@ -89,12 +87,20 @@ Atmospheric correction :alt: SICOR Logo EnPT uses `SICOR`_ (Sensor Independent Atmosperic Correction of optical Earth observation data from multi- and -hyperspectral instruments) for atmospheric correction. SICOR is a Python based open-source package developed at the +hyperspectral instruments) for atmospheric correction, i.e., for the conversion of TOA-(top-of-atmosphere) radiance +to BOA- (bottom-of-atmosphere / surface) reflectance. SICOR is a Python based open-source package developed at the German Research Centre for Geosciences (GFZ) Potsdam. For details on the underlying algorithm, please refer to the `documentation pages of SICOR`_. -.. _SICOR: https://gitext.gfz-potsdam.de/EnMAP/sicor -.. _`documentation pages of SICOR`: http://enmap.gitext.gfz-potsdam.de/sicor/doc/ + + +Conversion of TOA-radiance to TOA-reflectance +********************************************* + +As an alternative to the atmospheric correction, your EnMAP Level-1B data can also be converted from +TOA-radiance to TOA-reflectance. This is useful to normalize unequal acquisition- and illumination geometries of +multiple EnMAP datasets but will not correct for atmospheric effects. + @@ -109,13 +115,15 @@ For the detection of spatial misregistrations with regard to a user-provided spa open-source Python package `AROSICS`_ (An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data). It has been developed at the German Research Centre for Geosciences (GFZ) Potsdam. For detailed algorithm description and use cases refer to the corresponding (open-access) paper that can be found here: -`Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`_. +`Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image +Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`__. In EnPT, AROSICS is used to automacially compute thousands of tie points between a selected EnMAP band the user-provided reference image. The computed shifts are later respected in the orthorectification step. -.. _AROSICS: https://gitext.gfz-potsdam.de/danschef/arosics -.. _`Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676`: http://www.mdpi.com/2072-4292/9/7/676 +__ http://www.mdpi.com/2072-4292/9/7/676 + + Orthorectification @@ -126,13 +134,15 @@ coordinates. For the geo-rectification of the data EnPT uses a set of Rational P for each band of the two EnMAP subsystems (VNIR and SWIR). Together with a user provided digital elevation model these RPC coefficients enable a highly accurate assignment of map coordinates to each pixel of the EnMAP Level-1B images. Resampling is done using a fast KDTree gaussian weighting neighbour approach implemented in the Python library -`pyresample`_ (find the `documentation here`_). The spatial shifts computed during the co-registration step are +`pyresample`_ (find the documentation here__). The spatial shifts computed during the co-registration step are respected here. In this processing step, the EnMAP VNIR is merged with the SWIR subsystem and from now on stored in a single 3D array. -.. _pyresample: https://github.com/pytroll/pyresample -.. _documentation here: https://pyresample.readthedocs.io/en/latest/ +__ https://pyresample.readthedocs.io/en/latest/ + + + EnMAP Level 2A data writer ************************** @@ -173,3 +183,9 @@ below: +-----------------------------------------------+-----+---------+-------------+ |ENMAP*L2A*-SPECTRAL_IMAGE.GEOTIFF | yes | yes | | +-----------------------------------------------+-----+---------+-------------+ + + +.. _SICOR: https://gitext.gfz-potsdam.de/EnMAP/sicor +.. _`documentation pages of SICOR`: http://enmap.gitext.gfz-potsdam.de/sicor/doc/ +.. _AROSICS: https://gitext.gfz-potsdam.de/danschef/arosics +.. _pyresample: https://github.com/pytroll/pyresample \ No newline at end of file diff --git a/docs/usage.rst b/docs/usage.rst index 4c66d29..9193998 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -4,7 +4,11 @@ Usage Usage of the Python API *********************** -To start run whole EnPT processing pipeline via the Python API:: +**Run the whole pipeline at once** + +To run the whole EnPT processing pipeline via the Python API: + +.. code-block:: python from enpt.execution.controller import EnPT_Controller @@ -15,16 +19,18 @@ To start run whole EnPT processing pipeline via the Python API:: CTR = EnPT_Controller(**config_minimal) CTR.run_all_processors() -Further configuration parameters are documented here_. +Further configuration parameters are documented here__. Note that the class `EnPTConfig` takes the same keyword arguments like the `EnPT_Controller` class. -.. _here: http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.options.html#enpt.options.config.EnPTConfig +__ http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.options.html#enpt.options.config.EnPTConfig You can also pass a JSON-File with your EnPT configuration to the `EnPT_Controller` class. This allows you to easily copy and reuse configuration files. A template with all possible options and defaults can be found in `enpt/options/options_default.json`_. -The corresponding Python call looks like this:: +The corresponding Python call looks like this: + +.. code-block:: python from enpt.execution.controller import EnPT_Controller from enpt.options.config import EnPTConfig @@ -33,7 +39,78 @@ The corresponding Python call looks like this:: CTR = EnPT_Controller(config=CFG) CTR.run_all_processors() -.. _enpt/options/options_default.json: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/blob/master/enpt/options/options_default.json + +**Run each processor module separately** + +To run the different processor modules separately, follow the instructions below. +Note, that the processors are built on each other, so the order must be unchanged. + +To get an instance of EnPT_Controller: + +.. code-block:: python + + CTR = EnPT_Controller(**your_config_parameters) # config parameters are described above + +Read the EnMAP Level-1B data into memory, convert DNs to radiance and compute coordiante layers: + +.. code-block:: python + + CTR.read_L1B_data() + +Get the in-memory Python object representing the Level-1 dataset (NOTE: the attributes and methods of this +Python object are documented here__): + +__ http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.model.html#enpt.model.images.EnMAPL1Product_SensorGeo + +.. code-block:: python + + L1_obj = CTR.L1_obj + +To correct dead pixels: + +.. code-block:: python + + CTR.L1_obj.correct_dead_pixels() + +To run the atmospheric correction using SICOR_: + +.. code-block:: python + + CTR.run_atmospheric_correction() + +To run convert top-of-atmosphere radiance to top-of-atmosphere reflectance (as an alternative to atmospheric correction): + +.. code-block:: python + + CTR.run_toaRad2toaRef() + +To compute spatial misregistration with respect to a user-provided reference dataset +(NOTE: This feature is yet implemented): + +.. code-block:: python + + CTR.run_geometry_processor() + +To run the orthorectification: + +.. code-block:: python + + self.run_orthorectification() + +From now on, you may get the in-memory EnMAP Level-2 Python object (attributes and methods are documented here__): + +__http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.model.html#enpt.model.images.EnMAPL2Product_MapGeo + +.. code-block:: python + + L2_obj = CTR.L2_obj + +To write the EnMAP Level-2 data to disk: + +.. code-block:: python + + L2_obj = CTR.write_output() + Command line utilities @@ -60,4 +137,6 @@ Here is screenshot of the current version: .. image:: img/screenshot_enpt_enmapboxapp_874x1047.png -.. _enpt_enmapboxapp: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/enpt_enmapboxapp \ No newline at end of file +.. _enpt_enmapboxapp: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/enpt_enmapboxapp +.. _enpt/options/options_default.json: https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/blob/master/enpt/options/options_default.json +.. _SICOR: https://gitext.gfz-potsdam.de/EnMAP/sicor \ No newline at end of file -- GitLab From eb21f282bdd633a51865a81d8f65fee0d2a588ed Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Fri, 19 Jul 2019 15:12:09 +0200 Subject: [PATCH 24/26] Updated CONTRIBUTING.rst. Fixed anonymous links and emphasized some text in usage.rst. Signed-off-by: Daniel Scheffler --- CONTRIBUTING.rst | 37 ++++++++++++++++--------------- docs/algorithm_descriptions.rst | 6 ++--- docs/installation.rst | 4 +--- docs/usage.rst | 39 ++++++++++++++++----------------- 4 files changed, 41 insertions(+), 45 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index a54ff10..78e0da2 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -15,7 +15,7 @@ Types of Contributions Report Bugs ~~~~~~~~~~~ -Report bugs at https://github.com/audreyr/enpt/issues. +Report bugs at https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/issues If you are reporting a bug, please include: @@ -26,13 +26,13 @@ If you are reporting a bug, please include: Fix Bugs ~~~~~~~~ -Look through the GitHub issues for bugs. Anything tagged with "bug" +Look through the GitLab issues for bugs. Anything tagged with "bug" and "help wanted" is open to whoever wants to implement it. Implement Features ~~~~~~~~~~~~~~~~~~ -Look through the GitHub issues for features. Anything tagged with "enhancement" +Look through the GitLab issues for features. Anything tagged with "enhancement" and "help wanted" is open to whoever wants to implement it. Write Documentation @@ -45,26 +45,26 @@ articles, and such. Submit Feedback ~~~~~~~~~~~~~~~ -The best way to send feedback is to file an issue at https://github.com/audreyr/enpt/issues. +The best way to send feedback is to file an issue at https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/issues If you are proposing a feature: * Explain in detail how it would work. * Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) +* Remember that this is a volunteer-driven project, and that contributions are welcome :) Get Started! ------------ Ready to contribute? Here's how to set up `enpt` for local development. -1. Fork the `enpt` repo on GitHub. +1. Fork the `enpt` repo on GitLab. 2. Clone your fork locally:: - $ git clone git@github.com:your_name_here/enpt.git + $ git clone git@gitext.gfz-potsdam.de:your_name_here/enpt.git -3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:: +3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up + your fork for local development:: $ mkvirtualenv enpt $ cd enpt/ @@ -76,33 +76,34 @@ Ready to contribute? Here's how to set up `enpt` for local development. Now you can make your changes locally. -5. When you're done making changes, check that your changes pass flake8 and the tests, including testing other Python versions with tox:: +5. When you're done making changes, check that your changes pass the codestyle and the software tests, including + testing other Python versions with tox:: - $ flake8 enpt tests - $ python setup.py test or py.test + $ make lint + $ python -m unittest $ tox To get flake8 and tox, just pip install them into your virtualenv. -6. Commit your changes and push your branch to GitHub:: +6. Commit your changes and push your branch to GitLab:: $ git add . $ git commit -m "Your detailed description of your changes." $ git push origin name-of-your-bugfix-or-feature -7. Submit a pull request through the GitHub website. +7. Submit a merge request through the GitLab website. Pull Request Guidelines ----------------------- Before you submit a pull request, check that it meets these guidelines: -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put +1. The merge request should include tests. +2. If the merge request adds functionality, the docs should be updated. Put your new functionality into a function with a docstring, and add the feature to the list in README.rst. -3. The pull request should work for Python 2.6, 2.7, 3.3, 3.4 and 3.5, and for PyPy. Check - https://travis-ci.org/audreyr/enpt/pull_requests +3. The merge request should work for Python 2.6, 2.7, 3.4, 3.5, 3.6 and 3.7. Check + https://gitext.gfz-potsdam.de/EnMAP/GFZ_Tools_EnMAP_BOX/EnPT/merge_requests and make sure that the tests pass for all supported Python versions. Tips diff --git a/docs/algorithm_descriptions.rst b/docs/algorithm_descriptions.rst index c57f1ce..a68111a 100644 --- a/docs/algorithm_descriptions.rst +++ b/docs/algorithm_descriptions.rst @@ -134,13 +134,11 @@ coordinates. For the geo-rectification of the data EnPT uses a set of Rational P for each band of the two EnMAP subsystems (VNIR and SWIR). Together with a user provided digital elevation model these RPC coefficients enable a highly accurate assignment of map coordinates to each pixel of the EnMAP Level-1B images. Resampling is done using a fast KDTree gaussian weighting neighbour approach implemented in the Python library -`pyresample`_ (find the documentation here__). The spatial shifts computed during the co-registration step are -respected here. +`pyresample`_ (find the documentation `here `__). +The spatial shifts computed during the co-registration step are respected here. In this processing step, the EnMAP VNIR is merged with the SWIR subsystem and from now on stored in a single 3D array. -__ https://pyresample.readthedocs.io/en/latest/ - diff --git a/docs/installation.rst b/docs/installation.rst index 283c3c8..e08b7db 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,5 +1,3 @@ -.. highlight:: shell - ============ Installation ============ @@ -11,7 +9,7 @@ Using conda_, the recommended approach is: .. _conda: https://conda.io/docs/ -.. code-block:: console +.. code-block:: bash # create virtual environment for enpt, this is optional but recommended conda create --name enpt python=3 diff --git a/docs/usage.rst b/docs/usage.rst index 9193998..033f3ec 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -19,12 +19,11 @@ To run the whole EnPT processing pipeline via the Python API: CTR = EnPT_Controller(**config_minimal) CTR.run_all_processors() -Further configuration parameters are documented here__. +Further *configuration parameters* are documented +`here `__. Note that the class `EnPTConfig` takes the same keyword arguments like the `EnPT_Controller` class. -__ http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.options.html#enpt.options.config.EnPTConfig - -You can also pass a JSON-File with your EnPT configuration to the `EnPT_Controller` class. This allows you to easily +You can also pass a *JSON-File with your EnPT configuration* to the `EnPT_Controller` class. This allows you to easily copy and reuse configuration files. A template with all possible options and defaults can be found in `enpt/options/options_default.json`_. @@ -45,67 +44,67 @@ The corresponding Python call looks like this: To run the different processor modules separately, follow the instructions below. Note, that the processors are built on each other, so the order must be unchanged. -To get an instance of EnPT_Controller: +1. To get an instance of *EnPT_Controller*: .. code-block:: python CTR = EnPT_Controller(**your_config_parameters) # config parameters are described above -Read the EnMAP Level-1B data into memory, convert DNs to radiance and compute coordiante layers: +2. *Read the EnMAP Level-1B data* into memory, convert DNs to radiance and compute coordiante layers: .. code-block:: python CTR.read_L1B_data() Get the in-memory Python object representing the Level-1 dataset (NOTE: the attributes and methods of this -Python object are documented here__): - -__ http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.model.html#enpt.model.images.EnMAPL1Product_SensorGeo +Python object are documented +`here `__): .. code-block:: python L1_obj = CTR.L1_obj -To correct dead pixels: +3. To correct *dead pixels*: .. code-block:: python CTR.L1_obj.correct_dead_pixels() -To run the atmospheric correction using SICOR_: +4. *reflectance* conversion + +To run the *atmospheric correction* using SICOR_: .. code-block:: python CTR.run_atmospheric_correction() -To run convert top-of-atmosphere radiance to top-of-atmosphere reflectance (as an alternative to atmospheric correction): +To run convert top-of-atmosphere radiance to *top-of-atmosphere reflectance* (as an alternative to atmospheric correction): .. code-block:: python - CTR.run_toaRad2toaRef() + CTR.run_toaRad2toaRef() -To compute spatial misregistration with respect to a user-provided reference dataset -(NOTE: This feature is yet implemented): +5. To compute *spatial misregistration* with respect to a user-provided reference dataset + (NOTE: This feature is yet implemented): .. code-block:: python CTR.run_geometry_processor() -To run the orthorectification: +6. To run the *orthorectification*: .. code-block:: python self.run_orthorectification() -From now on, you may get the in-memory EnMAP Level-2 Python object (attributes and methods are documented here__): - -__http://enmap.gitext.gfz-potsdam.de/GFZ_Tools_EnMAP_BOX/EnPT/doc/enpt.model.html#enpt.model.images.EnMAPL2Product_MapGeo +From now on, you may get the in-memory EnMAP Level-2 Python object (attributes and methods are documented +`here `__): .. code-block:: python L2_obj = CTR.L2_obj -To write the EnMAP Level-2 data to disk: +7. To *write the EnMAP Level-2 data* to disk: .. code-block:: python -- GitLab From 5320bed53c5d8c54f1ed7b9fc7dbbccd428ff1d1 Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Fri, 19 Jul 2019 15:28:35 +0200 Subject: [PATCH 25/26] Improved indentation. Signed-off-by: Daniel Scheffler --- docs/usage.rst | 59 +++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index 033f3ec..1176105 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -46,71 +46,73 @@ Note, that the processors are built on each other, so the order must be unchange 1. To get an instance of *EnPT_Controller*: -.. code-block:: python + .. code-block:: python - CTR = EnPT_Controller(**your_config_parameters) # config parameters are described above + CTR = EnPT_Controller(**your_config_parameters) # config parameters are described above 2. *Read the EnMAP Level-1B data* into memory, convert DNs to radiance and compute coordiante layers: -.. code-block:: python + .. code-block:: python - CTR.read_L1B_data() + CTR.read_L1B_data() -Get the in-memory Python object representing the Level-1 dataset (NOTE: the attributes and methods of this -Python object are documented -`here `__): + Get the in-memory Python object representing the Level-1 dataset (NOTE: the attributes and methods of this + Python object are documented + `here `__): -.. code-block:: python + .. code-block:: python - L1_obj = CTR.L1_obj + L1_obj = CTR.L1_obj 3. To correct *dead pixels*: -.. code-block:: python + .. code-block:: python - CTR.L1_obj.correct_dead_pixels() + CTR.L1_obj.correct_dead_pixels() 4. *reflectance* conversion -To run the *atmospheric correction* using SICOR_: + To run the *atmospheric correction* using SICOR_: -.. code-block:: python + .. code-block:: python - CTR.run_atmospheric_correction() + CTR.run_atmospheric_correction() -To run convert top-of-atmosphere radiance to *top-of-atmosphere reflectance* (as an alternative to atmospheric correction): + To run convert top-of-atmosphere radiance to *top-of-atmosphere reflectance* (as an alternative to atmospheric correction): -.. code-block:: python + .. code-block:: python - CTR.run_toaRad2toaRef() + CTR.run_toaRad2toaRef() 5. To compute *spatial misregistration* with respect to a user-provided reference dataset (NOTE: This feature is yet implemented): -.. code-block:: python + .. code-block:: python - CTR.run_geometry_processor() + CTR.run_geometry_processor() 6. To run the *orthorectification*: -.. code-block:: python + .. code-block:: python - self.run_orthorectification() + self.run_orthorectification() -From now on, you may get the in-memory EnMAP Level-2 Python object (attributes and methods are documented -`here `__): + From now on, you may get the in-memory EnMAP Level-2 Python object (attributes and methods are documented + `here `__): -.. code-block:: python + .. code-block:: python - L2_obj = CTR.L2_obj + L2_obj = CTR.L2_obj 7. To *write the EnMAP Level-2 data* to disk: -.. code-block:: python + .. code-block:: python - L2_obj = CTR.write_output() + L2_obj = CTR.write_output() +---- + Command line utilities ********************** @@ -126,6 +128,9 @@ At the command line, EnPT provides the **enpt_cli.py** command: :prog: enpt_cli.py +---- + + QGIS GUI ******** -- GitLab From 88cab46859ac7dad03ca0dda359262c7297d72da Mon Sep 17 00:00:00 2001 From: Daniel Scheffler Date: Fri, 19 Jul 2019 15:35:36 +0200 Subject: [PATCH 26/26] Updated AUTHORS.rst. Signed-off-by: Daniel Scheffler --- AUTHORS.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index a115a26..c7ff055 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -10,7 +10,7 @@ Karl Segl Contributors ------------ -* Daniel Scheffler +* Daniel Scheffler (main developer of the EnPT source code) +* Niklas Bohn (main developer of the SICOR atmopsheric correction source code) * André Hollstein * Stéphane Guillaso -* Niklas Bohn -- GitLab