├── .gitignore ├── LICENSE.txt ├── README.md ├── environment.yml └── notebooks ├── animate_netcdf_sat_images.ipynb ├── compare_EUMETSAT_file_formats.ipynb ├── convert_native_to_reprojected_netcdf.ipynb ├── data_getter_experiments_jpeg.ipynb ├── explore_y_offset.ipynb ├── old_experiments ├── data_getter_experiments_nat.ipynb ├── data_getter_experiments_nat_rasterio.ipynb ├── data_getter_experiments_nat_satpy_resample.ipynb ├── test_crash_cartopy.ipynb └── test_crash_pyresample.ipynb ├── prep_data_for_UCL_and_QMUL.ipynb └── untar_jpegs.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | Pipfile 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # celery beat schedule file 95 | celerybeat-schedule 96 | 97 | # SageMath parsed files 98 | *.sage.py 99 | 100 | # Environments 101 | .env 102 | .venv 103 | env/ 104 | venv/ 105 | ENV/ 106 | env.bak/ 107 | venv.bak/ 108 | 109 | # Spyder project settings 110 | .spyderproject 111 | .spyproject 112 | 113 | # Rope project settings 114 | .ropeproject 115 | 116 | # mkdocs documentation 117 | /site 118 | 119 | # mypy 120 | .mypy_cache/ 121 | .dmypy.json 122 | dmypy.json 123 | 124 | # Pyre type checker 125 | .pyre/ -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright 2019 Open Climate Fix 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | ``` 4 | git clone 5 | conda env create -f environment.yml 6 | conda activate sat_image_processing 7 | ``` 8 | 9 | 10 | ### Install Jupyter lab interactive plotting for matplotlib 11 | 12 | See the [jupyter-matplotlib docs for more info](https://github.com/matplotlib/jupyter-matplotlib). The short version is to run these commands from within the `sat_image_processing` env: 13 | 14 | ``` 15 | jupyter labextension install @jupyter-widgets/jupyterlab-manager 16 | jupyter labextension install jupyter-matplotlib 17 | ``` 18 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: sat_image_processing 2 | channels: 3 | - conda-forge 4 | - pytorch 5 | - pvlib 6 | dependencies: 7 | - python>=3.7 8 | - pytest 9 | - pytables 10 | - pandas 11 | - matplotlib 12 | - jupyterlab 13 | - ipympl 14 | - nodejs 15 | - satpy 16 | - netCDF4 17 | - xarray 18 | - cartopy 19 | - pyproj 20 | - geopandas 21 | - rasterio 22 | - pillow # for image loading and processing 23 | - gdal 24 | - pytorch 25 | - pvlib 26 | -------------------------------------------------------------------------------- /notebooks/old_experiments/test_crash_cartopy.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import cartopy\n", 10 | "import cartopy.crs as ccrs\n", 11 | "#import ipdb" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "outputs": [ 19 | { 20 | "data": { 21 | "text/plain": [ 22 | "'0.17.1.dev172+'" 23 | ] 24 | }, 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "output_type": "execute_result" 28 | } 29 | ], 30 | "source": [ 31 | "cartopy.__version__" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 3, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "#ipdb.set_trace()\n", 41 | "osgb = ccrs.OSGB()" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 4, 47 | "metadata": {}, 48 | "outputs": [ 49 | { 50 | "name": "stderr", 51 | "output_type": "stream", 52 | "text": [ 53 | "/home/jack/miniconda3/envs/sat_image_processing/lib/python3.7/site-packages/cartopy/mpl/ticker.py:476: MatplotlibDeprecationWarning: MaxNLocator.set_params got an unexpected parameter: dms\n", 54 | " MaxNLocator.set_params(self, **kwargs)\n" 55 | ] 56 | }, 57 | { 58 | "data": { 59 | "text/html": [ 60 | "\n", 61 | "\n", 63 | "\n", 64 | "\n", 65 | " \n", 66 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 99 | " \n", 144 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 222 | " \n", 323 | " \n", 424 | " \n", 524 | " \n", 625 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 806 | " \n", 886 | " \n", 970 | " \n", 1058 | " \n", 1148 | " \n", 1242 | " \n", 1340 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | "\n", 1432 | "
<cartopy.crs.OSGB object at 0x7fe6c0992c50>
" 1433 | ], 1434 | "text/plain": [ 1435 | "" 1436 | ] 1437 | }, 1438 | "execution_count": 4, 1439 | "metadata": {}, 1440 | "output_type": "execute_result" 1441 | } 1442 | ], 1443 | "source": [ 1444 | "# This is where the crash occurs :(\n", 1445 | "osgb" 1446 | ] 1447 | }, 1448 | { 1449 | "cell_type": "code", 1450 | "execution_count": 5, 1451 | "metadata": {}, 1452 | "outputs": [], 1453 | "source": [ 1454 | "import pyproj" 1455 | ] 1456 | }, 1457 | { 1458 | "cell_type": "code", 1459 | "execution_count": 6, 1460 | "metadata": {}, 1461 | "outputs": [ 1462 | { 1463 | "name": "stdout", 1464 | "output_type": "stream", 1465 | "text": [ 1466 | "\n", 1467 | "System:\n", 1468 | " python: 3.7.3 | packaged by conda-forge | (default, Jul 1 2019, 21:52:21) [GCC 7.3.0]\n", 1469 | "executable: /home/jack/miniconda3/envs/sat_image_processing/bin/python\n", 1470 | " machine: Linux-5.0.0-27-generic-x86_64-with-debian-buster-sid\n", 1471 | "\n", 1472 | "PROJ:\n", 1473 | " PROJ: 6.1.1\n", 1474 | " data dir: /home/jack/miniconda3/envs/sat_image_processing/share/proj\n", 1475 | "\n", 1476 | "Python deps:\n", 1477 | " pyproj: 2.3.1\n", 1478 | " pip: 19.2.3\n", 1479 | "setuptools: 41.2.0\n", 1480 | " Cython: 0.29.13\n" 1481 | ] 1482 | } 1483 | ], 1484 | "source": [ 1485 | "pyproj.show_versions()" 1486 | ] 1487 | }, 1488 | { 1489 | "cell_type": "code", 1490 | "execution_count": null, 1491 | "metadata": {}, 1492 | "outputs": [], 1493 | "source": [] 1494 | } 1495 | ], 1496 | "metadata": { 1497 | "kernelspec": { 1498 | "display_name": "Python 3", 1499 | "language": "python", 1500 | "name": "python3" 1501 | }, 1502 | "language_info": { 1503 | "codemirror_mode": { 1504 | "name": "ipython", 1505 | "version": 3 1506 | }, 1507 | "file_extension": ".py", 1508 | "mimetype": "text/x-python", 1509 | "name": "python", 1510 | "nbconvert_exporter": "python", 1511 | "pygments_lexer": "ipython3", 1512 | "version": "3.7.3" 1513 | } 1514 | }, 1515 | "nbformat": 4, 1516 | "nbformat_minor": 4 1517 | } 1518 | -------------------------------------------------------------------------------- /notebooks/old_experiments/test_crash_pyresample.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import matplotlib.pyplot as plt" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import pyresample\n", 19 | "from pyresample import geo_filter, geometry, load_area" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 3, 25 | "metadata": {}, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "\n", 32 | "System:\n", 33 | " python: 3.7.3 | packaged by conda-forge | (default, Jul 1 2019, 21:52:21) [GCC 7.3.0]\n", 34 | "executable: /home/jack/miniconda3/envs/cartopy_test/bin/python\n", 35 | " machine: Linux-5.0.0-27-generic-x86_64-with-debian-buster-sid\n", 36 | "\n", 37 | "PROJ:\n", 38 | " PROJ: 6.1.1\n", 39 | " data dir: /home/jack/miniconda3/envs/cartopy_test/share/proj\n", 40 | "\n", 41 | "Python deps:\n", 42 | " pyproj: 2.3.1\n", 43 | " pip: 19.2.3\n", 44 | "setuptools: 41.2.0\n", 45 | " Cython: 0.29.13\n" 46 | ] 47 | } 48 | ], 49 | "source": [ 50 | "import pyproj\n", 51 | "\n", 52 | "pyproj.show_versions()" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "europe = geometry.AreaDefinition(\n", 62 | " area_id='areaD',\n", 63 | " description='Europe (3km, HRV, VTC)',\n", 64 | " proj_id='areaD',\n", 65 | " projection={\n", 66 | " #'a': '6378144.0',\n", 67 | " #'b': '6356759.0',\n", 68 | " 'lat_0': '90.0',\n", 69 | " 'lat_ts': '60.00',\n", 70 | " 'lon_0': '0.00',\n", 71 | " 'ellps': 'WGS84',\n", 72 | " 'proj': 'stere'},\n", 73 | " width=500, #image.shape[1], \n", 74 | " height=500, #image.shape[0],\n", 75 | " area_extent=[-3780000.0, -7644000.0, 3900000.0, -1500000.0])" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 5, 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "crs = europe.to_cartopy_crs()" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 6, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stderr", 94 | "output_type": "stream", 95 | "text": [ 96 | "/home/jack/miniconda3/envs/cartopy_test/lib/python3.7/site-packages/cartopy/mpl/ticker.py:476: MatplotlibDeprecationWarning: MaxNLocator.set_params got an unexpected parameter: dms\n", 97 | " MaxNLocator.set_params(self, **kwargs)\n" 98 | ] 99 | }, 100 | { 101 | "data": { 102 | "text/html": [ 103 | "\n", 104 | "\n", 106 | "\n", 107 | "\n", 108 | " \n", 109 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 145 | " \n", 150 | " \n", 170 | " \n", 181 | " \n", 193 | " \n", 204 | " \n", 212 | " \n", 219 | " \n", 264 | " \n", 285 | " \n", 303 | " \n", 315 | " \n", 319 | " \n", 780 | " \n", 787 | " \n", 795 | " \n", 809 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 882 | " \n", 944 | " \n", 1039 | " \n", 1130 | " \n", 1225 | " \n", 1289 | " \n", 1314 | " \n", 1315 | " \n", 1316 | " \n", 1328 | " \n", 1381 | " \n", 1447 | " \n", 1541 | " \n", 1634 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | "\n", 1718 | "
_PROJ4Projection(+ellps=WGS84 +lat_0=90.0 +lat_ts=60.0 +lon_0=0.0 +no_defs=True +proj=stere +type=crs +units=m +x_0=0.0 +y_0=0.0 +no_defs)
" 1719 | ], 1720 | "text/plain": [ 1721 | "_PROJ4Projection(+ellps=WGS84 +lat_0=90.0 +lat_ts=60.0 +lon_0=0.0 +no_defs=True +proj=stere +type=crs +units=m +x_0=0.0 +y_0=0.0 +no_defs)" 1722 | ] 1723 | }, 1724 | "execution_count": 6, 1725 | "metadata": {}, 1726 | "output_type": "execute_result" 1727 | } 1728 | ], 1729 | "source": [ 1730 | "# This is where the crash occurs :(\n", 1731 | "crs" 1732 | ] 1733 | }, 1734 | { 1735 | "cell_type": "code", 1736 | "execution_count": 7, 1737 | "metadata": {}, 1738 | "outputs": [ 1739 | { 1740 | "data": { 1741 | "image/png": "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\n", 1742 | "text/plain": [ 1743 | "
" 1744 | ] 1745 | }, 1746 | "metadata": { 1747 | "needs_background": "light" 1748 | }, 1749 | "output_type": "display_data" 1750 | } 1751 | ], 1752 | "source": [ 1753 | "ax = plt.axes(projection=crs)\n", 1754 | "ax.coastlines()\n", 1755 | "ax.set_global()" 1756 | ] 1757 | }, 1758 | { 1759 | "cell_type": "code", 1760 | "execution_count": null, 1761 | "metadata": {}, 1762 | "outputs": [], 1763 | "source": [] 1764 | } 1765 | ], 1766 | "metadata": { 1767 | "kernelspec": { 1768 | "display_name": "Python 3", 1769 | "language": "python", 1770 | "name": "python3" 1771 | }, 1772 | "language_info": { 1773 | "codemirror_mode": { 1774 | "name": "ipython", 1775 | "version": 3 1776 | }, 1777 | "file_extension": ".py", 1778 | "mimetype": "text/x-python", 1779 | "name": "python", 1780 | "nbconvert_exporter": "python", 1781 | "pygments_lexer": "ipython3", 1782 | "version": "3.7.3" 1783 | } 1784 | }, 1785 | "nbformat": 4, 1786 | "nbformat_minor": 4 1787 | } 1788 | -------------------------------------------------------------------------------- /notebooks/untar_jpegs.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "This little script untars satellite image files downloaded from EUMETSAT.\n", 8 | "\n", 9 | "Set `SRC_PATH` to be the directory holding all the `.tar` files downloaded from EUMETSAT.\n", 10 | "\n", 11 | "Set `DST_PATH` to be the destination path. This script will store data in a directory structure of the form `////