From 5a50ab0562429e4241d763810ac8e940c69cf202 Mon Sep 17 00:00:00 2001 From: Tomas Zigo <50632337+tmszi@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:27:29 +0100 Subject: [PATCH 01/12] wxGUI/main_window: fix rendering Layers pane map display toolbar widget (#3262) On the wxMac. --- gui/wxpython/main_window/frame.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gui/wxpython/main_window/frame.py b/gui/wxpython/main_window/frame.py index 566914c820c..24e5d8240b5 100644 --- a/gui/wxpython/main_window/frame.py +++ b/gui/wxpython/main_window/frame.py @@ -257,6 +257,11 @@ def show_menu_errors(messages): self._show_demo_map() + def _repaintLayersPaneMapDisplayToolbar(self): + """Repaint Layers pane map display toolbar widget on the wxMac""" + if sys.platform == "darwin": + wx.CallLater(100, self.notebookLayers.Refresh) + def _setTitle(self): """Set frame title""" gisenv = grass.gisenv() @@ -338,6 +343,7 @@ def _createDisplay(self, parent): # bindings self.notebookLayers.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnCBPageChanged) self.notebookLayers.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.OnCBPageClosing) + self.notebookLayers.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CLOSED, self.OnCBPageClosed) def _createSearchModule(self, parent): """Initialize Search module widget""" @@ -480,6 +486,8 @@ def CreateNewMapDisplay(giface, layertree): cb_boxsizer.Fit(self.GetLayerTree()) self.currentPage.Layout() self.GetLayerTree().Layout() + # Repaint Layers pane map display toolbar widget on the wxMac + self._repaintLayersPaneMapDisplayToolbar() self.displayIndex += 1 @@ -955,6 +963,12 @@ def OnCBPageChanged(self, event): event.Skip() + def OnCBPageClosed(self, event): + """Page of notebook has been closed from the Layers pane via x + button or via closing map display notebook page""" + # Repaint Layers pane map display toolbar widget on the wxMac + self._repaintLayersPaneMapDisplayToolbar() + def OnCBPageClosing(self, event): """Page of notebook is being closed from Layer Manager (x button next to arrows) From abe82c4ad00e92e2e4d0509e59159103483850e2 Mon Sep 17 00:00:00 2001 From: Tomas Zigo <50632337+tmszi@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:28:10 +0100 Subject: [PATCH 02/12] wxGUI/lmgr: fix unfocused Layers pane wx.ListCtrl widget row background color (#3264) On the wxMac. --- gui/wxpython/lmgr/layertree.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/wxpython/lmgr/layertree.py b/gui/wxpython/lmgr/layertree.py index db7b6d7483f..eae93ce8147 100644 --- a/gui/wxpython/lmgr/layertree.py +++ b/gui/wxpython/lmgr/layertree.py @@ -149,7 +149,8 @@ def __init__( # when some layers are not visible in layer tree # self.SetAutoLayout(True) self.SetGradientStyle(1) - self.EnableSelectionGradient(True) + if sys.platform != "darwin": + self.EnableSelectionGradient(True) self._setGradient() # init associated map display From db573919637fc9e46c0a9a0aa743d534db98b05c Mon Sep 17 00:00:00 2001 From: Nicklas Larsson Date: Tue, 28 Nov 2023 10:30:58 +0100 Subject: [PATCH 03/12] checks: add -Wpendantic compiler flag to CI builds (#3245) Also silence compiler warnings in include/grass/vect/dig_defines.h, caused by code copied from GDAL, using compiler #pragma statements. --- .github/workflows/build_ubuntu-22.04.sh | 5 +++-- .github/workflows/gcc.yml | 4 +++- .github/workflows/macos_install.sh | 7 ++++--- include/grass/vect/dig_defines.h | 12 ++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_ubuntu-22.04.sh b/.github/workflows/build_ubuntu-22.04.sh index 86017e33f29..179ff56f19b 100755 --- a/.github/workflows/build_ubuntu-22.04.sh +++ b/.github/workflows/build_ubuntu-22.04.sh @@ -20,8 +20,9 @@ fi # an old version of configure, which issues compiler warnings and # errors out. This may be removed with upgraded configure.in file. makecmd="make" -if [[ "$#" -eq 2 ]]; then - makecmd="make CFLAGS='$CFLAGS $2' CXXFLAGS='$CXXFLAGS $2'" +if [[ "$#" -ge 2 ]]; then + ARGS=("$@") + makecmd="make CFLAGS='$CFLAGS ${ARGS[@]:1}' CXXFLAGS='$CXXFLAGS ${ARGS[@]:1}'" fi # non-existent variables as an errors diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml index 33ab0e5e059..a7e1963bd16 100644 --- a/.github/workflows/gcc.yml +++ b/.github/workflows/gcc.yml @@ -63,4 +63,6 @@ jobs: CFLAGS: -std=${{ matrix.c }} -fPIC -Wall -Wextra # TODO: -pedantic-errors here won't compile CXXFLAGS: -std=${{ matrix.cpp }} -fPIC -Wall -Wextra - run: .github/workflows/build_ubuntu-22.04.sh $HOME/install -Werror + run: | + .github/workflows/build_ubuntu-22.04.sh $HOME/install \ + -isystem/usr/include/gdal -Wpedantic -Werror diff --git a/.github/workflows/macos_install.sh b/.github/workflows/macos_install.sh index 42192c6ea6c..79828b933f6 100755 --- a/.github/workflows/macos_install.sh +++ b/.github/workflows/macos_install.sh @@ -66,12 +66,13 @@ CONFIGURE_FLAGS="\ --with-readline-libs=${CONDA_PREFIX}/lib " -export CFLAGS="-O2 -pipe -arch ${CONDA_ARCH} -DGL_SILENCE_DEPRECATION -Wall -Wextra" -export CXXFLAGS="-O2 -pipe -stdlib=libc++ -arch ${CONDA_ARCH} -Wall -Wextra" +export CFLAGS="-O2 -pipe -arch ${CONDA_ARCH} -DGL_SILENCE_DEPRECATION -Wall -Wextra -Wpedantic" +export CXXFLAGS="-O2 -pipe -stdlib=libc++ -arch ${CONDA_ARCH} -Wall -Wextra -Wpedantic" +export CPPFLAGS="-isystem${CONDA_PREFIX}/include" ./configure $CONFIGURE_FLAGS -EXEMPT="-Wno-error=deprecated-non-prototype" +EXEMPT="-Wno-error=deprecated-non-prototype -Wno-error=strict-prototypes" make -j$(sysctl -n hw.ncpu) CFLAGS="$CFLAGS -Werror $EXEMPT" \ CXXFLAGS="$CXXFLAGS -Werror $EXEMPT" diff --git a/include/grass/vect/dig_defines.h b/include/grass/vect/dig_defines.h index be33235dbb8..aeb9c673edf 100644 --- a/include/grass/vect/dig_defines.h +++ b/include/grass/vect/dig_defines.h @@ -225,6 +225,13 @@ typedef enum overlay_operator OVERLAY_OPERATOR; /*! \brief GRASS ASCII vector format - well-known-text format */ #define GV_ASCII_FORMAT_WKT 2 +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpedantic" +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif /*! \brief Simple feature types Taken from GDAL/OGR library (ogr/ogr_core.h) @@ -252,6 +259,11 @@ typedef enum { SF_MULTIPOLYGON25D = 0x80000006, /* 2.5D extension as per 99-402 */ SF_GEOMETRYCOLLECTION25D = 0x80000007 /* 2.5D extension as per 99-402 */ } SF_FeatureType; +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif #define HEADSTR 50 From 05f1b61b2344ca808da459919e6e90300b2c7de4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 10:37:05 +0100 Subject: [PATCH 04/12] CI(deps): Update conda-incubator/setup-miniconda action to v3 (#3265) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 1b9fc2127d0..d00b7ba66c7 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -24,7 +24,7 @@ jobs: steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - name: Setup Mambaforge - uses: conda-incubator/setup-miniconda@v2 + uses: conda-incubator/setup-miniconda@v3 with: channels: conda-forge miniforge-variant: Mambaforge From 843b41d1849e8912e7277e05a96c78c983811b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edouard=20Choini=C3=A8re?= <27212526+echoix@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:26:37 -0500 Subject: [PATCH 05/12] CI: New 'Periodic update' workflow (#3200) Check monthly if 'config.guess' and 'config.sub' are updated and create a pull request with updates if that is the case. --- .github/workflows/periodic_update.yml | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/periodic_update.yml diff --git a/.github/workflows/periodic_update.yml b/.github/workflows/periodic_update.yml new file mode 100644 index 00000000000..85e2401defd --- /dev/null +++ b/.github/workflows/periodic_update.yml @@ -0,0 +1,52 @@ +--- +name: Periodic update + +# Controls when the action will run. Workflow runs when manually triggered using the UI +# or API, or on a schedule. +on: + workflow_dispatch: + schedule: + # At 10:32 on every first Wednesday of the month. + # See https://crontab.guru/#32_10_1-7_*_WED + - cron: "32 10 1-7 * WED" + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + update-configure: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Create URL to the run output + id: vars + run: echo "run-url=https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" >> $GITHUB_OUTPUT + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: "Check that autoconf scripts are up-to-date:" + run: | + rm -f config.guess config.sub + wget http://git.savannah.gnu.org/cgit/config.git/plain/config.guess + wget http://git.savannah.gnu.org/cgit/config.git/plain/config.sub + # Display changes, only to follow along in the logs. + - run: git diff config.guess config.sub + - name: Double check if files are modified + run: git status --ignored + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38 # v5.0.2 + with: + commit-message: "config.guess + config.sub: updated from http://git.savannah.gnu.org/cgit/config.git/plain/" + branch: periodic/update-configure + title: "configure: update to latest config.guess and config.sub" + labels: "CI,packaging,configure" + body: | + This updates config.guess and config.sub to their latest versions. + If the two files are deleted in this PR, please check the logs of the workflow here: + [Workflow run summary](${{ steps.vars.outputs.run-url }}) + + Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action + - name: Check outputs + if: ${{ steps.cpr.outputs.pull-request-number }} + run: | + echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" + echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" From 656add71cfc681c352ae2a23ec1d7c29b37c958f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edouard=20Choini=C3=A8re?= <27212526+echoix@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:29:11 -0500 Subject: [PATCH 06/12] CI: Speed up pytest workflow with pytest-xdist (#3257) * Use pytest-xdist in pytest.yml * Add pip caching on pytest.yml --- .github/workflows/pytest.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index c18045c18f1..dd09b30d6cd 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -36,6 +36,7 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} + cache: pip - name: Install non-Python dependencies run: | @@ -49,7 +50,7 @@ jobs: python -m pip install --upgrade pip pip install -r .github/workflows/python_requirements.txt pip install -r .github/workflows/optional_requirements.txt - pip install pytest pytest-timeout pytest-github-actions-annotate-failures + pip install pytest pytest-timeout pytest-github-actions-annotate-failures pytest-xdist - name: Create installation directory run: | @@ -73,7 +74,7 @@ jobs: run: | export PYTHONPATH=`grass --config python_path`:$PYTHONPATH export LD_LIBRARY_PATH=$HOME/install/grass84/lib:$LD_LIBRARY_PATH - pytest . + pytest --numprocesses auto . - name: Print installed versions if: always() From 00a8fff087d5667b25f19ddc1f03ad769da9124c Mon Sep 17 00:00:00 2001 From: Vaclav Petras Date: Wed, 29 Nov 2023 17:55:29 -0500 Subject: [PATCH 07/12] contributing: Optimize commands, text in release procedure (#2414) Update release procedure after 8.2.0. - Add cron job update - Restructure updates to website and wiki - Remove Launchpad notes (I think the reason was they are not used, at least not by the release manager.) - Change of procedure for the mailing list announcements - Improves precision in the text --- doc/howto_release.md | 103 ++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/doc/howto_release.md b/doc/howto_release.md index 439fa7bb55f..cedbcf71d4c 100644 --- a/doc/howto_release.md +++ b/doc/howto_release.md @@ -19,7 +19,7 @@ _Note: Some later steps in this text are to be done by the development coordinat Update your remotes and switch to branch: ```bash -git fetch --all --prune && git checkout releasebranch_8_4 +git fetch --prune upstream && git checkout releasebranch_8_4 ``` Confirm that you are on the right branch and have no local changes @@ -33,15 +33,16 @@ git diff git diff --staged # Should give no output: git log upstream/releasebranch_8_4..HEAD -# Should give the same as last commits visible on GitHub: +# There should be no commits which are not visible on GitHub: git log --max-count=5 ``` -Now you can merge (or rebase) updates from the remote your local branch -and optionally update your own fork: +Now you can rebase updates from the remote your local branch. +Above, you confirmed you have no local commits, so this should happen +without rebasing any local commits, i.e., it should just add the new commits: ```bash -git merge upstream/releasebranch_8_4 && git push origin releasebranch_8_4 +git rebase upstream/releasebranch_8_4 ``` Verify the result: @@ -49,14 +50,16 @@ Verify the result: ```bash # Should give no output: git log upstream/releasebranch_8_4..HEAD -# Should give the same as last commits visible on GitHub: +git log HEAD..upstream/releasebranch_8_4 +# Should give exactly the same as last commits visible on GitHub: git log --max-count=5 ``` -Now or any time later, you can use `git log` and `git show` to see the latest -commits and the last commit including the changes. +Now or any time later, you can use `git status`, `git log`, and `git show` +to see a branch, latest commits and a last commit including the changes. ```bash +git status git log --max-count=5 git show ``` @@ -334,13 +337,13 @@ md5sum grass-${VERSION}.tar.gz > grass-${VERSION}.md5sum ### Upload source code tarball to OSGeo servers -Note: servers 'osgeo7-grass' and 'osgeo7-download' only reachable via +Note: servers 'osgeo8-grass' and 'osgeo7-download' only reachable via jumphost (managed by OSGeo-SAC) - see ```bash # Store the source tarball (twice) in (use scp -p FILES grass:): USER=neteler -SERVER1=osgeo7-grass +SERVER1=osgeo8-grass SERVER1DIR=/var/www/code_and_data/grass$MAJOR$MINOR/source/ SERVER2=osgeo7-download SERVER2DIR=/osgeo/download/grass/grass$MAJOR$MINOR/source/ @@ -371,13 +374,13 @@ For final minor and major releases (not release candidates and micro releases), update `grass-stable` redirect at `osgeo7-grass`: ```bash -sudo vim /etc/apache2/sites-enabled/000-default.conf` +sudo vim /etc/apache2/sites-enabled/000-default.conf ``` Load the new configuration: ```bash -sudo systemctl reload apache2` +sudo systemctl reload apache2 ``` For new branches: Update `grass-devel` using the steps above. @@ -421,51 +424,64 @@ Release is done. ## Improve release description -For final releases only, go to Zenodo.org a get a Markdown badge for the release -which Zenodo creates with a DOI for the published release. +For final releases only, go to [Zenodo](https://doi.org/10.5281/zenodo.5176030) +and get a Markdown badge for the release which Zenodo creates with a DOI +for the published release. For all releases, click the Binder badge to get Binder to build. Use it to test it and to cache the built image. Add more links to (or badges for) more notebooks if there are any which show well specific features added or updated in the release. -## Create entries for the new release - -### Trac Wiki release page entry +## Create various entries for the new release -Add entry in +### Cron jobs -### Update Hugo web site and other pages to show the new version +Only in case of major releases: -For a (final) release (not release candidate), write announcement and publish it: +- update '[cronjob(s)](https://github.com/OSGeo/grass-addons/tree/grass8/utils/cronjobs_osgeo_lxd/)' + on grass.osgeo.org to next but one release tag for the differences -- News section, +### Update Hugo web site -Increment the GRASS GIS version in +Update website only for final releases (not release candidates). Submit the changes +in a single PR. -- -- - -Update the version in the Wiki page: - -Subsequently, verify the software pages: +Software pages: - Linux: - Windows: - Mac: +- Releases: +- Website variables: -### Only in case of new major release +Write announcement and publish it: -- update '[cronjob(s)](https://github.com/OSGeo/grass-addons/tree/grass8/utils/cronjobs_osgeo_lxd/)' - on grass.osgeo.org to next but one release tag for the differences -- wiki updates, only when new major release: +- News section: + +### GRASS Wiki + +For final releases (not release candidates), update the last version +on the main page: + +- Wiki: + +- For major release only: - {{cmd|xxxx}} macro: - - update last version on main page + +### Trac wiki + +For all releases: + +- Add link to GitHub release page to + +For major and minor releases: + - Add trac Wiki Macro definitions for manual pages G8X:modulename - Edit: -## Packaging notes +## WinGRASS notes -### WinGRASS notes +For new branches and final releases (see additional instructions in the repo): - Go to - Update grass_packager_release.bat, eg. @@ -488,11 +504,6 @@ Subsequently, verify the software pages: copy_addon 840RC1 8.4.0RC1 ``` -### Ubuntu Launchpad notes - -- Create milestone and release: -- Upload tarball for created release - ### Update grass.osgeo.org These updates are for final releases only. @@ -517,12 +528,12 @@ Add release to history page: ## Tell others about release -- If release candidate (send just a short invitation to test): - - +- If release candidate (just a short invitation to test): - + - -If final release, send out an announcement (press release) which is a shortened -version of release desciption and website news item (under `/announces/`). +If final release, send out an announcement (press release) +which is a shortened version of release desciption and website news item. Note: Do not use relative links. - Our main mailing lists: @@ -530,8 +541,8 @@ Note: Do not use relative links. (ask a development coordinator to be added) - | - | -- OSGeo.org: , (send an email, then it - will be approved) +- OSGeo.org: , + (send an email, then it will be approved) Via web and social media: From 2ff126dba06941d7de7e2797345a60a89dd2e831 Mon Sep 17 00:00:00 2001 From: Yann Chemin Date: Thu, 30 Nov 2023 08:17:43 +0100 Subject: [PATCH 08/12] i.atcorr: add atmospheric correction support for Hyperion hyperspectral imagery (VNIR and SWIR parts) (#3272) * Added Hyperion VNIR SWIR CSV files * Added support for Hyperion VNIR and SWIR --- imagery/i.atcorr/geomcond.cpp | 6 +- imagery/i.atcorr/geomcond.h | 4 + imagery/i.atcorr/i.atcorr.html | 33 +- imagery/i.atcorr/iwave.cpp | 1483 ++++++++++++++++- imagery/i.atcorr/iwave.h | 2 + .../i.atcorr/sensors_csv/Hyperion_SWIR.csv | 149 ++ .../i.atcorr/sensors_csv/Hyperion_VNIR.csv | 51 + 7 files changed, 1724 insertions(+), 4 deletions(-) create mode 100644 imagery/i.atcorr/sensors_csv/Hyperion_SWIR.csv create mode 100644 imagery/i.atcorr/sensors_csv/Hyperion_VNIR.csv diff --git a/imagery/i.atcorr/geomcond.cpp b/imagery/i.atcorr/geomcond.cpp index aa7cb29bb55..87515a1b80e 100644 --- a/imagery/i.atcorr/geomcond.cpp +++ b/imagery/i.atcorr/geomcond.cpp @@ -399,6 +399,8 @@ void GeomCond::parse() case 29: /* planetscope0f10 * enter month,day,hh.ddd,long.,lat. */ case 30: /* worldview4 * enter month,day,hh.ddd,long.,lat. */ case 31: /* AVIRIS * enter month,day,hh.ddd,long.,lat. */ + case 32: /* Hyperion VNIR * enter month,day,hh.ddd,long.,lat. */ + case 33: /* Hyperion SWIR * enter month,day,hh.ddd,long.,lat. */ { cin >> month; cin >> jday; @@ -483,7 +485,9 @@ void GeomCond::print() string(" planetscope 0e observation "), string(" planetscope 0f 10 observation"), string(" worldview4 observation "), - string(" AVIRIS observation ")}; + string(" AVIRIS observation "), + string(" Hyperion VNIR observation "), + string(" Hyperion SWIR observation ")}; static const string head(" geometrical conditions identity "); static const string line(" ------------------------------- "); diff --git a/imagery/i.atcorr/geomcond.h b/imagery/i.atcorr/geomcond.h index 3ef2b2d042c..2a05d8b1989 100644 --- a/imagery/i.atcorr/geomcond.h +++ b/imagery/i.atcorr/geomcond.h @@ -91,6 +91,10 @@ /* */ /* 31 AVIRIS * enter month,day,hh.ddd,long.,lat. */ /* */ +/* 32 Hyperion VNIR * enter month,day,hh.ddd,long.,lat. */ +/* */ +/* 33 Hyperion SWIR * enter month,day,hh.ddd,long.,lat. */ +/* */ /* note: for hrv and tm experiments long. and lat. are the */ /* coordinates of the scene center. */ /* lat. must be > 0 for north lat., < 0 for south lat. */ diff --git a/imagery/i.atcorr/i.atcorr.html b/imagery/i.atcorr/i.atcorr.html index 932b9b34669..4383d2d8f44 100644 --- a/imagery/i.atcorr/i.atcorr.html +++ b/imagery/i.atcorr/i.atcorr.html @@ -253,11 +253,23 @@

A. Geometrical conditions

-30 +31 AVIRIS enter month,day,hh.ddd,long.,lat. * + +32 +Hyperion VNIR +enter month,day,hh.ddd,long.,lat. * + + + +33 +Hyperion SWIR +enter month,day,hh.ddd,long.,lat. * + +

@@ -477,7 +489,8 @@

E. Target altitude (xps), sensor platform (xpp)

For aircraft simulations only (xpp is neither equal to 0 nor equal to -1000):

-puw,po3 (water vapor content,ozone content between the aircraft and the surface) +puw (water vapor content between the aircraft and the surface) +
po3 (ozone content between the aircraft and the surface)
taerp (the aerosol optical thickness at 550nm between the aircraft and the surface)

If these data are not available, enter negative values for all of them. @@ -778,6 +791,19 @@

F. Sensor band

.AVIRIS b. band (+10nm) 431AVIRIS b223 band (2486nm) 432AVIRIS b224 band (2496nm) + +433Hyperion VNIR b8 band (427nm) +434Hyperion VNIR b9 band (437.16326nm) +.Hyperion VNIR b. band (+10.16326nm) +480Hyperion VNIR b56 band (914.83648nm) +481Hyperion VNIR b57 band (924.99974nm) + +482Hyperion SWIR b77 band (912nm) +483Hyperion SWIR b78 band (922.0884nm) +.Hyperion SWIR b. band (+10.0884nm) +627Hyperion SWIR b223 band (2384.9064nm) +628Hyperion SWIR b224 band (2394.9948nm) +

EXAMPLES

@@ -1148,3 +1174,6 @@

AUTHORS

Worldview4 addition 12/2018:
Markus Neteler, mundialis.de, Germany + +

AVIRIS/Hyperion addition 11/2023: +
Yann Chemin, SOPHIA Engineering, FR diff --git a/imagery/i.atcorr/iwave.cpp b/imagery/i.atcorr/iwave.cpp index 55bfb663a70..601697557ea 100644 --- a/imagery/i.atcorr/iwave.cpp +++ b/imagery/i.atcorr/iwave.cpp @@ -4797,6 +4797,8 @@ void IWave::planetscope0f10(int iwa) } } +/* Following filter function created using create_iwave.py */ + void IWave::aviris(int iwa) { @@ -6452,6 +6454,1478 @@ double IWave::equivwl() const return wlwave / seb; } +/* Following filter function created using create_iwave.py */ +/* This is from band 8 to band 57 of Hyperion (VNIR part), */ + +void IWave::hyperion_vnir(int iwa) +{ + + /* b8 of Hyperion_VNIR */ + static const float sr1[1] = {.9508}; + + /* b9 of Hyperion_VNIR */ + static const float sr2[3] = {.5412, .7871, .9669}; + + /* b10 of Hyperion_VNIR */ + static const float sr3[3] = {.5251, .7711, .9829}; + + /* b11 of Hyperion_VNIR */ + static const float sr4[3] = {.5090, .7550, .9990}; + + /* b12 of Hyperion_VNIR */ + static const float sr5[3] = {.7390, .9849, .7691}; + + /* b13 of Hyperion_VNIR */ + static const float sr6[3] = {.7229, .9689, .7851}; + + /* b14 of Hyperion_VNIR */ + static const float sr7[3] = {.7068, .9528, .8012}; + + /* b15 of Hyperion_VNIR */ + static const float sr8[3] = {.6908, .9368, .8173}; + + /* b16 of Hyperion_VNIR */ + static const float sr9[3] = {.6747, .9207, .8333}; + + /* b17 of Hyperion_VNIR */ + static const float sr10[3] = {.6586, .9046, .8494}; + + /* b18 of Hyperion_VNIR */ + static const float sr11[3] = {.6426, .8886, .8655}; + + /* b19 of Hyperion_VNIR */ + static const float sr12[3] = {.6265, .8725, .8815}; + + /* b20 of Hyperion_VNIR */ + static const float sr13[3] = {.6104, .8564, .8976}; + + /* b21 of Hyperion_VNIR */ + static const float sr14[3] = {.5944, .8404, .9136}; + + /* b22 of Hyperion_VNIR */ + static const float sr15[3] = {.5783, .8243, .9297}; + + /* b23 of Hyperion_VNIR */ + static const float sr16[3] = {.5623, .8082, .9458}; + + /* b24 of Hyperion_VNIR */ + static const float sr17[3] = {.5462, .7922, .9618}; + + /* b25 of Hyperion_VNIR */ + static const float sr18[3] = {.5301, .7761, .9779}; + + /* b26 of Hyperion_VNIR */ + static const float sr19[3] = {.5141, .7600, .9940}; + + /* b27 of Hyperion_VNIR */ + static const float sr20[3] = {.7440, .9900, .7640}; + + /* b28 of Hyperion_VNIR */ + static const float sr21[3] = {.7279, .9739, .7801}; + + /* b29 of Hyperion_VNIR */ + static const float sr22[3] = {.7119, .9578, .7962}; + + /* b30 of Hyperion_VNIR */ + static const float sr23[3] = {.6958, .9418, .8122}; + + /* b31 of Hyperion_VNIR */ + static const float sr24[3] = {.6797, .9257, .8283}; + + /* b32 of Hyperion_VNIR */ + static const float sr25[3] = {.6637, .9097, .8444}; + + /* b33 of Hyperion_VNIR */ + static const float sr26[3] = {.6476, .8936, .8604}; + + /* b34 of Hyperion_VNIR */ + static const float sr27[3] = {.6315, .8775, .8765}; + + /* b35 of Hyperion_VNIR */ + static const float sr28[3] = {.6155, .8615, .8926}; + + /* b36 of Hyperion_VNIR */ + static const float sr29[3] = {.5994, .8454, .9086}; + + /* b37 of Hyperion_VNIR */ + static const float sr30[3] = {.5833, .8293, .9247}; + + /* b38 of Hyperion_VNIR */ + static const float sr31[3] = {.5673, .8133, .9407}; + + /* b39 of Hyperion_VNIR */ + static const float sr32[3] = {.5512, .7972, .9568}; + + /* b40 of Hyperion_VNIR */ + static const float sr33[3] = {.5352, .7811, .9729}; + + /* b41 of Hyperion_VNIR */ + static const float sr34[3] = {.5191, .7651, .9889}; + + /* b42 of Hyperion_VNIR */ + static const float sr35[3] = {.7490, .9950, .7590}; + + /* b43 of Hyperion_VNIR */ + static const float sr36[3] = {.7329, .9789, .7751}; + + /* b44 of Hyperion_VNIR */ + static const float sr37[3] = {.7169, .9629, .7911}; + + /* b45 of Hyperion_VNIR */ + static const float sr38[3] = {.7008, .9468, .8072}; + + /* b46 of Hyperion_VNIR */ + static const float sr39[3] = {.6848, .9307, .8233}; + + /* b47 of Hyperion_VNIR */ + static const float sr40[3] = {.6687, .9147, .8393}; + + /* b48 of Hyperion_VNIR */ + static const float sr41[3] = {.6526, .8986, .8554}; + + /* b49 of Hyperion_VNIR */ + static const float sr42[3] = {.6366, .8826, .8715}; + + /* b50 of Hyperion_VNIR */ + static const float sr43[3] = {.6205, .8665, .8875}; + + /* b51 of Hyperion_VNIR */ + static const float sr44[3] = {.6044, .8504, .9036}; + + /* b52 of Hyperion_VNIR */ + static const float sr45[3] = {.5884, .8344, .9197}; + + /* b53 of Hyperion_VNIR */ + static const float sr46[3] = {.5723, .8183, .9357}; + + /* b54 of Hyperion_VNIR */ + static const float sr47[3] = {.5562, .8022, .9518}; + + /* b55 of Hyperion_VNIR */ + static const float sr48[3] = {.5402, .7862, .9678}; + + /* b56 of Hyperion_VNIR */ + static const float sr49[3] = {.5241, .7701, .9839}; + + /* b57 of Hyperion_VNIR */ + static const float sr50[1] = {.5081}; + + static const float wli[50] = { + 0.4275, 0.4325, 0.4425, 0.4525, 0.4650, 0.4750, 0.4850, 0.4950, 0.5050, + 0.5150, 0.5250, 0.5350, 0.5450, 0.5550, 0.5650, 0.5750, 0.5850, 0.5950, + 0.6050, 0.6175, 0.6275, 0.6375, 0.6475, 0.6575, 0.6675, 0.6775, 0.6875, + 0.6975, 0.7075, 0.7175, 0.7275, 0.7375, 0.7475, 0.7575, 0.7700, 0.7800, + 0.7900, 0.8000, 0.8100, 0.8200, 0.8300, 0.8400, 0.8500, 0.8600, 0.8700, + 0.8800, 0.8900, 0.9000, 0.9100, 0.9200}; + static const float wls[50] = { + 0.4300, 0.4400, 0.4500, 0.4600, 0.4725, 0.4825, 0.4925, 0.5025, 0.5125, + 0.5225, 0.5325, 0.5425, 0.5525, 0.5625, 0.5725, 0.5825, 0.5925, 0.6025, + 0.6125, 0.6250, 0.6350, 0.6450, 0.6550, 0.6650, 0.6750, 0.6850, 0.6950, + 0.7050, 0.7150, 0.7250, 0.7350, 0.7450, 0.7550, 0.7650, 0.7775, 0.7875, + 0.7975, 0.8075, 0.8175, 0.8275, 0.8375, 0.8475, 0.8575, 0.8675, 0.8775, + 0.8875, 0.8975, 0.9075, 0.9175, 0.9225}; + + ffu.wlinf = (float)wli[iwa - 1]; + ffu.wlsup = (float)wls[iwa - 1]; + + int i; + for (i = 0; i < 1501; i++) + ffu.s[i] = 0; + + switch (iwa) { + case 1: + for (i = 0; i < 1; i++) + ffu.s[71 + i] = sr1[i]; + break; + case 2: + for (i = 0; i < 3; i++) + ffu.s[73 + i] = sr2[i]; + break; + case 3: + for (i = 0; i < 3; i++) + ffu.s[77 + i] = sr3[i]; + break; + case 4: + for (i = 0; i < 3; i++) + ffu.s[81 + i] = sr4[i]; + break; + case 5: + for (i = 0; i < 3; i++) + ffu.s[86 + i] = sr5[i]; + break; + case 6: + for (i = 0; i < 3; i++) + ffu.s[90 + i] = sr6[i]; + break; + case 7: + for (i = 0; i < 3; i++) + ffu.s[94 + i] = sr7[i]; + break; + case 8: + for (i = 0; i < 3; i++) + ffu.s[98 + i] = sr8[i]; + break; + case 9: + for (i = 0; i < 3; i++) + ffu.s[102 + i] = sr9[i]; + break; + case 10: + for (i = 0; i < 3; i++) + ffu.s[106 + i] = sr10[i]; + break; + case 11: + for (i = 0; i < 3; i++) + ffu.s[110 + i] = sr11[i]; + break; + case 12: + for (i = 0; i < 3; i++) + ffu.s[114 + i] = sr12[i]; + break; + case 13: + for (i = 0; i < 3; i++) + ffu.s[118 + i] = sr13[i]; + break; + case 14: + for (i = 0; i < 3; i++) + ffu.s[122 + i] = sr14[i]; + break; + case 15: + for (i = 0; i < 3; i++) + ffu.s[126 + i] = sr15[i]; + break; + case 16: + for (i = 0; i < 3; i++) + ffu.s[130 + i] = sr16[i]; + break; + case 17: + for (i = 0; i < 3; i++) + ffu.s[134 + i] = sr17[i]; + break; + case 18: + for (i = 0; i < 3; i++) + ffu.s[138 + i] = sr18[i]; + break; + case 19: + for (i = 0; i < 3; i++) + ffu.s[142 + i] = sr19[i]; + break; + case 20: + for (i = 0; i < 3; i++) + ffu.s[147 + i] = sr20[i]; + break; + case 21: + for (i = 0; i < 3; i++) + ffu.s[151 + i] = sr21[i]; + break; + case 22: + for (i = 0; i < 3; i++) + ffu.s[155 + i] = sr22[i]; + break; + case 23: + for (i = 0; i < 3; i++) + ffu.s[159 + i] = sr23[i]; + break; + case 24: + for (i = 0; i < 3; i++) + ffu.s[163 + i] = sr24[i]; + break; + case 25: + for (i = 0; i < 3; i++) + ffu.s[167 + i] = sr25[i]; + break; + case 26: + for (i = 0; i < 3; i++) + ffu.s[171 + i] = sr26[i]; + break; + case 27: + for (i = 0; i < 3; i++) + ffu.s[175 + i] = sr27[i]; + break; + case 28: + for (i = 0; i < 3; i++) + ffu.s[179 + i] = sr28[i]; + break; + case 29: + for (i = 0; i < 3; i++) + ffu.s[183 + i] = sr29[i]; + break; + case 30: + for (i = 0; i < 3; i++) + ffu.s[187 + i] = sr30[i]; + break; + case 31: + for (i = 0; i < 3; i++) + ffu.s[191 + i] = sr31[i]; + break; + case 32: + for (i = 0; i < 3; i++) + ffu.s[195 + i] = sr32[i]; + break; + case 33: + for (i = 0; i < 3; i++) + ffu.s[199 + i] = sr33[i]; + break; + case 34: + for (i = 0; i < 3; i++) + ffu.s[203 + i] = sr34[i]; + break; + case 35: + for (i = 0; i < 3; i++) + ffu.s[208 + i] = sr35[i]; + break; + case 36: + for (i = 0; i < 3; i++) + ffu.s[212 + i] = sr36[i]; + break; + case 37: + for (i = 0; i < 3; i++) + ffu.s[216 + i] = sr37[i]; + break; + case 38: + for (i = 0; i < 3; i++) + ffu.s[220 + i] = sr38[i]; + break; + case 39: + for (i = 0; i < 3; i++) + ffu.s[224 + i] = sr39[i]; + break; + case 40: + for (i = 0; i < 3; i++) + ffu.s[228 + i] = sr40[i]; + break; + case 41: + for (i = 0; i < 3; i++) + ffu.s[232 + i] = sr41[i]; + break; + case 42: + for (i = 0; i < 3; i++) + ffu.s[236 + i] = sr42[i]; + break; + case 43: + for (i = 0; i < 3; i++) + ffu.s[240 + i] = sr43[i]; + break; + case 44: + for (i = 0; i < 3; i++) + ffu.s[244 + i] = sr44[i]; + break; + case 45: + for (i = 0; i < 3; i++) + ffu.s[248 + i] = sr45[i]; + break; + case 46: + for (i = 0; i < 3; i++) + ffu.s[252 + i] = sr46[i]; + break; + case 47: + for (i = 0; i < 3; i++) + ffu.s[256 + i] = sr47[i]; + break; + case 48: + for (i = 0; i < 3; i++) + ffu.s[260 + i] = sr48[i]; + break; + case 49: + for (i = 0; i < 3; i++) + ffu.s[264 + i] = sr49[i]; + break; + case 50: + for (i = 0; i < 1; i++) + ffu.s[268 + i] = sr50[i]; + break; + } +} + +/* Following filter function created using create_iwave.py */ +/* This is from band 77 to band 224 of Hyperion (SWIR part), */ + +void IWave::hyperion_swir(int iwa) +{ + + /* b77 of Hyperion_SWIR */ + static const float sr1[1] = {.9504}; + + /* b78 of Hyperion_SWIR */ + static const float sr2[3] = {.5452, .7930, .9592}; + + /* b79 of Hyperion_SWIR */ + static const float sr3[3] = {.5364, .7842, .9680}; + + /* b80 of Hyperion_SWIR */ + static const float sr4[3] = {.5277, .7755, .9767}; + + /* b81 of Hyperion_SWIR */ + static const float sr5[3] = {.5189, .7667, .9855}; + + /* b82 of Hyperion_SWIR */ + static const float sr6[3] = {.5101, .7579, .9943}; + + /* b83 of Hyperion_SWIR */ + static const float sr7[3] = {.7492, .9970, .7552}; + + /* b84 of Hyperion_SWIR */ + static const float sr8[3] = {.7404, .9882, .7640}; + + /* b85 of Hyperion_SWIR */ + static const float sr9[3] = {.7317, .9795, .7727}; + + /* b86 of Hyperion_SWIR */ + static const float sr10[3] = {.7229, .9707, .7815}; + + /* b87 of Hyperion_SWIR */ + static const float sr11[3] = {.7141, .9619, .7903}; + + /* b88 of Hyperion_SWIR */ + static const float sr12[3] = {.7054, .9532, .7990}; + + /* b89 of Hyperion_SWIR */ + static const float sr13[3] = {.6966, .9444, .8078}; + + /* b90 of Hyperion_SWIR */ + static const float sr14[3] = {.6878, .9356, .8165}; + + /* b91 of Hyperion_SWIR */ + static const float sr15[3] = {.6791, .9269, .8253}; + + /* b92 of Hyperion_SWIR */ + static const float sr16[3] = {.6703, .9181, .8341}; + + /* b93 of Hyperion_SWIR */ + static const float sr17[3] = {.6616, .9094, .8428}; + + /* b94 of Hyperion_SWIR */ + static const float sr18[3] = {.6528, .9006, .8516}; + + /* b95 of Hyperion_SWIR */ + static const float sr19[3] = {.6440, .8918, .8604}; + + /* b96 of Hyperion_SWIR */ + static const float sr20[3] = {.6353, .8831, .8691}; + + /* b97 of Hyperion_SWIR */ + static const float sr21[3] = {.6265, .8743, .8779}; + + /* b98 of Hyperion_SWIR */ + static const float sr22[3] = {.6177, .8655, .8866}; + + /* b99 of Hyperion_SWIR */ + static const float sr23[3] = {.6090, .8568, .8954}; + + /* b100 of Hyperion_SWIR */ + static const float sr24[3] = {.6002, .8480, .9042}; + + /* b101 of Hyperion_SWIR */ + static const float sr25[3] = {.5915, .8393, .9129}; + + /* b102 of Hyperion_SWIR */ + static const float sr26[3] = {.5827, .8305, .9217}; + + /* b103 of Hyperion_SWIR */ + static const float sr27[3] = {.5739, .8217, .9305}; + + /* b104 of Hyperion_SWIR */ + static const float sr28[3] = {.5652, .8130, .9392}; + + /* b105 of Hyperion_SWIR */ + static const float sr29[3] = {.5564, .8042, .9480}; + + /* b106 of Hyperion_SWIR */ + static const float sr30[3] = {.5476, .7954, .9567}; + + /* b107 of Hyperion_SWIR */ + static const float sr31[3] = {.5389, .7867, .9655}; + + /* b108 of Hyperion_SWIR */ + static const float sr32[3] = {.5301, .7779, .9743}; + + /* b109 of Hyperion_SWIR */ + static const float sr33[3] = {.5214, .7692, .9830}; + + /* b110 of Hyperion_SWIR */ + static const float sr34[3] = {.5126, .7604, .9918}; + + /* b111 of Hyperion_SWIR */ + static const float sr35[3] = {.7516, .9994, .7527}; + + /* b112 of Hyperion_SWIR */ + static const float sr36[3] = {.7429, .9907, .7615}; + + /* b113 of Hyperion_SWIR */ + static const float sr37[3] = {.7341, .9819, .7703}; + + /* b114 of Hyperion_SWIR */ + static const float sr38[3] = {.7253, .9732, .7790}; + + /* b115 of Hyperion_SWIR */ + static const float sr39[3] = {.7166, .9644, .7878}; + + /* b116 of Hyperion_SWIR */ + static const float sr40[3] = {.7078, .9556, .7966}; + + /* b117 of Hyperion_SWIR */ + static const float sr41[3] = {.6991, .9469, .8053}; + + /* b118 of Hyperion_SWIR */ + static const float sr42[3] = {.6903, .9381, .8141}; + + /* b119 of Hyperion_SWIR */ + static const float sr43[3] = {.6815, .9293, .8228}; + + /* b120 of Hyperion_SWIR */ + static const float sr44[3] = {.6728, .9206, .8316}; + + /* b121 of Hyperion_SWIR */ + static const float sr45[3] = {.6640, .9118, .8404}; + + /* b122 of Hyperion_SWIR */ + static const float sr46[3] = {.6552, .9031, .8491}; + + /* b123 of Hyperion_SWIR */ + static const float sr47[3] = {.6465, .8943, .8579}; + + /* b124 of Hyperion_SWIR */ + static const float sr48[3] = {.6377, .8855, .8667}; + + /* b125 of Hyperion_SWIR */ + static const float sr49[3] = {.6290, .8768, .8754}; + + /* b126 of Hyperion_SWIR */ + static const float sr50[3] = {.6202, .8680, .8842}; + + /* b127 of Hyperion_SWIR */ + static const float sr51[3] = {.6114, .8592, .8929}; + + /* b128 of Hyperion_SWIR */ + static const float sr52[3] = {.6027, .8505, .9017}; + + /* b129 of Hyperion_SWIR */ + static const float sr53[3] = {.5939, .8417, .9105}; + + /* b130 of Hyperion_SWIR */ + static const float sr54[3] = {.5851, .8330, .9192}; + + /* b131 of Hyperion_SWIR */ + static const float sr55[3] = {.5764, .8242, .9280}; + + /* b132 of Hyperion_SWIR */ + static const float sr56[3] = {.5676, .8154, .9368}; + + /* b133 of Hyperion_SWIR */ + static const float sr57[3] = {.5589, .8067, .9455}; + + /* b134 of Hyperion_SWIR */ + static const float sr58[3] = {.5501, .7979, .9543}; + + /* b135 of Hyperion_SWIR */ + static const float sr59[3] = {.5413, .7891, .9630}; + + /* b136 of Hyperion_SWIR */ + static const float sr60[3] = {.5326, .7804, .9718}; + + /* b137 of Hyperion_SWIR */ + static const float sr61[3] = {.5238, .7716, .9806}; + + /* b138 of Hyperion_SWIR */ + static const float sr62[3] = {.5150, .7629, .9893}; + + /* b139 of Hyperion_SWIR */ + static const float sr63[3] = {.5063, .7541, .9981}; + + /* b140 of Hyperion_SWIR */ + static const float sr64[3] = {.7453, .9931, .7590}; + + /* b141 of Hyperion_SWIR */ + static const float sr65[3] = {.7366, .9844, .7678}; + + /* b142 of Hyperion_SWIR */ + static const float sr66[3] = {.7278, .9756, .7766}; + + /* b143 of Hyperion_SWIR */ + static const float sr67[3] = {.7190, .9669, .7853}; + + /* b144 of Hyperion_SWIR */ + static const float sr68[3] = {.7103, .9581, .7941}; + + /* b145 of Hyperion_SWIR */ + static const float sr69[3] = {.7015, .9493, .8029}; + + /* b146 of Hyperion_SWIR */ + static const float sr70[3] = {.6928, .9406, .8116}; + + /* b147 of Hyperion_SWIR */ + static const float sr71[3] = {.6840, .9318, .8204}; + + /* b148 of Hyperion_SWIR */ + static const float sr72[3] = {.6752, .9230, .8292}; + + /* b149 of Hyperion_SWIR */ + static const float sr73[3] = {.6665, .9143, .8379}; + + /* b150 of Hyperion_SWIR */ + static const float sr74[3] = {.6577, .9055, .8467}; + + /* b151 of Hyperion_SWIR */ + static const float sr75[3] = {.6489, .8968, .8554}; + + /* b152 of Hyperion_SWIR */ + static const float sr76[3] = {.6402, .8880, .8642}; + + /* b153 of Hyperion_SWIR */ + static const float sr77[3] = {.6314, .8792, .8730}; + + /* b154 of Hyperion_SWIR */ + static const float sr78[3] = {.6227, .8705, .8817}; + + /* b155 of Hyperion_SWIR */ + static const float sr79[3] = {.6139, .8617, .8905}; + + /* b156 of Hyperion_SWIR */ + static const float sr80[3] = {.6051, .8529, .8993}; + + /* b157 of Hyperion_SWIR */ + static const float sr81[3] = {.5964, .8442, .9080}; + + /* b158 of Hyperion_SWIR */ + static const float sr82[3] = {.5876, .8354, .9168}; + + /* b159 of Hyperion_SWIR */ + static const float sr83[3] = {.5788, .8267, .9255}; + + /* b160 of Hyperion_SWIR */ + static const float sr84[3] = {.5701, .8179, .9343}; + + /* b161 of Hyperion_SWIR */ + static const float sr85[3] = {.5613, .8091, .9431}; + + /* b162 of Hyperion_SWIR */ + static const float sr86[3] = {.5526, .8004, .9518}; + + /* b163 of Hyperion_SWIR */ + static const float sr87[3] = {.5438, .7916, .9606}; + + /* b164 of Hyperion_SWIR */ + static const float sr88[3] = {.5350, .7828, .9694}; + + /* b165 of Hyperion_SWIR */ + static const float sr89[3] = {.5263, .7741, .9781}; + + /* b166 of Hyperion_SWIR */ + static const float sr90[3] = {.5175, .7653, .9869}; + + /* b167 of Hyperion_SWIR */ + static const float sr91[3] = {.5087, .7566, .9956}; + + /* b168 of Hyperion_SWIR */ + static const float sr92[3] = {.7478, .9956, .7566}; + + /* b169 of Hyperion_SWIR */ + static const float sr93[3] = {.7390, .9868, .7654}; + + /* b170 of Hyperion_SWIR */ + static const float sr94[3] = {.7303, .9781, .7741}; + + /* b171 of Hyperion_SWIR */ + static const float sr95[3] = {.7215, .9693, .7829}; + + /* b172 of Hyperion_SWIR */ + static const float sr96[3] = {.7127, .9605, .7916}; + + /* b173 of Hyperion_SWIR */ + static const float sr97[3] = {.7040, .9518, .8004}; + + /* b174 of Hyperion_SWIR */ + static const float sr98[3] = {.6952, .9430, .8092}; + + /* b175 of Hyperion_SWIR */ + static const float sr99[3] = {.6865, .9343, .8179}; + + /* b176 of Hyperion_SWIR */ + static const float sr100[3] = {.6777, .9255, .8267}; + + /* b177 of Hyperion_SWIR */ + static const float sr101[3] = {.6689, .9167, .8355}; + + /* b178 of Hyperion_SWIR */ + static const float sr102[3] = {.6602, .9080, .8442}; + + /* b179 of Hyperion_SWIR */ + static const float sr103[3] = {.6514, .8992, .8530}; + + /* b180 of Hyperion_SWIR */ + static const float sr104[3] = {.6426, .8904, .8617}; + + /* b181 of Hyperion_SWIR */ + static const float sr105[3] = {.6339, .8817, .8705}; + + /* b182 of Hyperion_SWIR */ + static const float sr106[3] = {.6251, .8729, .8793}; + + /* b183 of Hyperion_SWIR */ + static const float sr107[3] = {.6164, .8642, .8880}; + + /* b184 of Hyperion_SWIR */ + static const float sr108[3] = {.6076, .8554, .8968}; + + /* b185 of Hyperion_SWIR */ + static const float sr109[3] = {.5988, .8466, .9056}; + + /* b186 of Hyperion_SWIR */ + static const float sr110[3] = {.5901, .8379, .9143}; + + /* b187 of Hyperion_SWIR */ + static const float sr111[3] = {.5813, .8291, .9231}; + + /* b188 of Hyperion_SWIR */ + static const float sr112[3] = {.5725, .8203, .9318}; + + /* b189 of Hyperion_SWIR */ + static const float sr113[3] = {.5638, .8116, .9406}; + + /* b190 of Hyperion_SWIR */ + static const float sr114[3] = {.5550, .8028, .9494}; + + /* b191 of Hyperion_SWIR */ + static const float sr115[3] = {.5463, .7941, .9581}; + + /* b192 of Hyperion_SWIR */ + static const float sr116[3] = {.5375, .7853, .9669}; + + /* b193 of Hyperion_SWIR */ + static const float sr117[3] = {.5287, .7765, .9757}; + + /* b194 of Hyperion_SWIR */ + static const float sr118[3] = {.5200, .7678, .9844}; + + /* b195 of Hyperion_SWIR */ + static const float sr119[3] = {.5112, .7590, .9932}; + + /* b196 of Hyperion_SWIR */ + static const float sr120[3] = {.7502, .9981, .7541}; + + /* b197 of Hyperion_SWIR */ + static const float sr121[3] = {.7415, .9893, .7629}; + + /* b198 of Hyperion_SWIR */ + static const float sr122[3] = {.7327, .9805, .7717}; + + /* b199 of Hyperion_SWIR */ + static const float sr123[3] = {.7240, .9718, .7804}; + + /* b200 of Hyperion_SWIR */ + static const float sr124[3] = {.7152, .9630, .7892}; + + /* b201 of Hyperion_SWIR */ + static const float sr125[3] = {.7064, .9542, .7979}; + + /* b202 of Hyperion_SWIR */ + static const float sr126[3] = {.6977, .9455, .8067}; + + /* b203 of Hyperion_SWIR */ + static const float sr127[3] = {.6889, .9367, .8155}; + + /* b204 of Hyperion_SWIR */ + static const float sr128[3] = {.6801, .9280, .8242}; + + /* b205 of Hyperion_SWIR */ + static const float sr129[3] = {.6714, .9192, .8330}; + + /* b206 of Hyperion_SWIR */ + static const float sr130[3] = {.6626, .9104, .8418}; + + /* b207 of Hyperion_SWIR */ + static const float sr131[3] = {.6539, .9017, .8505}; + + /* b208 of Hyperion_SWIR */ + static const float sr132[3] = {.6451, .8929, .8593}; + + /* b209 of Hyperion_SWIR */ + static const float sr133[3] = {.6363, .8841, .8680}; + + /* b210 of Hyperion_SWIR */ + static const float sr134[3] = {.6276, .8754, .8768}; + + /* b211 of Hyperion_SWIR */ + static const float sr135[3] = {.6188, .8666, .8856}; + + /* b212 of Hyperion_SWIR */ + static const float sr136[3] = {.6100, .8579, .8943}; + + /* b213 of Hyperion_SWIR */ + static const float sr137[3] = {.6013, .8491, .9031}; + + /* b214 of Hyperion_SWIR */ + static const float sr138[3] = {.5925, .8403, .9119}; + + /* b215 of Hyperion_SWIR */ + static const float sr139[3] = {.5838, .8316, .9206}; + + /* b216 of Hyperion_SWIR */ + static const float sr140[3] = {.5750, .8228, .9294}; + + /* b217 of Hyperion_SWIR */ + static const float sr141[3] = {.5662, .8140, .9381}; + + /* b218 of Hyperion_SWIR */ + static const float sr142[3] = {.5575, .8053, .9469}; + + /* b219 of Hyperion_SWIR */ + static const float sr143[3] = {.5487, .7965, .9557}; + + /* b220 of Hyperion_SWIR */ + static const float sr144[3] = {.5399, .7878, .9644}; + + /* b221 of Hyperion_SWIR */ + static const float sr145[3] = {.5312, .7790, .9732}; + + /* b222 of Hyperion_SWIR */ + static const float sr146[3] = {.5224, .7702, .9820}; + + /* b223 of Hyperion_SWIR */ + static const float sr147[3] = {.5137, .7615, .9907}; + + /* b224 of Hyperion_SWIR */ + static const float sr148[1] = {.5049}; + + static const float wli[148] = { + 0.9125, 0.9175, 0.9275, 0.9375, 0.9475, 0.9575, 0.9700, 0.9800, 0.9900, + 1.0000, 1.0100, 1.0200, 1.0300, 1.0400, 1.0500, 1.0600, 1.0700, 1.0800, + 1.0900, 1.1000, 1.1100, 1.1200, 1.1300, 1.1400, 1.1500, 1.1600, 1.1700, + 1.1800, 1.1900, 1.2000, 1.2100, 1.2200, 1.2300, 1.2400, 1.2525, 1.2625, + 1.2725, 1.2825, 1.2925, 1.3025, 1.3125, 1.3225, 1.3325, 1.3425, 1.3525, + 1.3625, 1.3725, 1.3825, 1.3925, 1.4025, 1.4125, 1.4225, 1.4325, 1.4425, + 1.4525, 1.4625, 1.4725, 1.4825, 1.4925, 1.5025, 1.5125, 1.5225, 1.5325, + 1.5450, 1.5550, 1.5650, 1.5750, 1.5850, 1.5950, 1.6050, 1.6150, 1.6250, + 1.6350, 1.6450, 1.6550, 1.6650, 1.6750, 1.6850, 1.6950, 1.7050, 1.7150, + 1.7250, 1.7350, 1.7450, 1.7550, 1.7650, 1.7750, 1.7850, 1.7950, 1.8050, + 1.8150, 1.8275, 1.8375, 1.8475, 1.8575, 1.8675, 1.8775, 1.8875, 1.8975, + 1.9075, 1.9175, 1.9275, 1.9375, 1.9475, 1.9575, 1.9675, 1.9775, 1.9875, + 1.9975, 2.0075, 2.0175, 2.0275, 2.0375, 2.0475, 2.0575, 2.0675, 2.0775, + 2.0875, 2.0975, 2.1100, 2.1200, 2.1300, 2.1400, 2.1500, 2.1600, 2.1700, + 2.1800, 2.1900, 2.2000, 2.2100, 2.2200, 2.2300, 2.2400, 2.2500, 2.2600, + 2.2700, 2.2800, 2.2900, 2.3000, 2.3100, 2.3200, 2.3300, 2.3400, 2.3500, + 2.3600, 2.3700, 2.3800, 2.3900}; + static const float wls[148] = { + 0.9150, 0.9250, 0.9350, 0.9450, 0.9550, 0.9650, 0.9775, 0.9875, 0.9975, + 1.0075, 1.0175, 1.0275, 1.0375, 1.0475, 1.0575, 1.0675, 1.0775, 1.0875, + 1.0975, 1.1075, 1.1175, 1.1275, 1.1375, 1.1475, 1.1575, 1.1675, 1.1775, + 1.1875, 1.1975, 1.2075, 1.2175, 1.2275, 1.2375, 1.2475, 1.2600, 1.2700, + 1.2800, 1.2900, 1.3000, 1.3100, 1.3200, 1.3300, 1.3400, 1.3500, 1.3600, + 1.3700, 1.3800, 1.3900, 1.4000, 1.4100, 1.4200, 1.4300, 1.4400, 1.4500, + 1.4600, 1.4700, 1.4800, 1.4900, 1.5000, 1.5100, 1.5200, 1.5300, 1.5400, + 1.5525, 1.5625, 1.5725, 1.5825, 1.5925, 1.6025, 1.6125, 1.6225, 1.6325, + 1.6425, 1.6525, 1.6625, 1.6725, 1.6825, 1.6925, 1.7025, 1.7125, 1.7225, + 1.7325, 1.7425, 1.7525, 1.7625, 1.7725, 1.7825, 1.7925, 1.8025, 1.8125, + 1.8225, 1.8350, 1.8450, 1.8550, 1.8650, 1.8750, 1.8850, 1.8950, 1.9050, + 1.9150, 1.9250, 1.9350, 1.9450, 1.9550, 1.9650, 1.9750, 1.9850, 1.9950, + 2.0050, 2.0150, 2.0250, 2.0350, 2.0450, 2.0550, 2.0650, 2.0750, 2.0850, + 2.0950, 2.1050, 2.1175, 2.1275, 2.1375, 2.1475, 2.1575, 2.1675, 2.1775, + 2.1875, 2.1975, 2.2075, 2.2175, 2.2275, 2.2375, 2.2475, 2.2575, 2.2675, + 2.2775, 2.2875, 2.2975, 2.3075, 2.3175, 2.3275, 2.3375, 2.3475, 2.3575, + 2.3675, 2.3775, 2.3875, 2.3925}; + + ffu.wlinf = (float)wli[iwa - 1]; + ffu.wlsup = (float)wls[iwa - 1]; + + int i; + for (i = 0; i < 1501; i++) + ffu.s[i] = 0; + + switch (iwa) { + case 1: + for (i = 0; i < 1; i++) + ffu.s[265 + i] = sr1[i]; + break; + case 2: + for (i = 0; i < 3; i++) + ffu.s[267 + i] = sr2[i]; + break; + case 3: + for (i = 0; i < 3; i++) + ffu.s[271 + i] = sr3[i]; + break; + case 4: + for (i = 0; i < 3; i++) + ffu.s[275 + i] = sr4[i]; + break; + case 5: + for (i = 0; i < 3; i++) + ffu.s[279 + i] = sr5[i]; + break; + case 6: + for (i = 0; i < 3; i++) + ffu.s[283 + i] = sr6[i]; + break; + case 7: + for (i = 0; i < 3; i++) + ffu.s[288 + i] = sr7[i]; + break; + case 8: + for (i = 0; i < 3; i++) + ffu.s[292 + i] = sr8[i]; + break; + case 9: + for (i = 0; i < 3; i++) + ffu.s[296 + i] = sr9[i]; + break; + case 10: + for (i = 0; i < 3; i++) + ffu.s[300 + i] = sr10[i]; + break; + case 11: + for (i = 0; i < 3; i++) + ffu.s[304 + i] = sr11[i]; + break; + case 12: + for (i = 0; i < 3; i++) + ffu.s[308 + i] = sr12[i]; + break; + case 13: + for (i = 0; i < 3; i++) + ffu.s[312 + i] = sr13[i]; + break; + case 14: + for (i = 0; i < 3; i++) + ffu.s[316 + i] = sr14[i]; + break; + case 15: + for (i = 0; i < 3; i++) + ffu.s[320 + i] = sr15[i]; + break; + case 16: + for (i = 0; i < 3; i++) + ffu.s[324 + i] = sr16[i]; + break; + case 17: + for (i = 0; i < 3; i++) + ffu.s[328 + i] = sr17[i]; + break; + case 18: + for (i = 0; i < 3; i++) + ffu.s[332 + i] = sr18[i]; + break; + case 19: + for (i = 0; i < 3; i++) + ffu.s[336 + i] = sr19[i]; + break; + case 20: + for (i = 0; i < 3; i++) + ffu.s[340 + i] = sr20[i]; + break; + case 21: + for (i = 0; i < 3; i++) + ffu.s[344 + i] = sr21[i]; + break; + case 22: + for (i = 0; i < 3; i++) + ffu.s[348 + i] = sr22[i]; + break; + case 23: + for (i = 0; i < 3; i++) + ffu.s[352 + i] = sr23[i]; + break; + case 24: + for (i = 0; i < 3; i++) + ffu.s[356 + i] = sr24[i]; + break; + case 25: + for (i = 0; i < 3; i++) + ffu.s[360 + i] = sr25[i]; + break; + case 26: + for (i = 0; i < 3; i++) + ffu.s[364 + i] = sr26[i]; + break; + case 27: + for (i = 0; i < 3; i++) + ffu.s[368 + i] = sr27[i]; + break; + case 28: + for (i = 0; i < 3; i++) + ffu.s[372 + i] = sr28[i]; + break; + case 29: + for (i = 0; i < 3; i++) + ffu.s[376 + i] = sr29[i]; + break; + case 30: + for (i = 0; i < 3; i++) + ffu.s[380 + i] = sr30[i]; + break; + case 31: + for (i = 0; i < 3; i++) + ffu.s[384 + i] = sr31[i]; + break; + case 32: + for (i = 0; i < 3; i++) + ffu.s[388 + i] = sr32[i]; + break; + case 33: + for (i = 0; i < 3; i++) + ffu.s[392 + i] = sr33[i]; + break; + case 34: + for (i = 0; i < 3; i++) + ffu.s[396 + i] = sr34[i]; + break; + case 35: + for (i = 0; i < 3; i++) + ffu.s[401 + i] = sr35[i]; + break; + case 36: + for (i = 0; i < 3; i++) + ffu.s[405 + i] = sr36[i]; + break; + case 37: + for (i = 0; i < 3; i++) + ffu.s[409 + i] = sr37[i]; + break; + case 38: + for (i = 0; i < 3; i++) + ffu.s[413 + i] = sr38[i]; + break; + case 39: + for (i = 0; i < 3; i++) + ffu.s[417 + i] = sr39[i]; + break; + case 40: + for (i = 0; i < 3; i++) + ffu.s[421 + i] = sr40[i]; + break; + case 41: + for (i = 0; i < 3; i++) + ffu.s[425 + i] = sr41[i]; + break; + case 42: + for (i = 0; i < 3; i++) + ffu.s[429 + i] = sr42[i]; + break; + case 43: + for (i = 0; i < 3; i++) + ffu.s[433 + i] = sr43[i]; + break; + case 44: + for (i = 0; i < 3; i++) + ffu.s[437 + i] = sr44[i]; + break; + case 45: + for (i = 0; i < 3; i++) + ffu.s[441 + i] = sr45[i]; + break; + case 46: + for (i = 0; i < 3; i++) + ffu.s[445 + i] = sr46[i]; + break; + case 47: + for (i = 0; i < 3; i++) + ffu.s[449 + i] = sr47[i]; + break; + case 48: + for (i = 0; i < 3; i++) + ffu.s[453 + i] = sr48[i]; + break; + case 49: + for (i = 0; i < 3; i++) + ffu.s[457 + i] = sr49[i]; + break; + case 50: + for (i = 0; i < 3; i++) + ffu.s[461 + i] = sr50[i]; + break; + case 51: + for (i = 0; i < 3; i++) + ffu.s[465 + i] = sr51[i]; + break; + case 52: + for (i = 0; i < 3; i++) + ffu.s[469 + i] = sr52[i]; + break; + case 53: + for (i = 0; i < 3; i++) + ffu.s[473 + i] = sr53[i]; + break; + case 54: + for (i = 0; i < 3; i++) + ffu.s[477 + i] = sr54[i]; + break; + case 55: + for (i = 0; i < 3; i++) + ffu.s[481 + i] = sr55[i]; + break; + case 56: + for (i = 0; i < 3; i++) + ffu.s[485 + i] = sr56[i]; + break; + case 57: + for (i = 0; i < 3; i++) + ffu.s[489 + i] = sr57[i]; + break; + case 58: + for (i = 0; i < 3; i++) + ffu.s[493 + i] = sr58[i]; + break; + case 59: + for (i = 0; i < 3; i++) + ffu.s[497 + i] = sr59[i]; + break; + case 60: + for (i = 0; i < 3; i++) + ffu.s[501 + i] = sr60[i]; + break; + case 61: + for (i = 0; i < 3; i++) + ffu.s[505 + i] = sr61[i]; + break; + case 62: + for (i = 0; i < 3; i++) + ffu.s[509 + i] = sr62[i]; + break; + case 63: + for (i = 0; i < 3; i++) + ffu.s[513 + i] = sr63[i]; + break; + case 64: + for (i = 0; i < 3; i++) + ffu.s[518 + i] = sr64[i]; + break; + case 65: + for (i = 0; i < 3; i++) + ffu.s[522 + i] = sr65[i]; + break; + case 66: + for (i = 0; i < 3; i++) + ffu.s[526 + i] = sr66[i]; + break; + case 67: + for (i = 0; i < 3; i++) + ffu.s[530 + i] = sr67[i]; + break; + case 68: + for (i = 0; i < 3; i++) + ffu.s[534 + i] = sr68[i]; + break; + case 69: + for (i = 0; i < 3; i++) + ffu.s[538 + i] = sr69[i]; + break; + case 70: + for (i = 0; i < 3; i++) + ffu.s[542 + i] = sr70[i]; + break; + case 71: + for (i = 0; i < 3; i++) + ffu.s[546 + i] = sr71[i]; + break; + case 72: + for (i = 0; i < 3; i++) + ffu.s[550 + i] = sr72[i]; + break; + case 73: + for (i = 0; i < 3; i++) + ffu.s[554 + i] = sr73[i]; + break; + case 74: + for (i = 0; i < 3; i++) + ffu.s[558 + i] = sr74[i]; + break; + case 75: + for (i = 0; i < 3; i++) + ffu.s[562 + i] = sr75[i]; + break; + case 76: + for (i = 0; i < 3; i++) + ffu.s[566 + i] = sr76[i]; + break; + case 77: + for (i = 0; i < 3; i++) + ffu.s[570 + i] = sr77[i]; + break; + case 78: + for (i = 0; i < 3; i++) + ffu.s[574 + i] = sr78[i]; + break; + case 79: + for (i = 0; i < 3; i++) + ffu.s[578 + i] = sr79[i]; + break; + case 80: + for (i = 0; i < 3; i++) + ffu.s[582 + i] = sr80[i]; + break; + case 81: + for (i = 0; i < 3; i++) + ffu.s[586 + i] = sr81[i]; + break; + case 82: + for (i = 0; i < 3; i++) + ffu.s[590 + i] = sr82[i]; + break; + case 83: + for (i = 0; i < 3; i++) + ffu.s[594 + i] = sr83[i]; + break; + case 84: + for (i = 0; i < 3; i++) + ffu.s[598 + i] = sr84[i]; + break; + case 85: + for (i = 0; i < 3; i++) + ffu.s[602 + i] = sr85[i]; + break; + case 86: + for (i = 0; i < 3; i++) + ffu.s[606 + i] = sr86[i]; + break; + case 87: + for (i = 0; i < 3; i++) + ffu.s[610 + i] = sr87[i]; + break; + case 88: + for (i = 0; i < 3; i++) + ffu.s[614 + i] = sr88[i]; + break; + case 89: + for (i = 0; i < 3; i++) + ffu.s[618 + i] = sr89[i]; + break; + case 90: + for (i = 0; i < 3; i++) + ffu.s[622 + i] = sr90[i]; + break; + case 91: + for (i = 0; i < 3; i++) + ffu.s[626 + i] = sr91[i]; + break; + case 92: + for (i = 0; i < 3; i++) + ffu.s[631 + i] = sr92[i]; + break; + case 93: + for (i = 0; i < 3; i++) + ffu.s[635 + i] = sr93[i]; + break; + case 94: + for (i = 0; i < 3; i++) + ffu.s[639 + i] = sr94[i]; + break; + case 95: + for (i = 0; i < 3; i++) + ffu.s[643 + i] = sr95[i]; + break; + case 96: + for (i = 0; i < 3; i++) + ffu.s[647 + i] = sr96[i]; + break; + case 97: + for (i = 0; i < 3; i++) + ffu.s[651 + i] = sr97[i]; + break; + case 98: + for (i = 0; i < 3; i++) + ffu.s[655 + i] = sr98[i]; + break; + case 99: + for (i = 0; i < 3; i++) + ffu.s[659 + i] = sr99[i]; + break; + case 100: + for (i = 0; i < 3; i++) + ffu.s[663 + i] = sr100[i]; + break; + case 101: + for (i = 0; i < 3; i++) + ffu.s[667 + i] = sr101[i]; + break; + case 102: + for (i = 0; i < 3; i++) + ffu.s[671 + i] = sr102[i]; + break; + case 103: + for (i = 0; i < 3; i++) + ffu.s[675 + i] = sr103[i]; + break; + case 104: + for (i = 0; i < 3; i++) + ffu.s[679 + i] = sr104[i]; + break; + case 105: + for (i = 0; i < 3; i++) + ffu.s[683 + i] = sr105[i]; + break; + case 106: + for (i = 0; i < 3; i++) + ffu.s[687 + i] = sr106[i]; + break; + case 107: + for (i = 0; i < 3; i++) + ffu.s[691 + i] = sr107[i]; + break; + case 108: + for (i = 0; i < 3; i++) + ffu.s[695 + i] = sr108[i]; + break; + case 109: + for (i = 0; i < 3; i++) + ffu.s[699 + i] = sr109[i]; + break; + case 110: + for (i = 0; i < 3; i++) + ffu.s[702 + i] = sr110[i]; + break; + case 111: + for (i = 0; i < 3; i++) + ffu.s[707 + i] = sr111[i]; + break; + case 112: + for (i = 0; i < 3; i++) + ffu.s[710 + i] = sr112[i]; + break; + case 113: + for (i = 0; i < 3; i++) + ffu.s[715 + i] = sr113[i]; + break; + case 114: + for (i = 0; i < 3; i++) + ffu.s[718 + i] = sr114[i]; + break; + case 115: + for (i = 0; i < 3; i++) + ffu.s[723 + i] = sr115[i]; + break; + case 116: + for (i = 0; i < 3; i++) + ffu.s[727 + i] = sr116[i]; + break; + case 117: + for (i = 0; i < 3; i++) + ffu.s[731 + i] = sr117[i]; + break; + case 118: + for (i = 0; i < 3; i++) + ffu.s[735 + i] = sr118[i]; + break; + case 119: + for (i = 0; i < 3; i++) + ffu.s[739 + i] = sr119[i]; + break; + case 120: + for (i = 0; i < 3; i++) + ffu.s[744 + i] = sr120[i]; + break; + case 121: + for (i = 0; i < 3; i++) + ffu.s[748 + i] = sr121[i]; + break; + case 122: + for (i = 0; i < 3; i++) + ffu.s[752 + i] = sr122[i]; + break; + case 123: + for (i = 0; i < 3; i++) + ffu.s[756 + i] = sr123[i]; + break; + case 124: + for (i = 0; i < 3; i++) + ffu.s[760 + i] = sr124[i]; + break; + case 125: + for (i = 0; i < 3; i++) + ffu.s[764 + i] = sr125[i]; + break; + case 126: + for (i = 0; i < 3; i++) + ffu.s[768 + i] = sr126[i]; + break; + case 127: + for (i = 0; i < 3; i++) + ffu.s[772 + i] = sr127[i]; + break; + case 128: + for (i = 0; i < 3; i++) + ffu.s[776 + i] = sr128[i]; + break; + case 129: + for (i = 0; i < 3; i++) + ffu.s[780 + i] = sr129[i]; + break; + case 130: + for (i = 0; i < 3; i++) + ffu.s[784 + i] = sr130[i]; + break; + case 131: + for (i = 0; i < 3; i++) + ffu.s[788 + i] = sr131[i]; + break; + case 132: + for (i = 0; i < 3; i++) + ffu.s[792 + i] = sr132[i]; + break; + case 133: + for (i = 0; i < 3; i++) + ffu.s[796 + i] = sr133[i]; + break; + case 134: + for (i = 0; i < 3; i++) + ffu.s[800 + i] = sr134[i]; + break; + case 135: + for (i = 0; i < 3; i++) + ffu.s[804 + i] = sr135[i]; + break; + case 136: + for (i = 0; i < 3; i++) + ffu.s[808 + i] = sr136[i]; + break; + case 137: + for (i = 0; i < 3; i++) + ffu.s[812 + i] = sr137[i]; + break; + case 138: + for (i = 0; i < 3; i++) + ffu.s[816 + i] = sr138[i]; + break; + case 139: + for (i = 0; i < 3; i++) + ffu.s[820 + i] = sr139[i]; + break; + case 140: + for (i = 0; i < 3; i++) + ffu.s[824 + i] = sr140[i]; + break; + case 141: + for (i = 0; i < 3; i++) + ffu.s[828 + i] = sr141[i]; + break; + case 142: + for (i = 0; i < 3; i++) + ffu.s[832 + i] = sr142[i]; + break; + case 143: + for (i = 0; i < 3; i++) + ffu.s[836 + i] = sr143[i]; + break; + case 144: + for (i = 0; i < 3; i++) + ffu.s[840 + i] = sr144[i]; + break; + case 145: + for (i = 0; i < 3; i++) + ffu.s[844 + i] = sr145[i]; + break; + case 146: + for (i = 0; i < 3; i++) + ffu.s[848 + i] = sr146[i]; + break; + case 147: + for (i = 0; i < 3; i++) + ffu.s[852 + i] = sr147[i]; + break; + case 148: + for (i = 0; i < 1; i++) + ffu.s[856 + i] = sr148[i]; + break; + } +} + void IWave::parse() { iinf = 0; @@ -6463,6 +7937,7 @@ void IWave::parse() cin >> iwave; cin.ignore(numeric_limits::max(), '\n'); + printf("iwave = %d\n", iwave); if (iwave == 0 || iwave == -2) { cin >> ffu.wlinf; cin >> ffu.wlsup; @@ -6553,6 +8028,10 @@ void IWave::parse() worldview4(iwave - 203); else if (iwave <= 432) aviris(iwave - 208); + else if (iwave <= 481) + hyperion_vnir(iwave - 432); + else if (iwave <= 628) + hyperion_swir(iwave - 481); else G_warning(_("Unsupported iwave value: %d"), iwave); @@ -6815,7 +8294,9 @@ void IWave::print() string(" worldview 4 green"), string(" worldview 4 red"), string(" worldview 4 nir"), - string(" aviris b1-224")}; + string(" aviris b1-224"), + string(" hyperion vnir b8-57"), + string(" hyperion swir b77-224")}; Output::Begin(); Output::Repeat(22, ' '); diff --git a/imagery/i.atcorr/iwave.h b/imagery/i.atcorr/iwave.h index 153d9dab09f..c6f9d5d57d9 100644 --- a/imagery/i.atcorr/iwave.h +++ b/imagery/i.atcorr/iwave.h @@ -86,6 +86,8 @@ struct IWave { void planetscope0f10(int iwa); void worldview4(int iwa); void aviris(int iwa); + void hyperion_vnir(int iwa); + void hyperion_swir(int iwa); public: /* To compute the equivalent wavelength needed for the calculation of the diff --git a/imagery/i.atcorr/sensors_csv/Hyperion_SWIR.csv b/imagery/i.atcorr/sensors_csv/Hyperion_SWIR.csv new file mode 100644 index 00000000000..1b676ef7e4c --- /dev/null +++ b/imagery/i.atcorr/sensors_csv/Hyperion_SWIR.csv @@ -0,0 +1,149 @@ +WL (nm),b77,b78,b79,b80,b81,b82,b83,b84,b85,b86,b87,b88,b89,b90,b91,b92,b93,b94,b95,b96,b97,b98,b99,b100,b101,b102,b103,b104,b105,b106,b107,b108,b109,b110,b111,b112,b113,b114,b115,b116,b117,b118,b119,b120,b121,b122,b123,b124,b125,b126,b127,b128,b129,b130,b131,b132,b133,b134,b135,b136,b137,b138,b139,b140,b141,b142,b143,b144,b145,b146,b147,b148,b149,b150,b151,b152,b153,b154,b155,b156,b157,b158,b159,b160,b161,b162,b163,b164,b165,b166,b167,b168,b169,b170,b171,b172,b173,b174,b175,b176,b177,b178,b179,b180,b181,b182,b183,b184,b185,b186,b187,b188,b189,b190,b191,b192,b193,b194,b195,b196,b197,b198,b199,b200,b201,b202,b203,b204,b205,b206,b207,b208,b209,b210,b211,b212,b213,b214,b215,b216,b217,b218,b219,b220,b221,b222,b223,b224 +912,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +922.0884,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +932.1768,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +942.2652,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +952.3536,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +962.442,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +972.5304,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +982.6188,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +992.7072,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1002.7956,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1012.884,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1022.9724,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1033.0608,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1043.1492,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1053.2376,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1063.326,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1073.4144,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1083.5028,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1093.5912,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1103.6796,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1113.768,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1123.8564,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1133.9448,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1144.0332,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1154.1216,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1164.21,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1174.2984,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1184.3868,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1194.4752,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1204.5636,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1214.652,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1224.7404,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1234.8288,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1244.9172,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1255.0056,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1265.094,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1275.1824,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1285.2708,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1295.3592,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1305.4476,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1315.536,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1325.6244,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1335.7128,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1345.8012,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1355.8896,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1365.978,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1376.0664,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1386.1548,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1396.2432,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1406.3316,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1416.42,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1426.5084,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1436.5968,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1446.6852,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1456.7736,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1466.862,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1476.9504,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1487.0388,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1497.1272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1507.2156,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1517.304,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1527.3924,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1537.4808,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1547.5692,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1557.6576,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1567.746,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1577.8344,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1587.9228,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1598.0112,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1608.09960000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1618.18800000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1628.27640000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1638.36480000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1648.45320000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1658.54160000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1668.63000000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1678.71840000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1688.80680000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1698.89520000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1708.98360000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1719.07200000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1729.16040000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1739.24880000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1749.33720000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1759.42560000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1769.51400000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1779.60240000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1789.69080000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1799.77920000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1809.86760000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1819.95600000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1830.04440000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1840.13280000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1850.22120000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1860.30960000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1870.39800000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1880.48640000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1890.57480000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1900.66320000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1910.75160000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1920.84000000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1930.92840000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1941.01680000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1951.10520000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1961.19360000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1971.28200000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1981.37040000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1991.45880000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2001.54720000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2011.63560000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2021.72400000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2031.81240000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2041.90080000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2051.98920000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2062.07760000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2072.16600000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2082.25440000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2092.34280000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2102.43120000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2112.51960000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,, +2122.60800000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,, +2132.69640000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,, +2142.78480000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,, +2152.87320000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,, +2162.96160000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,, +2173.05000000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,, +2183.13840000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,, +2193.22680000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,, +2203.31520000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,, +2213.40360000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,, +2223.49200000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,, +2233.58040000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,, +2243.66880000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,, +2253.75720000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,, +2263.84560000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,, +2273.93400000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,, +2284.02240000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,, +2294.11080000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,, +2304.19920000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,, +2314.28760000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,, +2324.37600000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,, +2334.46440000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,, +2344.55280000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,, +2354.64120000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,, +2364.72960000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,, +2374.81800000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,, +2384.90640000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0, +2394.99480000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0 diff --git a/imagery/i.atcorr/sensors_csv/Hyperion_VNIR.csv b/imagery/i.atcorr/sensors_csv/Hyperion_VNIR.csv new file mode 100644 index 00000000000..f1b91d2ab9a --- /dev/null +++ b/imagery/i.atcorr/sensors_csv/Hyperion_VNIR.csv @@ -0,0 +1,51 @@ +WL (nm),b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57 +427,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +437.16326,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +447.32652,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +457.48978,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +467.65304,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +477.8163,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +487.97956,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +498.14282,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +508.30608,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +518.46934,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +528.6326,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +538.79586,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +548.95912,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +559.12238,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +569.28564,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +579.4489,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +589.61216,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +599.77542,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +609.93868,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +620.10194,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +630.2652,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +640.42846,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,,, +650.59172,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,,, +660.75498,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,,, +670.91824,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,,, +681.0815,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,,, +691.24476,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,,, +701.408020000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,,, +711.571280000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,,, +721.734540000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,,, +731.897800000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,,, +742.061060000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,,, +752.224320000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,,, +762.387580000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,,, +772.550840000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,,, +782.714100000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,,, +792.877360000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,,, +803.040620000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,,, +813.203880000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,,, +823.367140000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,,, +833.530400000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,,, +843.693660000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,,, +853.856920000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,,, +864.020180000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,,, +874.183440000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,,, +884.346700000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,,, +894.509960000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,,, +904.673220000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0,, +914.836480000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0, +924.999740000001,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1.0 From 9f0d83891d5b556557dd0b3f058632877d598f2f Mon Sep 17 00:00:00 2001 From: Nicklas Larsson Date: Thu, 30 Nov 2023 15:49:35 +0100 Subject: [PATCH 09/12] CI: fix Periodic update's cron and do not add labels (#3271) --- .github/workflows/periodic_update.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/periodic_update.yml b/.github/workflows/periodic_update.yml index 85e2401defd..4c8060aaabf 100644 --- a/.github/workflows/periodic_update.yml +++ b/.github/workflows/periodic_update.yml @@ -7,8 +7,8 @@ on: workflow_dispatch: schedule: # At 10:32 on every first Wednesday of the month. - # See https://crontab.guru/#32_10_1-7_*_WED - - cron: "32 10 1-7 * WED" + # See https://crontab.guru/#32_10_*/100,1-7_*_WED + - cron: "32 10 */100,1-7 * WED" # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -38,7 +38,6 @@ jobs: commit-message: "config.guess + config.sub: updated from http://git.savannah.gnu.org/cgit/config.git/plain/" branch: periodic/update-configure title: "configure: update to latest config.guess and config.sub" - labels: "CI,packaging,configure" body: | This updates config.guess and config.sub to their latest versions. If the two files are deleted in this PR, please check the logs of the workflow here: From 731cab37c081932611aa296b73fcc73fe8e53b0c Mon Sep 17 00:00:00 2001 From: Caitlin Haedrich <69856275+chaedri@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:54:02 -0500 Subject: [PATCH 10/12] grass.jupyter: add SeriesMap and tests (#3036) SeriesMap creates a ipywidgets Slider for scrolling between a list of rasters and/or vectors. --- python/.pylintrc | 3 +- python/grass/jupyter/Makefile | 1 + python/grass/jupyter/__init__.py | 1 + python/grass/jupyter/region.py | 72 ++++ python/grass/jupyter/seriesmap.py | 355 +++++++++++++++++++ python/grass/jupyter/tests/seriesmap_test.py | 52 +++ python/grass/jupyter/timeseriesmap.py | 43 +-- python/grass/jupyter/utils.py | 68 +++- 8 files changed, 563 insertions(+), 32 deletions(-) create mode 100644 python/grass/jupyter/seriesmap.py create mode 100644 python/grass/jupyter/tests/seriesmap_test.py diff --git a/python/.pylintrc b/python/.pylintrc index 89244f98dae..0aed22e524f 100644 --- a/python/.pylintrc +++ b/python/.pylintrc @@ -95,7 +95,8 @@ disable=raw-checker-failed, file-ignored, suppressed-message, deprecated-pragma, - use-symbolic-message-instead + use-symbolic-message-instead, + duplicate-code # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/python/grass/jupyter/Makefile b/python/grass/jupyter/Makefile index 1fd9f18b40d..102a70cbc80 100644 --- a/python/grass/jupyter/Makefile +++ b/python/grass/jupyter/Makefile @@ -11,6 +11,7 @@ MODULES = \ interactivemap \ region \ map3d \ + seriesmap \ reprojection_renderer \ utils \ timeseriesmap diff --git a/python/grass/jupyter/__init__.py b/python/grass/jupyter/__init__.py index e2fa5dde429..246f6d7b3ab 100644 --- a/python/grass/jupyter/__init__.py +++ b/python/grass/jupyter/__init__.py @@ -103,3 +103,4 @@ from .map3d import Map3D from .setup import init from .timeseriesmap import TimeSeriesMap +from .seriesmap import SeriesMap diff --git a/python/grass/jupyter/region.py b/python/grass/jupyter/region.py index 298d95bc23a..30e71385343 100644 --- a/python/grass/jupyter/region.py +++ b/python/grass/jupyter/region.py @@ -215,6 +215,78 @@ def set_region_from_command(self, module, **kwargs): return +class RegionManagerForSeries: + """Region manager for SeriesMap""" + + def __init__(self, use_region, saved_region, width, height, env): + """Manages region during rendering. + + :param use_region: if True, use either current or provided saved region, + else derive region from rendered layers + :param saved_region: if name of saved_region is provided, + this region is then used for rendering + :param width: rendering width + :param height: rendering height + :param env: environment for rendering + """ + self._env = env + self._width = width + self._height = height + self._use_region = use_region + self._saved_region = saved_region + self._extent_set = False + self._resolution_set = False + + def set_region_from_rasters(self, rasters): + """Sets computational region for rendering from a series of rasters. + + This function sets the region from a series of rasters. If the extent or + resolution has already been set by calling this function previously or by the + set_region_from vectors() function, this function will not modify it. + + If user specified the name of saved region during object's initialization, + the provided region is used. If it's not specified + and use_region=True, current region is used. + """ + if self._saved_region: + self._env["GRASS_REGION"] = gs.region_env( + region=self._saved_region, env=self._env + ) + return + if self._use_region: + # use current + return + if self._resolution_set and self._extent_set: + return + if not self._resolution_set and not self._extent_set: + self._env["GRASS_REGION"] = gs.region_env(raster=rasters, env=self._env) + self._extent_set = True + self._resolution_set = True + elif not self._resolution_set: + self._env["GRASS_REGION"] = gs.region_env(align=rasters[0], env=self._env) + self._resolution_set = True + + def set_region_from_vectors(self, vectors): + """Sets computational region extent for rendering from a series of vectors + + If the extent and resolution has already been set by set_region_from_rasters, + or by using the saved_region or use_region arguments, the region is not modified + """ + if self._saved_region: + self._env["GRASS_REGION"] = gs.region_env( + region=self._saved_region, env=self._env + ) + return + if self._use_region: + # use current + return + if self._resolution_set and self._extent_set: + return + if not self._resolution_set and not self._extent_set: + self._env["GRASS_REGION"] = gs.region_env(vector=vectors, env=self._env) + self._extent_set = True + + class RegionManagerFor3D: """Region manager for 3D displays (gets region from m.nviz.image command)""" diff --git a/python/grass/jupyter/seriesmap.py b/python/grass/jupyter/seriesmap.py new file mode 100644 index 00000000000..2c3a3860130 --- /dev/null +++ b/python/grass/jupyter/seriesmap.py @@ -0,0 +1,355 @@ +# MODULE: grass.jupyter.seriesmap +# +# AUTHOR(S): Caitlin Haedrich +# +# PURPOSE: This module contains functions for visualizing series of rasters in +# Jupyter Notebooks +# +# COPYRIGHT: (C) 2022 Caitlin Haedrich, and by the GRASS Development Team +# +# This program is free software under the GNU General Public +# License (>=v2). Read the file COPYING that comes with GRASS +# for details. +"""Create and display visualizations for a series of rasters.""" + +import tempfile +import os +import weakref +import shutil + +import grass.script as gs +from grass.grassdb.data import map_exists + +from .map import Map +from .region import RegionManagerForSeries +from .utils import save_gif + + +class SeriesMap: + """Creates visualizations from a series of rasters or vectors in Jupyter + Notebooks. + + Basic usage:: + + >>> series = gj.SeriesMap(height = 500) + >>> series.add_rasters(["elevation_shade", "geology", "soils"]) + >>> series.add_vectors(["streams", "streets", "viewpoints"]) + >>> series.d_barscale() + >>> series.show() # Create Slider + >>> series.save("image.gif") + + This class of grass.jupyter is experimental and under development. The API can + change at anytime. + """ + + # pylint: disable=too-many-instance-attributes + # pylint: disable=duplicate-code + + def __init__( + self, + width=None, + height=None, + env=None, + use_region=False, + saved_region=None, + ): + """Creates an instance of the SeriesMap visualizations class. + + :param int width: width of map in pixels + :param int height: height of map in pixels + :param str env: environment + :param use_region: if True, use either current or provided saved region, + else derive region from rendered layers + :param saved_region: if name of saved_region is provided, + this region is then used for rendering + """ + + # Copy Environment + if env: + self._env = env.copy() + else: + self._env = os.environ.copy() + + self._series_length = None + self._base_layer_calls = [] + self._calls = [] + self._series_added = False + self._layers_rendered = False + self._layer_filename_dict = {} + self._names = [] + self._width = width + self._height = height + + # Create a temporary directory for our PNG images + # Resource managed by weakref.finalize. + self._tmpdir = ( + # pylint: disable=consider-using-with + tempfile.TemporaryDirectory() + ) + + def cleanup(tmpdir): + tmpdir.cleanup() + + weakref.finalize(self, cleanup, self._tmpdir) + + # Handle Regions + self._region_manager = RegionManagerForSeries( + use_region=use_region, + saved_region=saved_region, + width=width, + height=height, + env=self._env, + ) + + def add_rasters(self, rasters, **kwargs): + """ + :param list rasters: list of raster layers to add to SeriesMap + """ + for raster in rasters: + if not map_exists(name=raster, element="raster"): + raise NameError(_("Could not find a raster named {}").format(raster)) + # Update region to rasters if not use_region or saved_region + self._region_manager.set_region_from_rasters(rasters) + if self._series_added: + assert self._series_length == len(rasters), _( + "Number of vectors in series must match number of vectors" + ) + for i in range(self._series_length): + kwargs["map"] = rasters[i] + self._calls[i].append(("d.rast", kwargs.copy())) + else: + self._series_length = len(rasters) + for raster in rasters: + kwargs["map"] = raster + self._calls.append([("d.rast", kwargs.copy())]) + self._series_added = True + if not self._names: + self._names = rasters + self._layers_rendered = False + + def add_vectors(self, vectors, **kwargs): + """ + :param list vectors: list of vector layers to add to SeriesMap + """ + for vector in vectors: + if not map_exists(name=vector, element="vector"): + raise NameError(_("Could not find a vector named {}").format(vector)) + # Update region extent to vectors if not use_region or saved_region + self._region_manager.set_region_from_vectors(vectors) + if self._series_added: + assert self._series_length == len(vectors), _( + "Number of rasters in series must match number of vectors" + ) + for i in range(self._series_length): + kwargs["map"] = vectors[i] + self._calls[i].append(("d.vect", kwargs.copy())) + else: + self._series_length = len(vectors) + for vector in vectors: + kwargs["map"] = vector + self._calls.append([("d.vect", kwargs.copy())]) + self._series_added = True + if not self._names: + self._names = vectors + self._layers_rendered = False + + def __getattr__(self, name): + """ + Parse attribute to GRASS display module. Attribute should be in + the form 'd_module_name'. For example, 'd.rast' is called with 'd_rast'. + """ + # Check to make sure format is correct + if not name.startswith("d_"): + raise AttributeError(_("Module must begin with 'd_'")) + # Reformat string + grass_module = name.replace("_", ".") + # Assert module exists + if not shutil.which(grass_module): + raise AttributeError(_("Cannot find GRASS module {}").format(grass_module)) + # if this function is called, the images need to be rendered again + self._layers_rendered = False + + def wrapper(**kwargs): + if not self._series_added: + self._base_layer_calls.append((grass_module, kwargs)) + else: + for row in self._calls: + row.append((grass_module, kwargs)) + + return wrapper + + def add_names(self, names): + """Add list of names associated with layers. + Default will be names of first series added.""" + assert self._series_length == len(names), _( + "Number of vectors in series must match number of vectors" + ) + self._names = names + + def _render_baselayers(self, img): + """Add collected baselayers to Map instance""" + for grass_module, kwargs in self._base_layer_calls: + img.run(grass_module, **kwargs) + + def render(self): + """Renders image for each raster in series. + + Save PNGs to temporary directory. Must be run before creating a visualization + (i.e. show or save). + """ + + if not self._series_added: + raise RuntimeError( + "Cannot render series since none has been added." + "Use SeriesMap.add_rasters() or SeriesMap.add_vectors()" + ) + + # Make base image (background and baselayers) + # Random name needed to avoid potential conflict with layer names + random_name_base = gs.append_random("base", 8) + ".png" + base_file = os.path.join(self._tmpdir.name, random_name_base) + img = Map( + width=self._width, + height=self._height, + filename=base_file, + use_region=True, + env=self._env, + read_file=True, + ) + # We have to call d_erase to ensure the file is created. If there are no + # base layers, then there is nothing to render in random_base_name + img.d_erase() + # Add baselayers + self._render_baselayers(img) + + # Render each layer + for i in range(self._series_length): + # Create file + filename = os.path.join(self._tmpdir.name, f"{i}.png") + # Copying the base_file ensures that previous results are overwritten + shutil.copyfile(base_file, filename) + self._layer_filename_dict[i] = filename + # Render image + img = Map( + width=self._width, + height=self._height, + filename=filename, + use_region=True, + env=self._env, + read_file=True, + ) + for grass_module, kwargs in self._calls[i]: + img.run(grass_module, **kwargs) + + self._layers_rendered = True + + def show(self, slider_width=None): + """Create interactive timeline slider. + + param str slider_width: width of datetime selection slider + + The slider_width parameter sets the width of the slider in the output cell. + It should be formatted as a percentage (%) between 0 and 100 of the cell width + or in pixels (px). Values should be formatted as strings and include the "%" + or "px" suffix. For example, slider_width="80%" or slider_width="500px". + slider_width is passed to ipywidgets in ipywidgets.Layout(width=slider_width). + """ + # Lazy Imports + import ipywidgets as widgets # pylint: disable=import-outside-toplevel + + # Render images if they have not been already + if not self._layers_rendered: + self.render() + + # Set default slider width + if not slider_width: + slider_width = "70%" + + # Create lookup table for slider + lookup = list(zip(self._names, range(self._series_length))) + + # Datetime selection slider + slider = widgets.SelectionSlider( + options=lookup, + value=0, + disabled=False, + continuous_update=True, + orientation="horizontal", + readout=True, + layout=widgets.Layout(width=slider_width), + ) + play = widgets.Play( + interval=500, + value=0, + min=0, + max=self._series_length - 1, + step=1, + description="Press play", + disabled=False, + ) + out_img = widgets.Image(value=b"", format="png") + + def change_slider(change): + slider.value = slider.options[change.new][1] + + play.observe(change_slider, names="value") + + # Display image associated with datetime + def change_image(index): + # Look up layer name for date + filename = self._layer_filename_dict[index] + with open(filename, "rb") as rfile: + out_img.value = rfile.read() + + # Return interact widget with image and slider + widgets.interactive_output(change_image, {"index": slider}) + layout = widgets.Layout( + width="100%", display="inline-flex", flex_flow="row wrap" + ) + return widgets.HBox([play, slider, out_img], layout=layout) + + def save( + self, + filename, + duration=500, + label=True, + font=None, + text_size=12, + text_color="gray", + ): + """ + Creates a GIF animation of rendered layers. + + Text color must be in a format accepted by PIL ImageColor module. For supported + formats, visit: + https://pillow.readthedocs.io/en/stable/reference/ImageColor.html#color-names + + param str filename: name of output GIF file + param int duration: time to display each frame; milliseconds + param bool label: include label on each frame + param str font: font file + param int text_size: size of label text + param str text_color: color to use for the text + """ + + # Render images if they have not been already + if not self._layers_rendered: + self.render() + + tmp_files = [] + for _, file in self._layer_filename_dict.items(): + tmp_files.append(file) + + save_gif( + tmp_files, + filename, + duration=duration, + label=label, + labels=self._names, + font=font, + text_size=text_size, + text_color=text_color, + ) + + # Display the GIF + return filename diff --git a/python/grass/jupyter/tests/seriesmap_test.py b/python/grass/jupyter/tests/seriesmap_test.py new file mode 100644 index 00000000000..79f3b20dbda --- /dev/null +++ b/python/grass/jupyter/tests/seriesmap_test.py @@ -0,0 +1,52 @@ +"""Test SeriesMap functions""" + + +from pathlib import Path +import pytest + +try: + import IPython +except ImportError: + IPython = None + +try: + import ipywidgets +except ImportError: + ipywidgets = None + +import grass.jupyter as gj + + +def test_default_init(space_time_raster_dataset): + """Check that TimeSeriesMap init runs with default parameters""" + img = gj.SeriesMap() + img.add_rasters(space_time_raster_dataset.raster_names) + assert img._names == space_time_raster_dataset.raster_names + + +def test_render_layers(space_time_raster_dataset): + """Check that layers are rendered""" + # create instance of TimeSeriesMap + img = gj.SeriesMap() + # test adding base layer and d_legend here too for efficiency (rendering is + # time-intensive) + img.d_rast(map=space_time_raster_dataset.raster_names[0]) + img.add_rasters(space_time_raster_dataset.raster_names[1:]) + img.d_barscale() + # Render layers + img.render() + # check files exist + # We need to check values which are only in protected attributes + # pylint: disable=protected-access + for unused_layer, filename in img._layer_filename_dict.items(): + assert Path(filename).is_file() + + +@pytest.mark.skipif(IPython is None, reason="IPython package not available") +@pytest.mark.skipif(ipywidgets is None, reason="ipywidgets package not available") +def test_save(space_time_raster_dataset, tmp_path): + """Test returns from animate and time_slider are correct object types""" + img = gj.SeriesMap() + img.add_rasters(space_time_raster_dataset.raster_names) + gif_file = img.save(tmp_path / "image.gif") + assert Path(gif_file).is_file() diff --git a/python/grass/jupyter/timeseriesmap.py b/python/grass/jupyter/timeseriesmap.py index 8d00eba9427..0d9c365b387 100644 --- a/python/grass/jupyter/timeseriesmap.py +++ b/python/grass/jupyter/timeseriesmap.py @@ -16,12 +16,12 @@ import os import weakref import shutil -from pathlib import Path import grass.script as gs from .map import Map from .region import RegionManagerForTimeSeries +from .utils import save_gif def fill_none_values(names): @@ -131,6 +131,7 @@ class TimeSeriesMap: # pylint: disable=too-many-instance-attributes # Need more attributes to build timeseriesmap visuals + # pylint: disable=duplicate-code def __init__( self, @@ -475,42 +476,24 @@ def save( param int text_size: size of date/time text param str text_color: color to use for the text. """ - # Create a GIF from the PNG images - import PIL.Image # pylint: disable=import-outside-toplevel - import PIL.ImageDraw # pylint: disable=import-outside-toplevel - import PIL.ImageFont # pylint: disable=import-outside-toplevel # Render images if they have not been already if not self._layers_rendered: self.render() - # filepath to output GIF - filename = Path(filename) - if filename.suffix.lower() != ".gif": - raise ValueError(_("filename must end in '.gif'")) - - images = [] + input_files = [] for date in self._dates: - img_path = self._date_filename_dict[date] - img = PIL.Image.open(img_path) - img = img.convert("RGBA", dither=None) - draw = PIL.ImageDraw.Draw(img) - if label: - draw.text( - (0, 0), - date, - fill=text_color, - font=PIL.ImageFont.truetype(font, text_size), - ) - images.append(img) - - images[0].save( - fp=filename, - format="GIF", - append_images=images[1:], - save_all=True, + input_files.append(self._date_filename_dict[date]) + + save_gif( + input_files, + filename, duration=duration, - loop=0, + label=label, + labels=self._dates, + font=font, + text_size=text_size, + text_color=text_color, ) # Display the GIF diff --git a/python/grass/jupyter/utils.py b/python/grass/jupyter/utils.py index 92d59e6cd16..e0aa7eb11b2 100644 --- a/python/grass/jupyter/utils.py +++ b/python/grass/jupyter/utils.py @@ -10,7 +10,7 @@ # for details. """Utility functions warpping existing processes in a suitable way""" - +from pathlib import Path import grass.script as gs @@ -200,3 +200,69 @@ def get_rendering_size(region, width, height, default_width=600, default_height= if region_height > region_width: return (round(default_height * region_width / region_height), default_height) return (default_width, round(default_width * region_height / region_width)) + + +def save_gif( + input_files, + output_filename, + duration=500, + label=True, + labels=None, + font=None, + text_size=12, + text_color="gray", +): + """ + Creates a GIF animation + + param list input_files: list of paths to source + param str output_filename: destination gif filename + param int duration: time to display each frame; milliseconds + param bool label: include label stamp on each frame + param list labels: list of labels for each source image + param str font: font file + param int text_size: size of label text + param str text_color: color to use for the text + """ + # Create a GIF from the PNG images + import PIL.Image # pylint: disable=import-outside-toplevel + import PIL.ImageDraw # pylint: disable=import-outside-toplevel + import PIL.ImageFont # pylint: disable=import-outside-toplevel + + # filepath to output GIF + filename = Path(output_filename) + if filename.suffix.lower() != ".gif": + raise ValueError(_("filename must end in '.gif'")) + + images = [] + for i, file in enumerate(input_files): + img = PIL.Image.open(file) + img = img.convert("RGBA", dither=None) + draw = PIL.ImageDraw.Draw(img) + if label: + if font: + font_obj = PIL.ImageFont.truetype(font, text_size) + else: + try: + font_obj = PIL.ImageFont.load_default(size=text_size) + except TypeError: + font_obj = PIL.ImageFont.load_default() + draw.text( + (0, 0), + labels[i], + fill=text_color, + font=font_obj, + ) + images.append(img) + + images[0].save( + fp=filename, + format="GIF", + append_images=images[1:], + save_all=True, + duration=duration, + loop=0, + ) + + # Display the GIF + return filename From fb696656f2ac3388b6bc33ba13caf0f0feddb87e Mon Sep 17 00:00:00 2001 From: Michael Barton Date: Thu, 30 Nov 2023 20:15:31 -0700 Subject: [PATCH 11/12] docs: update friction map info for r.walk.html (#3279) --- raster/r.walk/r.walk.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/raster/r.walk/r.walk.html b/raster/r.walk/r.walk.html index ad20d842198..1ab039a4a2f 100644 --- a/raster/r.walk/r.walk.html +++ b/raster/r.walk/r.walk.html @@ -64,6 +64,9 @@

NOTES

The friction cost parameter represents a time penalty in seconds of additional walking time to cross 1 meter distance. +Friction cost can be any floating point value ≥ 0. +A friction map is a required parameter; if no friction costs are desired, +a friction map should be a raster in which all cells have a value of 0.

The lambda parameter is a dimensionless scaling factor of the friction cost:


From 4b6dcb9f2f430cd06ddc9a3d2279bd6ca34e95da Mon Sep 17 00:00:00 2001
From: Alessandro Frigeri 
Date: Fri, 1 Dec 2023 18:51:50 +0100
Subject: [PATCH 12/12] r.in.aster: add support for ASTER L1T data (#3258)

In addition, removed architecture dependent code for Mac.
---
 scripts/r.in.aster/r.in.aster.html |  4 ++--
 scripts/r.in.aster/r.in.aster.py   | 36 ++++++++++++++++++++++--------
 2 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/scripts/r.in.aster/r.in.aster.html b/scripts/r.in.aster/r.in.aster.html
index 2dc2ba17063..78aaf7a796a 100644
--- a/scripts/r.in.aster/r.in.aster.html
+++ b/scripts/r.in.aster/r.in.aster.html
@@ -2,12 +2,12 @@ 

DESCRIPTION

r.in.aster rectifies, georeferences, and imports Terra-ASTER imagery to current location using gdalwarp, hdf 4, and r.in.gdal, using projection parameters -from g.proj. It can import Level 1A, Level 1B, and relative DEM products. +from g.proj. It can import Level 1A, Level 1B, their relative DEM products, and Level 1T.

The program may be run interactively or non-interactively from the command line. In either case, the user must specify an input *.hdf file name, the type of processing used, the image band to import, and an output GRASS raster map name. -

The type parameter can take values of L1A, L1B, or DEM. +

The type parameter can take values of L1A, L1B, L1T or DEM.

The band parameter can take values of 1, 2, 3n, 3b, 4-14

NOTES

diff --git a/scripts/r.in.aster/r.in.aster.py b/scripts/r.in.aster/r.in.aster.py index 505a0d0cc04..07c993c0715 100755 --- a/scripts/r.in.aster/r.in.aster.py +++ b/scripts/r.in.aster/r.in.aster.py @@ -36,14 +36,14 @@ # % key: proctype # % type: string # % description: ASTER imagery processing type (Level 1A, Level 1B, or relative DEM) -# % options: L1A,L1B,DEM +# % options: L1A,L1B,L1T,DEM # % answer: L1B # % required: yes # %end # %option # % key: band # % type: string -# % description: List L1A or L1B band to translate (1,2,3n,...), or enter 'all' to translate all bands +# % description: List L1A L1B or L1T band to translate (1,2,3n,...), or enter 'all' to translate all bands # % answer: all # % required: yes # %end @@ -52,7 +52,6 @@ # %end import os -import platform import grass.script as grass bands = { @@ -90,6 +89,22 @@ "13": "TIR_Swath:ImageData13", "14": "TIR_Swath:ImageData14", }, + "L1T": { + "4": "SWIR_Swath:ImageData4", + "5": "SWIR_Swath:ImageData5", + "6": "SWIR_Swath:ImageData6", + "7": "SWIR_Swath:ImageData7", + "8": "SWIR_Swath:ImageData8", + "9": "SWIR_Swath:ImageData9", + "1": "VNIR_Swath:ImageData1", + "2": "VNIR_Swath:ImageData2", + "3n": "VNIR_Swath:ImageData3N", + "10": "TIR_Swath:ImageData10", + "11": "TIR_Swath:ImageData11", + "12": "TIR_Swath:ImageData12", + "13": "TIR_Swath:ImageData13", + "14": "TIR_Swath:ImageData14", + }, } @@ -133,13 +148,17 @@ def main(): "13", "14", ] + + # Band 3b is not included ASTER L1T + if proctype == "L1T": + allbands.remove("3b") if band == "all": bandlist = allbands else: bandlist = band.split(",") - # initialize datasets for L1A and L1B - if proctype in ["L1A", "L1B"]: + # initialize datasets for L1A, L1B, L1T + if proctype in ["L1A", "L1B", "L1T"]: for band in bandlist: if band in allbands: dataset = bands[proctype][band] @@ -165,10 +184,9 @@ def import_aster(proj, srcfile, tempfile, output, band): grass.message(_("Georeferencing aster image ...")) grass.debug("gdalwarp -t_srs %s %s %s" % (proj, srcfile, tempfile)) - if platform.system() == "Darwin": - cmd = ["arch", "-i386", "gdalwarp", "-t_srs", proj, srcfile, tempfile] - else: - cmd = ["gdalwarp", "-t_srs", proj, srcfile, tempfile] + # We assume gdal is build natively for the platform GRASS is running on. + # see #3258 + cmd = ["gdalwarp", "-t_srs", proj, srcfile, tempfile] p = grass.call(cmd) if p != 0: # check to see if gdalwarp executed properly