Z=J$(I}*GSAm$=Q0*TfX)z!q+{89
zlpB`&1`~YFys=nDi|ChoVN+hXZxi6ULqNNJvHIKoQ8pcr}|8S)3aB%?0idbI;*DZ$V)#V
z?1S&`*Z(Ml%j{dN`~VR=Xu&cOZ#4cfxK|M1
zgI801{*K-C!M#aSyv>z;ppzeiXD>u}d?{>q?@<~nkInqH;U$Hp&y7p>v=e;k_wQUq
z^2crRl=%--X_T(+X&z9dp^+YX?))GHpB!lktzrrnqMXg5f=FFt4V|LZDWrtgF(Tsx
z_rdV%X$ppLM8^^f#jsTfUOI8;$I-3=zRH%vvm-#Oc#M$4!$@c;R$jOzIp>
zZ)|_u^X__~H>3vl9$Kd7gEji~7mo0KFw@aY;mSjAG-XViYC4bLmuTjjNFO1NeSLX-
z<3Sp)jH8Vl*AqV7=_T1}PNN;Z6<K>gnBsz88r7Yz@
zf~(ZH~l~LiQYeQ>49N5AN5DqcuLpvpddV=nz5P(zQL}fz6%2E@Y0cf
zRwlryI{}qaodQgj3lp3qdDJ|>HSr_*XL_x3Ubhp42R+qJD~S$z?{%(HSVUn?N@T&r
z-y~ix3vIY|G}Pq14mqUJSXHU{%yPUCy$rD}{H;PLZlAi-rCW$y^0%%(p+ty!vi1A3
zb`fk2m{-LS+)m#z6sOnb1(|2E!7Yy7h^TexZ@u7+u8uTjQIa>ly$otiRq{sb&yeqO
zGG2)1cDj_l6T*Gl+DRXjgqR-4G}O(fp&S~Y#M?!qN8(}a2WJ|O*guw*kT``5zlfIq
zheGa!7#uV*xKNP9c2i9yc>$35DA2O^?S2ZtDl7RoIg_
zMYkHa^KMa?KjJ+8>IkX7d2y*q7KEn|7`Hq
z3*{@5z2kRy;p5pa`lVGOsK&DG_K1nFK!ZU)4{4&8Ok1p#cr*0FS8#`vCNBWt8NV$g=PXsvfPH*#{PCokVc03vrJqWNCV2T5KH-H;aSEEPfS#L>##Bu~y*=Qc)~
zd13D8_f$iM7aBY#D&98n!u~nqOY-{(?ps+^xCIj(@ydwS{3L`?#h1!=8-#Gn_ir-%
zMWeCz*wTZ^G=^(b<_ucXcs9656h)p-)_D27-BA>t3d`n3k@sJ?wS4w9(w_|Fz8(2N
z`fmTc&=V8&c=*IMYPd_*G3^?5?$$oRLH4T`*5^mrFx$9GvF5P=lXhG;dDAL@ZE8)(x=DxdTy+J<`w7wgDJ>JuxTcJ!5+&HY0V@RRyqQ^FIE`=BKe~5X<
zP?)Xtc}LA%(x?CYb7-CAXn2GWPLq-JjGCUH{@Sa$0#Iqp8_K7-U>nX&Sp
zc7o?yLdQuxvZG-7_8&2BFyRZG&s=}PADhBbA{E{ey?cJ7xOWbXptu!~%~W&MT`0IBu6?e3``i`s1Iw<4IoK*E?G<
zh45v%hryrI<0%A}ZrRCJAv`f_G_;xMvd1Mg7RLn?5;o=J>l`I|imBOniRiawe^%b!
z_ltsm{GM$UgqQESZHS${gVaO6oVvnIq6f`xcmHhpIjEktWq#*a`FAp-Sxyq+&31TA&YeD6bo)9csh
zfLyyHz2-%zN3!acfLp2h>#xQNvRPknRGCa}V33^pw-VrP@SD@5mY
zX9JnvxBl0+M`;{Vt=X4H>ZfP9Qo+b9A)e#vBZV14jIkqw7D@ysQR`J2cJ(Utv>OMh5X3cPu#am82dU0mWVS^V7ws9U&z4sH_-|K
zk_YW)uPDDeY3FMM=(|O4MlB>~Stuens-f`p-3PIEBgKXOzViDXj7RsZ5hT
zY*pJKri>mRY6;^uH^`Ci1GfrHjT<@GbTFrAYcd<2qiXV}$@jkA88R^+{Fzv%?WdBO
W$bfFu1J2e7
Date: Fri, 18 Jun 2021 11:16:01 +0700
Subject: [PATCH 5/8] Support any epsg distance repair pyproject.toml (#20)
* add support for another epssg
add support for another epssg in geographic distance calculation
* Update CHANGELOG.md
* remove local dev dependency
From f4f8a087305aa0be192e7b2ca27081f469344c22 Mon Sep 17 00:00:00 2001
From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>
Date: Fri, 18 Jun 2021 15:55:43 +0700
Subject: [PATCH 6/8] Update meta.yaml
---
conda.recipe/meta.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
index b65449e..96c4fab 100644
--- a/conda.recipe/meta.yaml
+++ b/conda.recipe/meta.yaml
@@ -1,5 +1,5 @@
{% set name = "geosardine" %}
-{% set version = "0.12.0a0" %}
+{% set version = "0.13.0" %}
package:
name: {{ name|lower }}
@@ -7,7 +7,7 @@ package:
source:
url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz
- sha256: ddac3c95763b878c5454f2717b800b62c2f7bae3a4a372cbba00404e6c7c0fcc
+ sha256: d43b553a733293ffbc561e6acda33a637209ec45470e237b80b393b4b5043687
build:
noarch: python
From 10bb24e55314c78d57e5731741bbc68cb3bfa60a Mon Sep 17 00:00:00 2001
From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>
Date: Thu, 24 Jun 2021 16:13:53 +0700
Subject: [PATCH 7/8] update dependency to support latest gdal
---
CHANGELOG.md | 8 +-
conda.recipe/meta.yaml | 12 +--
poetry.lock | 217 ++++++++++++++++++++++++-----------------
pyproject.toml | 26 ++---
4 files changed, 154 insertions(+), 109 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1097f9e..56203fb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [0.13.1] - 2021-06-23
+
+### Changed
+- update dependency to latest
+
## [0.13.0] - 2021-06-18
### Changed
@@ -171,7 +176,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Support multiple layer in raster calculation
-[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.0...HEAD
+[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.1...HEAD
+[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.13.0...v0.13.1
[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0
[0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0
[0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
index 96c4fab..46b27e4 100644
--- a/conda.recipe/meta.yaml
+++ b/conda.recipe/meta.yaml
@@ -1,5 +1,5 @@
{% set name = "geosardine" %}
-{% set version = "0.13.0" %}
+{% set version = "0.13.1" %}
package:
name: {{ name|lower }}
@@ -7,7 +7,7 @@ package:
source:
url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz
- sha256: d43b553a733293ffbc561e6acda33a637209ec45470e237b80b393b4b5043687
+ sha256: a3737c9dad7d52b41f6cebb18d6c085c5a0ad14a9dc2c23f977c42be305db1b5
build:
noarch: python
@@ -18,7 +18,7 @@ build:
requirements:
host:
- - python >=3.6,<4.0
+ - python >=3.6,<3.10
- pip
- pytest-runner
# - poetry
@@ -27,10 +27,10 @@ requirements:
- affine >=2.3.0,<3.0.0
- click >=7.1.2,<8.0.0
- fiona >=1.8.13,<2.0.0
- - gdal >=3.0.4,<3.1.4
- - numba >=0.51.2,<0.52.0
+ - gdal >=3.0.4
+ - numba >=0.51.2
- numpy >=1.18,<2.0
- - python >=3.6,<4.0
+ - python >=3.6,<3.10
- rasterio >=1.1.4,<2.0.0
- shapely >=1.6.4,<2.0.0
- tqdm
diff --git a/poetry.lock b/poetry.lock
index 2f0fb6c..c214859 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -176,24 +176,25 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes
[[package]]
name = "isort"
-version = "5.8.0"
+version = "5.9.1"
description = "A Python utility / library to sort Python imports."
category = "dev"
optional = false
-python-versions = ">=3.6,<4.0"
+python-versions = ">=3.6.1,<4.0"
[package.extras]
pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
requirements_deprecated_finder = ["pipreqs", "pip-api"]
colors = ["colorama (>=0.4.3,<0.5.0)"]
+plugins = ["setuptools"]
[[package]]
name = "llvmlite"
-version = "0.34.0"
+version = "0.36.0"
description = "lightweight wrapper around basic LLVM functionality"
category = "main"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.6,<3.10"
[[package]]
name = "mako"
@@ -281,23 +282,23 @@ python-versions = "*"
[[package]]
name = "numba"
-version = "0.51.2"
+version = "0.53.1"
description = "compiling Python code using LLVM"
category = "main"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.6,<3.10"
[package.dependencies]
-llvmlite = ">=0.34.0.dev0,<0.35"
+llvmlite = ">=0.36.0rc1,<0.37"
numpy = ">=1.15"
[[package]]
name = "numpy"
-version = "1.19.3"
+version = "1.21.0"
description = "NumPy is the fundamental package for array computing with Python."
category = "main"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
[[package]]
name = "opencv-python"
@@ -371,6 +372,17 @@ category = "main"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+[[package]]
+name = "pyproj"
+version = "3.1.0"
+description = "Python interface to PROJ (cartographic projections and coordinate transformations library)"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+certifi = "*"
+
[[package]]
name = "pytest"
version = "5.4.3"
@@ -412,7 +424,7 @@ testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtuale
[[package]]
name = "rasterio"
-version = "1.2.4"
+version = "1.2.6"
description = "Fast and direct raster I/O for use with Numpy and SciPy"
category = "main"
optional = false
@@ -429,7 +441,7 @@ numpy = "*"
snuggs = ">=1.4.1"
[package.extras]
-all = ["sphinx-rtd-theme", "boto3 (>=1.2.4)", "matplotlib", "pytest (>=2.8.2)", "numpydoc", "ghp-import", "ipython (>=2.0)", "hypothesis", "packaging", "sphinx", "pytest-cov (>=2.2.0)", "shapely"]
+all = ["boto3 (>=1.2.4)", "pytest-cov (>=2.2.0)", "hypothesis", "shapely", "numpydoc", "ghp-import", "pytest (>=2.8.2)", "matplotlib", "packaging", "ipython (>=2.0)", "sphinx-rtd-theme", "sphinx"]
docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"]
ipython = ["ipython (>=2.0)"]
plot = ["matplotlib"]
@@ -539,8 +551,8 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt
[metadata]
lock-version = "1.1"
-python-versions = "^3.7"
-content-hash = "922a3f4c627233d1b4b78b5bc21e1e9598e22c8202444f035fb849912f63dfa6"
+python-versions = ">=3.7,<3.10"
+content-hash = "785517b4c8485cd29bc100fc84d28a56262e1e0821866146f074b54ef1034811"
[metadata.files]
affine = [
@@ -655,26 +667,31 @@ importlib-metadata = [
{file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"},
]
isort = [
- {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"},
- {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"},
+ {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"},
+ {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"},
]
llvmlite = [
- {file = "llvmlite-0.34.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:11342e5ac320c953590bdd9d0dec8c52f4b5252c4c6335ba25f1e7b9f91f9325"},
- {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5bdf0ce430adfaf938ced5844d12f80616eb8321b5b9edfc45ef84ada5c5242c"},
- {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e08d9d2dc5a31636bfc6b516d2d7daba95632afa3419eb8730dc76a7951e9558"},
- {file = "llvmlite-0.34.0-cp36-cp36m-win32.whl", hash = "sha256:9ff1dcdad03be0cf953aca5fc8cffdca25ccee2ec9e8ec7e95571722cdc02d55"},
- {file = "llvmlite-0.34.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5acdc3c3c7ea0ef7a1a6b442272e05d695bc8492e5b07666135ed1cfbf4ab9d2"},
- {file = "llvmlite-0.34.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb96989bc57a1ccb131e7a0e061d07b68139b6f81a98912345d53d9239e231e1"},
- {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6d3f81992f52a94077e7b9b16497029daf5b5eebb2cce56f3c8345bbc9c6308e"},
- {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d841248d1c630426c93e3eb3f8c45bca0dab77c09faeb7553b1a500220e362ce"},
- {file = "llvmlite-0.34.0-cp37-cp37m-win32.whl", hash = "sha256:408b15ffec30696406e821c89da010f1bb1eb0aa572be4561c98eb2536d610ab"},
- {file = "llvmlite-0.34.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5d1f370bf150db7239204f09cf6a0603292ea28bac984e69b167e16fe160d803"},
- {file = "llvmlite-0.34.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132322bc084abf336c80dd106f9357978c8c085911fb656898d3be0d9ff057ea"},
- {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:8f344102745fceba6eb5bf03c228bb290e9bc79157e9506a4a72878d636f9b3c"},
- {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:05253f3f44fab0148276335b2c1b2c4a78143dfa78e6bafd7f937d6248f297cc"},
- {file = "llvmlite-0.34.0-cp38-cp38-win32.whl", hash = "sha256:28264f9e2b3df4135cbcfca5a91c5b0b31dd3fc02fa623b4bb13327f0cd4fc80"},
- {file = "llvmlite-0.34.0-cp38-cp38-win_amd64.whl", hash = "sha256:964f8f7a2184963cb3617d057c2382575953e488b7bb061b632ee014cfef110a"},
- {file = "llvmlite-0.34.0.tar.gz", hash = "sha256:f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc0f9b9644b4ab0e4a5edb17f1531d791630c88858220d3cc688d6edf10da100"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f7918dbac02b1ebbfd7302ad8e8307d7877ab57d782d5f04b70ff9696b53c21b"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7768658646c418b9b3beccb7044277a608bc8c62b82a85e73c7e5c065e4157c2"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-win32.whl", hash = "sha256:05f807209a360d39526d98141b6f281b9c7c771c77a4d1fc22002440642c8de2"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d1fdd63c371626c25ad834e1c6297eb76cf2f093a40dbb401a87b6476ab4e34e"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c4e7066447305d5095d0b0a9cae7b835d2f0fde143456b3124110eab0856426"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9dad7e4bb042492914292aea3f4172eca84db731f9478250240955aedba95e08"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1ce5bc0a638d874a08d4222be0a7e48e5df305d094c2ff8dec525ef32b581551"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-win32.whl", hash = "sha256:dbedff0f6d417b374253a6bab39aa4b5364f1caab30c06ba8726904776fcf1cb"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b17fc4b0dd17bd29d7297d054e2915fad535889907c3f65232ee21f483447c5"},
+ {file = "llvmlite-0.36.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3a77e46e6053e2a86e607e87b97651dda81e619febb914824a927bff4e88737"},
+ {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:048a7c117641c9be87b90005684e64a6f33ea0897ebab1df8a01214a10d6e79a"},
+ {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7db4b0eef93125af1c4092c64a3c73c7dc904101117ef53f8d78a1a499b8d5f4"},
+ {file = "llvmlite-0.36.0-cp38-cp38-win32.whl", hash = "sha256:50b1828bde514b31431b2bba1aa20b387f5625b81ad6e12fede430a04645e47a"},
+ {file = "llvmlite-0.36.0-cp38-cp38-win_amd64.whl", hash = "sha256:f608bae781b2d343e15e080c546468c5a6f35f57f0446923ea198dd21f23757e"},
+ {file = "llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a"},
+ {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1"},
+ {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1"},
+ {file = "llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a"},
+ {file = "llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c"},
+ {file = "llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9"},
]
mako = [
{file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"},
@@ -749,58 +766,57 @@ mypy-extensions = [
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
]
numba = [
- {file = "numba-0.51.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:af798310eeb318c56cdb83254abbe9a938cc0182d08671d7f9f032dc817e064d"},
- {file = "numba-0.51.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:93e18350f2094e7432321c1275730a3143b94af012fb609cc180fa376c44867f"},
- {file = "numba-0.51.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9e2bb1f129bfadd757ad7a9c18ab79c3ab25ce6d6a68e58565d6c52ad07b3566"},
- {file = "numba-0.51.2-cp36-cp36m-win32.whl", hash = "sha256:31cdf6b6d1301d5fb6c4fcb8b4c711ba5c9f60ba2fca008b550da9b56185367c"},
- {file = "numba-0.51.2-cp36-cp36m-win_amd64.whl", hash = "sha256:df6edca13c04a31fdb5addf5205199478a7da372712829157ef491e8a6e7031f"},
- {file = "numba-0.51.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a628122dacfcba9a3ea68a9e95578c6b6391016e34962c46550ea8e189e0412e"},
- {file = "numba-0.51.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:106736d5a8dab6bebce989d4ab1b3f169c264582598f172e6e5b736210d2e834"},
- {file = "numba-0.51.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:a12f16fdb4ca5edc94e2ef412e4e768c29217ef9b6fdfc237d064ebe30acfe14"},
- {file = "numba-0.51.2-cp37-cp37m-win32.whl", hash = "sha256:025b033fd31c44bba17802293c81270084b5454b5b055b8c10c394385c232f00"},
- {file = "numba-0.51.2-cp37-cp37m-win_amd64.whl", hash = "sha256:081788f584fa500339e9b74bf02e3c5029d408c114e555ada19cae0b92721416"},
- {file = "numba-0.51.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:5416b584183fd599afda11b947b64f89450fcf26a9c15b408167f412b98a3a94"},
- {file = "numba-0.51.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:05da65dca2ac28a192c9d8f20e9e477eb1237205cfc4d131c414f5f8092c6639"},
- {file = "numba-0.51.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:aee435e3b7e465dd49971f8ea76aa414532a87736916cb399534e017334d1138"},
- {file = "numba-0.51.2-cp38-cp38-win32.whl", hash = "sha256:bbbe2432433b11d3fadab0226a84c1a81918cb905ba1aeb022249e8d2ba8856c"},
- {file = "numba-0.51.2-cp38-cp38-win_amd64.whl", hash = "sha256:259e7c15b24feec4a99fb41eb8c47b5ad49b544d1a5ad40ad0252ef531ba06fd"},
- {file = "numba-0.51.2.tar.gz", hash = "sha256:16bd59572114adbf5f600ea383880d7b2071ae45477e84a24994e089ea390768"},
+ {file = "numba-0.53.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b23de6b6837c132087d06b8b92d343edb54b885873b824a037967fbd5272ebb7"},
+ {file = "numba-0.53.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6545b9e9b0c112b81de7f88a3c787469a357eeff8211e90b8f45ee243d521cc2"},
+ {file = "numba-0.53.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:8fa5c963a43855050a868106a87cd614f3c3f459951c8fc468aec263ef80d063"},
+ {file = "numba-0.53.1-cp36-cp36m-win32.whl", hash = "sha256:aaa6ebf56afb0b6752607b9f3bf39e99b0efe3c1fa6849698373925ee6838fd7"},
+ {file = "numba-0.53.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08b3df38aab769df79ed948d70f0a54a3cdda49d58af65369235c204ec5d0f3"},
+ {file = "numba-0.53.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:bf5c463b62d013e3f709cc8277adf2f4f4d8cc6757293e29c6db121b77e6b760"},
+ {file = "numba-0.53.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:74df02e73155f669e60dcff07c4eef4a03dbf5b388594db74142ab40914fe4f5"},
+ {file = "numba-0.53.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5165709bf62f28667e10b9afe6df0ce1037722adab92d620f59cb8bbb8104641"},
+ {file = "numba-0.53.1-cp37-cp37m-win32.whl", hash = "sha256:2e96958ed2ca7e6d967b2ce29c8da0ca47117e1de28e7c30b2c8c57386506fa5"},
+ {file = "numba-0.53.1-cp37-cp37m-win_amd64.whl", hash = "sha256:276f9d1674fe08d95872d81b97267c6b39dd830f05eb992608cbede50fcf48a9"},
+ {file = "numba-0.53.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c4c8d102512ae472af52c76ad9522da718c392cb59f4cd6785d711fa5051a2a"},
+ {file = "numba-0.53.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:691adbeac17dbdf6ed7c759e9e33a522351f07d2065fe926b264b6b2c15fd89b"},
+ {file = "numba-0.53.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:94aab3e0e9e8754116325ce026e1b29ae72443c706a3104cf7f3368dc3012912"},
+ {file = "numba-0.53.1-cp38-cp38-win32.whl", hash = "sha256:aabeec89bb3e3162136eea492cea7ee8882ddcda2201f05caecdece192c40896"},
+ {file = "numba-0.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:1895ebd256819ff22256cd6fe24aa8f7470b18acc73e7917e8e93c9ac7f565dc"},
+ {file = "numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c"},
+ {file = "numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f"},
+ {file = "numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744"},
+ {file = "numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221"},
+ {file = "numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69"},
+ {file = "numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0"},
]
numpy = [
- {file = "numpy-1.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2"},
- {file = "numpy-1.19.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2"},
- {file = "numpy-1.19.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268"},
- {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0"},
- {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d"},
- {file = "numpy-1.19.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add"},
- {file = "numpy-1.19.3-cp36-cp36m-win32.whl", hash = "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d"},
- {file = "numpy-1.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f"},
- {file = "numpy-1.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822"},
- {file = "numpy-1.19.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c"},
- {file = "numpy-1.19.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed"},
- {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931"},
- {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996"},
- {file = "numpy-1.19.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6"},
- {file = "numpy-1.19.3-cp37-cp37m-win32.whl", hash = "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7"},
- {file = "numpy-1.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f"},
- {file = "numpy-1.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772"},
- {file = "numpy-1.19.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e"},
- {file = "numpy-1.19.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3"},
- {file = "numpy-1.19.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535"},
- {file = "numpy-1.19.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68"},
- {file = "numpy-1.19.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98"},
- {file = "numpy-1.19.3-cp38-cp38-win32.whl", hash = "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c"},
- {file = "numpy-1.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4"},
- {file = "numpy-1.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2"},
- {file = "numpy-1.19.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0"},
- {file = "numpy-1.19.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da"},
- {file = "numpy-1.19.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69"},
- {file = "numpy-1.19.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522"},
- {file = "numpy-1.19.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5"},
- {file = "numpy-1.19.3-cp39-cp39-win32.whl", hash = "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170"},
- {file = "numpy-1.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6"},
- {file = "numpy-1.19.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9"},
- {file = "numpy-1.19.3.zip", hash = "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72"},
+ {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"},
+ {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"},
+ {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"},
+ {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"},
+ {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"},
+ {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"},
+ {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"},
+ {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"},
+ {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"},
+ {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"},
+ {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"},
+ {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"},
+ {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"},
+ {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"},
+ {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"},
+ {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"},
+ {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"},
+ {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"},
+ {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"},
+ {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"},
+ {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"},
+ {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"},
+ {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"},
+ {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"},
+ {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"},
+ {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"},
+ {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"},
+ {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"},
]
opencv-python = [
{file = "opencv_python-4.5.2.54-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6"},
@@ -847,6 +863,27 @@ pyparsing = [
{file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
{file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
]
+pyproj = [
+ {file = "pyproj-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8eda240225971b5cd0bac2d399ed6222068f0598ee92d5f6e847bd2019d2c8b0"},
+ {file = "pyproj-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ae237492767e0225f99b53a0fd7110fde2b7e7cabc105bbc243c151a7497de88"},
+ {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b635e7e21fea5af74e90fc9e54d1a4c27078efdce6f214101c98dd93afae599a"},
+ {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa87df0982aa0f4477478899d9c930cc0f97cd6d8a4ce84c43ac88ccf86d1da7"},
+ {file = "pyproj-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:10dad599b9f7ce2194996dc25f1000e0aa15754ecef9db46b624713959c67957"},
+ {file = "pyproj-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a162ed199cd2ec392cffe20b2fa3381b68e7a166d55f3f060eceb8d517e4f46d"},
+ {file = "pyproj-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e88ebc4e08e661e9011b5c1ebfb32f0d311963a9824a6effb4168c7e07918b1"},
+ {file = "pyproj-3.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:da88abc5e2f6a8fb07533855a57ca2a31845f58901a87f821b68b0db6b023978"},
+ {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:911d773da9fa4d4f3f7580173858c391e3ee0b61acaf0be303baab323d2eae78"},
+ {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f8a8d982bde211e65dc2de1f8f36cf162f9cc7fcd8a7625046ea265284e5e65"},
+ {file = "pyproj-3.1.0-cp38-cp38-win32.whl", hash = "sha256:c4193e1069d165476b2d0f7d882b7712b3eab6e2e6fe2a0a78ef40de825a1f28"},
+ {file = "pyproj-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b6c74bbec679199746a3e02c0e0fad093c3652df96dd63e086a2fbf2afe9dc0e"},
+ {file = "pyproj-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04c185102e659439c5bd428ac5473d36ef795fca8e225bbbe78e20643d804ec0"},
+ {file = "pyproj-3.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ebbba7707fe83a01e54bce8e3e7342feb0b3e0d74ff8c28df12f8bc59b76827c"},
+ {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cc464a1c51baad28ffb7a233116e8d4ce4c560b32039fa986d0f992ac3c431f"},
+ {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f3ad09cf3352bf5664794042b28d98781362ec8d9774ad73f28a1a0101a27f1"},
+ {file = "pyproj-3.1.0-cp39-cp39-win32.whl", hash = "sha256:ae5534fa7a3b74f20534694d297fce6f7483890ff6ca404394ecf372f3c589d4"},
+ {file = "pyproj-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:808f5992320e9631b2e45444028a65cd6ba3ee40229292934178ef07020a5ffd"},
+ {file = "pyproj-3.1.0.tar.gz", hash = "sha256:67b94f4e694ae33fc90dfb7da0e6b5ed5f671dd0acc2f6cf46e9c39d56e16e1a"},
+]
pytest = [
{file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"},
{file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"},
@@ -856,15 +893,15 @@ pytest-cov = [
{file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
]
rasterio = [
- {file = "rasterio-1.2.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd590eb130d96b7823de3a1e1e359d2a83b67a9bb538880a84c123c0d4a827d9"},
- {file = "rasterio-1.2.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6b7bcc859b8447827f415d6f719f099843658a738b46531c909c9a188828f52f"},
- {file = "rasterio-1.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d219d484a567ff045a97281d900db0e1eae80c9d59f1aa8b0092f7c304590d57"},
- {file = "rasterio-1.2.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d9e28dc1b32b39be9cf1c9c571524ef544543672cc2d08ff9e43285021f5465a"},
- {file = "rasterio-1.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:89500e607ab3cffcc247ff40a5cc48cbe8c437a0b0bfaa7e36db7a1f6abc7203"},
- {file = "rasterio-1.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cd2029f497383d837d4a6fb73d6646f8d15b8a8d62c8f912aa23fc552e436306"},
- {file = "rasterio-1.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ad993c11b34affaeb8d3c5966f8ba76b77641359fd98ce7522fd5cab1a1553"},
- {file = "rasterio-1.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b9c3aaa20bf9bc01eae453a1504c0f741ab71da0959a72636f4c9d1ff7735519"},
- {file = "rasterio-1.2.4.tar.gz", hash = "sha256:31248c5ddc8f138f73b166dd93384aa72d11abd0dc27dca90a190276c7976aa3"},
+ {file = "rasterio-1.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fda220ca942ff7446458a1d532121a2a0bebffdcbe064e4719dcca348a2ed541"},
+ {file = "rasterio-1.2.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2134587770d258ed97f40e4f910b7250bd3d39cdba76f9dd1617ca73cd481ff5"},
+ {file = "rasterio-1.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6154622ec5210f5768db6544502b89487cfac10b0be9a321af33cd64e8cbe0fa"},
+ {file = "rasterio-1.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bd06ed04197eb79b96240dc90354fe15e0fe9b531312830045c849e4db57a42f"},
+ {file = "rasterio-1.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:87129e50e835e2696c17d19c5e7f5d566d09f8895d9e405e2c7d78adc63ae626"},
+ {file = "rasterio-1.2.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da2ed05c025bbdc1df8bdd9d1237e96ca3030eadabdb67722674620e9732a54a"},
+ {file = "rasterio-1.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294479e9d7caf64c95a90b2ed2ec13df6eba35f035f0c536a388e0160e9abf03"},
+ {file = "rasterio-1.2.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f55aa86bac58672ca47627a1dfecd56d35581beb49feae1f22818f97ff79abf8"},
+ {file = "rasterio-1.2.6.tar.gz", hash = "sha256:24975b97fe2fc3fd282d59640baab19de431448e1b23be6b85b68fecc1362f88"},
]
regex = [
{file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"},
diff --git a/pyproject.toml b/pyproject.toml
index df913d8..b61ced3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "geosardine"
-version = "0.13.0"
+version = "0.13.1"
license = "BSD-3-Clause"
description = "Spatial operations extend fiona and rasterio"
authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"]
@@ -18,22 +18,24 @@ classifiers = [
]
[tool.poetry.dependencies]
-python = "^3.7"
-numpy = ">=1.18,<1.19.4"
+python = ">=3.7,<3.10"
+numpy = ">=1.18"
affine = "^2.3.0"
shapely = ">=1.6.4,<2.0.0"
-tqdm = "^4.48.2"
-numba = "^0.51.2"
+tqdm = ">=4.48.2,<5.0.0"
+numba = ">=0.51.2"
click = "^7.1.2"
-gdal = "^3.0.4"
-fiona = "^1.8.13"
-rasterio = "^1.1.2"
-opencv-python = "^4.4.0"
+gdal = ">=3.0.4"
+fiona = ">=1.8.13"
+rasterio = ">=1.1.2"
+opencv-python = ">=4.4.0,<=5.0.0"
+pyproj = ">=2.6.1"
+# pyproj = { path="../../../.pypkg/pyproj-3.1.0-cp38-cp38-win_amd64.whl" }
[tool.poetry.dev-dependencies]
-# gdal = { path="../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" }
-# fiona = { path="../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" }
-# rasterio = { path="../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" }
+# gdal = { path="../../../.pypkg/GDAL-3.3.0-cp38-cp38-win_amd64.whl" }
+# fiona = { path="../../../.pypkg/Fiona-1.8.20-cp38-cp38-win_amd64.whl" }
+# rasterio = { path="../../../.pypkg/rasterio-1.2.6-cp38-cp38-win_amd64.whl" }
pip = ">=20.0.0"
pytest = "^5.2"
black = "^20.8b1"
From 143f84f9cf72b5904b6f402abc3553cef5bfddae Mon Sep 17 00:00:00 2001
From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>
Date: Sun, 20 Feb 2022 21:22:12 +0700
Subject: [PATCH 8/8] update crlf
---
CHANGELOG.md | 380 ++---
README.md | 324 ++--
conda.recipe/meta.yaml | 118 +-
geosardine/__init__.py | 70 +-
geosardine/_utility.py | 832 +++++-----
geosardine/raster.py | 2018 ++++++++++++------------
poetry.lock | 2116 +++++++++++++-------------
pyproject.toml | 112 +-
tests/idw/test_idw_file_8327.geojson | 24 +-
tests/test_geosardine_interpolate.py | 104 +-
tests/test_geosardine_raster.py | 90 +-
11 files changed, 3119 insertions(+), 3069 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 56203fb..1e2b976 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,190 +1,190 @@
-# Changelog
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-## [Unreleased]
-
-## [0.13.1] - 2021-06-23
-
-### Changed
-- update dependency to latest
-
-## [0.13.0] - 2021-06-18
-
-### Changed
-- support any epsg code for calculating distance by using each datum semi major and semi minor axes
-
-## [0.12.0-aplha] - 2021-05-19
-
-### Added
-- clip2bbox
-
-## [0.11.0-aplha1] - 2021-03-19
-
-### Added
-- Added polygonize in raster
-
-### Fixed
-- Fixed unused argument (offset) in Raster.xy2rowcol
-### Changed
-- moved pip to development dependency
-- simplified numba xy2rowcol without creating new variable
-- updated environment.yml
-
-### Removed
-- removed unused module in utility
-
-## [0.11.0-alpha0] - 2021-02-24
-
-### Fixed
-- fixed xy2rowcol
-- fixed coordinate for idw to reduce it by half of resolution to represent upper left pixel
-
-### Added
-- indexing return raster with respective coordinate
-- split into tiled
-- interpolation return Raster instead InterpolationResult
-
-### Deprecated
-- py_resample will be removed in the future
-
-
-
-## [0.10.3] - 2021-01-29
-### Added
-- Added offset in xy2rowcol
-- add ipython in dev dependency
-
-
-## [0.10.2] - 2020-12-18
-
-### Fixed
-
-- Flipped xy2rowcol numba
-- fixed no data in Raster.from_rasterfile
-- define resolution, when input is affine in Raster
-- raster calculator error, caused by numba typing
-- fixed algorithm with offset for raster calculator
-
-### Added
-
-- save with lzw compression
-## [0.10.0] - 2020-12-17
-
-### Added
-
-- Raster calculation using numba
-- add floordiv
-- parse raster from binary file
-- add shape ordering in reading raster from binary file
-- parse raster from raster file
-- doc script for linux
-- add pdoc3 in dev dependency
-- add changelog.md in pyproject
-
-### Changed
-
-- Use numba to raster calculation
-- upper changed to top
-
-
-### Fixed
-
-- Restrict numpy version below 1.19.4, caused error in windows
-
-## [0.9.5] - 2020-12-13
-
-### Fixed
-
-- Flipped cv resize input
-- Return numpy array when slicing
-
-## [0.9.4] - 2020-12-11
-
-### Added
-
-- add no data when saving raster
-- documentation for Raster attributes
-- add missing return type in save_raster
-
-### Changed
-
-- py resample, resize and opencv resample, resize turn into private method. To prevent confusion, less abstraction.
-
-### Removed
-
-- remove import numba in raster.py
-
-## [0.9.3] - 2020-12-10
-
-### Added
-
-- upper, left, right, bottom boundary
-
-### Changed
-
-- minimum argument needed is x_min, y_max, resolution or transform
-- simpler conditional statement in raster init
-- x_min, x_max, y_max,y_min is computed properties
-
-### Fixed
-
-- save raster return exact layer not +1 layer
-- return no data if pixel out of bound for raster calculation
-- raise error when using xy_value and the row col index is negative
-
-## [0.9.2] - 2020-12-09
-### Added
-- Add numpy.ndarray type in raster calculation
-- Raster.xy_value documentation
-- Add pytest to check affine parameter
-
-### Changed
-- Show error if xy_value result is out of bound
-- Change y_min into y_max in raster calculation, resize and resample
-
-### Fixed
-- Fix y_min attribute in raster calculation, resize and resample
-
-## [0.9.1] - 2020-12-09
-### Changed
-- Change y_min into y_max in creating Affine
-
-## [0.9.0] - 2020-12-08
-### Added
-- resize and resample using opencv for faster performance
-- check validity, y_min should be less than y_max and x_min should be less than x_max
-- add no data value
-- return no data if any pixel is no data (raster calculation)
-
-### Changed
-- Use x_min and y_max as minimum input argument to fit upper left extent
-- Refactor raster calculation per pixel to reduce cognitive complexity
-- Check array shape as a tuple
-
-### Fixed
-- Remove pip check because different opencv name in pypi and anaconda
-
-### Removed
-- Remove shape check per element
-
-## [0.8.0] - 2020-12-05
-### Added
-- Raster wrapper
-- Support multiple layer in raster calculation
-
-
-[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.1...HEAD
-[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.13.0...v0.13.1
-[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0
-[0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0
-[0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0
-[0.10.2]: https://github.com/sahitono/geosardine/compare/v0.9.5...v0.10.2
-[0.9.5]: https://github.com/sahitono/geosardine/compare/v0.9.4...v0.9.5
-[0.9.4]: https://github.com/sahitono/geosardine/compare/v0.9.3...v0.9.4
-[0.9.3]: https://github.com/sahitono/geosardine/compare/v0.9.2...v0.9.3
-[0.9.2]: https://github.com/sahitono/geosardine/compare/v0.9.0...v0.9.2
-[0.9.0]: https://github.com/sahitono/geosardine/compare/v0.8.0...v0.9.0
-[0.8.0]: https://github.com/sahitono/geosardine/releases/tag/v0.8.0
+# Changelog
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+## [0.13.1] - 2021-06-23
+
+### Changed
+- update dependency to latest
+
+## [0.13.0] - 2021-06-18
+
+### Changed
+- support any epsg code for calculating distance by using each datum semi major and semi minor axes
+
+## [0.12.0-aplha] - 2021-05-19
+
+### Added
+- clip2bbox
+
+## [0.11.0-aplha1] - 2021-03-19
+
+### Added
+- Added polygonize in raster
+
+### Fixed
+- Fixed unused argument (offset) in Raster.xy2rowcol
+### Changed
+- moved pip to development dependency
+- simplified numba xy2rowcol without creating new variable
+- updated environment.yml
+
+### Removed
+- removed unused module in utility
+
+## [0.11.0-alpha0] - 2021-02-24
+
+### Fixed
+- fixed xy2rowcol
+- fixed coordinate for idw to reduce it by half of resolution to represent upper left pixel
+
+### Added
+- indexing return raster with respective coordinate
+- split into tiled
+- interpolation return Raster instead InterpolationResult
+
+### Deprecated
+- py_resample will be removed in the future
+
+
+
+## [0.10.3] - 2021-01-29
+### Added
+- Added offset in xy2rowcol
+- add ipython in dev dependency
+
+
+## [0.10.2] - 2020-12-18
+
+### Fixed
+
+- Flipped xy2rowcol numba
+- fixed no data in Raster.from_rasterfile
+- define resolution, when input is affine in Raster
+- raster calculator error, caused by numba typing
+- fixed algorithm with offset for raster calculator
+
+### Added
+
+- save with lzw compression
+## [0.10.0] - 2020-12-17
+
+### Added
+
+- Raster calculation using numba
+- add floordiv
+- parse raster from binary file
+- add shape ordering in reading raster from binary file
+- parse raster from raster file
+- doc script for linux
+- add pdoc3 in dev dependency
+- add changelog.md in pyproject
+
+### Changed
+
+- Use numba to raster calculation
+- upper changed to top
+
+
+### Fixed
+
+- Restrict numpy version below 1.19.4, caused error in windows
+
+## [0.9.5] - 2020-12-13
+
+### Fixed
+
+- Flipped cv resize input
+- Return numpy array when slicing
+
+## [0.9.4] - 2020-12-11
+
+### Added
+
+- add no data when saving raster
+- documentation for Raster attributes
+- add missing return type in save_raster
+
+### Changed
+
+- py resample, resize and opencv resample, resize turn into private method. To prevent confusion, less abstraction.
+
+### Removed
+
+- remove import numba in raster.py
+
+## [0.9.3] - 2020-12-10
+
+### Added
+
+- upper, left, right, bottom boundary
+
+### Changed
+
+- minimum argument needed is x_min, y_max, resolution or transform
+- simpler conditional statement in raster init
+- x_min, x_max, y_max,y_min is computed properties
+
+### Fixed
+
+- save raster return exact layer not +1 layer
+- return no data if pixel out of bound for raster calculation
+- raise error when using xy_value and the row col index is negative
+
+## [0.9.2] - 2020-12-09
+### Added
+- Add numpy.ndarray type in raster calculation
+- Raster.xy_value documentation
+- Add pytest to check affine parameter
+
+### Changed
+- Show error if xy_value result is out of bound
+- Change y_min into y_max in raster calculation, resize and resample
+
+### Fixed
+- Fix y_min attribute in raster calculation, resize and resample
+
+## [0.9.1] - 2020-12-09
+### Changed
+- Change y_min into y_max in creating Affine
+
+## [0.9.0] - 2020-12-08
+### Added
+- resize and resample using opencv for faster performance
+- check validity, y_min should be less than y_max and x_min should be less than x_max
+- add no data value
+- return no data if any pixel is no data (raster calculation)
+
+### Changed
+- Use x_min and y_max as minimum input argument to fit upper left extent
+- Refactor raster calculation per pixel to reduce cognitive complexity
+- Check array shape as a tuple
+
+### Fixed
+- Remove pip check because different opencv name in pypi and anaconda
+
+### Removed
+- Remove shape check per element
+
+## [0.8.0] - 2020-12-05
+### Added
+- Raster wrapper
+- Support multiple layer in raster calculation
+
+
+[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.1...HEAD
+[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.13.0...v0.13.1
+[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0
+[0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0
+[0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0
+[0.10.2]: https://github.com/sahitono/geosardine/compare/v0.9.5...v0.10.2
+[0.9.5]: https://github.com/sahitono/geosardine/compare/v0.9.4...v0.9.5
+[0.9.4]: https://github.com/sahitono/geosardine/compare/v0.9.3...v0.9.4
+[0.9.3]: https://github.com/sahitono/geosardine/compare/v0.9.2...v0.9.3
+[0.9.2]: https://github.com/sahitono/geosardine/compare/v0.9.0...v0.9.2
+[0.9.0]: https://github.com/sahitono/geosardine/compare/v0.8.0...v0.9.0
+[0.8.0]: https://github.com/sahitono/geosardine/releases/tag/v0.8.0
diff --git a/README.md b/README.md
index 1607ab5..b44bd68 100644
--- a/README.md
+++ b/README.md
@@ -1,162 +1,162 @@
-# Geo-Sardine :fish:
-![python package](https://github.com/sahitono/geosardine/workflows/python%20package/badge.svg)
-[![codecov](https://codecov.io/gh/sahitono/geosardine/branch/master/graph/badge.svg)](https://codecov.io/gh/sahitono/geosardine)
-[![Maintainability](https://api.codeclimate.com/v1/badges/e7ec3c08fe42ef4b5e19/maintainability)](https://codeclimate.com/github/sahitono/geosardine/maintainability)
-
-![PyPI - Python Version](https://img.shields.io/pypi/pyversions/geosardine)
-![PyPI](https://img.shields.io/pypi/v/geosardine)
-![Conda](https://img.shields.io/conda/v/sahitono/geosardine)
-
-Spatial operations extend fiona and rasterio.
-Collection of spatial operation which i occasionally use written in python:
- - Interpolation with IDW (Inverse Distance Weighting) Shepard
- - Drape vector to raster
- - Spatial join between two vector
- - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample
-
-:blue_book: documentation: https://sahitono.github.io/geosardine
-## Setup
-install with pip
-```pip install geosardine```
-
-or anaconda
-```conda install -c sahitono geosardine```
-
-## How to use it
-
-#### Drape and spatial join
-```python
-import geosardine as dine
-import rasterio
-import fiona
-
-with rasterio.open("/home/user/data.tif") as raster, fiona.open("/home/user/data.shp") as vector:
- draped = dine.drape_geojson(vector, raster)
- joined = dine.spatial_join(vector, raster)
-```
-#### IDW Interpolation
-```python
-import numpy as np
-import geosardine as dine
-xy = np.array([
- [106.8358, -6.585 ],
- [106.6039, -6.7226],
- [106.7589, -6.4053],
- [106.9674, -6.7092],
- [106.7956, -6.5988]
-])
-values = np.array([132., 127., 37., 90., 182.])
-
-"""
-if epsg not provided, it will assume that coordinate is in wgs84 geographic
-Find your epsg here https://epsg.io/
-"""
-interpolated = dine.interpolate.idw(xy, values, spatial_res=(0.01,0.01), epsg=4326)
-
-# Save interpolation result to tiff
-interpolated.save('idw.tif')
-
-# shapefile or geojson can be used too
-interp_file = dine.interpolate.idw("points.shp", spatial_res=(0.01,0.01), column_name="value")
-interp_file.save("idw.tif")
-
-# The result array can be accessed like this
-print(interpolated.array)
-"""
-[[ 88.63769859 86.24219616 83.60463194 ... 101.98185127 103.37001289
- 104.54621272]
- [ 90.12053232 87.79279317 85.22030848 ... 103.77118852 105.01425289
- 106.05302554]
- [ 91.82987695 89.60855271 87.14722258 ... 105.70090081 106.76928067
- 107.64635337]
- ...
- [127.21214817 127.33208302 127.53878268 ... 97.80436475 94.96247196
- 93.12113458]
- [127.11315081 127.18465002 127.33444124 ... 95.86455668 93.19212577
- 91.51135399]
- [127.0435062 127.0827023 127.19214624 ... 94.80175756 92.30685734
- 90.75707134]]
-"""
-
-
-```
-
-
-## Raster Wrapper
-Geosardine include wrapper for raster data. The benefit are:
-1. math operation (addition, subtraction, division, multiplication) between rasters of different size, resolution and reference system.
- The data type result is equal to the first raster data type
-
- for example:
- ```
- raster1 = float32 and raster2 = int32
- raster3 = raster1 - raster2
- raster3 will be float32
- ```
-
-
-2. resample with opencv
-3. resize with opencv
-4. split into tiled
-
-
-```python
-from geosardine import Raster
-
-
-"""
-minimum parameter needed to create raster are
-1. 2D numpy array, example: np.ones(18, dtype=np.float32).reshape(3, 3, 2)
-2. spatial resolution, example: 0.4 or ( 0.4, 0.4)
-3. left coordinate / x minimum
-4. bottom coordinate / y minimum
-"""
-raster1 = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
-
-## resample
-resampled = raster.resample((0.2,0.2))
-## resize
-resized = raster.resize(height=16, width=16)
-
-## math operation between raster
-raster_2 = raster + resampled
-raster_2 = raster - resampled
-raster_2 = raster * resampled
-raster_2 = raster / resampled
-
-## math operation raster to number
-raster_3 = raster + 2
-raster_3 = raster - 2
-raster_3 = raster * 2
-raster_3 = raster / 2
-
-### plot it using raster.array
-import matplotlib.pyplot as plt
-plt.imshow(raster_3)
-plt.show()
-
-```
-
-
-
-## Geosardine CLI
-You can use it through terminal or command prompt by calling **dine**
-
-```
-$ dine --help
-Usage: dine [OPTIONS] COMMAND [ARGS]...
-
- GeoSardine CLI
-
-Options:
- --help Show this message and exit.
-
-Commands:
- drape Drape vector to raster to obtain height value
- info Get supported format
- join-spatial Join attribute by location
- idw Create raster with Inverse Distance Weighting interpolation
-```
-
-### License
-[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
+# Geo-Sardine :fish:
+![python package](https://github.com/sahitono/geosardine/workflows/python%20package/badge.svg)
+[![codecov](https://codecov.io/gh/sahitono/geosardine/branch/master/graph/badge.svg)](https://codecov.io/gh/sahitono/geosardine)
+[![Maintainability](https://api.codeclimate.com/v1/badges/e7ec3c08fe42ef4b5e19/maintainability)](https://codeclimate.com/github/sahitono/geosardine/maintainability)
+
+![PyPI - Python Version](https://img.shields.io/pypi/pyversions/geosardine)
+![PyPI](https://img.shields.io/pypi/v/geosardine)
+![Conda](https://img.shields.io/conda/v/sahitono/geosardine)
+
+Spatial operations extend fiona and rasterio.
+Collection of spatial operation which i occasionally use written in python:
+ - Interpolation with IDW (Inverse Distance Weighting) Shepard
+ - Drape vector to raster
+ - Spatial join between two vector
+ - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample
+
+:blue_book: documentation: https://sahitono.github.io/geosardine
+## Setup
+install with pip
+```pip install geosardine```
+
+or anaconda
+```conda install -c sahitono geosardine```
+
+## How to use it
+
+#### Drape and spatial join
+```python
+import geosardine as dine
+import rasterio
+import fiona
+
+with rasterio.open("/home/user/data.tif") as raster, fiona.open("/home/user/data.shp") as vector:
+ draped = dine.drape_geojson(vector, raster)
+ joined = dine.spatial_join(vector, raster)
+```
+#### IDW Interpolation
+```python
+import numpy as np
+import geosardine as dine
+xy = np.array([
+ [106.8358, -6.585 ],
+ [106.6039, -6.7226],
+ [106.7589, -6.4053],
+ [106.9674, -6.7092],
+ [106.7956, -6.5988]
+])
+values = np.array([132., 127., 37., 90., 182.])
+
+"""
+if epsg not provided, it will assume that coordinate is in wgs84 geographic
+Find your epsg here https://epsg.io/
+"""
+interpolated = dine.interpolate.idw(xy, values, spatial_res=(0.01,0.01), epsg=4326)
+
+# Save interpolation result to tiff
+interpolated.save('idw.tif')
+
+# shapefile or geojson can be used too
+interp_file = dine.interpolate.idw("points.shp", spatial_res=(0.01,0.01), column_name="value")
+interp_file.save("idw.tif")
+
+# The result array can be accessed like this
+print(interpolated.array)
+"""
+[[ 88.63769859 86.24219616 83.60463194 ... 101.98185127 103.37001289
+ 104.54621272]
+ [ 90.12053232 87.79279317 85.22030848 ... 103.77118852 105.01425289
+ 106.05302554]
+ [ 91.82987695 89.60855271 87.14722258 ... 105.70090081 106.76928067
+ 107.64635337]
+ ...
+ [127.21214817 127.33208302 127.53878268 ... 97.80436475 94.96247196
+ 93.12113458]
+ [127.11315081 127.18465002 127.33444124 ... 95.86455668 93.19212577
+ 91.51135399]
+ [127.0435062 127.0827023 127.19214624 ... 94.80175756 92.30685734
+ 90.75707134]]
+"""
+
+
+```
+
+
+## Raster Wrapper
+Geosardine include wrapper for raster data. The benefit are:
+1. math operation (addition, subtraction, division, multiplication) between rasters of different size, resolution and reference system.
+ The data type result is equal to the first raster data type
+
+ for example:
+ ```
+ raster1 = float32 and raster2 = int32
+ raster3 = raster1 - raster2
+ raster3 will be float32
+ ```
+
+
+2. resample with opencv
+3. resize with opencv
+4. split into tiled
+
+
+```python
+from geosardine import Raster
+
+
+"""
+minimum parameter needed to create raster are
+1. 2D numpy array, example: np.ones(18, dtype=np.float32).reshape(3, 3, 2)
+2. spatial resolution, example: 0.4 or ( 0.4, 0.4)
+3. left coordinate / x minimum
+4. bottom coordinate / y minimum
+"""
+raster1 = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
+
+## resample
+resampled = raster.resample((0.2,0.2))
+## resize
+resized = raster.resize(height=16, width=16)
+
+## math operation between raster
+raster_2 = raster + resampled
+raster_2 = raster - resampled
+raster_2 = raster * resampled
+raster_2 = raster / resampled
+
+## math operation raster to number
+raster_3 = raster + 2
+raster_3 = raster - 2
+raster_3 = raster * 2
+raster_3 = raster / 2
+
+### plot it using raster.array
+import matplotlib.pyplot as plt
+plt.imshow(raster_3)
+plt.show()
+
+```
+
+
+
+## Geosardine CLI
+You can use it through terminal or command prompt by calling **dine**
+
+```
+$ dine --help
+Usage: dine [OPTIONS] COMMAND [ARGS]...
+
+ GeoSardine CLI
+
+Options:
+ --help Show this message and exit.
+
+Commands:
+ drape Drape vector to raster to obtain height value
+ info Get supported format
+ join-spatial Join attribute by location
+ idw Create raster with Inverse Distance Weighting interpolation
+```
+
+### License
+[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
index 46b27e4..e6c0e50 100644
--- a/conda.recipe/meta.yaml
+++ b/conda.recipe/meta.yaml
@@ -1,59 +1,59 @@
-{% set name = "geosardine" %}
-{% set version = "0.13.1" %}
-
-package:
- name: {{ name|lower }}
- version: {{ version }}
-
-source:
- url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz
- sha256: a3737c9dad7d52b41f6cebb18d6c085c5a0ad14a9dc2c23f977c42be305db1b5
-
-build:
- noarch: python
- number: 0
- entry_points:
- - dine = geosardine.__main__:main
-# script: {{ PYTHON }} -m pip install . -vv
-
-requirements:
- host:
- - python >=3.6,<3.10
- - pip
- - pytest-runner
-# - poetry
-
- run:
- - affine >=2.3.0,<3.0.0
- - click >=7.1.2,<8.0.0
- - fiona >=1.8.13,<2.0.0
- - gdal >=3.0.4
- - numba >=0.51.2
- - numpy >=1.18,<2.0
- - python >=3.6,<3.10
- - rasterio >=1.1.4,<2.0.0
- - shapely >=1.6.4,<2.0.0
- - tqdm
- - opencv >=4.4.0,<5.0.0
-
-
-test:
- imports:
- - geosardine
- - geosardine.interpolate
- - geosardine.raster
- commands:
- - dine --help
- requires:
- - pytest
-
-about:
- home: https://github.com/sahitono/geosardine
- summary: Spatial operations extend fiona and rasterio
- license: BSD-3-Clause
- license_family: BSD
- license_file: LICENSE.txt
-
-extra:
- recipe-maintainers:
- - sahitono
+{% set name = "geosardine" %}
+{% set version = "0.13.1" %}
+
+package:
+ name: {{ name|lower }}
+ version: {{ version }}
+
+source:
+ url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz
+ sha256: a3737c9dad7d52b41f6cebb18d6c085c5a0ad14a9dc2c23f977c42be305db1b5
+
+build:
+ noarch: python
+ number: 0
+ entry_points:
+ - dine = geosardine.__main__:main
+# script: {{ PYTHON }} -m pip install . -vv
+
+requirements:
+ host:
+ - python >=3.6,<3.10
+ - pip
+ - pytest-runner
+# - poetry
+
+ run:
+ - affine >=2.3.0,<3.0.0
+ - click >=7.1.2,<8.0.0
+ - fiona >=1.8.13,<2.0.0
+ - gdal >=3.0.4
+ - numba >=0.51.2
+ - numpy >=1.18,<2.0
+ - python >=3.6,<3.10
+ - rasterio >=1.1.4,<2.0.0
+ - shapely >=1.6.4,<2.0.0
+ - tqdm
+ - opencv >=4.4.0,<5.0.0
+
+
+test:
+ imports:
+ - geosardine
+ - geosardine.interpolate
+ - geosardine.raster
+ commands:
+ - dine --help
+ requires:
+ - pytest
+
+about:
+ home: https://github.com/sahitono/geosardine
+ summary: Spatial operations extend fiona and rasterio
+ license: BSD-3-Clause
+ license_family: BSD
+ license_file: LICENSE.txt
+
+extra:
+ recipe-maintainers:
+ - sahitono
diff --git a/geosardine/__init__.py b/geosardine/__init__.py
index 572eb78..dc6eb0c 100644
--- a/geosardine/__init__.py
+++ b/geosardine/__init__.py
@@ -1,35 +1,35 @@
-"""
-Spatial operations extend fiona and rasterio.
-Collection of spatial operation which i occasionally use written in python:
- - Interpolation with IDW (Inverse Distance Weighting) Shepard
- - Drape vector to raster
- - Spatial join between two vector
- - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample
-"""
-from . import interpolate
-from ._geosardine import (
- drape2raster,
- drape_geojson,
- drape_shapely,
- rowcol2xy,
- spatial_join,
- xy2rowcol,
-)
-from ._utility import harvesine_distance, vincenty_distance
-from .raster import Raster
-
-__all__ = [
- "rowcol2xy",
- "xy2rowcol",
- "drape2raster",
- "spatial_join",
- "drape_shapely",
- "drape_geojson",
- "interpolate",
- "harvesine_distance",
- "vincenty_distance",
- "Raster",
-]
-
-__version__ = "0.10.2"
-__author__ = "Sahit Tuntas Sadono"
+"""
+Spatial operations extend fiona and rasterio.
+Collection of spatial operation which i occasionally use written in python:
+ - Interpolation with IDW (Inverse Distance Weighting) Shepard
+ - Drape vector to raster
+ - Spatial join between two vector
+ - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample
+"""
+from . import interpolate
+from ._geosardine import (
+ drape2raster,
+ drape_geojson,
+ drape_shapely,
+ rowcol2xy,
+ spatial_join,
+ xy2rowcol,
+)
+from ._utility import harvesine_distance, vincenty_distance
+from .raster import Raster
+
+__all__ = [
+ "rowcol2xy",
+ "xy2rowcol",
+ "drape2raster",
+ "spatial_join",
+ "drape_shapely",
+ "drape_geojson",
+ "interpolate",
+ "harvesine_distance",
+ "vincenty_distance",
+ "Raster",
+]
+
+__version__ = "0.13.2"
+__author__ = "Sahit Tuntas Sadono"
diff --git a/geosardine/_utility.py b/geosardine/_utility.py
index 66638b7..5177c04 100644
--- a/geosardine/_utility.py
+++ b/geosardine/_utility.py
@@ -1,416 +1,416 @@
-import math
-from functools import singledispatch
-from pathlib import Path
-from typing import List, Optional, Tuple, Union
-
-import numba
-import numpy as np
-import rasterio
-from affine import Affine
-from osgeo import osr
-from rasterio.crs import CRS
-
-
-def calc_affine(coordinate_array: np.ndarray) -> Affine:
- x_res = coordinate_array[0, 1, 0] - coordinate_array[0, 0, 0]
- y_res = coordinate_array[1, 0, 1] - coordinate_array[0, 0, 1]
- x_min, y_max = coordinate_array[0, 0]
- x_min -= x_res / 2
- y_max -= y_res / 2
- affine = Affine.translation(*coordinate_array[0, 0]) * Affine.scale(x_res, y_res)
- return affine
-
-
-def get_ellipsoid_par(epsg: int) -> Tuple[float, float, float]:
- crs = CRS.from_epsg(epsg)
- semi_major = float(
- osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 1)
- )
- inverse_flattening = float(
- osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 2)
- )
- semi_minor: float = (1 - (1 / inverse_flattening)) * semi_major
- return semi_major, semi_minor, inverse_flattening
-
-
-def save_raster(
- file_name: Union[str, Path],
- value_array: np.ndarray,
- crs: Union[CRS, int],
- coordinate_array: Optional[np.ndarray] = None,
- affine: Optional[Affine] = None,
- nodata: Union[None, float, int] = None,
- compress: bool = False,
-) -> None:
-
- if len(value_array.shape) == 3:
- height, width, layers = value_array.shape
- else:
- height, width = value_array.shape
- layers = 1
-
- value_array = value_array.reshape(height, width, layers)
-
- _compress = None
- if compress:
- _compress = "lzw"
-
- if affine is None:
- if coordinate_array is None:
- raise ValueError("please, provide array of coordinate per pixel")
- affine = calc_affine(coordinate_array)
-
- if type(crs) == int:
- crs = CRS.from_epsg(crs)
- if nodata is not None:
- with rasterio.open(
- file_name,
- "w",
- driver="GTiff",
- height=height,
- width=width,
- count=layers,
- dtype=value_array.dtype,
- crs=crs,
- transform=affine,
- nodata=nodata,
- compress=_compress,
- ) as raster:
- for layer in range(layers):
- raster.write(value_array[:, :, layer], layer + 1)
- else:
- with rasterio.open(
- file_name,
- "w",
- driver="GTiff",
- height=height,
- width=width,
- count=layers,
- dtype=value_array.dtype,
- crs=crs,
- transform=affine,
- compress=_compress,
- ) as raster:
- for layer in range(layers):
- raster.write(value_array[:, :, layer], layer + 1)
- print(f"{file_name} saved")
-
-
-def harvesine_distance(
- long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
- long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
- epsg: int = 4326,
-) -> Optional[float]:
-
- """Calculate distance in ellipsoid by harvesine method
- faster, less accurate
-
- Parameters
- ----------
- long_lat1 : tuple, list
- first point coordinate in longitude, latitude
- long_lat2 : tuple, list
- second point coordinate in longitude, latitude
- epsg : int, optional
- epsg code of the spatial reference system, by default 4326
-
- Returns
- -------
- Optional[float]
- distance, if None then input is not np.ndarray, tuple or list
-
- Notes
- -------
- https://rafatieppo.github.io/post/2018_07_27_idw2pyr/
- """
-
- semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg)
-
- return _harvesine_distance_dispatch(
- long_lat1,
- long_lat2,
- semi_major=semi_major,
- semi_minor=semi_minor,
- i_flattening=i_flattening,
- )
-
-
-@singledispatch
-def _harvesine_distance_dispatch(
- long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
- long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
- semi_major: float,
- semi_minor: float,
- i_flattening: float,
-) -> Optional[float]:
- """
- Calculate distance in ellipsoid by harvesine method
- faster, less accurate
-
- Parameters
- ----------
- long_lat1 : tuple, list, numpy array
- first point coordinate in longitude, latitude
- long_lat2 : tuple, list, numpy array
- second point coordinate in longitude, latitude
- semi_major : float
- ellipsoid's semi major axes
- semi_minor : float
- ellipsoid's semi minor axes
- i_flattening : float
- ellipsoid's inverse flattening
-
- Returns
- -------
- Optional[float]
- distance, if None then input is not np.ndarray, tuple or list
-
- Notes
- -------
- https://rafatieppo.github.io/post/2018_07_27_idw2pyr/
- """
-
- print("only accept numpy array, list and tuple")
- return None
-
-
-@_harvesine_distance_dispatch.register(np.ndarray)
-@numba.njit()
-def _harvesine_distance(
- long_lat1: np.ndarray,
- long_lat2: np.ndarray,
- semi_major: float = 6378137.0,
- semi_minor: float = 6356752.314245179,
- i_flattening=298.257223563,
-) -> float:
- long1, lat1 = np.radians(long_lat1)
- long2, lat2 = np.radians(long_lat2)
-
- long_diff = long2 - long1
- lat_diff = lat2 - lat1
- a = (
- math.sin(lat_diff / 2) ** 2
- + math.cos(lat1) * math.cos(lat2) * math.sin(long_diff / 2) ** 2
- )
- c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
- return np.abs(semi_major * c)
-
-
-@_harvesine_distance_dispatch.register(list)
-def __harvesine_distance(
- long_lat1: List[float],
- long_lat2: List[float],
- semi_major: float,
- semi_minor: float,
- i_flattening: float,
-):
- return _harvesine_distance(
- np.array(long_lat1),
- np.array(long_lat2),
- semi_major,
- semi_minor,
- i_flattening,
- )
-
-
-@_harvesine_distance_dispatch.register(tuple)
-def __harvesine_distance(
- long_lat1: Tuple[float, float],
- long_lat2: Tuple[float, float],
- semi_major: float,
- semi_minor: float,
- i_flattening: float,
-):
- return _harvesine_distance(
- np.array(long_lat1),
- np.array(long_lat2),
- semi_major,
- semi_minor,
- i_flattening,
- )
-
-
-def vincenty_distance(
- long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
- long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
- epsg: int = 4326,
-) -> float:
- """Calculate distance in ellipsoid by vincenty method
- slower, more accurate
-
- Parameters
- ----------
- long_lat1 : tuple, list
- first point coordinate in longitude, latitude
- long_lat2 : tuple, list
- second point coordinate in longitude, latitude
- epsg : int, optional
- epsg code of the spatial reference system, by default 4326
-
- Returns
- -------
- float
- distance
-
- Notes
- -------
- https://www.johndcook.com/blog/2018/11/24/spheroid-distance/
- """
-
- semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg)
-
- return _vincenty_distance_dispatch(
- long_lat1,
- long_lat2,
- semi_major=semi_major,
- semi_minor=semi_minor,
- i_flattening=i_flattening,
- )
-
-
-@singledispatch
-def _vincenty_distance_dispatch(
- long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
- long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
- epsg: int,
- semi_major: float,
- semi_minor: float,
- i_flattening: float,
-) -> Optional[float]:
- """
- Calculate distance in ellipsoid by vincenty method
- slower, more accurate
-
- Parameters
- ----------
- long_lat1 : tuple, list
- first point coordinate in longitude, latitude
- long_lat2 : tuple, list
- second point coordinate in longitude, latitude
- semi_major : float
- ellipsoid's semi major axes
- semi_minor : float
- ellipsoid's semi minor axes
- i_flattening : float
- ellipsoid's inverse flattening
-
- Returns
- -------
- distance
-
- Notes
- -------
- https://www.johndcook.com/blog/2018/11/24/spheroid-distance/
- """
-
- print("only accept numpy array, list and tuple")
- return None
-
-
-@_vincenty_distance_dispatch.register(np.ndarray)
-@numba.njit()
-def _vincenty_distance(
- long_lat1: np.ndarray,
- long_lat2: np.ndarray,
- semi_major: float = 6378137.0,
- semi_minor: float = 6356752.314245179,
- i_flattening=298.257223563,
-) -> float:
- # WGS 1984
- flattening = 1 / i_flattening
- tolerance = 1e-11 # to stop iteration
-
- radians = math.pi / 180
- long1, lat1 = np.radians(long_lat1)
- long2, lat2 = np.radians(long_lat2)
-
- distance = 0.0
-
- if long1 != long2 and lat1 != lat2:
- phi1, phi2 = lat1, lat2
- u1 = math.atan((1 - flattening) * math.tan(phi1))
- u2 = math.atan((1 - flattening) * math.tan(phi2))
- long_diff = long2 - long1
-
- lambda_old = long_diff + 0
-
- while True:
- t = (math.cos(u2) * math.sin(lambda_old)) ** 2
- t += (
- math.cos(u1) * math.sin(u2)
- - math.sin(u1) * math.cos(u2) * math.cos(lambda_old)
- ) ** 2
- sin_sigma = t ** 0.5
- cos_sigma = math.sin(u1) * math.sin(u2) + math.cos(u1) * math.cos(
- u2
- ) * math.cos(lambda_old)
- sigma = math.atan2(sin_sigma, cos_sigma)
-
- sin_alpha = math.cos(u1) * math.cos(u2) * math.sin(lambda_old) / sin_sigma
- cos_sq_alpha = 1 - sin_alpha ** 2
- cos_2sigma_m = cos_sigma - 2 * math.sin(u1) * math.sin(u2) / cos_sq_alpha
- c = (
- flattening
- * cos_sq_alpha
- * (4 + flattening * (4 - 3 * cos_sq_alpha))
- / 16
- )
-
- t = sigma + c * sin_sigma * (
- cos_2sigma_m + c * cos_sigma * (-1 + 2 * cos_2sigma_m ** 2)
- )
- lambda_new = long_diff + (1 - c) * flattening * sin_alpha * t
- if abs(lambda_new - lambda_old) <= tolerance:
- break
- else:
- lambda_old = lambda_new
-
- u2 = cos_sq_alpha * ((semi_major ** 2 - semi_minor ** 2) / semi_minor ** 2)
- A = 1 + (u2 / 16384) * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)))
- B = (u2 / 1024) * (256 + u2 * (-128 + u2 * (74 - 47 * u2)))
- t = cos_2sigma_m + 0.25 * B * (cos_sigma * (-1 + 2 * cos_2sigma_m ** 2))
- t -= (
- (B / 6)
- * cos_2sigma_m
- * (-3 + 4 * sin_sigma ** 2)
- * (-3 + 4 * cos_2sigma_m ** 2)
- )
- delta_sigma = B * sin_sigma * t
- distance = semi_minor * A * (sigma - delta_sigma)
-
- return np.abs(distance)
-
-
-@_vincenty_distance_dispatch.register(list)
-def __vincenty_distance(
- long_lat1: List[float], long_lat2: List[float], *args, **kwargs
-):
- return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs)
-
-
-@_vincenty_distance_dispatch.register(tuple)
-def __vincenty_distance(
- long_lat1: Tuple[float, float], long_lat2: Tuple[float, float], *args, **kwargs
-):
- return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs)
-
-
-@numba.njit()
-def projected_distance(
- xy1: Union[Tuple[float, float], List[float]],
- xy2: Union[Tuple[float, float], List[float]],
-) -> float:
- return math.sqrt((xy1[0] - xy2[0]) ** 2 + (xy1[1] - xy2[1]) ** 2)
-
-
-def calc_extent(points: np.ndarray) -> Tuple[float, float, float, float]:
- x_max, y_max = points[:, 0].max(), points[:, 1].max()
- x_min, y_min = points[:, 0].min(), points[:, 1].min()
- return x_min, y_min, x_max, y_max
-
-
-calc_distance = {
- "harvesine": _harvesine_distance,
- "vincenty": _vincenty_distance,
- "projected": projected_distance,
-}
+import math
+from functools import singledispatch
+from pathlib import Path
+from typing import List, Optional, Tuple, Union
+
+import numba
+import numpy as np
+import rasterio
+from affine import Affine
+from osgeo import osr
+from rasterio.crs import CRS
+
+
+def calc_affine(coordinate_array: np.ndarray) -> Affine:
+ x_res = coordinate_array[0, 1, 0] - coordinate_array[0, 0, 0]
+ y_res = coordinate_array[1, 0, 1] - coordinate_array[0, 0, 1]
+ x_min, y_max = coordinate_array[0, 0]
+ x_min -= x_res / 2
+ y_max -= y_res / 2
+ affine = Affine.translation(*coordinate_array[0, 0]) * Affine.scale(x_res, y_res)
+ return affine
+
+
+def get_ellipsoid_par(epsg: int) -> Tuple[float, float, float]:
+ crs = CRS.from_epsg(epsg)
+ semi_major = float(
+ osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 1)
+ )
+ inverse_flattening = float(
+ osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 2)
+ )
+ semi_minor: float = (1 - (1 / inverse_flattening)) * semi_major
+ return semi_major, semi_minor, inverse_flattening
+
+
+def save_raster(
+ file_name: Union[str, Path],
+ value_array: np.ndarray,
+ crs: Union[CRS, int],
+ coordinate_array: Optional[np.ndarray] = None,
+ affine: Optional[Affine] = None,
+ nodata: Union[None, float, int] = None,
+ compress: bool = False,
+) -> None:
+
+ if len(value_array.shape) == 3:
+ height, width, layers = value_array.shape
+ else:
+ height, width = value_array.shape
+ layers = 1
+
+ value_array = value_array.reshape(height, width, layers)
+
+ _compress = None
+ if compress:
+ _compress = "lzw"
+
+ if affine is None:
+ if coordinate_array is None:
+ raise ValueError("please, provide array of coordinate per pixel")
+ affine = calc_affine(coordinate_array)
+
+ if type(crs) == int:
+ crs = CRS.from_epsg(crs)
+ if nodata is not None:
+ with rasterio.open(
+ file_name,
+ "w",
+ driver="GTiff",
+ height=height,
+ width=width,
+ count=layers,
+ dtype=value_array.dtype,
+ crs=crs,
+ transform=affine,
+ nodata=nodata,
+ compress=_compress,
+ ) as raster:
+ for layer in range(layers):
+ raster.write(value_array[:, :, layer], layer + 1)
+ else:
+ with rasterio.open(
+ file_name,
+ "w",
+ driver="GTiff",
+ height=height,
+ width=width,
+ count=layers,
+ dtype=value_array.dtype,
+ crs=crs,
+ transform=affine,
+ compress=_compress,
+ ) as raster:
+ for layer in range(layers):
+ raster.write(value_array[:, :, layer], layer + 1)
+ print(f"{file_name} saved")
+
+
+def harvesine_distance(
+ long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
+ long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
+ epsg: int = 4326,
+) -> Optional[float]:
+
+ """Calculate distance in ellipsoid by harvesine method
+ faster, less accurate
+
+ Parameters
+ ----------
+ long_lat1 : tuple, list
+ first point coordinate in longitude, latitude
+ long_lat2 : tuple, list
+ second point coordinate in longitude, latitude
+ epsg : int, optional
+ epsg code of the spatial reference system, by default 4326
+
+ Returns
+ -------
+ Optional[float]
+ distance, if None then input is not np.ndarray, tuple or list
+
+ Notes
+ -------
+ https://rafatieppo.github.io/post/2018_07_27_idw2pyr/
+ """
+
+ semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg)
+
+ return _harvesine_distance_dispatch(
+ long_lat1,
+ long_lat2,
+ semi_major=semi_major,
+ semi_minor=semi_minor,
+ i_flattening=i_flattening,
+ )
+
+
+@singledispatch
+def _harvesine_distance_dispatch(
+ long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
+ long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
+ semi_major: float,
+ semi_minor: float,
+ i_flattening: float,
+) -> Optional[float]:
+ """
+ Calculate distance in ellipsoid by harvesine method
+ faster, less accurate
+
+ Parameters
+ ----------
+ long_lat1 : tuple, list, numpy array
+ first point coordinate in longitude, latitude
+ long_lat2 : tuple, list, numpy array
+ second point coordinate in longitude, latitude
+ semi_major : float
+ ellipsoid's semi major axes
+ semi_minor : float
+ ellipsoid's semi minor axes
+ i_flattening : float
+ ellipsoid's inverse flattening
+
+ Returns
+ -------
+ Optional[float]
+ distance, if None then input is not np.ndarray, tuple or list
+
+ Notes
+ -------
+ https://rafatieppo.github.io/post/2018_07_27_idw2pyr/
+ """
+
+ print("only accept numpy array, list and tuple")
+ return None
+
+
+@_harvesine_distance_dispatch.register(np.ndarray)
+@numba.njit()
+def _harvesine_distance(
+ long_lat1: np.ndarray,
+ long_lat2: np.ndarray,
+ semi_major: float = 6378137.0,
+ semi_minor: float = 6356752.314245179,
+ i_flattening=298.257223563,
+) -> float:
+ long1, lat1 = np.radians(long_lat1)
+ long2, lat2 = np.radians(long_lat2)
+
+ long_diff = long2 - long1
+ lat_diff = lat2 - lat1
+ a = (
+ math.sin(lat_diff / 2) ** 2
+ + math.cos(lat1) * math.cos(lat2) * math.sin(long_diff / 2) ** 2
+ )
+ c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
+ return np.abs(semi_major * c)
+
+
+@_harvesine_distance_dispatch.register(list)
+def __harvesine_distance(
+ long_lat1: List[float],
+ long_lat2: List[float],
+ semi_major: float,
+ semi_minor: float,
+ i_flattening: float,
+):
+ return _harvesine_distance(
+ np.array(long_lat1),
+ np.array(long_lat2),
+ semi_major,
+ semi_minor,
+ i_flattening,
+ )
+
+
+@_harvesine_distance_dispatch.register(tuple)
+def __harvesine_distance(
+ long_lat1: Tuple[float, float],
+ long_lat2: Tuple[float, float],
+ semi_major: float,
+ semi_minor: float,
+ i_flattening: float,
+):
+ return _harvesine_distance(
+ np.array(long_lat1),
+ np.array(long_lat2),
+ semi_major,
+ semi_minor,
+ i_flattening,
+ )
+
+
+def vincenty_distance(
+ long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
+ long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
+ epsg: int = 4326,
+) -> float:
+ """Calculate distance in ellipsoid by vincenty method
+ slower, more accurate
+
+ Parameters
+ ----------
+ long_lat1 : tuple, list
+ first point coordinate in longitude, latitude
+ long_lat2 : tuple, list
+ second point coordinate in longitude, latitude
+ epsg : int, optional
+ epsg code of the spatial reference system, by default 4326
+
+ Returns
+ -------
+ float
+ distance
+
+ Notes
+ -------
+ https://www.johndcook.com/blog/2018/11/24/spheroid-distance/
+ """
+
+ semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg)
+
+ return _vincenty_distance_dispatch(
+ long_lat1,
+ long_lat2,
+ semi_major=semi_major,
+ semi_minor=semi_minor,
+ i_flattening=i_flattening,
+ )
+
+
+@singledispatch
+def _vincenty_distance_dispatch(
+ long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
+ long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
+ epsg: int,
+ semi_major: float,
+ semi_minor: float,
+ i_flattening: float,
+) -> Optional[float]:
+ """
+ Calculate distance in ellipsoid by vincenty method
+ slower, more accurate
+
+ Parameters
+ ----------
+ long_lat1 : tuple, list
+ first point coordinate in longitude, latitude
+ long_lat2 : tuple, list
+ second point coordinate in longitude, latitude
+ semi_major : float
+ ellipsoid's semi major axes
+ semi_minor : float
+ ellipsoid's semi minor axes
+ i_flattening : float
+ ellipsoid's inverse flattening
+
+ Returns
+ -------
+ distance
+
+ Notes
+ -------
+ https://www.johndcook.com/blog/2018/11/24/spheroid-distance/
+ """
+
+ print("only accept numpy array, list and tuple")
+ return None
+
+
+@_vincenty_distance_dispatch.register(np.ndarray)
+@numba.njit()
+def _vincenty_distance(
+ long_lat1: np.ndarray,
+ long_lat2: np.ndarray,
+ semi_major: float = 6378137.0,
+ semi_minor: float = 6356752.314245179,
+ i_flattening=298.257223563,
+) -> float:
+ # WGS 1984
+ flattening = 1 / i_flattening
+ tolerance = 1e-11 # to stop iteration
+
+ radians = math.pi / 180
+ long1, lat1 = np.radians(long_lat1)
+ long2, lat2 = np.radians(long_lat2)
+
+ distance = 0.0
+
+ if long1 != long2 and lat1 != lat2:
+ phi1, phi2 = lat1, lat2
+ u1 = math.atan((1 - flattening) * math.tan(phi1))
+ u2 = math.atan((1 - flattening) * math.tan(phi2))
+ long_diff = long2 - long1
+
+ lambda_old = long_diff + 0
+
+ while True:
+ t = (math.cos(u2) * math.sin(lambda_old)) ** 2
+ t += (
+ math.cos(u1) * math.sin(u2)
+ - math.sin(u1) * math.cos(u2) * math.cos(lambda_old)
+ ) ** 2
+ sin_sigma = t ** 0.5
+ cos_sigma = math.sin(u1) * math.sin(u2) + math.cos(u1) * math.cos(
+ u2
+ ) * math.cos(lambda_old)
+ sigma = math.atan2(sin_sigma, cos_sigma)
+
+ sin_alpha = math.cos(u1) * math.cos(u2) * math.sin(lambda_old) / sin_sigma
+ cos_sq_alpha = 1 - sin_alpha ** 2
+ cos_2sigma_m = cos_sigma - 2 * math.sin(u1) * math.sin(u2) / cos_sq_alpha
+ c = (
+ flattening
+ * cos_sq_alpha
+ * (4 + flattening * (4 - 3 * cos_sq_alpha))
+ / 16
+ )
+
+ t = sigma + c * sin_sigma * (
+ cos_2sigma_m + c * cos_sigma * (-1 + 2 * cos_2sigma_m ** 2)
+ )
+ lambda_new = long_diff + (1 - c) * flattening * sin_alpha * t
+ if abs(lambda_new - lambda_old) <= tolerance:
+ break
+ else:
+ lambda_old = lambda_new
+
+ u2 = cos_sq_alpha * ((semi_major ** 2 - semi_minor ** 2) / semi_minor ** 2)
+ A = 1 + (u2 / 16384) * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)))
+ B = (u2 / 1024) * (256 + u2 * (-128 + u2 * (74 - 47 * u2)))
+ t = cos_2sigma_m + 0.25 * B * (cos_sigma * (-1 + 2 * cos_2sigma_m ** 2))
+ t -= (
+ (B / 6)
+ * cos_2sigma_m
+ * (-3 + 4 * sin_sigma ** 2)
+ * (-3 + 4 * cos_2sigma_m ** 2)
+ )
+ delta_sigma = B * sin_sigma * t
+ distance = semi_minor * A * (sigma - delta_sigma)
+
+ return np.abs(distance)
+
+
+@_vincenty_distance_dispatch.register(list)
+def __vincenty_distance(
+ long_lat1: List[float], long_lat2: List[float], *args, **kwargs
+):
+ return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs)
+
+
+@_vincenty_distance_dispatch.register(tuple)
+def __vincenty_distance(
+ long_lat1: Tuple[float, float], long_lat2: Tuple[float, float], *args, **kwargs
+):
+ return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs)
+
+
+@numba.njit()
+def projected_distance(
+ xy1: Union[Tuple[float, float], List[float]],
+ xy2: Union[Tuple[float, float], List[float]],
+) -> float:
+ return math.sqrt((xy1[0] - xy2[0]) ** 2 + (xy1[1] - xy2[1]) ** 2)
+
+
+def calc_extent(points: np.ndarray) -> Tuple[float, float, float, float]:
+ x_max, y_max = points[:, 0].max(), points[:, 1].max()
+ x_min, y_min = points[:, 0].min(), points[:, 1].min()
+ return x_min, y_min, x_max, y_max
+
+
+calc_distance = {
+ "harvesine": _harvesine_distance,
+ "vincenty": _vincenty_distance,
+ "projected": projected_distance,
+}
diff --git a/geosardine/raster.py b/geosardine/raster.py
index 7bdbce1..fab9cf9 100644
--- a/geosardine/raster.py
+++ b/geosardine/raster.py
@@ -1,1009 +1,1009 @@
-import itertools
-import warnings
-from operator import (
- add,
- floordiv,
- iadd,
- ifloordiv,
- imul,
- ipow,
- isub,
- itruediv,
- mul,
- pow,
- sub,
- truediv,
-)
-from typing import (
- Any,
- Callable,
- Dict,
- Generator,
- Iterable,
- List,
- Optional,
- Tuple,
- Union,
-)
-
-import cv2
-import numpy as np
-import rasterio
-from affine import Affine
-from rasterio import features
-from rasterio.crs import CRS
-from rasterio.plot import reshape_as_image
-from shapely.geometry import mapping, shape
-from shapely.ops import unary_union
-
-from geosardine._geosardine import rowcol2xy, xy2rowcol
-from geosardine._raster_numba import __nb_raster_calc__, nb_raster_ops
-from geosardine._utility import save_raster
-
-
-def polygonize(
- array: np.ndarray,
- transform: Affine,
- mask: Optional[np.ndarray] = None,
- groupby_func: Optional[Callable] = None,
-) -> List[Dict[str, Any]]:
- """Polygonize raster
-
- Parameters
- ----------
- array : np.ndarray
- raster as numpy array
- transform : Affine
- affine trasformation parameter
- mask : Optional[np.ndarray], optional
- filter used pixel area, by default None
- groupby_func : Optional[Callable], optional
- dissolve by function, by default None
-
- Returns
- -------
- List[Dict[str, Any]]
- vector as geojson
- """
- feats: Generator[Dict[str, Any], None, None] = (
- {"properties": {"raster_val": value}, "geometry": shape}
- for shape, value in features.shapes(array, mask=mask, transform=transform)
- )
- if groupby_func is not None:
- union_features: List[Dict[str, Any]] = []
- for _, group in itertools.groupby(
- feats, key=lambda x: x["properties"]["raster_val"]
- ):
- properties, geom = zip(
- *[
- (feature["properties"], shape(feature["geometry"]))
- for feature in group
- ]
- )
- union_features.append(
- {"geometry": mapping(unary_union(geom)), "properties": properties[0]}
- )
- return union_features
- return list(feats)
-
-
-class Raster(np.ndarray):
- """
- Construct Raster from numpy array with spatial information.
- Support calculation between different raster
-
- Parameters
- ----------
- array : numpy array
- array of raster
- resolution : tuple, list, default None
- spatial resolution
- x_min : float, defaults to None
- left boundary of x-axis coordinate
- y_max : float, defaults to None
- top boundary of y-axis coordinate
- x_max : float, defaults to None
- right boundary of x-axis coordinate
- y_min : float, defaults to None
- bottom boundary of y-axis coordinate
- epsg : int, defaults to 4326
- EPSG code of reference system
- no_data : int or float, default None
- no data value
-
- Examples
- --------
- >>> from geosardine import Raster
- >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
- >>> print(raster)
- [[[1. 1.]
- [1. 1.]
- [1. 1.]]
- [[1. 1.]
- [1. 1.]
- [1. 1.]]
- [[1. 1.]
- [1. 1.]
- [1. 1.]]]
- Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
- >>> resampled = raster.resample((0.2,0.2))
- >>> print(resampled.shape, resampled.resolution)
- (6, 6, 2) (0.2, 0.2)
- Raster can be resized
- >>> resized = raster.resize(height=16, width=16)
- >>> print(resized.shape, resized.resolution)
- (16, 16, 2) (0.07500000000000018, 0.07500000000000001)
- """
-
- __cv2_resize_method = {
- "nearest": cv2.INTER_NEAREST,
- "bicubic": cv2.INTER_CUBIC,
- "bilinear": cv2.INTER_LINEAR,
- "area": cv2.INTER_AREA,
- "lanczos": cv2.INTER_LANCZOS4,
- }
-
- def __init__(
- self,
- array: np.ndarray,
- resolution: Union[
- None, Tuple[float, float], List[float], Tuple[float, ...], float
- ] = None,
- x_min: Optional[float] = None,
- y_max: Optional[float] = None,
- x_max: Optional[float] = None,
- y_min: Optional[float] = None,
- epsg: int = 4326,
- no_data: Union[float, int] = -32767.0,
- transform: Optional[Affine] = None,
- source: Optional[str] = None,
- ):
- if transform is None:
- if resolution is None and x_min is None and y_min is None:
- raise ValueError(
- "Please define resolution and at least x minimum and y minimum"
- )
-
- if resolution is not None and x_min is None and y_max is None:
- raise ValueError("Please define x_min and y_max")
-
- if isinstance(resolution, float):
- self.resolution: Tuple[float, float] = (
- resolution,
- resolution,
- )
- elif isinstance(resolution, Iterable):
- self.resolution = (resolution[0], resolution[1])
-
- if (
- resolution is None
- and x_min is not None
- and y_min is not None
- and x_max is not None
- and y_max is not None
- ):
- self.resolution = (
- (x_max - x_min) / array.shape[1],
- (y_max - y_min) / array.shape[0],
- )
-
- self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale(
- self.resolution[0], -self.resolution[1]
- )
- elif isinstance(transform, Affine):
- self.transform = transform
- self.resolution = (transform[0], abs(transform[4]))
- else:
- raise ValueError(
- "Please define affine parameter or resolution and xmin ymax"
- )
-
- self.epsg = epsg
-
- self.crs = CRS.from_epsg(epsg)
- self.no_data = no_data
- self.source = source
- self.__check_validity()
-
- def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster":
- return array.view(cls)
-
- @staticmethod
- def parse_slicer(key: Union[int, slice, None], length: int) -> int:
- if key is None:
- start = 0
- elif isinstance(key, int):
- start = key if key > 0 else length + key
- elif isinstance(key, slice):
- if key.start is None:
- start = 0
- elif key.start < 0:
- start = length + slice.start
- elif key.start > 0:
- start = key.start
- else:
- raise ValueError
- else:
- raise ValueError
- return start
-
- def __getitem__(self, keys: Union[int, Tuple[Any, ...], slice]) -> np.ndarray:
- if isinstance(keys, slice) or isinstance(keys, int):
- row_col_min: List[int] = [
- self.parse_slicer(keys, self.__array__().shape[0]),
- 0,
- ]
- elif len(keys) == 2:
- row_col_min = [
- self.parse_slicer(key, self.__array__().shape[i])
- for i, key in enumerate(keys)
- ]
- elif len(keys) == 3:
- row_col_min = [
- self.parse_slicer(key, self.__array__().shape[i])
- for i, key in enumerate(keys[:2])
- ]
-
- if row_col_min == [0, 0]:
- return self.array.__get__item(keys)
- else:
- sliced_array = self.array.__getitem__(keys)
- x_min, y_max = self.rowcol2xy(row_col_min[0], row_col_min[1], offset="ul")
-
- return Raster(
- sliced_array,
- self.resolution,
- x_min,
- y_max,
- epsg=self.epsg,
- no_data=self.no_data,
- )
-
- @classmethod
- def from_binary(
- cls,
- binary_file: str,
- shape: Tuple[int, ...],
- resolution: Union[Tuple[float, float], List[float], float],
- x_min: float,
- y_max: float,
- epsg: int = 4326,
- no_data: Union[float, int] = -32767.0,
- dtype: np.dtype = np.float32,
- shape_order: str = "hwc",
- *args,
- **kwargs,
- ) -> "Raster":
- """Convert binary grid into Raster
-
- Parameters
- -------
- binary_file : str
- location of binary grid file
- shape : tuple of int
- shape of binary grid.
- resolution : tuple of float, list of float or float
- pixel / grid spatial resolution
- x_min : float, defaults to None
- left boundary of x-axis coordinate
- y_max : float, defaults to None
- top boundary of y-axis coordinate
- epsg : int, defaults to 4326
- EPSG code of reference system
- no_data : int or float, default None
- no data value
- dtype : numpy.dtype, default numpy.float32
- data type of raster
- shape_order : str, default hwc
- shape ordering,
- * if default, height x width x channel
-
-
- Returns
- -------
- Raster
- raster shape will be in format height x width x channel / layer
-
- """
-
- _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
- shape
- )
-
- if shape_order not in ("hwc", "hw"):
- c_index = shape_order.index("c")
- h_index = shape_order.index("h")
- w_index = shape_order.index("w")
-
- _bin_array = np.transpose(_bin_array, (h_index, w_index, c_index))
-
- return cls(
- _bin_array,
- resolution,
- x_min,
- y_max,
- epsg=epsg,
- no_data=no_data,
- source=binary_file,
- )
-
- @classmethod
- def from_rasterfile(cls, raster_file: str) -> "Raster":
- """Get raster from supported gdal raster file
-
- Parameters
- -------
- raster_file : str
- location of raser file
-
- Returns
- -------
- Raster
- """
- with rasterio.open(raster_file) as file:
- _raster = reshape_as_image(file.read())
-
- return cls(
- _raster,
- transform=file.transform,
- epsg=file.crs.to_epsg(),
- no_data=file.nodatavals[0],
- source=raster_file,
- )
-
- @property
- def array(self) -> np.ndarray:
- """the numpy array of raster"""
- return self.__array__()
-
- @property
- def __transform(self) -> Tuple[float, ...]:
- return tuple(self.transform)
-
- @property
- def x_min(self) -> float:
- """minimum x-axis coordinate"""
- return self.__transform[2]
-
- @property
- def y_max(self) -> float:
- """maximum y-axis coordinate"""
- return self.__transform[5]
-
- @property
- def x_max(self) -> float:
- """maximum x-axis coordinate"""
- return self.__transform[2] + (self.resolution[0] * self.cols)
-
- @property
- def y_min(self) -> float:
- """minimum y-axis coordinate"""
- return self.__transform[5] - (self.resolution[1] * self.rows)
-
- @property
- def top(self) -> float:
- """top y-axis coordinate"""
- return self.y_max
-
- @property
- def left(self) -> float:
- """left x-axis coordinate"""
- return self.x_min
-
- @property
- def right(self) -> float:
- """right x-axis coordinate"""
- return self.x_max
-
- @property
- def bottom(self) -> float:
- """bottom y-axis coordinate"""
- return self.y_min
-
- @property
- def rows(self) -> int:
- """number of row, height"""
- return int(self.array.shape[0])
-
- @property
- def cols(self) -> int:
- """number of column, width"""
- return int(self.array.shape[1])
-
- @property
- def layers(self) -> int:
- """number of layer / channel"""
- _layers: int = 1
- if len(self.array.shape) > 2:
- _layers = self.array.shape[2]
- return _layers
-
- @property
- def x_extent(self) -> float:
- """width of raster in the map unit (degree decimal or meters)"""
- return self.x_max - self.x_min
-
- @property
- def y_extent(self) -> float:
- """height of raster in the map unit (degree decimal or meters)"""
- return self.y_max - self.y_min
-
- @property
- def is_projected(self) -> bool:
- """check crs is projected or not"""
- return self.crs.is_projected
-
- @property
- def is_geographic(self) -> bool:
- """check crs is geographic or not"""
- return self.crs.is_geographic
-
- @property
- def coordinate_array(self) -> np.ndarray:
- x_dist, y_dist = np.meshgrid(
- np.arange(self.shape[1], dtype=np.float32),
- np.arange(self.shape[0], dtype=np.float32),
- )
-
- x_dist *= self.resolution[0]
- x_dist += self.x_min
-
- y_dist *= self.resolution[1]
- y_dist += self.y_max
-
- return np.stack([x_dist, y_dist], axis=2)
-
- def __check_validity(self) -> None:
- """Check geometry validity
-
- Raises
- ------
- ValueError
- x min, y min is greater than x max, y max
- ValueError
- x min is greater than x max
- ValueError
- y min is greater than y max
- """
- if self.x_extent < 0 and self.y_extent < 0:
- raise ValueError(
- "x min should be less than x max and y min should be less than y max"
- )
- elif self.x_extent < 0 and self.y_extent > 0:
- raise ValueError("x min should be less than x max")
- elif self.x_extent > 0 and self.y_extent < 0:
- raise ValueError("y min should be less than y max")
-
- def xy_value(
- self, x: float, y: float, offset="center"
- ) -> Union[float, int, np.ndarray]:
- """Obtain pixel value by geodetic or projected coordinate
-
- Parameters
- ----------
- x : float
- x-axis coordinate
- y : float
- y-axis coordinate
-
- Returns
- -------
- Union[float, int, np.ndarray]
- pixel value
- """
- try:
- row, col = self.xy2rowcol(x, y)
- if row < 0 or col < 0:
- raise IndexError
- return self.array[row, col]
- except IndexError:
- raise IndexError(
- f"""
- {x},{y} is out of bound.
- x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
- """
- )
-
- def rowcol2xy(
- self, row: int, col: int, offset: str = "center"
- ) -> Tuple[float, float]:
- """Convert image coordinate (row, col) to real world coordinate
-
- Parameters
- ----------
- row : int
- col : int
- offset : str
-
- Returns
- -------
- Tuple[float, float]
- X,Y coordinate in real world
- """
- return rowcol2xy((row, col), self.transform, offset=offset)
-
- def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
- """Convert real world coordinate to image coordinate (row, col)
-
- Parameters
- ----------
- x : float
- y : float
-
- Returns
- -------
- Tuple[int, int]
- row, column
- """
- _row, _col = xy2rowcol((x, y), self.transform)
- return int(_row), int(_col)
-
- def __raster_calc_by_pixel__(
- self,
- raster: "Raster",
- operator: Callable[[Any, Any], Any],
- ) -> np.ndarray:
- _raster = np.zeros(self.array.shape, dtype=self.array.dtype)
- for row in range(self.rows):
- for col in range(self.cols):
- try:
- pixel_source = self.array[row, col]
- pixel_target = raster.xy_value(*self.rowcol2xy(row, col))
- if pixel_source != self.no_data and pixel_target != raster.no_data:
- _raster[row, col] = operator(
- pixel_source,
- pixel_target,
- )
- else:
- _raster[row, col] = self.no_data
- except IndexError:
- _raster[row, col] = self.no_data
- return _raster
-
- def __nb_raster_calc(
- self, raster_a: "Raster", raster_b: "Raster", operator: str
- ) -> np.ndarray:
- """Wrapper for Raster calculation per pixel using numba jit.
-
- Parameters
- ----------
- raster_a : Raster
- first raster
- raster_b : Raster
- second raster
- operator : str
- operator name
-
- Returns
- -------
- np.ndarray
- calculated raster
- """
- if raster_b.layers != raster_a.layers:
- raise ValueError(
- f"""
- Cant calculate between different layer shape.
- first raster layer = {raster_a.layers}
- second raster layer = {raster_b.layers}
- """
- )
-
- _a = raster_a.array
- if self.layers == 1 and len(raster_a.shape) != 3:
- _a = raster_a.array.reshape(raster_a.rows, raster_a.cols, 1)
-
- _b = raster_b.array
- if self.layers == 1 and len(raster_b.shape) != 3:
- _b = raster_b.array.reshape(raster_b.rows, raster_b.cols, 1)
-
- out = __nb_raster_calc__(
- _a,
- _b,
- tuple(raster_a.transform),
- tuple(~raster_b.transform),
- raster_a.no_data,
- raster_b.no_data,
- nb_raster_ops[operator],
- )
- if out.shape != raster_a.shape:
- out = out.reshape(raster_a.shape)
- return out
-
- def __raster_calculation__(
- self,
- raster: Union[int, float, "Raster", np.ndarray],
- operator: Callable[[Any, Any], Any],
- ) -> "Raster":
- if not isinstance(raster, (int, float, Raster, np.ndarray)):
- raise ValueError(f"{type(raster)} unsupported data format")
-
- if isinstance(raster, Raster):
- if (
- raster.epsg == self.epsg
- and raster.resolution == self.resolution
- and raster.x_min == self.x_min
- and raster.y_min == self.y_min
- and raster.shape == self.shape
- ):
- _raster = operator(self.array, raster.array)
- else:
- # _raster = self.__raster_calc_by_pixel__(raster, operator)
-
- _raster = self.__nb_raster_calc(
- self,
- raster,
- operator.__name__,
- )
- elif isinstance(raster, np.ndarray):
- _raster = operator(self.array, raster)
- else:
- _raster = operator(self.array, raster)
-
- return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg)
-
- def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, sub)
-
- def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, add)
-
- def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, mul)
-
- def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, truediv)
-
- def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, floordiv)
-
- def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, pow)
-
- def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, iadd)
-
- def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, itruediv)
-
- def __ifloordiv__(
- self, raster: Union[int, float, "Raster", np.ndarray]
- ) -> "Raster":
- return self.__raster_calculation__(raster, ifloordiv)
-
- def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, imul)
-
- def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, isub)
-
- def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
- return self.__raster_calculation__(raster, ipow)
-
- def __iter__(self) -> Generator[Any, None, None]:
- _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers)
- if self.layers == 1:
- _iter_shape = self.rows * self.cols
- _iter = self.array.reshape(_iter_shape)
- for i in range(self.rows * self.cols):
- yield _iter[i]
-
- def save(self, file_name: str, compress: bool = False) -> None:
- """Save raster as geotiff
-
- Parameters
- ----------
- file_name : str
- output filename
- """
- save_raster(
- file_name,
- self.array,
- self.crs,
- affine=self.transform,
- nodata=self.no_data,
- compress=compress,
- )
-
- def resize(
- self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
- ) -> "Raster":
- """Resize raster into defined height and width
-
- Parameters
- -------
- height: int
- height defined
- width: int
- width defined
- method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
- resampling method for opencv
- * if nearest, a nearest-neighbor interpolation
- * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
- * if bilinear, a bilinear interpolation
- * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
- backend: str opencv or python, default opencv
- resampling backend
- * if opencv, image will be resampled using opencv
- * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
- Returns
- -------
- Raster
- Resized
- """
- if backend == "opencv":
- return self.__cv_resize(height, width, method)
- elif backend == "python":
- return self.__py_resize(height, width)
- else:
- raise ValueError("Please choose between python or opencv for backend")
-
- def resample(
- self,
- resolution: Union[Tuple[float, float], List[float], float],
- method: str = "bilinear",
- backend: str = "opencv",
- ) -> "Raster":
- """Resample image into defined resolution
-
- Parameters
- -------
- resolution: tuple, list, float
- spatial resolution target
- method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
- resampling method for opencv
- * if nearest, a nearest-neighbor interpolation
- * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
- * if bilinear, a bilinear interpolation
- * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
- backend: str opencv or python, default opencv
- resampling backend
- * if opencv, image will be resampled using opencv
- * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
- Returns
- -------
- Raster
- Resampled
- """
- if backend == "opencv":
- if self.resolution[0] != self.resolution[1]:
- warnings.warn(
- "non square pixel resolution, use rasterio instead", UserWarning
- )
- return self.__cv_resample(resolution, method)
- elif backend == "python":
- return self.__py_resample(resolution)
- else:
- raise ValueError("Please choose between python or opencv for backend")
-
- def __cv_resize(self, height: int, width: int, method: str) -> "Raster":
- resized_y_resolution = self.y_extent / height
- resized_x_resolution = self.x_extent / width
- resized = cv2.resize(
- self.array, (width, height), interpolation=self.__cv2_resize_method[method]
- )
- return Raster(
- resized,
- (resized_x_resolution, resized_y_resolution),
- self.x_min,
- self.y_max,
- epsg=self.epsg,
- )
-
- def __cv_resample(
- self, resolution: Union[Tuple[float, float], List[float], float], method: str
- ) -> "Raster":
- if isinstance(resolution, (float, int)):
- resampled_x_resolution = float(resolution)
- resampled_y_resolution = float(resolution)
- else:
- resampled_x_resolution = resolution[0]
- resampled_y_resolution = resolution[1]
-
- resampled_rows = round(self.y_extent / resampled_y_resolution)
- resampled_cols = round(self.x_extent / resampled_x_resolution)
-
- resampled = self.__cv_resize(resampled_rows, resampled_cols, method)
- return resampled
-
- def __py_resample(
- self, resolution: Union[Tuple[float, float], List[float], float]
- ) -> "Raster":
- """
- Resample raster using nearest neighbor
- Parameters
- -------
- resolution: tuple, list
- spatial resolution target
-
- Returns
- -------
- Raster
- Resampled
- """
- warnings.warn("this function will be removed in v1.0", DeprecationWarning)
-
- if isinstance(resolution, (float, int)):
- resampled_x_resolution = float(resolution)
- resampled_y_resolution = float(resolution)
- else:
- resampled_x_resolution = resolution[0]
- resampled_y_resolution = resolution[1]
-
- resampled_rows = round(self.y_extent / resampled_y_resolution)
- resampled_cols = round(self.x_extent / resampled_x_resolution)
-
- resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers)
- if self.layers == 1:
- resampled_shape = (resampled_rows, resampled_cols)
-
- resampled_array = np.zeros(
- resampled_rows * resampled_cols * self.layers, dtype=self.dtype
- ).reshape(resampled_shape)
-
- resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
- resampled_x_resolution, -resampled_y_resolution
- )
-
- for row in range(resampled_rows):
- for col in range(resampled_cols):
- x, y = rowcol2xy((row, col), resampled_affine)
- resampled_array[row, col] = self.xy_value(
- x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2)
- )
-
- return Raster(
- resampled_array,
- (resampled_x_resolution, resampled_y_resolution),
- self.x_min,
- self.y_max,
- epsg=self.epsg,
- )
-
- def __py_resize(self, height: int, width: int) -> "Raster":
- """
- Resize raster using nearest neighbor
- Parameters
- -------
- height: int
- raster height
- width: int
- raster width
-
- Returns
- -------
- Raster
- Resampled
- """
- warnings.warn("this function will be removed in v1.0", DeprecationWarning)
-
- resized_y_resolution = self.y_extent / height
- resized_x_resolution = self.x_extent / width
-
- resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
- resized_x_resolution, -resized_y_resolution
- )
-
- resized_shape: Tuple[int, ...] = (height, width, self.layers)
- if self.layers == 1:
- resized_shape = (height, width)
-
- resized_array = np.zeros(
- height * width * self.layers, dtype=self.dtype
- ).reshape(resized_shape)
-
- for row in range(height):
- for col in range(width):
- x, y = rowcol2xy((row, col), resized_affine)
- resized_array[row, col] = self.xy_value(
- x + (resized_x_resolution / 2), y + (resized_y_resolution / 2)
- )
-
- return Raster(
- resized_array,
- (resized_x_resolution, resized_y_resolution),
- self.x_min,
- self.y_max,
- epsg=self.epsg,
- )
-
- def clip2bbox(
- self, x_min: float, y_min: float, x_max: float, y_max: float
- ) -> "Raster":
- """Clipping into bounding boxes
-
- Returns
- -------
- Raster
- Clipped raster
- """
- if x_min < self.x_min:
- raise ValueError(
- f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max}
- but input is {x_min},{y_min},{x_max},{y_max}"""
- )
-
- if y_min < self.y_min:
- raise ValueError(
- f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max}
- but input is {x_min},{y_min},{x_max},{y_max}"""
- )
-
- if x_max > self.x_max:
- raise ValueError(
- f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max}
- but input is {x_min},{y_min},{x_max},{y_max}"""
- )
-
- if y_max > self.y_max:
- raise ValueError(
- f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max}
- but input is {x_min},{y_min},{x_max},{y_max}"""
- )
-
- row_min, col_min = self.xy2rowcol(x_min, y_max)
- row_max, col_max = self.xy2rowcol(x_max, y_min)
-
- clipped = self.array[row_min:row_max, col_min:col_max]
- return Raster(clipped, self.resolution, x_min, y_max)
-
- def split2tiles(
- self, tile_size: Union[int, Tuple[int, int], List[int]]
- ) -> Generator[Tuple[int, int, "Raster"], None, None]:
- """
- Split raster into smaller tiles, excessive will be padded and have no data value
-
- Parameters
- -------
- tile_size: int, list of int, tuple of int
- dimension of tiles
-
- Yields
- -------
- int, int, Raster
- row, column, tiled raster
- """
-
- tile_width: int = 0
- tile_height: int = 0
- if isinstance(tile_size, int):
- tile_height = tile_size
- tile_width = tile_size
- elif isinstance(tile_size, tuple) or isinstance(tile_size, list):
- if isinstance(tile_size[0], int) or isinstance(tile_size[1], int):
- tile_height, tile_width = tile_size
-
- new_height = self.shape[0]
- if self.shape[0] % tile_height != 0:
- new_height += tile_height - (new_height % tile_height)
-
- new_width = self.shape[1]
- if self.shape[1] % tile_width != 0:
- new_width += tile_width - (new_width % tile_width)
-
- padded_array = np.zeros((new_height, new_height, self.layers), dtype=self.dtype)
- padded_array[:] = self.no_data
- padded_array[: self.shape[0], : self.shape[1]] = self.array
-
- for r in range(0, new_height, tile_height):
- for c in range(0, new_width, tile_width):
- yield r, c, Raster(
- padded_array[r : r + tile_height, c : c + tile_width],
- self.resolution,
- *self.rowcol2xy(r, c, offset="ul"),
- epsg=self.epsg,
- no_data=self.no_data,
- )
-
-
-class Layer(Raster):
- pass
-
-
-class Pixel(Raster):
- pass
+import itertools
+import warnings
+from operator import (
+ add,
+ floordiv,
+ iadd,
+ ifloordiv,
+ imul,
+ ipow,
+ isub,
+ itruediv,
+ mul,
+ pow,
+ sub,
+ truediv,
+)
+from typing import (
+ Any,
+ Callable,
+ Dict,
+ Generator,
+ Iterable,
+ List,
+ Optional,
+ Tuple,
+ Union,
+)
+
+import cv2
+import numpy as np
+import rasterio
+from affine import Affine
+from rasterio import features
+from rasterio.crs import CRS
+from rasterio.plot import reshape_as_image
+from shapely.geometry import mapping, shape
+from shapely.ops import unary_union
+
+from geosardine._geosardine import rowcol2xy, xy2rowcol
+from geosardine._raster_numba import __nb_raster_calc__, nb_raster_ops
+from geosardine._utility import save_raster
+
+
+def polygonize(
+ array: np.ndarray,
+ transform: Affine,
+ mask: Optional[np.ndarray] = None,
+ groupby_func: Optional[Callable] = None,
+) -> List[Dict[str, Any]]:
+ """Polygonize raster
+
+ Parameters
+ ----------
+ array : np.ndarray
+ raster as numpy array
+ transform : Affine
+ affine trasformation parameter
+ mask : Optional[np.ndarray], optional
+ filter used pixel area, by default None
+ groupby_func : Optional[Callable], optional
+ dissolve by function, by default None
+
+ Returns
+ -------
+ List[Dict[str, Any]]
+ vector as geojson
+ """
+ feats: Generator[Dict[str, Any], None, None] = (
+ {"properties": {"raster_val": value}, "geometry": shape}
+ for shape, value in features.shapes(array, mask=mask, transform=transform)
+ )
+ if groupby_func is not None:
+ union_features: List[Dict[str, Any]] = []
+ for _, group in itertools.groupby(
+ feats, key=lambda x: x["properties"]["raster_val"]
+ ):
+ properties, geom = zip(
+ *[
+ (feature["properties"], shape(feature["geometry"]))
+ for feature in group
+ ]
+ )
+ union_features.append(
+ {"geometry": mapping(unary_union(geom)), "properties": properties[0]}
+ )
+ return union_features
+ return list(feats)
+
+
+class Raster(np.ndarray):
+ """
+ Construct Raster from numpy array with spatial information.
+ Support calculation between different raster
+
+ Parameters
+ ----------
+ array : numpy array
+ array of raster
+ resolution : tuple, list, default None
+ spatial resolution
+ x_min : float, defaults to None
+ left boundary of x-axis coordinate
+ y_max : float, defaults to None
+ top boundary of y-axis coordinate
+ x_max : float, defaults to None
+ right boundary of x-axis coordinate
+ y_min : float, defaults to None
+ bottom boundary of y-axis coordinate
+ epsg : int, defaults to 4326
+ EPSG code of reference system
+ no_data : int or float, default None
+ no data value
+
+ Examples
+ --------
+ >>> from geosardine import Raster
+ >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
+ >>> print(raster)
+ [[[1. 1.]
+ [1. 1.]
+ [1. 1.]]
+ [[1. 1.]
+ [1. 1.]
+ [1. 1.]]
+ [[1. 1.]
+ [1. 1.]
+ [1. 1.]]]
+ Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
+ >>> resampled = raster.resample((0.2,0.2))
+ >>> print(resampled.shape, resampled.resolution)
+ (6, 6, 2) (0.2, 0.2)
+ Raster can be resized
+ >>> resized = raster.resize(height=16, width=16)
+ >>> print(resized.shape, resized.resolution)
+ (16, 16, 2) (0.07500000000000018, 0.07500000000000001)
+ """
+
+ __cv2_resize_method = {
+ "nearest": cv2.INTER_NEAREST,
+ "bicubic": cv2.INTER_CUBIC,
+ "bilinear": cv2.INTER_LINEAR,
+ "area": cv2.INTER_AREA,
+ "lanczos": cv2.INTER_LANCZOS4,
+ }
+
+ def __init__(
+ self,
+ array: np.ndarray,
+ resolution: Union[
+ None, Tuple[float, float], List[float], Tuple[float, ...], float
+ ] = None,
+ x_min: Optional[float] = None,
+ y_max: Optional[float] = None,
+ x_max: Optional[float] = None,
+ y_min: Optional[float] = None,
+ epsg: int = 4326,
+ no_data: Union[float, int] = -32767.0,
+ transform: Optional[Affine] = None,
+ source: Optional[str] = None,
+ ):
+ if transform is None:
+ if resolution is None and x_min is None and y_min is None:
+ raise ValueError(
+ "Please define resolution and at least x minimum and y minimum"
+ )
+
+ if resolution is not None and x_min is None and y_max is None:
+ raise ValueError("Please define x_min and y_max")
+
+ if isinstance(resolution, float):
+ self.resolution: Tuple[float, float] = (
+ resolution,
+ -resolution,
+ )
+ elif isinstance(resolution, Iterable):
+ self.resolution = (resolution[0], resolution[1])
+
+ if (
+ resolution is None
+ and x_min is not None
+ and y_min is not None
+ and x_max is not None
+ and y_max is not None
+ ):
+ self.resolution = (
+ (x_max - x_min) / array.shape[1],
+ -(y_max - y_min) / array.shape[0],
+ )
+
+ if self.resolution[0] > 0 and self.resolution[1] > 0:
+ print(self.resolution)
+ warnings.warn("both resolution are positive")
+
+ self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale(
+ self.resolution[0], self.resolution[1]
+ )
+ elif isinstance(transform, Affine):
+ self.transform = transform
+ self.resolution = (transform[0], transform[4])
+ else:
+ raise ValueError(
+ "Please define affine parameter or resolution and xmin ymax"
+ )
+
+ self.epsg = epsg
+
+ self.crs = CRS.from_epsg(epsg)
+ self.no_data = no_data
+ self.source = source
+ self.__check_validity()
+
+ def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster":
+ return array.view(cls)
+
+ @staticmethod
+ def parse_slicer(key: Union[int, slice, None], length: int) -> int:
+ if key is None:
+ start = 0
+ elif isinstance(key, int):
+ start = key if key > 0 else length + key
+ elif isinstance(key, slice):
+ if key.start is None:
+ start = 0
+ elif key.start < 0:
+ start = length + slice.start
+ elif key.start > 0:
+ start = key.start
+ else:
+ raise ValueError
+ else:
+ raise ValueError
+ return start
+
+ def __getitem__(self, keys: Union[int, Tuple[Any, ...], slice]) -> np.ndarray:
+ if isinstance(keys, slice) or isinstance(keys, int):
+ row_col_min: List[int] = [
+ self.parse_slicer(keys, self.__array__().shape[0]),
+ 0,
+ ]
+ elif len(keys) == 2:
+ row_col_min = [
+ self.parse_slicer(key, self.__array__().shape[i])
+ for i, key in enumerate(keys)
+ ]
+ elif len(keys) == 3:
+ row_col_min = [
+ self.parse_slicer(key, self.__array__().shape[i])
+ for i, key in enumerate(keys[:2])
+ ]
+
+ if row_col_min == [0, 0]:
+ return self.array.__get__item(keys)
+ else:
+ sliced_array = self.array.__getitem__(keys)
+ x_min, y_max = self.rowcol2xy(row_col_min[0], row_col_min[1], offset="ul")
+
+ return Raster(
+ sliced_array,
+ self.resolution,
+ x_min,
+ y_max,
+ epsg=self.epsg,
+ no_data=self.no_data,
+ )
+
+ @classmethod
+ def from_binary(
+ cls,
+ binary_file: str,
+ shape: Tuple[int, ...],
+ resolution: Union[Tuple[float, float], List[float], float],
+ x_min: float,
+ y_max: float,
+ epsg: int = 4326,
+ no_data: Union[float, int] = -32767.0,
+ dtype: np.dtype = np.float32,
+ shape_order: str = "hwc",
+ *args,
+ **kwargs,
+ ) -> "Raster":
+ """Convert binary grid into Raster
+
+ Parameters
+ -------
+ binary_file : str
+ location of binary grid file
+ shape : tuple of int
+ shape of binary grid.
+ resolution : tuple of float, list of float or float
+ pixel / grid spatial resolution
+ x_min : float, defaults to None
+ left boundary of x-axis coordinate
+ y_max : float, defaults to None
+ top boundary of y-axis coordinate
+ epsg : int, defaults to 4326
+ EPSG code of reference system
+ no_data : int or float, default None
+ no data value
+ dtype : numpy.dtype, default numpy.float32
+ data type of raster
+ shape_order : str, default hwc
+ shape ordering,
+ * if default, height x width x channel
+
+
+ Returns
+ -------
+ Raster
+ raster shape will be in format height x width x channel / layer
+
+ """
+
+ _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
+ shape
+ )
+
+ if shape_order not in ("hwc", "hw"):
+ c_index = shape_order.index("c")
+ h_index = shape_order.index("h")
+ w_index = shape_order.index("w")
+
+ _bin_array = np.transpose(_bin_array, (h_index, w_index, c_index))
+
+ return cls(
+ _bin_array,
+ resolution,
+ x_min,
+ y_max,
+ epsg=epsg,
+ no_data=no_data,
+ source=binary_file,
+ )
+
+ @classmethod
+ def from_rasterfile(cls, raster_file: str) -> "Raster":
+ """Get raster from supported gdal raster file
+
+ Parameters
+ -------
+ raster_file : str
+ location of raser file
+
+ Returns
+ -------
+ Raster
+ """
+ with rasterio.open(raster_file) as file:
+ _raster = reshape_as_image(file.read())
+
+ return cls(
+ _raster,
+ transform=file.transform,
+ epsg=file.crs.to_epsg(),
+ no_data=file.nodatavals[0],
+ source=raster_file,
+ )
+
+ @property
+ def array(self) -> np.ndarray:
+ """the numpy array of raster"""
+ return self.__array__()
+
+ @property
+ def __transform(self) -> Tuple[float, ...]:
+ return tuple(self.transform)
+
+ @property
+ def x_min(self) -> float:
+ """minimum x-axis coordinate"""
+ return self.__transform[2]
+
+ @property
+ def y_max(self) -> float:
+ """maximum y-axis coordinate"""
+ return self.__transform[5]
+
+ @property
+ def x_max(self) -> float:
+ """maximum x-axis coordinate"""
+ return self.__transform[2] + (self.resolution[0] * self.cols)
+
+ @property
+ def y_min(self) -> float:
+ """minimum y-axis coordinate"""
+ return self.__transform[5] + (self.resolution[1] * self.rows)
+
+ @property
+ def extent(self) -> Tuple[float, float, float, float]:
+ return self.x_min, self.y_min, self.x_max, self.y_max
+
+ @property
+ def top(self) -> float:
+ """top y-axis coordinate"""
+ return self.y_max
+
+ @property
+ def left(self) -> float:
+ """left x-axis coordinate"""
+ return self.x_min
+
+ @property
+ def right(self) -> float:
+ """right x-axis coordinate"""
+ return self.x_max
+
+ @property
+ def bottom(self) -> float:
+ """bottom y-axis coordinate"""
+ return self.y_min
+
+ @property
+ def rows(self) -> int:
+ """number of row, height"""
+ return int(self.array.shape[0])
+
+ @property
+ def cols(self) -> int:
+ """number of column, width"""
+ return int(self.array.shape[1])
+
+ @property
+ def layers(self) -> int:
+ """number of layer / channel"""
+ _layers: int = 1
+ if len(self.array.shape) > 2:
+ _layers = self.array.shape[2]
+ return _layers
+
+ @property
+ def x_extent(self) -> float:
+ """width of raster in the map unit (degree decimal or meters)"""
+ return self.x_max - self.x_min
+
+ @property
+ def y_extent(self) -> float:
+ """height of raster in the map unit (degree decimal or meters)"""
+ return self.y_max - self.y_min
+
+ @property
+ def is_projected(self) -> bool:
+ """check crs is projected or not"""
+ return self.crs.is_projected
+
+ @property
+ def is_geographic(self) -> bool:
+ """check crs is geographic or not"""
+ return self.crs.is_geographic
+
+ @property
+ def coordinate_array(self) -> np.ndarray:
+ x_dist, y_dist = np.meshgrid(
+ np.arange(self.shape[1], dtype=np.float32),
+ np.arange(self.shape[0], dtype=np.float32),
+ )
+
+ x_dist *= self.resolution[0]
+ x_dist += self.x_min
+
+ y_dist *= self.resolution[1]
+ y_dist += self.y_max
+
+ return np.stack([x_dist, y_dist], axis=2)
+
+ def __check_validity(self) -> None:
+ """Check geometry validity
+
+ Raises
+ ------
+ ValueError
+ x min, y min is greater than x max, y max
+ ValueError
+ x min is greater than x max
+ ValueError
+ y min is greater than y max
+ """
+ if self.x_extent < 0 and self.y_extent < 0:
+ raise ValueError(
+ "x min should be less than x max and y min should be less than y max"
+ )
+ elif self.x_extent < 0 and self.y_extent > 0:
+ raise ValueError("x min should be less than x max")
+ elif self.x_extent > 0 and self.y_extent < 0:
+ print(self.resolution)
+ print(self.y_max, self.y_min, self.y_extent)
+ raise ValueError("y min should be less than y max")
+
+ def xy_value(
+ self, x: float, y: float, offset="center"
+ ) -> Union[float, int, np.ndarray]:
+ """Obtain pixel value by geodetic or projected coordinate
+
+ Parameters
+ ----------
+ x : float
+ x-axis coordinate
+ y : float
+ y-axis coordinate
+
+ Returns
+ -------
+ Union[float, int, np.ndarray]
+ pixel value
+ """
+ try:
+ row, col = self.xy2rowcol(x, y)
+ if row < 0 or col < 0:
+ raise IndexError
+ return self.array[row, col]
+ except IndexError:
+ raise IndexError(
+ f"""
+ {x},{y} is out of bound.
+ x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
+ """
+ )
+
+ def rowcol2xy(
+ self, row: int, col: int, offset: str = "center"
+ ) -> Tuple[float, float]:
+ """Convert image coordinate (row, col) to real world coordinate
+
+ Parameters
+ ----------
+ row : int
+ col : int
+ offset : str
+
+ Returns
+ -------
+ Tuple[float, float]
+ X,Y coordinate in real world
+ """
+ return rowcol2xy((row, col), self.transform, offset=offset)
+
+ def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
+ """Convert real world coordinate to image coordinate (row, col)
+
+ Parameters
+ ----------
+ x : float
+ y : float
+
+ Returns
+ -------
+ Tuple[int, int]
+ row, column
+ """
+ _row, _col = xy2rowcol((x, y), self.transform)
+ return int(_row), int(_col)
+
+ def __raster_calc_by_pixel__(
+ self,
+ raster: "Raster",
+ operator: Callable[[Any, Any], Any],
+ ) -> np.ndarray:
+ _raster = np.zeros(self.array.shape, dtype=self.array.dtype)
+ for row in range(self.rows):
+ for col in range(self.cols):
+ try:
+ pixel_source = self.array[row, col]
+ pixel_target = raster.xy_value(*self.rowcol2xy(row, col))
+ if pixel_source != self.no_data and pixel_target != raster.no_data:
+ _raster[row, col] = operator(
+ pixel_source,
+ pixel_target,
+ )
+ else:
+ _raster[row, col] = self.no_data
+ except IndexError:
+ _raster[row, col] = self.no_data
+ return _raster
+
+ def __nb_raster_calc(
+ self, raster_a: "Raster", raster_b: "Raster", operator: str
+ ) -> np.ndarray:
+ """Wrapper for Raster calculation per pixel using numba jit.
+
+ Parameters
+ ----------
+ raster_a : Raster
+ first raster
+ raster_b : Raster
+ second raster
+ operator : str
+ operator name
+
+ Returns
+ -------
+ np.ndarray
+ calculated raster
+ """
+ if raster_b.layers != raster_a.layers:
+ raise ValueError(
+ f"""
+ Cant calculate between different layer shape.
+ first raster layer = {raster_a.layers}
+ second raster layer = {raster_b.layers}
+ """
+ )
+
+ _a = raster_a.array
+ if self.layers == 1 and len(raster_a.shape) != 3:
+ _a = raster_a.array.reshape(raster_a.rows, raster_a.cols, 1)
+
+ _b = raster_b.array
+ if self.layers == 1 and len(raster_b.shape) != 3:
+ _b = raster_b.array.reshape(raster_b.rows, raster_b.cols, 1)
+
+ out = __nb_raster_calc__(
+ _a,
+ _b,
+ tuple(raster_a.transform),
+ tuple(~raster_b.transform),
+ raster_a.no_data,
+ raster_b.no_data,
+ nb_raster_ops[operator],
+ )
+ if out.shape != raster_a.shape:
+ out = out.reshape(raster_a.shape)
+ return out
+
+ def __raster_calculation__(
+ self,
+ raster: Union[int, float, "Raster", np.ndarray],
+ operator: Callable[[Any, Any], Any],
+ ) -> "Raster":
+ if not isinstance(raster, (int, float, Raster, np.ndarray)):
+ raise ValueError(f"{type(raster)} unsupported data format")
+
+ if isinstance(raster, Raster):
+ if (
+ raster.epsg == self.epsg
+ and raster.resolution == self.resolution
+ and raster.x_min == self.x_min
+ and raster.y_min == self.y_min
+ and raster.shape == self.shape
+ ):
+ _raster = operator(self.array, raster.array)
+ else:
+ # _raster = self.__raster_calc_by_pixel__(raster, operator)
+
+ _raster = self.__nb_raster_calc(
+ self,
+ raster,
+ operator.__name__,
+ )
+ elif isinstance(raster, np.ndarray):
+ _raster = operator(self.array, raster)
+ else:
+ _raster = operator(self.array, raster)
+ return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg)
+
+ def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, sub)
+
+ def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, add)
+
+ def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, mul)
+
+ def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, truediv)
+
+ def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, floordiv)
+
+ def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, pow)
+
+ def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, iadd)
+
+ def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, itruediv)
+
+ def __ifloordiv__(
+ self, raster: Union[int, float, "Raster", np.ndarray]
+ ) -> "Raster":
+ return self.__raster_calculation__(raster, ifloordiv)
+
+ def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, imul)
+
+ def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, isub)
+
+ def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
+ return self.__raster_calculation__(raster, ipow)
+
+ def __iter__(self) -> Generator[Any, None, None]:
+ _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers)
+ if self.layers == 1:
+ _iter_shape = self.rows * self.cols
+ _iter = self.array.reshape(_iter_shape)
+ for i in range(self.rows * self.cols):
+ yield _iter[i]
+
+ def save(self, file_name: str, compress: bool = False) -> None:
+ """Save raster as geotiff
+
+ Parameters
+ ----------
+ file_name : str
+ output filename
+ """
+ save_raster(
+ file_name,
+ self.array,
+ self.crs,
+ affine=self.transform,
+ nodata=self.no_data,
+ compress=compress,
+ )
+
+ def resize(
+ self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
+ ) -> "Raster":
+ """Resize raster into defined height and width
+
+ Parameters
+ -------
+ height: int
+ height defined
+ width: int
+ width defined
+ method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
+ resampling method for opencv
+ * if nearest, a nearest-neighbor interpolation
+ * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
+ * if bilinear, a bilinear interpolation
+ * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
+ * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
+ backend: str opencv or python, default opencv
+ resampling backend
+ * if opencv, image will be resampled using opencv
+ * if python, image will be resampled using pure python. slower and nearest neighbor only
+
+
+ Returns
+ -------
+ Raster
+ Resized
+ """
+ if backend == "opencv":
+ return self.__cv_resize(height, width, method)
+ elif backend == "python":
+ return self.__py_resize(height, width)
+ else:
+ raise ValueError("Please choose between python or opencv for backend")
+
+ def resample(
+ self,
+ resolution: Union[Tuple[float, float], List[float], float],
+ method: str = "bilinear",
+ backend: str = "opencv",
+ ) -> "Raster":
+ """Resample image into defined resolution
+
+ Parameters
+ -------
+ resolution: tuple, list, float
+ spatial resolution target
+ method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
+ resampling method for opencv
+ * if nearest, a nearest-neighbor interpolation
+ * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
+ * if bilinear, a bilinear interpolation
+ * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
+ * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
+ backend: str opencv or python, default opencv
+ resampling backend
+ * if opencv, image will be resampled using opencv
+ * if python, image will be resampled using pure python. slower and nearest neighbor only
+
+
+ Returns
+ -------
+ Raster
+ Resampled
+ """
+ if backend == "opencv":
+ if abs(self.resolution[0]) != abs(self.resolution[1]):
+ warnings.warn(
+ "non square pixel resolution, use rasterio instead", UserWarning
+ )
+ return self.__cv_resample(resolution, method)
+ elif backend == "python":
+ return self.__py_resample(resolution)
+ else:
+ raise ValueError("Please choose between python or opencv for backend")
+
+ def __cv_resize(self, height: int, width: int, method: str) -> "Raster":
+ resized_y_resolution = self.y_extent / height
+ resized_x_resolution = self.x_extent / width
+ resized = cv2.resize(
+ self.array, (width, height), interpolation=self.__cv2_resize_method[method]
+ )
+ return Raster(
+ resized,
+ (resized_x_resolution, resized_y_resolution),
+ self.x_min,
+ self.y_max,
+ epsg=self.epsg,
+ )
+
+ def __cv_resample(
+ self, resolution: Union[Tuple[float, float], List[float], float], method: str
+ ) -> "Raster":
+ if isinstance(resolution, (float, int)):
+ resampled_x_resolution = float(resolution)
+ resampled_y_resolution = float(resolution)
+ else:
+ resampled_x_resolution = resolution[0]
+ resampled_y_resolution = resolution[1]
+
+ resampled_rows = round(self.y_extent / resampled_y_resolution)
+ resampled_cols = round(self.x_extent / resampled_x_resolution)
+
+ resampled = self.__cv_resize(resampled_rows, resampled_cols, method)
+ return resampled
+
+ def __py_resample(
+ self, resolution: Union[Tuple[float, float], List[float], float]
+ ) -> "Raster":
+ """
+ Resample raster using nearest neighbor
+ Parameters
+ -------
+ resolution: tuple, list
+ spatial resolution target
+
+ Returns
+ -------
+ Raster
+ Resampled
+ """
+ warnings.warn("this function will be removed in v1.0", DeprecationWarning)
+
+ if isinstance(resolution, (float, int)):
+ resampled_x_resolution = float(resolution)
+ resampled_y_resolution = float(resolution)
+ else:
+ resampled_x_resolution = resolution[0]
+ resampled_y_resolution = resolution[1]
+
+ resampled_rows = round(self.y_extent / resampled_y_resolution)
+ resampled_cols = round(self.x_extent / resampled_x_resolution)
+
+ resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers)
+ if self.layers == 1:
+ resampled_shape = (resampled_rows, resampled_cols)
+
+ resampled_array = np.zeros(
+ resampled_rows * resampled_cols * self.layers, dtype=self.dtype
+ ).reshape(resampled_shape)
+
+ resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
+ resampled_x_resolution, -resampled_y_resolution
+ )
+
+ for row in range(resampled_rows):
+ for col in range(resampled_cols):
+ x, y = rowcol2xy((row, col), resampled_affine)
+ resampled_array[row, col] = self.xy_value(
+ x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2)
+ )
+
+ return Raster(
+ resampled_array,
+ (resampled_x_resolution, resampled_y_resolution),
+ self.x_min,
+ self.y_max,
+ epsg=self.epsg,
+ )
+
+ def __py_resize(self, height: int, width: int) -> "Raster":
+ """
+ Resize raster using nearest neighbor
+ Parameters
+ -------
+ height: int
+ raster height
+ width: int
+ raster width
+
+ Returns
+ -------
+ Raster
+ Resampled
+ """
+ warnings.warn("this function will be removed in v1.0", DeprecationWarning)
+
+ resized_y_resolution = self.y_extent / height
+ resized_x_resolution = self.x_extent / width
+
+ resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
+ resized_x_resolution, -resized_y_resolution
+ )
+
+ resized_shape: Tuple[int, ...] = (height, width, self.layers)
+ if self.layers == 1:
+ resized_shape = (height, width)
+
+ resized_array = np.zeros(
+ height * width * self.layers, dtype=self.dtype
+ ).reshape(resized_shape)
+
+ for row in range(height):
+ for col in range(width):
+ x, y = rowcol2xy((row, col), resized_affine)
+ resized_array[row, col] = self.xy_value(
+ x + (resized_x_resolution / 2), y + (resized_y_resolution / 2)
+ )
+
+ return Raster(
+ resized_array,
+ (resized_x_resolution, resized_y_resolution),
+ self.x_min,
+ self.y_max,
+ epsg=self.epsg,
+ )
+
+ def clip2bbox(
+ self, x_min: float, y_min: float, x_max: float, y_max: float
+ ) -> "Raster":
+ """Clipping into bounding boxes
+
+ Returns
+ -------
+ Raster
+ Clipped raster
+ """
+ if (
+ x_min < self.x_min
+ or y_min < self.y_min
+ or x_max > self.x_max
+ or y_max > self.y_max
+ ):
+ raise ValueError(
+ f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max}
+ but input is {x_min},{y_min},{x_max},{y_max}"""
+ )
+
+ row_min, col_min = self.xy2rowcol(x_min, y_max)
+ row_max, col_max = self.xy2rowcol(x_max, y_min)
+
+ clipped = self.array[row_min:row_max, col_min:col_max]
+ return Raster(clipped, self.resolution, x_min, y_max)
+
+ def split2tiles(
+ self, tile_size: Union[int, Tuple[int, int], List[int]]
+ ) -> Generator[Tuple[int, int, "Raster"], None, None]:
+ """
+ Split raster into smaller tiles, excessive will be padded and have no data value
+
+ Parameters
+ -------
+ tile_size: int, list of int, tuple of int
+ dimension of tiles
+
+ Yields
+ -------
+ int, int, Raster
+ row, column, tiled raster
+ """
+
+ tile_width: int = 0
+ tile_height: int = 0
+ if isinstance(tile_size, int):
+ tile_height = tile_size
+ tile_width = tile_size
+ elif isinstance(tile_size, tuple) or isinstance(tile_size, list):
+ if isinstance(tile_size[0], int) or isinstance(tile_size[1], int):
+ tile_height, tile_width = tile_size
+
+ new_height = self.shape[0]
+ if self.shape[0] % tile_height != 0:
+ new_height += tile_height - (new_height % tile_height)
+
+ new_width = self.shape[1]
+ if self.shape[1] % tile_width != 0:
+ new_width += tile_width - (new_width % tile_width)
+
+ padded_array = np.zeros((new_height, new_height, self.layers), dtype=self.dtype)
+ padded_array[:] = self.no_data
+ padded_array[: self.shape[0], : self.shape[1]] = self.array
+
+ for r in range(0, new_height, tile_height):
+ for c in range(0, new_width, tile_width):
+ yield r, c, Raster(
+ padded_array[r : r + tile_height, c : c + tile_width],
+ self.resolution,
+ *self.rowcol2xy(r, c, offset="ul"),
+ epsg=self.epsg,
+ no_data=self.no_data,
+ )
+
+
+class Layer(Raster):
+ """placeholder for future development"""
+
+ pass
+
+
+class Pixel(Raster):
+ """placeholder for future development"""
+
+ pass
diff --git a/poetry.lock b/poetry.lock
index c214859..6e83e7e 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,1033 +1,1083 @@
-[[package]]
-name = "affine"
-version = "2.3.0"
-description = "Matrices describing affine transformation of the plane."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.extras]
-test = ["pytest (>=3.0)", "pytest-cov", "pydocstyle", "coveralls"]
-
-[[package]]
-name = "appdirs"
-version = "1.4.4"
-description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "atomicwrites"
-version = "1.4.0"
-description = "Atomic file writes."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[[package]]
-name = "attrs"
-version = "21.2.0"
-description = "Classes Without Boilerplate"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.extras]
-dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
-docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
-tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
-tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
-
-[[package]]
-name = "black"
-version = "20.8b1"
-description = "The uncompromising code formatter."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-appdirs = "*"
-click = ">=7.1.2"
-mypy-extensions = ">=0.4.3"
-pathspec = ">=0.6,<1"
-regex = ">=2020.1.8"
-toml = ">=0.10.1"
-typed-ast = ">=1.4.0"
-typing-extensions = ">=3.7.4"
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
-
-[[package]]
-name = "certifi"
-version = "2021.5.30"
-description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "click"
-version = "7.1.2"
-description = "Composable command line interface toolkit"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "click-plugins"
-version = "1.1.1"
-description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-click = ">=4.0"
-
-[package.extras]
-dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"]
-
-[[package]]
-name = "cligj"
-version = "0.7.2"
-description = "Click params for commmand line interfaces to GeoJSON"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4"
-
-[package.dependencies]
-click = ">=4.0"
-
-[package.extras]
-test = ["pytest-cov"]
-
-[[package]]
-name = "colorama"
-version = "0.4.4"
-description = "Cross-platform colored terminal text."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "coverage"
-version = "5.5"
-description = "Code coverage measurement for Python"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
-
-[package.extras]
-toml = ["toml"]
-
-[[package]]
-name = "fiona"
-version = "1.8.20"
-description = "Fiona reads and writes spatial data files"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-attrs = ">=17"
-certifi = "*"
-click = ">=4.0"
-click-plugins = ">=1.0"
-cligj = ">=0.5"
-munch = "*"
-six = ">=1.7"
-
-[package.extras]
-all = ["pytest (>=3)", "boto3 (>=1.2.4)", "pytest-cov", "shapely", "mock"]
-calc = ["shapely"]
-s3 = ["boto3 (>=1.2.4)"]
-test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"]
-
-[[package]]
-name = "gdal"
-version = "3.3.0"
-description = "GDAL: Geospatial Data Abstraction Library"
-category = "main"
-optional = false
-python-versions = ">=3.6.0"
-
-[package.extras]
-numpy = ["numpy (>1.0.0)"]
-
-[[package]]
-name = "importlib-metadata"
-version = "4.5.0"
-description = "Read metadata from Python packages"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
-zipp = ">=0.5"
-
-[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
-
-[[package]]
-name = "isort"
-version = "5.9.1"
-description = "A Python utility / library to sort Python imports."
-category = "dev"
-optional = false
-python-versions = ">=3.6.1,<4.0"
-
-[package.extras]
-pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
-requirements_deprecated_finder = ["pipreqs", "pip-api"]
-colors = ["colorama (>=0.4.3,<0.5.0)"]
-plugins = ["setuptools"]
-
-[[package]]
-name = "llvmlite"
-version = "0.36.0"
-description = "lightweight wrapper around basic LLVM functionality"
-category = "main"
-optional = false
-python-versions = ">=3.6,<3.10"
-
-[[package]]
-name = "mako"
-version = "1.1.4"
-description = "A super-fast templating language that borrows the best ideas from the existing templating languages."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-MarkupSafe = ">=0.9.2"
-
-[package.extras]
-babel = ["babel"]
-lingua = ["lingua"]
-
-[[package]]
-name = "markdown"
-version = "3.3.4"
-description = "Python implementation of Markdown."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
-
-[package.extras]
-testing = ["coverage", "pyyaml"]
-
-[[package]]
-name = "markupsafe"
-version = "2.0.1"
-description = "Safely add untrusted strings to HTML/XML markup."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[[package]]
-name = "more-itertools"
-version = "8.8.0"
-description = "More routines for operating on iterables, beyond itertools"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[[package]]
-name = "munch"
-version = "2.5.0"
-description = "A dot-accessible dictionary (a la JavaScript objects)"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-six = "*"
-
-[package.extras]
-testing = ["pytest", "coverage", "astroid (>=1.5.3,<1.6.0)", "pylint (>=1.7.2,<1.8.0)", "astroid (>=2.0)", "pylint (>=2.3.1,<2.4.0)"]
-yaml = ["PyYAML (>=5.1.0)"]
-
-[[package]]
-name = "mypy"
-version = "0.790"
-description = "Optional static typing for Python"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-mypy-extensions = ">=0.4.3,<0.5.0"
-typed-ast = ">=1.4.0,<1.5.0"
-typing-extensions = ">=3.7.4"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-
-[[package]]
-name = "mypy-extensions"
-version = "0.4.3"
-description = "Experimental type system extensions for programs checked with the mypy typechecker."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "numba"
-version = "0.53.1"
-description = "compiling Python code using LLVM"
-category = "main"
-optional = false
-python-versions = ">=3.6,<3.10"
-
-[package.dependencies]
-llvmlite = ">=0.36.0rc1,<0.37"
-numpy = ">=1.15"
-
-[[package]]
-name = "numpy"
-version = "1.21.0"
-description = "NumPy is the fundamental package for array computing with Python."
-category = "main"
-optional = false
-python-versions = ">=3.7"
-
-[[package]]
-name = "opencv-python"
-version = "4.5.2.54"
-description = "Wrapper package for OpenCV python bindings."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-numpy = ">=1.13.3"
-
-[[package]]
-name = "packaging"
-version = "20.9"
-description = "Core utilities for Python packages"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-pyparsing = ">=2.0.2"
-
-[[package]]
-name = "pathspec"
-version = "0.8.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "pdoc3"
-version = "0.9.2"
-description = "Auto-generate API documentation for Python projects."
-category = "dev"
-optional = false
-python-versions = ">= 3.5"
-
-[package.dependencies]
-mako = "*"
-markdown = ">=3.0"
-
-[[package]]
-name = "pluggy"
-version = "0.13.1"
-description = "plugin and hook calling mechanisms for python"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-
-[[package]]
-name = "py"
-version = "1.10.0"
-description = "library with cross-python path, ini-parsing, io, code, log facilities"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[[package]]
-name = "pyparsing"
-version = "2.4.7"
-description = "Python parsing module"
-category = "main"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[[package]]
-name = "pyproj"
-version = "3.1.0"
-description = "Python interface to PROJ (cartographic projections and coordinate transformations library)"
-category = "main"
-optional = false
-python-versions = ">=3.7"
-
-[package.dependencies]
-certifi = "*"
-
-[[package]]
-name = "pytest"
-version = "5.4.3"
-description = "pytest: simple powerful testing with Python"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-
-[package.dependencies]
-atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
-attrs = ">=17.4.0"
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
-more-itertools = ">=4.0.0"
-packaging = "*"
-pluggy = ">=0.12,<1.0"
-py = ">=1.5.0"
-wcwidth = "*"
-
-[package.extras]
-checkqa-mypy = ["mypy (==v0.761)"]
-testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
-
-[[package]]
-name = "pytest-cov"
-version = "2.12.1"
-description = "Pytest plugin for measuring coverage."
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[package.dependencies]
-coverage = ">=5.2.1"
-pytest = ">=4.6"
-toml = "*"
-
-[package.extras]
-testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
-
-[[package]]
-name = "rasterio"
-version = "1.2.6"
-description = "Fast and direct raster I/O for use with Numpy and SciPy"
-category = "main"
-optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-affine = "*"
-attrs = "*"
-certifi = "*"
-click = ">=4.0"
-click-plugins = "*"
-cligj = ">=0.5"
-numpy = "*"
-snuggs = ">=1.4.1"
-
-[package.extras]
-all = ["boto3 (>=1.2.4)", "pytest-cov (>=2.2.0)", "hypothesis", "shapely", "numpydoc", "ghp-import", "pytest (>=2.8.2)", "matplotlib", "packaging", "ipython (>=2.0)", "sphinx-rtd-theme", "sphinx"]
-docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"]
-ipython = ["ipython (>=2.0)"]
-plot = ["matplotlib"]
-s3 = ["boto3 (>=1.2.4)"]
-test = ["boto3 (>=1.2.4)", "hypothesis", "packaging", "pytest-cov (>=2.2.0)", "pytest (>=2.8.2)", "shapely"]
-
-[[package]]
-name = "regex"
-version = "2021.4.4"
-description = "Alternative regular expression module, to replace re."
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "shapely"
-version = "1.7.1"
-description = "Geometric objects, predicates, and operations"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.extras]
-all = ["numpy", "pytest", "pytest-cov"]
-test = ["pytest", "pytest-cov"]
-vectorized = ["numpy"]
-
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[[package]]
-name = "snuggs"
-version = "1.4.7"
-description = "Snuggs are s-expressions for Numpy"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-numpy = "*"
-pyparsing = ">=2.1.6"
-
-[package.extras]
-test = ["pytest", "hypothesis"]
-
-[[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
-category = "dev"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[[package]]
-name = "tqdm"
-version = "4.61.1"
-description = "Fast, Extensible Progress Meter"
-category = "main"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-
-[package.extras]
-dev = ["py-make (>=0.1.0)", "twine", "wheel"]
-notebook = ["ipywidgets (>=6)"]
-telegram = ["requests"]
-
-[[package]]
-name = "typed-ast"
-version = "1.4.3"
-description = "a fork of Python 2 and 3 ast modules with type comment support"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "typing-extensions"
-version = "3.10.0.0"
-description = "Backported and Experimental Type Hints for Python 3.5+"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "wcwidth"
-version = "0.2.5"
-description = "Measures the displayed width of unicode strings in a terminal"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "zipp"
-version = "3.4.1"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-
-[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
-
-[metadata]
-lock-version = "1.1"
-python-versions = ">=3.7,<3.10"
-content-hash = "785517b4c8485cd29bc100fc84d28a56262e1e0821866146f074b54ef1034811"
-
-[metadata.files]
-affine = [
- {file = "affine-2.3.0-py2.py3-none-any.whl", hash = "sha256:34b05b070d954c382e56f02c207a372d8a32621a87653cc30cdd31cd7f65799f"},
- {file = "affine-2.3.0.tar.gz", hash = "sha256:2e045def1aa29e613c42e801a7e10e0b9bacfed1a7c6af0cadf8843530a15102"},
-]
-appdirs = [
- {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
- {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
-]
-atomicwrites = [
- {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
- {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
-]
-attrs = [
- {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
- {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
-]
-black = [
- {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"},
-]
-certifi = [
- {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
- {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
-]
-click = [
- {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
- {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
-]
-click-plugins = [
- {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
- {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
-]
-cligj = [
- {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"},
- {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"},
-]
-colorama = [
- {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
- {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
-]
-coverage = [
- {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"},
- {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"},
- {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"},
- {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"},
- {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"},
- {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"},
- {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"},
- {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"},
- {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"},
- {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"},
- {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"},
- {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"},
- {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"},
- {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"},
- {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"},
- {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"},
- {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"},
- {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"},
- {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"},
- {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"},
- {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"},
- {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"},
- {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"},
- {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"},
- {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"},
- {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"},
- {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"},
- {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"},
- {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"},
- {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"},
- {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"},
- {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"},
- {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"},
- {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"},
- {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"},
- {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"},
- {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"},
- {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"},
- {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"},
- {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"},
- {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"},
- {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"},
- {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"},
- {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"},
- {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"},
- {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"},
- {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"},
- {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"},
- {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"},
- {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"},
- {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"},
- {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
-]
-fiona = [
- {file = "Fiona-1.8.20-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:02880556540e36ad6aac97687799d9b3093c354787a47bc0e73026c7fc15f1b3"},
- {file = "Fiona-1.8.20-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3f668c471fa2f8c9c0a9ca83639cb2c8dcc93edc3d93d43dba2f9e8da38ad53e"},
- {file = "Fiona-1.8.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:54f81039e913d0f88728ef23edf5a69038dec94dea54f4c799f972ba8e2a7d40"},
- {file = "Fiona-1.8.20-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:328340a448bed5c43d119f61f760368a04d13a302c59d2fccb051a3ff021f4b8"},
- {file = "Fiona-1.8.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03f910380dbe684730b59b817aa030e6e9a3ee79211b66c6db2d1c8fe6ea12de"},
- {file = "Fiona-1.8.20-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bef100ebd82afb9a4d67096216e82611b82ca9341330e4805832d7ff8c9bc1f7"},
- {file = "Fiona-1.8.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5e1cef608c6de9039eaa65b395024096e3189ab0559a5a328c68c4690c3302ce"},
- {file = "Fiona-1.8.20-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e72e4a5b84ec410be531d4fe4c1a5c87c6c0e92d01116c145c0f1b33f81c8080"},
- {file = "Fiona-1.8.20.tar.gz", hash = "sha256:a70502d2857b82f749c09cb0dea3726787747933a2a1599b5ab787d74e3c143b"},
-]
-gdal = [
- {file = "GDAL-3.3.0.tar.gz", hash = "sha256:ed314a0b3f8b3729a9f6d8ca23f21473c2ff4a946d1a2969e0a1937bf0f4e700"},
-]
-importlib-metadata = [
- {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"},
- {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"},
-]
-isort = [
- {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"},
- {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"},
-]
-llvmlite = [
- {file = "llvmlite-0.36.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc0f9b9644b4ab0e4a5edb17f1531d791630c88858220d3cc688d6edf10da100"},
- {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f7918dbac02b1ebbfd7302ad8e8307d7877ab57d782d5f04b70ff9696b53c21b"},
- {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7768658646c418b9b3beccb7044277a608bc8c62b82a85e73c7e5c065e4157c2"},
- {file = "llvmlite-0.36.0-cp36-cp36m-win32.whl", hash = "sha256:05f807209a360d39526d98141b6f281b9c7c771c77a4d1fc22002440642c8de2"},
- {file = "llvmlite-0.36.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d1fdd63c371626c25ad834e1c6297eb76cf2f093a40dbb401a87b6476ab4e34e"},
- {file = "llvmlite-0.36.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c4e7066447305d5095d0b0a9cae7b835d2f0fde143456b3124110eab0856426"},
- {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9dad7e4bb042492914292aea3f4172eca84db731f9478250240955aedba95e08"},
- {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1ce5bc0a638d874a08d4222be0a7e48e5df305d094c2ff8dec525ef32b581551"},
- {file = "llvmlite-0.36.0-cp37-cp37m-win32.whl", hash = "sha256:dbedff0f6d417b374253a6bab39aa4b5364f1caab30c06ba8726904776fcf1cb"},
- {file = "llvmlite-0.36.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b17fc4b0dd17bd29d7297d054e2915fad535889907c3f65232ee21f483447c5"},
- {file = "llvmlite-0.36.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3a77e46e6053e2a86e607e87b97651dda81e619febb914824a927bff4e88737"},
- {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:048a7c117641c9be87b90005684e64a6f33ea0897ebab1df8a01214a10d6e79a"},
- {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7db4b0eef93125af1c4092c64a3c73c7dc904101117ef53f8d78a1a499b8d5f4"},
- {file = "llvmlite-0.36.0-cp38-cp38-win32.whl", hash = "sha256:50b1828bde514b31431b2bba1aa20b387f5625b81ad6e12fede430a04645e47a"},
- {file = "llvmlite-0.36.0-cp38-cp38-win_amd64.whl", hash = "sha256:f608bae781b2d343e15e080c546468c5a6f35f57f0446923ea198dd21f23757e"},
- {file = "llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a"},
- {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1"},
- {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1"},
- {file = "llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a"},
- {file = "llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c"},
- {file = "llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9"},
-]
-mako = [
- {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"},
- {file = "Mako-1.1.4.tar.gz", hash = "sha256:17831f0b7087c313c0ffae2bcbbd3c1d5ba9eeac9c38f2eb7b50e8c99fe9d5ab"},
-]
-markdown = [
- {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"},
- {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"},
-]
-markupsafe = [
- {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
- {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
- {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
- {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
- {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
- {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
-]
-more-itertools = [
- {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"},
- {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"},
-]
-munch = [
- {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"},
- {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"},
-]
-mypy = [
- {file = "mypy-0.790-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669"},
- {file = "mypy-0.790-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802"},
- {file = "mypy-0.790-cp35-cp35m-win_amd64.whl", hash = "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de"},
- {file = "mypy-0.790-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1"},
- {file = "mypy-0.790-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc"},
- {file = "mypy-0.790-cp36-cp36m-win_amd64.whl", hash = "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7"},
- {file = "mypy-0.790-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c"},
- {file = "mypy-0.790-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178"},
- {file = "mypy-0.790-cp37-cp37m-win_amd64.whl", hash = "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324"},
- {file = "mypy-0.790-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01"},
- {file = "mypy-0.790-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666"},
- {file = "mypy-0.790-cp38-cp38-win_amd64.whl", hash = "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea"},
- {file = "mypy-0.790-py3-none-any.whl", hash = "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122"},
- {file = "mypy-0.790.tar.gz", hash = "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975"},
-]
-mypy-extensions = [
- {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
- {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
-]
-numba = [
- {file = "numba-0.53.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b23de6b6837c132087d06b8b92d343edb54b885873b824a037967fbd5272ebb7"},
- {file = "numba-0.53.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6545b9e9b0c112b81de7f88a3c787469a357eeff8211e90b8f45ee243d521cc2"},
- {file = "numba-0.53.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:8fa5c963a43855050a868106a87cd614f3c3f459951c8fc468aec263ef80d063"},
- {file = "numba-0.53.1-cp36-cp36m-win32.whl", hash = "sha256:aaa6ebf56afb0b6752607b9f3bf39e99b0efe3c1fa6849698373925ee6838fd7"},
- {file = "numba-0.53.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08b3df38aab769df79ed948d70f0a54a3cdda49d58af65369235c204ec5d0f3"},
- {file = "numba-0.53.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:bf5c463b62d013e3f709cc8277adf2f4f4d8cc6757293e29c6db121b77e6b760"},
- {file = "numba-0.53.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:74df02e73155f669e60dcff07c4eef4a03dbf5b388594db74142ab40914fe4f5"},
- {file = "numba-0.53.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5165709bf62f28667e10b9afe6df0ce1037722adab92d620f59cb8bbb8104641"},
- {file = "numba-0.53.1-cp37-cp37m-win32.whl", hash = "sha256:2e96958ed2ca7e6d967b2ce29c8da0ca47117e1de28e7c30b2c8c57386506fa5"},
- {file = "numba-0.53.1-cp37-cp37m-win_amd64.whl", hash = "sha256:276f9d1674fe08d95872d81b97267c6b39dd830f05eb992608cbede50fcf48a9"},
- {file = "numba-0.53.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c4c8d102512ae472af52c76ad9522da718c392cb59f4cd6785d711fa5051a2a"},
- {file = "numba-0.53.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:691adbeac17dbdf6ed7c759e9e33a522351f07d2065fe926b264b6b2c15fd89b"},
- {file = "numba-0.53.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:94aab3e0e9e8754116325ce026e1b29ae72443c706a3104cf7f3368dc3012912"},
- {file = "numba-0.53.1-cp38-cp38-win32.whl", hash = "sha256:aabeec89bb3e3162136eea492cea7ee8882ddcda2201f05caecdece192c40896"},
- {file = "numba-0.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:1895ebd256819ff22256cd6fe24aa8f7470b18acc73e7917e8e93c9ac7f565dc"},
- {file = "numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c"},
- {file = "numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f"},
- {file = "numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744"},
- {file = "numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221"},
- {file = "numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69"},
- {file = "numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0"},
-]
-numpy = [
- {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"},
- {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"},
- {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"},
- {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"},
- {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"},
- {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"},
- {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"},
- {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"},
- {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"},
- {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"},
- {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"},
- {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"},
- {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"},
- {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"},
- {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"},
- {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"},
- {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"},
- {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"},
- {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"},
- {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"},
- {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"},
- {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"},
- {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"},
- {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"},
- {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"},
- {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"},
- {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"},
- {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"},
-]
-opencv-python = [
- {file = "opencv_python-4.5.2.54-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6"},
- {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9680ab256ab31bdafd74f6cf55eb570e5629b5604d50fd69dd1bd2a8124f0611"},
- {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ef3102b70aa59ab3fed69df30465c1b7587d681e963dfff5146de233c75df7ba"},
- {file = "opencv_python-4.5.2.54-cp36-cp36m-win32.whl", hash = "sha256:89a2b45429bf945988a17b0404431d9d8fdc9e04fb2450b56fa01f6f9477101d"},
- {file = "opencv_python-4.5.2.54-cp36-cp36m-win_amd64.whl", hash = "sha256:08327a38564786bf73e387736f080e8ad4c110b394ca4af2ecec8277b305bf44"},
- {file = "opencv_python-4.5.2.54-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:6b2573c6367ec0052b37e375d18638a885dd7a10a5ef8dd726b391969c227f23"},
- {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b724a96eeb88842bd2371b1ffe2da73b6295063ba5c029aa34139d25b8315a3f"},
- {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4b8814d3f0cf01e8b8624125f7dcfb095893abcc04083cb4968fa1629bc81161"},
- {file = "opencv_python-4.5.2.54-cp37-cp37m-win32.whl", hash = "sha256:d9004e2cc90bb2862cdc1d062fac5163d3def55b200081d4520d3e90b4c7197b"},
- {file = "opencv_python-4.5.2.54-cp37-cp37m-win_amd64.whl", hash = "sha256:2436b71346d1eed423577fac8cd3aa9c0832ea97452444dc7f856b2f09600dba"},
- {file = "opencv_python-4.5.2.54-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0118a086fad8d77acdf46ac68df49d4167fbb85420f8bcf2615d7b74fc03aae0"},
- {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b3bef3f2a2ab3c201784d12ec6b5c9e61c920c15b6854d8d2f62fd019e3df846"},
- {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6e2070e35f2aaca3d1259093c786d4e373004b36d89a94e81943247c6ed3d4e1"},
- {file = "opencv_python-4.5.2.54-cp38-cp38-win32.whl", hash = "sha256:f12f39c1e5001e1c00df5873e3eee6f0232b7723a60b7ef438b1e23f1341df0e"},
- {file = "opencv_python-4.5.2.54-cp38-cp38-win_amd64.whl", hash = "sha256:10325c3fd571e33a11eb5f0e5d265d73baef22dbb34c977f28df7e22de47b0bc"},
- {file = "opencv_python-4.5.2.54-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:050227e5728ea8316ec114aca8f43d56253cbb1c50983e3b136a988254a83118"},
- {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c446555cbbc4f5e809f9c15ac1b6200024032d9859f5ac5a2ca7669d09e4c91c"},
- {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8cf81f53ac5ad900ca443a8252c4e0bc1256f1c2cb2d8459df2ba1ac014dfa36"},
- {file = "opencv_python-4.5.2.54-cp39-cp39-win32.whl", hash = "sha256:a8020cc6145c6934192189058743a55189750df6dff894396edb8b35a380cc48"},
- {file = "opencv_python-4.5.2.54-cp39-cp39-win_amd64.whl", hash = "sha256:0a3aef70b7c53bbd22ade86a4318b8a2ad98d3c3ed3d0c315f18bf1a2d868709"},
-]
-packaging = [
- {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
- {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
-]
-pathspec = [
- {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"},
- {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"},
-]
-pdoc3 = [
- {file = "pdoc3-0.9.2.tar.gz", hash = "sha256:9df5d931f25f353c69c46819a3bd03ef96dd286f2a70bb1b93a23a781f91faa1"},
-]
-pluggy = [
- {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
- {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
-]
-py = [
- {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
- {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
-]
-pyparsing = [
- {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
- {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
-]
-pyproj = [
- {file = "pyproj-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8eda240225971b5cd0bac2d399ed6222068f0598ee92d5f6e847bd2019d2c8b0"},
- {file = "pyproj-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ae237492767e0225f99b53a0fd7110fde2b7e7cabc105bbc243c151a7497de88"},
- {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b635e7e21fea5af74e90fc9e54d1a4c27078efdce6f214101c98dd93afae599a"},
- {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa87df0982aa0f4477478899d9c930cc0f97cd6d8a4ce84c43ac88ccf86d1da7"},
- {file = "pyproj-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:10dad599b9f7ce2194996dc25f1000e0aa15754ecef9db46b624713959c67957"},
- {file = "pyproj-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a162ed199cd2ec392cffe20b2fa3381b68e7a166d55f3f060eceb8d517e4f46d"},
- {file = "pyproj-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e88ebc4e08e661e9011b5c1ebfb32f0d311963a9824a6effb4168c7e07918b1"},
- {file = "pyproj-3.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:da88abc5e2f6a8fb07533855a57ca2a31845f58901a87f821b68b0db6b023978"},
- {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:911d773da9fa4d4f3f7580173858c391e3ee0b61acaf0be303baab323d2eae78"},
- {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f8a8d982bde211e65dc2de1f8f36cf162f9cc7fcd8a7625046ea265284e5e65"},
- {file = "pyproj-3.1.0-cp38-cp38-win32.whl", hash = "sha256:c4193e1069d165476b2d0f7d882b7712b3eab6e2e6fe2a0a78ef40de825a1f28"},
- {file = "pyproj-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b6c74bbec679199746a3e02c0e0fad093c3652df96dd63e086a2fbf2afe9dc0e"},
- {file = "pyproj-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04c185102e659439c5bd428ac5473d36ef795fca8e225bbbe78e20643d804ec0"},
- {file = "pyproj-3.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ebbba7707fe83a01e54bce8e3e7342feb0b3e0d74ff8c28df12f8bc59b76827c"},
- {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cc464a1c51baad28ffb7a233116e8d4ce4c560b32039fa986d0f992ac3c431f"},
- {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f3ad09cf3352bf5664794042b28d98781362ec8d9774ad73f28a1a0101a27f1"},
- {file = "pyproj-3.1.0-cp39-cp39-win32.whl", hash = "sha256:ae5534fa7a3b74f20534694d297fce6f7483890ff6ca404394ecf372f3c589d4"},
- {file = "pyproj-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:808f5992320e9631b2e45444028a65cd6ba3ee40229292934178ef07020a5ffd"},
- {file = "pyproj-3.1.0.tar.gz", hash = "sha256:67b94f4e694ae33fc90dfb7da0e6b5ed5f671dd0acc2f6cf46e9c39d56e16e1a"},
-]
-pytest = [
- {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"},
- {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"},
-]
-pytest-cov = [
- {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
- {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
-]
-rasterio = [
- {file = "rasterio-1.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fda220ca942ff7446458a1d532121a2a0bebffdcbe064e4719dcca348a2ed541"},
- {file = "rasterio-1.2.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2134587770d258ed97f40e4f910b7250bd3d39cdba76f9dd1617ca73cd481ff5"},
- {file = "rasterio-1.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6154622ec5210f5768db6544502b89487cfac10b0be9a321af33cd64e8cbe0fa"},
- {file = "rasterio-1.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bd06ed04197eb79b96240dc90354fe15e0fe9b531312830045c849e4db57a42f"},
- {file = "rasterio-1.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:87129e50e835e2696c17d19c5e7f5d566d09f8895d9e405e2c7d78adc63ae626"},
- {file = "rasterio-1.2.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da2ed05c025bbdc1df8bdd9d1237e96ca3030eadabdb67722674620e9732a54a"},
- {file = "rasterio-1.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294479e9d7caf64c95a90b2ed2ec13df6eba35f035f0c536a388e0160e9abf03"},
- {file = "rasterio-1.2.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f55aa86bac58672ca47627a1dfecd56d35581beb49feae1f22818f97ff79abf8"},
- {file = "rasterio-1.2.6.tar.gz", hash = "sha256:24975b97fe2fc3fd282d59640baab19de431448e1b23be6b85b68fecc1362f88"},
-]
-regex = [
- {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"},
- {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"},
- {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"},
- {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"},
- {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"},
- {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"},
- {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"},
- {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"},
- {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"},
- {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"},
- {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"},
- {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"},
- {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"},
- {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"},
- {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"},
- {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"},
- {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"},
-]
-shapely = [
- {file = "Shapely-1.7.1-1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46da0ea527da9cf9503e66c18bab6981c5556859e518fe71578b47126e54ca93"},
- {file = "Shapely-1.7.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4c10f317e379cc404f8fc510cd9982d5d3e7ba13a9cfd39aa251d894c6366798"},
- {file = "Shapely-1.7.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:17df66e87d0fe0193910aeaa938c99f0b04f67b430edb8adae01e7be557b141b"},
- {file = "Shapely-1.7.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:da38ed3d65b8091447dc3717e5218cc336d20303b77b0634b261bc5c1aa2bae8"},
- {file = "Shapely-1.7.1-cp35-cp35m-win32.whl", hash = "sha256:8e7659dd994792a0aad8fb80439f59055a21163e236faf2f9823beb63a380e19"},
- {file = "Shapely-1.7.1-cp35-cp35m-win_amd64.whl", hash = "sha256:791477edb422692e7dc351c5ed6530eb0e949a31b45569946619a0d9cd5f53cb"},
- {file = "Shapely-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3afccf0437edc108eef1e2bb9cc4c7073e7705924eb4cd0bf7715cd1ef0ce1b"},
- {file = "Shapely-1.7.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8f15b6ce67dcc05b61f19c689b60f3fe58550ba994290ff8332f711f5aaa9840"},
- {file = "Shapely-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:60e5b2282619249dbe8dc5266d781cc7d7fb1b27fa49f8241f2167672ad26719"},
- {file = "Shapely-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de618e67b64a51a0768d26a9963ecd7d338a2cf6e9e7582d2385f88ad005b3d1"},
- {file = "Shapely-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:182716ffb500d114b5d1b75d7fd9d14b7d3414cef3c38c0490534cc9ce20981a"},
- {file = "Shapely-1.7.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4f3c59f6dbf86a9fc293546de492f5e07344e045f9333f3a753f2dda903c45d1"},
- {file = "Shapely-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:6871acba8fbe744efa4f9f34e726d070bfbf9bffb356a8f6d64557846324232b"},
- {file = "Shapely-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:35be1c5d869966569d3dfd4ec31832d7c780e9df760e1fe52131105685941891"},
- {file = "Shapely-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:052eb5b9ba756808a7825e8a8020fb146ec489dd5c919e7d139014775411e688"},
- {file = "Shapely-1.7.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:90a3e2ae0d6d7d50ff2370ba168fbd416a53e7d8448410758c5d6a5920646c1d"},
- {file = "Shapely-1.7.1-cp38-cp38-win32.whl", hash = "sha256:a3774516c8a83abfd1ddffb8b6ec1b0935d7fe6ea0ff5c31a18bfdae567b4eba"},
- {file = "Shapely-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:6593026cd3f5daaea12bcc51ae5c979318070fefee210e7990cb8ac2364e79a1"},
- {file = "Shapely-1.7.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b40cc7bb089ae4aa9ddba1db900b4cd1bce3925d2a4b5837b639e49de054784f"},
- {file = "Shapely-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2df5260d0f2983309776cb41bfa85c464ec07018d88c0ecfca23d40bfadae2f1"},
- {file = "Shapely-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5c3a50d823c192f32615a2a6920e8c046b09e07a58eba220407335a9cd2e8ea"},
- {file = "Shapely-1.7.1.tar.gz", hash = "sha256:1641724c1055459a7e2b8bbe47ba25bdc89554582e62aec23cb3f3ca25f9b129"},
-]
-six = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-snuggs = [
- {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"},
- {file = "snuggs-1.4.7.tar.gz", hash = "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b"},
-]
-toml = [
- {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
- {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
-]
-tqdm = [
- {file = "tqdm-4.61.1-py2.py3-none-any.whl", hash = "sha256:aa0c29f03f298951ac6318f7c8ce584e48fa22ec26396e6411e43d038243bdb2"},
- {file = "tqdm-4.61.1.tar.gz", hash = "sha256:24be966933e942be5f074c29755a95b315c69a91f839a29139bf26ffffe2d3fd"},
-]
-typed-ast = [
- {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
- {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"},
- {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"},
- {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"},
- {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"},
- {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"},
- {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"},
- {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"},
- {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"},
- {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"},
- {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"},
- {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"},
- {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"},
- {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"},
- {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"},
- {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"},
- {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"},
- {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"},
- {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"},
- {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"},
- {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"},
- {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"},
- {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"},
- {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"},
- {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"},
- {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"},
- {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"},
- {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"},
- {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"},
- {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
-]
-typing-extensions = [
- {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
- {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
- {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
-]
-wcwidth = [
- {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
- {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
-]
-zipp = [
- {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
- {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
-]
+[[package]]
+name = "affine"
+version = "2.3.0"
+description = "Matrices describing affine transformation of the plane."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+test = ["pytest (>=3.0)", "pytest-cov", "pydocstyle", "coveralls"]
+
+[[package]]
+name = "appdirs"
+version = "1.4.4"
+description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "atomicwrites"
+version = "1.4.0"
+description = "Atomic file writes."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "attrs"
+version = "21.2.0"
+description = "Classes Without Boilerplate"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
+
+[[package]]
+name = "black"
+version = "20.8b1"
+description = "The uncompromising code formatter."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+appdirs = "*"
+click = ">=7.1.2"
+mypy-extensions = ">=0.4.3"
+pathspec = ">=0.6,<1"
+regex = ">=2020.1.8"
+toml = ">=0.10.1"
+typed-ast = ">=1.4.0"
+typing-extensions = ">=3.7.4"
+
+[package.extras]
+colorama = ["colorama (>=0.4.3)"]
+d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
+
+[[package]]
+name = "certifi"
+version = "2021.10.8"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "click"
+version = "7.1.2"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "click-plugins"
+version = "1.1.1"
+description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+click = ">=4.0"
+
+[package.extras]
+dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"]
+
+[[package]]
+name = "cligj"
+version = "0.7.2"
+description = "Click params for commmand line interfaces to GeoJSON"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4"
+
+[package.dependencies]
+click = ">=4.0"
+
+[package.extras]
+test = ["pytest-cov"]
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "coverage"
+version = "5.5"
+description = "Code coverage measurement for Python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+toml = ["toml"]
+
+[[package]]
+name = "Fiona"
+version = "1.8.20"
+description = "Fiona reads and writes spatial data files"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+attrs = ">=17"
+certifi = "*"
+click = ">=4.0"
+click-plugins = ">=1.0"
+cligj = ">=0.5"
+gdal = ">=3.3.0,<3.4.0"
+munch = "*"
+six = ">=1.7"
+
+[package.extras]
+all = ["shapely", "pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"]
+calc = ["shapely"]
+s3 = ["boto3 (>=1.2.4)"]
+test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"]
+
+[package.source]
+type = "file"
+url = "../../../.pypkg/Fiona-1.8.20-cp39-cp39-win_amd64.whl"
+
+[[package]]
+name = "GDAL"
+version = "3.3.2"
+description = "GDAL: Geospatial Data Abstraction Library"
+category = "main"
+optional = false
+python-versions = ">=3.6.0"
+
+[package.extras]
+numpy = ["numpy (>1.19.0)"]
+
+[package.source]
+type = "file"
+url = "../../../.pypkg/GDAL-3.3.2-cp39-cp39-win_amd64.whl"
+
+[[package]]
+name = "importlib-metadata"
+version = "4.8.1"
+description = "Read metadata from Python packages"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+perf = ["ipython"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "isort"
+version = "5.9.3"
+description = "A Python utility / library to sort Python imports."
+category = "dev"
+optional = false
+python-versions = ">=3.6.1,<4.0"
+
+[package.extras]
+pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
+requirements_deprecated_finder = ["pipreqs", "pip-api"]
+colors = ["colorama (>=0.4.3,<0.5.0)"]
+plugins = ["setuptools"]
+
+[[package]]
+name = "llvmlite"
+version = "0.36.0"
+description = "lightweight wrapper around basic LLVM functionality"
+category = "main"
+optional = false
+python-versions = ">=3.6,<3.10"
+
+[[package]]
+name = "mako"
+version = "1.1.5"
+description = "A super-fast templating language that borrows the best ideas from the existing templating languages."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+MarkupSafe = ">=0.9.2"
+
+[package.extras]
+babel = ["babel"]
+lingua = ["lingua"]
+
+[[package]]
+name = "markdown"
+version = "3.3.4"
+description = "Python implementation of Markdown."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+testing = ["coverage", "pyyaml"]
+
+[[package]]
+name = "markupsafe"
+version = "2.0.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "more-itertools"
+version = "8.10.0"
+description = "More routines for operating on iterables, beyond itertools"
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "munch"
+version = "2.5.0"
+description = "A dot-accessible dictionary (a la JavaScript objects)"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[package.extras]
+testing = ["pytest", "coverage", "astroid (>=1.5.3,<1.6.0)", "pylint (>=1.7.2,<1.8.0)", "astroid (>=2.0)", "pylint (>=2.3.1,<2.4.0)"]
+yaml = ["PyYAML (>=5.1.0)"]
+
+[[package]]
+name = "mypy"
+version = "0.790"
+description = "Optional static typing for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+mypy-extensions = ">=0.4.3,<0.5.0"
+typed-ast = ">=1.4.0,<1.5.0"
+typing-extensions = ">=3.7.4"
+
+[package.extras]
+dmypy = ["psutil (>=4.0)"]
+
+[[package]]
+name = "mypy-extensions"
+version = "0.4.3"
+description = "Experimental type system extensions for programs checked with the mypy typechecker."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "numba"
+version = "0.53.1"
+description = "compiling Python code using LLVM"
+category = "main"
+optional = false
+python-versions = ">=3.6,<3.10"
+
+[package.dependencies]
+llvmlite = ">=0.36.0rc1,<0.37"
+numpy = ">=1.15"
+
+[[package]]
+name = "numpy"
+version = "1.21.3"
+description = "NumPy is the fundamental package for array computing with Python."
+category = "main"
+optional = false
+python-versions = ">=3.7,<3.11"
+
+[[package]]
+name = "opencv-python"
+version = "4.5.4.58"
+description = "Wrapper package for OpenCV python bindings."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+numpy = ">=1.21.2"
+
+[[package]]
+name = "packaging"
+version = "21.0"
+description = "Core utilities for Python packages"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyparsing = ">=2.0.2"
+
+[[package]]
+name = "pathspec"
+version = "0.9.0"
+description = "Utility library for gitignore style pattern matching of file paths."
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[[package]]
+name = "pdoc3"
+version = "0.9.2"
+description = "Auto-generate API documentation for Python projects."
+category = "dev"
+optional = false
+python-versions = ">= 3.5"
+
+[package.dependencies]
+mako = "*"
+markdown = ">=3.0"
+
+[[package]]
+name = "pluggy"
+version = "0.13.1"
+description = "plugin and hook calling mechanisms for python"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+
+[[package]]
+name = "py"
+version = "1.10.0"
+description = "library with cross-python path, ini-parsing, io, code, log facilities"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pyparsing"
+version = "3.0.1"
+description = "Python parsing module"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
+
+[[package]]
+name = "pyproj"
+version = "3.2.1"
+description = "Python interface to PROJ (cartographic projections and coordinate transformations library)"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+certifi = "*"
+
+[[package]]
+name = "pytest"
+version = "5.4.3"
+description = "pytest: simple powerful testing with Python"
+category = "dev"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
+attrs = ">=17.4.0"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+more-itertools = ">=4.0.0"
+packaging = "*"
+pluggy = ">=0.12,<1.0"
+py = ">=1.5.0"
+wcwidth = "*"
+
+[package.extras]
+checkqa-mypy = ["mypy (==v0.761)"]
+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
+
+[[package]]
+name = "pytest-cov"
+version = "2.12.1"
+description = "Pytest plugin for measuring coverage."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+coverage = ">=5.2.1"
+pytest = ">=4.6"
+toml = "*"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
+
+[[package]]
+name = "rasterio"
+version = "1.2.9"
+description = "Fast and direct raster I/O for use with Numpy and SciPy"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+affine = "*"
+attrs = "*"
+certifi = "*"
+click = ">=4.0"
+click-plugins = "*"
+cligj = ">=0.5"
+gdal = ">=3.3.2,<3.4.0"
+numpy = "*"
+snuggs = ">=1.4.1"
+
+[package.extras]
+all = ["hypothesis", "pytest-cov (>=2.2.0)", "ghp-import", "sphinx-rtd-theme", "matplotlib", "shapely", "boto3 (>=1.2.4)", "pytest (>=2.8.2)", "sphinx", "packaging", "numpydoc", "ipython (>=2.0)"]
+docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"]
+ipython = ["ipython (>=2.0)"]
+plot = ["matplotlib"]
+s3 = ["boto3 (>=1.2.4)"]
+test = ["boto3 (>=1.2.4)", "hypothesis", "packaging", "pytest-cov (>=2.2.0)", "pytest (>=2.8.2)", "shapely"]
+
+[package.source]
+type = "file"
+url = "../../../.pypkg/rasterio-1.2.9-cp39-cp39-win_amd64.whl"
+
+[[package]]
+name = "regex"
+version = "2021.10.23"
+description = "Alternative regular expression module, to replace re."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "shapely"
+version = "1.8.0"
+description = "Geometric objects, predicates, and operations"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+all = ["pytest", "pytest-cov", "numpy"]
+test = ["pytest", "pytest-cov"]
+vectorized = ["numpy"]
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "snuggs"
+version = "1.4.7"
+description = "Snuggs are s-expressions for Numpy"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+numpy = "*"
+pyparsing = ">=2.1.6"
+
+[package.extras]
+test = ["pytest", "hypothesis"]
+
+[[package]]
+name = "toml"
+version = "0.10.2"
+description = "Python Library for Tom's Obvious, Minimal Language"
+category = "dev"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "tqdm"
+version = "4.62.3"
+description = "Fast, Extensible Progress Meter"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["py-make (>=0.1.0)", "twine", "wheel"]
+notebook = ["ipywidgets (>=6)"]
+telegram = ["requests"]
+
+[[package]]
+name = "typed-ast"
+version = "1.4.3"
+description = "a fork of Python 2 and 3 ast modules with type comment support"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "typing-extensions"
+version = "3.10.0.2"
+description = "Backported and Experimental Type Hints for Python 3.5+"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "wcwidth"
+version = "0.2.5"
+description = "Measures the displayed width of unicode strings in a terminal"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "zipp"
+version = "3.6.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = ">=3.7,<3.10"
+content-hash = "5d6ce83e1ec350b84780984730c3c6f8bea2f66fdbe1cc33594a7de06a901096"
+
+[metadata.files]
+affine = [
+ {file = "affine-2.3.0-py2.py3-none-any.whl", hash = "sha256:34b05b070d954c382e56f02c207a372d8a32621a87653cc30cdd31cd7f65799f"},
+ {file = "affine-2.3.0.tar.gz", hash = "sha256:2e045def1aa29e613c42e801a7e10e0b9bacfed1a7c6af0cadf8843530a15102"},
+]
+appdirs = [
+ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
+ {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
+]
+atomicwrites = [
+ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
+ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
+]
+attrs = [
+ {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
+ {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
+]
+black = [
+ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"},
+]
+certifi = [
+ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
+ {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
+]
+click = [
+ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
+ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
+]
+click-plugins = [
+ {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
+ {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
+]
+cligj = [
+ {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"},
+ {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"},
+]
+colorama = [
+ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+coverage = [
+ {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"},
+ {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"},
+ {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"},
+ {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"},
+ {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"},
+ {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"},
+ {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"},
+ {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"},
+ {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"},
+ {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"},
+ {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"},
+ {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"},
+ {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"},
+ {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"},
+ {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"},
+ {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"},
+ {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"},
+ {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"},
+ {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"},
+ {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"},
+ {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"},
+ {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"},
+ {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"},
+ {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"},
+ {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"},
+ {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"},
+ {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"},
+ {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"},
+ {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"},
+ {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"},
+ {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"},
+ {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"},
+ {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"},
+ {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"},
+ {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"},
+ {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"},
+ {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"},
+ {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"},
+ {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"},
+ {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"},
+ {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"},
+ {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"},
+ {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"},
+ {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"},
+ {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"},
+ {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"},
+ {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"},
+ {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"},
+ {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"},
+ {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"},
+ {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"},
+ {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"},
+]
+Fiona = [
+ {file = "Fiona-1.8.20-cp39-cp39-win_amd64.whl", hash = "sha256:a5d1742c49879cc81cf34e124d1aba1891529472d32987b4ce79509b4332eb9a"},
+]
+GDAL = [
+ {file = "GDAL-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ff961a2abe57974df71337a99367b460a5faeec17fc5fdbdd4e13e4cb229899d"},
+]
+importlib-metadata = [
+ {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"},
+ {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"},
+]
+isort = [
+ {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"},
+ {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"},
+]
+llvmlite = [
+ {file = "llvmlite-0.36.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc0f9b9644b4ab0e4a5edb17f1531d791630c88858220d3cc688d6edf10da100"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f7918dbac02b1ebbfd7302ad8e8307d7877ab57d782d5f04b70ff9696b53c21b"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7768658646c418b9b3beccb7044277a608bc8c62b82a85e73c7e5c065e4157c2"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-win32.whl", hash = "sha256:05f807209a360d39526d98141b6f281b9c7c771c77a4d1fc22002440642c8de2"},
+ {file = "llvmlite-0.36.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d1fdd63c371626c25ad834e1c6297eb76cf2f093a40dbb401a87b6476ab4e34e"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c4e7066447305d5095d0b0a9cae7b835d2f0fde143456b3124110eab0856426"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9dad7e4bb042492914292aea3f4172eca84db731f9478250240955aedba95e08"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1ce5bc0a638d874a08d4222be0a7e48e5df305d094c2ff8dec525ef32b581551"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-win32.whl", hash = "sha256:dbedff0f6d417b374253a6bab39aa4b5364f1caab30c06ba8726904776fcf1cb"},
+ {file = "llvmlite-0.36.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b17fc4b0dd17bd29d7297d054e2915fad535889907c3f65232ee21f483447c5"},
+ {file = "llvmlite-0.36.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3a77e46e6053e2a86e607e87b97651dda81e619febb914824a927bff4e88737"},
+ {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:048a7c117641c9be87b90005684e64a6f33ea0897ebab1df8a01214a10d6e79a"},
+ {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7db4b0eef93125af1c4092c64a3c73c7dc904101117ef53f8d78a1a499b8d5f4"},
+ {file = "llvmlite-0.36.0-cp38-cp38-win32.whl", hash = "sha256:50b1828bde514b31431b2bba1aa20b387f5625b81ad6e12fede430a04645e47a"},
+ {file = "llvmlite-0.36.0-cp38-cp38-win_amd64.whl", hash = "sha256:f608bae781b2d343e15e080c546468c5a6f35f57f0446923ea198dd21f23757e"},
+ {file = "llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a"},
+ {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1"},
+ {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1"},
+ {file = "llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a"},
+ {file = "llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c"},
+ {file = "llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9"},
+]
+mako = [
+ {file = "Mako-1.1.5-py2.py3-none-any.whl", hash = "sha256:6804ee66a7f6a6416910463b00d76a7b25194cd27f1918500c5bd7be2a088a23"},
+ {file = "Mako-1.1.5.tar.gz", hash = "sha256:169fa52af22a91900d852e937400e79f535496191c63712e3b9fda5a9bed6fc3"},
+]
+markdown = [
+ {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"},
+ {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"},
+]
+markupsafe = [
+ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
+ {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
+ {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
+ {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
+ {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
+ {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
+ {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
+]
+more-itertools = [
+ {file = "more-itertools-8.10.0.tar.gz", hash = "sha256:1debcabeb1df793814859d64a81ad7cb10504c24349368ccf214c664c474f41f"},
+ {file = "more_itertools-8.10.0-py3-none-any.whl", hash = "sha256:56ddac45541718ba332db05f464bebfb0768110111affd27f66e0051f276fa43"},
+]
+munch = [
+ {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"},
+ {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"},
+]
+mypy = [
+ {file = "mypy-0.790-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669"},
+ {file = "mypy-0.790-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802"},
+ {file = "mypy-0.790-cp35-cp35m-win_amd64.whl", hash = "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de"},
+ {file = "mypy-0.790-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1"},
+ {file = "mypy-0.790-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc"},
+ {file = "mypy-0.790-cp36-cp36m-win_amd64.whl", hash = "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7"},
+ {file = "mypy-0.790-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c"},
+ {file = "mypy-0.790-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178"},
+ {file = "mypy-0.790-cp37-cp37m-win_amd64.whl", hash = "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324"},
+ {file = "mypy-0.790-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01"},
+ {file = "mypy-0.790-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666"},
+ {file = "mypy-0.790-cp38-cp38-win_amd64.whl", hash = "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea"},
+ {file = "mypy-0.790-py3-none-any.whl", hash = "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122"},
+ {file = "mypy-0.790.tar.gz", hash = "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975"},
+]
+mypy-extensions = [
+ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
+ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
+]
+numba = [
+ {file = "numba-0.53.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b23de6b6837c132087d06b8b92d343edb54b885873b824a037967fbd5272ebb7"},
+ {file = "numba-0.53.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6545b9e9b0c112b81de7f88a3c787469a357eeff8211e90b8f45ee243d521cc2"},
+ {file = "numba-0.53.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:8fa5c963a43855050a868106a87cd614f3c3f459951c8fc468aec263ef80d063"},
+ {file = "numba-0.53.1-cp36-cp36m-win32.whl", hash = "sha256:aaa6ebf56afb0b6752607b9f3bf39e99b0efe3c1fa6849698373925ee6838fd7"},
+ {file = "numba-0.53.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08b3df38aab769df79ed948d70f0a54a3cdda49d58af65369235c204ec5d0f3"},
+ {file = "numba-0.53.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:bf5c463b62d013e3f709cc8277adf2f4f4d8cc6757293e29c6db121b77e6b760"},
+ {file = "numba-0.53.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:74df02e73155f669e60dcff07c4eef4a03dbf5b388594db74142ab40914fe4f5"},
+ {file = "numba-0.53.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5165709bf62f28667e10b9afe6df0ce1037722adab92d620f59cb8bbb8104641"},
+ {file = "numba-0.53.1-cp37-cp37m-win32.whl", hash = "sha256:2e96958ed2ca7e6d967b2ce29c8da0ca47117e1de28e7c30b2c8c57386506fa5"},
+ {file = "numba-0.53.1-cp37-cp37m-win_amd64.whl", hash = "sha256:276f9d1674fe08d95872d81b97267c6b39dd830f05eb992608cbede50fcf48a9"},
+ {file = "numba-0.53.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c4c8d102512ae472af52c76ad9522da718c392cb59f4cd6785d711fa5051a2a"},
+ {file = "numba-0.53.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:691adbeac17dbdf6ed7c759e9e33a522351f07d2065fe926b264b6b2c15fd89b"},
+ {file = "numba-0.53.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:94aab3e0e9e8754116325ce026e1b29ae72443c706a3104cf7f3368dc3012912"},
+ {file = "numba-0.53.1-cp38-cp38-win32.whl", hash = "sha256:aabeec89bb3e3162136eea492cea7ee8882ddcda2201f05caecdece192c40896"},
+ {file = "numba-0.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:1895ebd256819ff22256cd6fe24aa8f7470b18acc73e7917e8e93c9ac7f565dc"},
+ {file = "numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c"},
+ {file = "numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f"},
+ {file = "numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744"},
+ {file = "numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221"},
+ {file = "numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69"},
+ {file = "numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0"},
+]
+numpy = [
+ {file = "numpy-1.21.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:508b0b513fa1266875524ba8a9ecc27b02ad771fe1704a16314dc1a816a68737"},
+ {file = "numpy-1.21.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5dfe9d6a4c39b8b6edd7990091fea4f852888e41919d0e6722fe78dd421db0eb"},
+ {file = "numpy-1.21.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a10968963640e75cc0193e1847616ab4c718e83b6938ae74dea44953950f6b7"},
+ {file = "numpy-1.21.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c6249260890e05b8111ebfc391ed58b3cb4b33e63197b2ec7f776e45330721"},
+ {file = "numpy-1.21.3-cp310-cp310-win_amd64.whl", hash = "sha256:f8f4625536926a155b80ad2bbff44f8cc59e9f2ad14cdda7acf4c135b4dc8ff2"},
+ {file = "numpy-1.21.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e54af82d68ef8255535a6cdb353f55d6b8cf418a83e2be3569243787a4f4866f"},
+ {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f41b018f126aac18583956c54544db437f25c7ee4794bcb23eb38bef8e5e192a"},
+ {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:50cd26b0cf6664cb3b3dd161ba0a09c9c1343db064e7c69f9f8b551f5104d654"},
+ {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cc9b512e9fb590797474f58b7f6d1f1b654b3a94f4fa8558b48ca8b3cfc97cf"},
+ {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:88a5d6b268e9ad18f3533e184744acdaa2e913b13148160b1152300c949bbb5f"},
+ {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c09418a14471c7ae69ba682e2428cae5b4420a766659605566c0fa6987f6b7e"},
+ {file = "numpy-1.21.3-cp37-cp37m-win32.whl", hash = "sha256:90bec6a86b348b4559b6482e2b684db4a9a7eed1fa054b86115a48d58fbbf62a"},
+ {file = "numpy-1.21.3-cp37-cp37m-win_amd64.whl", hash = "sha256:043e83bfc274649c82a6f09836943e4a4aebe5e33656271c7dbf9621dd58b8ec"},
+ {file = "numpy-1.21.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:75621882d2230ab77fb6a03d4cbccd2038511491076e7964ef87306623aa5272"},
+ {file = "numpy-1.21.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:188031f833bbb623637e66006cf75e933e00e7231f67e2b45cf8189612bb5dc3"},
+ {file = "numpy-1.21.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:160ccc1bed3a8371bf0d760971f09bfe80a3e18646620e9ded0ad159d9749baa"},
+ {file = "numpy-1.21.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:29fb3dcd0468b7715f8ce2c0c2d9bbbaf5ae686334951343a41bd8d155c6ea27"},
+ {file = "numpy-1.21.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32437f0b275c1d09d9c3add782516413e98cd7c09e6baf4715cbce781fc29912"},
+ {file = "numpy-1.21.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e606e6316911471c8d9b4618e082635cfe98876007556e89ce03d52ff5e8fcf0"},
+ {file = "numpy-1.21.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a99a6b067e5190ac6d12005a4d85aa6227c5606fa93211f86b1dafb16233e57d"},
+ {file = "numpy-1.21.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dde972a1e11bb7b702ed0e447953e7617723760f420decb97305e66fb4afc54f"},
+ {file = "numpy-1.21.3-cp38-cp38-win32.whl", hash = "sha256:fe52dbe47d9deb69b05084abd4b0df7abb39a3c51957c09f635520abd49b29dd"},
+ {file = "numpy-1.21.3-cp38-cp38-win_amd64.whl", hash = "sha256:75eb7cadc8da49302f5b659d40ba4f6d94d5045fbd9569c9d058e77b0514c9e4"},
+ {file = "numpy-1.21.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2a6ee9620061b2a722749b391c0d80a0e2ae97290f1b32e28d5a362e21941ee4"},
+ {file = "numpy-1.21.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c4193f70f8069550a1788bd0cd3268ab7d3a2b70583dfe3b2e7f421e9aace06"},
+ {file = "numpy-1.21.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28f15209fb535dd4c504a7762d3bc440779b0e37d50ed810ced209e5cea60d96"},
+ {file = "numpy-1.21.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c6c2d535a7beb1f8790aaa98fd089ceab2e3dd7ca48aca0af7dc60e6ef93ffe1"},
+ {file = "numpy-1.21.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bffa2eee3b87376cc6b31eee36d05349571c236d1de1175b804b348dc0941e3f"},
+ {file = "numpy-1.21.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14e7519fab2a4ed87d31f99c31a3796e4e1fe63a86ebdd1c5a1ea78ebd5896"},
+ {file = "numpy-1.21.3-cp39-cp39-win32.whl", hash = "sha256:dd0482f3fc547f1b1b5d6a8b8e08f63fdc250c58ce688dedd8851e6e26cff0f3"},
+ {file = "numpy-1.21.3-cp39-cp39-win_amd64.whl", hash = "sha256:300321e3985c968e3ae7fbda187237b225f3ffe6528395a5b7a5407f73cf093e"},
+ {file = "numpy-1.21.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98339aa9911853f131de11010f6dd94c8cec254d3d1f7261528c3b3e3219f139"},
+ {file = "numpy-1.21.3.zip", hash = "sha256:63571bb7897a584ca3249c86dd01c10bcb5fe4296e3568b2e9c1a55356b6410e"},
+]
+opencv-python = [
+ {file = "opencv-python-4.5.4.58.tar.gz", hash = "sha256:48288428f407bacba5f73d460feb4a1ecafe87db3d7cfc0730a49fb32f589bbf"},
+ {file = "opencv_python-4.5.4.58-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0eba0bfe62c48a02a5af3a0944e872c99f57f98653bed14d51c6991a58f9e1d1"},
+ {file = "opencv_python-4.5.4.58-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:9bcca50c5444b5cfb01624666b69f91ba8f2d2bf4ef37b111697aafdeb81c99f"},
+ {file = "opencv_python-4.5.4.58-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8f7886acabaebf0361bd3dbccaa0d08e3f65ab13b7c739eb11e028f01ad13582"},
+ {file = "opencv_python-4.5.4.58-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d4b1d0b98ee72ba5dd720166790fc93ce459281e138ee79b0d41420b3da52b2e"},
+ {file = "opencv_python-4.5.4.58-cp310-cp310-win32.whl", hash = "sha256:69a78e40a374ac14e4bf15a13dbb6c30fd2fbd5fcd3674d020a31b88861d5aaf"},
+ {file = "opencv_python-4.5.4.58-cp310-cp310-win_amd64.whl", hash = "sha256:315c357522b6310ef7a0718d9f0c5d3110e59c19140705499a3c29bdd8c0124f"},
+ {file = "opencv_python-4.5.4.58-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:887a61097092dc0bf23fa24646dbc8cfeeb753649cb28a3782a93a6879e3b7d2"},
+ {file = "opencv_python-4.5.4.58-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:22bcc3153a7d4f95aff79457eef81ef5e40ab1851b189e014412b5e9fbee2573"},
+ {file = "opencv_python-4.5.4.58-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:92e9b2261ec764229c948d77fe0d922ee033348ca6519939b87861016c1614b3"},
+ {file = "opencv_python-4.5.4.58-cp36-cp36m-win32.whl", hash = "sha256:0d6249a49122a78afc6685ddb1377a87e46414ae61c84535c4c6024397f1f3e8"},
+ {file = "opencv_python-4.5.4.58-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa144013b597e4dcabc8d8230edfe810319de01b5609556d415a20e2b707547"},
+ {file = "opencv_python-4.5.4.58-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:26feeeb280de179f5dbb8976ebf7ceb836bd263973cb5daec8ca36e8ef7b5773"},
+ {file = "opencv_python-4.5.4.58-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4a13381bdfc0fb4b080efcc27c46561d0bd752f126226e9f19aa9cbcf6677f40"},
+ {file = "opencv_python-4.5.4.58-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ac852fcaac93439f2f7116ddffdc23fd366c872200ade2272446f9898180cecb"},
+ {file = "opencv_python-4.5.4.58-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02872e0a9358526646d691f390143e9c21109c210095314abaa0641211cda077"},
+ {file = "opencv_python-4.5.4.58-cp37-cp37m-win32.whl", hash = "sha256:6b87bab220d17e03eeedbcc6652d9d7e7bb09886dbd0f810310697a948b4c6fd"},
+ {file = "opencv_python-4.5.4.58-cp37-cp37m-win_amd64.whl", hash = "sha256:a2a7f09b8843b85f3e1b02c5ea3ddc0cb9f5ad9698380109b37069ee8db7746d"},
+ {file = "opencv_python-4.5.4.58-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:c44f5c51e92322ed832607204249c190764dec6cf29e8ba6d679b10326be1c1b"},
+ {file = "opencv_python-4.5.4.58-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9b2c198af083a693d42a82bddc4d1f7e6bb02c64192ff7fac1fd1d43a8cf1be6"},
+ {file = "opencv_python-4.5.4.58-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:637f4d3ad81bd27f273ede4c5fa6c26afb85c097c9715baf107cc270e37f5fea"},
+ {file = "opencv_python-4.5.4.58-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:2fff48a641a74d1def31c1e88f9e5ce50ba4d0f87d085dfbf8bc844e12f6cd54"},
+ {file = "opencv_python-4.5.4.58-cp38-cp38-win32.whl", hash = "sha256:8ddf4dcd8199209e33f21deb0c6d8ab62b21802816bba895fefc346b6d2e522d"},
+ {file = "opencv_python-4.5.4.58-cp38-cp38-win_amd64.whl", hash = "sha256:085c5fcf5a6479c34aca3fd0f59055e704083d6a44009d6583c675ff1a5a0625"},
+ {file = "opencv_python-4.5.4.58-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4abe9c4fb6fe16daa9fcdd68b5357d3530431341aa655203f8e84f394e1fe6d4"},
+ {file = "opencv_python-4.5.4.58-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b614fbd81aeda53ce28e645aaee18fda7c7f2a48eb7f1a70a7c6c3427946342"},
+ {file = "opencv_python-4.5.4.58-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215bdf069847d4e3b0447a34e9eb4046dd4ca523d41fe4381c1c55f6704fd0dc"},
+ {file = "opencv_python-4.5.4.58-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc34cdbfbab463750713118c8259a5d364547adab8ed91e94ba888349f33590a"},
+ {file = "opencv_python-4.5.4.58-cp39-cp39-win32.whl", hash = "sha256:9998ce60884f3cda074f02b56d2b57ee6bd863e2ddba132da2b0af3b9487d584"},
+ {file = "opencv_python-4.5.4.58-cp39-cp39-win_amd64.whl", hash = "sha256:5370a11757fbe94b176771269aff599f4da8676c2a672b13bcbca043f2e3eea8"},
+]
+packaging = [
+ {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
+ {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
+]
+pathspec = [
+ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
+ {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
+]
+pdoc3 = [
+ {file = "pdoc3-0.9.2.tar.gz", hash = "sha256:9df5d931f25f353c69c46819a3bd03ef96dd286f2a70bb1b93a23a781f91faa1"},
+]
+pluggy = [
+ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
+ {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
+]
+py = [
+ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
+ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
+]
+pyparsing = [
+ {file = "pyparsing-3.0.1-py3-none-any.whl", hash = "sha256:fd93fc45c47893c300bd98f5dd1b41c0e783eaeb727e7cea210dcc09d64ce7c3"},
+ {file = "pyparsing-3.0.1.tar.gz", hash = "sha256:84196357aa3566d64ad123d7a3c67b0e597a115c4934b097580e5ce220b91531"},
+]
+pyproj = [
+ {file = "pyproj-3.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ce554616880ab59110af9baa2948b4442d2961e20390df00cea49782b7c779fe"},
+ {file = "pyproj-3.2.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:40ed2a66d93af811abac9fd2581685a2aade22a6753501f2f9760893ee6b0828"},
+ {file = "pyproj-3.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8e6821a472f03e3604413b562536e05cb7926c3bd85bfc423c88c4909871f692"},
+ {file = "pyproj-3.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a732342136fa57112de717109c2b853a4df3e4e2de56e42da7a2b61e67f0b29"},
+ {file = "pyproj-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:b87eda8647d71f27ed81c43da9d8e0b841a403378b645e8dc1d015e9f5133ed1"},
+ {file = "pyproj-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f2eb0ee7e4183c1c4e2f450cccff09734b59ff929619bad3a4df97a87e3a3d1f"},
+ {file = "pyproj-3.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:76dd8a9dbd67a42e5ab8afe0e4a4167f0dfcd8f07e12541852c5289abf49e28f"},
+ {file = "pyproj-3.2.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b73973908688a0845ebd78871ed2edcca35d1fad8e90983a416a49aadb350f28"},
+ {file = "pyproj-3.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:00ec0cdd218cc8e7c823a9fe7c705b1e55926fe3a9460ef2048403757f9897ec"},
+ {file = "pyproj-3.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d7097b969c7a3f114fcce379021e59c843c1c7b1b9b3f1bb2aa65019793800"},
+ {file = "pyproj-3.2.1-cp38-cp38-win32.whl", hash = "sha256:e61c34b1b5a6b8df2ecf5abdbf8dd69322001ebc1971d0897919e4004512c476"},
+ {file = "pyproj-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:50d312cb7610f93f02f07b7da5b96469c52645717bebe6530ac7214cc69c068e"},
+ {file = "pyproj-3.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:faadb5795e99321b5135263080348e184b927352c6331a06c2fcfe77a07ad215"},
+ {file = "pyproj-3.2.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:d355ddf4cb29e77cb38e152354fb6ef6796d699d37e1a67a2427890ce2341162"},
+ {file = "pyproj-3.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:28026ddf4d779e6bcbbd45954a0ca017348d819f27deb503e860be4eb88f5218"},
+ {file = "pyproj-3.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fb6283da84be5dc909f3f681490fd43de1b3694e9b5bed1ca7bc875130cb93"},
+ {file = "pyproj-3.2.1-cp39-cp39-win32.whl", hash = "sha256:604e8041ee0a17eec0fac4e7e10b2f11f45ab49676a4f26eb63753ebb9ba38b0"},
+ {file = "pyproj-3.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:8cf6f7c62a7c4144771a330381198e53bff782c0345af623b8989b1913acb919"},
+ {file = "pyproj-3.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:19e6a7c6d31624b9971639036679fad35460045fd99c0c484899134b6bbf84cc"},
+ {file = "pyproj-3.2.1.tar.gz", hash = "sha256:4a936093825ff55b24c1fc6cc093541fcf6d0f6d406589ed699e62048ebf3877"},
+]
+pytest = [
+ {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"},
+ {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"},
+]
+pytest-cov = [
+ {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"},
+ {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"},
+]
+rasterio = [
+ {file = "rasterio-1.2.9-cp39-cp39-win_amd64.whl", hash = "sha256:524bfb1ddae9394eb761721febdb9a85a458673146c66cc2c1f2a5cff678ae53"},
+]
+regex = [
+ {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"},
+ {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"},
+ {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"},
+ {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"},
+ {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"},
+ {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"},
+ {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"},
+ {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"},
+ {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"},
+ {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"},
+ {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"},
+ {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"},
+ {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"},
+ {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"},
+ {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"},
+ {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"},
+ {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"},
+ {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"},
+ {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"},
+ {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"},
+ {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"},
+ {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"},
+ {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"},
+ {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"},
+ {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"},
+ {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"},
+ {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"},
+ {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"},
+ {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"},
+ {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"},
+ {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"},
+ {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"},
+ {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"},
+ {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"},
+ {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"},
+ {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"},
+]
+shapely = [
+ {file = "Shapely-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5632cedea6d815b61eb4c264da1c3f24a8ce2ceba2f74e30fba340ca230563"},
+ {file = "Shapely-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ce1f18a0c9bb6b483c73bd7a0eb3a5e90676bcc29b9c27120236e662195c9d"},
+ {file = "Shapely-1.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e8cdffeec6d0c47ed1eb215ec4e80c024ac05be6ded982061c1e1188034f22f"},
+ {file = "Shapely-1.8.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83d10f8b47a7568fc90063f72da62cda201dc92ecadf80cc00c015babc48e11f"},
+ {file = "Shapely-1.8.0-cp36-cp36m-win32.whl", hash = "sha256:78b3a46dadd47c27e658d5e8d9006b4b1eb9b7ab947b450059225dcee799a18f"},
+ {file = "Shapely-1.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0e640d6da59172d679270f0dfd88128b6ae7c57df864a030dd858ff924c307fc"},
+ {file = "Shapely-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68bdf463f7a609fbed42bbded18fa74c82a5741251984a5597d070060f4286f4"},
+ {file = "Shapely-1.8.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c3cc87e66cbffd00ce0457c03969b64935752824bf43a1cd61f21cf606997d6"},
+ {file = "Shapely-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:bd84d993a0e8e07f5ebb4c67794d5392fdd23ce59a7ccc121900f2080f57989a"},
+ {file = "Shapely-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:796b15a483ac37c2dc757654186d0e064a42fb6f43cb9d1ff65d81cd0c92a84e"},
+ {file = "Shapely-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:622f62d2b2da81dd40841a56db0f78bcf9f9af7a83c7d5f5dc9bcb234aa650ba"},
+ {file = "Shapely-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26b43b69dfeb8a8cb27aacf5597134baf12337845c2bacb01809540c20d3d904"},
+ {file = "Shapely-1.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cfb9d72d255af1a484e3859f4c9bb737950faf1d16c21d2b949ffc4ba5f46147"},
+ {file = "Shapely-1.8.0-cp38-cp38-win32.whl", hash = "sha256:f304243b1f4d7bca9b3c9fdeec6565171e1b611fb4a3d6c93efc870c8a75958c"},
+ {file = "Shapely-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:8917a91430126165cfa4bc2b4cf168121e37ff0c8657134e7398c597ca1fe934"},
+ {file = "Shapely-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:19b54cd840883fd71cce98fd94916d1731eed8a32c115eb082b3ed24e631be02"},
+ {file = "Shapely-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13cbb959863cec32d48e2cffdc4bb81828bc3b0fa4256c9b2b32edac5021a0e4"},
+ {file = "Shapely-1.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7e1aebf4f1b2fbef40152fd531216387fcf6fe4ff2d777268381979b63c7c779"},
+ {file = "Shapely-1.8.0-cp39-cp39-win32.whl", hash = "sha256:83145eda2e582c2046d1ecc6a0d7dbfe97f492434311124f65ea60f4e87a6b65"},
+ {file = "Shapely-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b54ebd8fa4b78320f6d87032fe91363c7c1bf0f8d4a30eb93bca6413f787fd5"},
+ {file = "Shapely-1.8.0.tar.gz", hash = "sha256:f5307ee14ba4199f8bbcf6532ca33064661c1433960c432c84f0daa73b47ef9c"},
+]
+six = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+snuggs = [
+ {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"},
+ {file = "snuggs-1.4.7.tar.gz", hash = "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b"},
+]
+toml = [
+ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
+ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
+]
+tqdm = [
+ {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"},
+ {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"},
+]
+typed-ast = [
+ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
+ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"},
+ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"},
+ {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"},
+ {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"},
+ {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"},
+ {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"},
+ {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"},
+ {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"},
+ {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"},
+ {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"},
+ {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"},
+ {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"},
+ {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"},
+ {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"},
+ {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"},
+ {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"},
+ {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"},
+ {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"},
+ {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"},
+ {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"},
+ {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"},
+ {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"},
+ {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"},
+ {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"},
+ {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"},
+ {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"},
+ {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"},
+ {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"},
+ {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"},
+]
+typing-extensions = [
+ {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
+ {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
+ {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
+]
+wcwidth = [
+ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
+ {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
+]
+zipp = [
+ {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
+ {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
+]
diff --git a/pyproject.toml b/pyproject.toml
index b61ced3..81bdad9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,56 +1,56 @@
-[tool.poetry]
-name = "geosardine"
-version = "0.13.1"
-license = "BSD-3-Clause"
-description = "Spatial operations extend fiona and rasterio"
-authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"]
-homepage = "https://github.com/sahitono/geosardine"
-repository = "https://github.com/sahitono/geosardine"
-readme = "README.md"
-include = ["CHANGELOG.md"]
-classifiers = [
- "Development Status :: 5 - Production/Stable",
- "Programming Language :: Python :: 3",
- "Intended Audience :: Science/Research",
- "Topic :: Scientific/Engineering :: GIS",
- "License :: OSI Approved :: BSD License",
- "Typing :: Typed",
-]
-
-[tool.poetry.dependencies]
-python = ">=3.7,<3.10"
-numpy = ">=1.18"
-affine = "^2.3.0"
-shapely = ">=1.6.4,<2.0.0"
-tqdm = ">=4.48.2,<5.0.0"
-numba = ">=0.51.2"
-click = "^7.1.2"
-gdal = ">=3.0.4"
-fiona = ">=1.8.13"
-rasterio = ">=1.1.2"
-opencv-python = ">=4.4.0,<=5.0.0"
-pyproj = ">=2.6.1"
-# pyproj = { path="../../../.pypkg/pyproj-3.1.0-cp38-cp38-win_amd64.whl" }
-
-[tool.poetry.dev-dependencies]
-# gdal = { path="../../../.pypkg/GDAL-3.3.0-cp38-cp38-win_amd64.whl" }
-# fiona = { path="../../../.pypkg/Fiona-1.8.20-cp38-cp38-win_amd64.whl" }
-# rasterio = { path="../../../.pypkg/rasterio-1.2.6-cp38-cp38-win_amd64.whl" }
-pip = ">=20.0.0"
-pytest = "^5.2"
-black = "^20.8b1"
-isort = "^5.5.3"
-coverage = "^5.3"
-pytest-cov = "^2.10.1"
-mypy = "^0.790"
-pdoc3 = "^0.9.2"
-
-[tool.poetry.scripts]
-dine = 'geosardine.__main__:main'
-
-[tool.pytest.ini_options]
-filterwarnings = ["error::UserWarning"]
-
-[build-system]
-requires = ["poetry>=1.0.3", "pip>=20.0.0"]
-build-backend = "poetry.masonry.api"
+[tool.poetry]
+name = "geosardine"
+version = "0.13.1"
+license = "BSD-3-Clause"
+description = "Spatial operations extend fiona and rasterio"
+authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"]
+homepage = "https://github.com/sahitono/geosardine"
+repository = "https://github.com/sahitono/geosardine"
+readme = "README.md"
+include = ["CHANGELOG.md"]
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "Programming Language :: Python :: 3",
+ "Intended Audience :: Science/Research",
+ "Topic :: Scientific/Engineering :: GIS",
+ "License :: OSI Approved :: BSD License",
+ "Typing :: Typed",
+]
+
+[tool.poetry.dependencies]
+python = ">=3.7,<3.10"
+numpy = ">=1.18"
+affine = "^2.3.0"
+shapely = ">=1.6.4,<2.0.0"
+tqdm = ">=4.48.2,<5.0.0"
+numba = ">=0.51.2"
+click = "^7.1.2"
+gdal = ">=3.0.4"
+fiona = ">=1.8.13"
+rasterio = ">=1.1.2"
+opencv-python = ">=4.4.0,<=5.0.0"
+pyproj = ">=2.6.1"
+# pyproj = { path="../../../.pypkg/pyproj-3.1.0-cp38-cp38-win_amd64.whl" }
+
+[tool.poetry.dev-dependencies]
+gdal = { path="../../../.pypkg/GDAL-3.3.2-cp39-cp39-win_amd64.whl", develop=true }
+fiona = { path="../../../.pypkg/Fiona-1.8.20-cp39-cp39-win_amd64.whl", develop=true }
+rasterio = { path="../../../.pypkg/rasterio-1.2.9-cp39-cp39-win_amd64.whl", develop=true }
+pip = ">=20.0.0"
+pytest = "^5.2"
+black = "^20.8b1"
+isort = "^5.5.3"
+coverage = "^5.3"
+pytest-cov = "^2.10.1"
+mypy = "^0.790"
+pdoc3 = "^0.9.2"
+
+[tool.poetry.scripts]
+dine = 'geosardine.__main__:main'
+
+[tool.pytest.ini_options]
+filterwarnings = ["error::UserWarning"]
+
+[build-system]
+requires = ["poetry>=1.0.3", "pip>=20.0.0"]
+build-backend = "poetry.masonry.api"
diff --git a/tests/idw/test_idw_file_8327.geojson b/tests/idw/test_idw_file_8327.geojson
index 8c2d166..0c14f3a 100644
--- a/tests/idw/test_idw_file_8327.geojson
+++ b/tests/idw/test_idw_file_8327.geojson
@@ -1,12 +1,12 @@
-{
-"type": "FeatureCollection",
-"name": "test_idw_file_8327",
-"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::8327" } },
-"features": [
-{ "type": "Feature", "properties": { "week1": 132.0 }, "geometry": { "type": "Point", "coordinates": [ -12640945.517973877489567, 7544888.72555083874613 ] } },
-{ "type": "Feature", "properties": { "week1": 127.0 }, "geometry": { "type": "Point", "coordinates": [ -12657914.629812294617295, 7585525.831693620420992 ] } },
-{ "type": "Feature", "properties": { "week1": 37.0 }, "geometry": { "type": "Point", "coordinates": [ -12610826.411705931648612, 7554815.991225138306618 ] } },
-{ "type": "Feature", "properties": { "week1": 90.0 }, "geometry": { "type": "Point", "coordinates": [ -12662277.310977136716247, 7525923.692236887291074 ] } },
-{ "type": "Feature", "properties": { "week1": 182.0 }, "geometry": { "type": "Point", "coordinates": [ -12641908.127680582925677, 7551465.73191989492625 ] } }
-]
-}
+{
+"type": "FeatureCollection",
+"name": "test_idw_file_8327",
+"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::8327" } },
+"features": [
+{ "type": "Feature", "properties": { "week1": 132.0 }, "geometry": { "type": "Point", "coordinates": [ -12640945.517973877489567, 7544888.72555083874613 ] } },
+{ "type": "Feature", "properties": { "week1": 127.0 }, "geometry": { "type": "Point", "coordinates": [ -12657914.629812294617295, 7585525.831693620420992 ] } },
+{ "type": "Feature", "properties": { "week1": 37.0 }, "geometry": { "type": "Point", "coordinates": [ -12610826.411705931648612, 7554815.991225138306618 ] } },
+{ "type": "Feature", "properties": { "week1": 90.0 }, "geometry": { "type": "Point", "coordinates": [ -12662277.310977136716247, 7525923.692236887291074 ] } },
+{ "type": "Feature", "properties": { "week1": 182.0 }, "geometry": { "type": "Point", "coordinates": [ -12641908.127680582925677, 7551465.73191989492625 ] } }
+]
+}
diff --git a/tests/test_geosardine_interpolate.py b/tests/test_geosardine_interpolate.py
index eab3608..b2e134f 100644
--- a/tests/test_geosardine_interpolate.py
+++ b/tests/test_geosardine_interpolate.py
@@ -1,52 +1,52 @@
-import os
-
-import numpy as np
-import pytest
-from geosardine import interpolate
-from geosardine._utility import calc_extent
-
-
-def test_idw():
- xy = np.load("tests/idw/test_idw_xy.npy")
-
- values = np.load("tests/idw/test_idw_val.npy")
-
- # assert (
- # np.load("tests/idw/test_idw_array.npy")
- # == interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array
- # ).all()
-
- assert (
- interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array
- is not None
- )
-
- with pytest.warns(UserWarning):
- interp = interpolate.idw("tests/idw/test_idw_file.geojson", (0.01, 0.01))
- # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all()
- assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2
- assert interp.save("tes.tif") is None
- os.remove("tes.tif")
-
- with pytest.warns(UserWarning):
- interp = interpolate.idw("tests/idw/test_idw_file_8327.geojson", (10000, 10000))
- # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all()
- assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2
- assert interp.save("tes.tif") is None
- os.remove("tes.tif")
-
- assert interpolate.idw(1, np.array([0, 1]), (0.1, 0.1)) is None
- assert interpolate.idw_single([101, -7], xy, values) == 113.8992997794633
-
- assert (
- round(
- interpolate.idw_single(
- [860209.0, 9295740.0],
- np.array([[767984.0, 9261620.0], [838926.0, 9234594.0]]),
- np.array([[101.1, 102.2]]),
- epsg=32748,
- ),
- 8,
- )
- == round(101.86735169471324, 8)
- )
+import os
+
+import numpy as np
+import pytest
+from geosardine import interpolate
+from geosardine._utility import calc_extent
+
+
+def test_idw():
+ xy = np.load("tests/idw/test_idw_xy.npy")
+
+ values = np.load("tests/idw/test_idw_val.npy")
+
+ # assert (
+ # np.load("tests/idw/test_idw_array.npy")
+ # == interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array
+ # ).all()
+
+ assert (
+ interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array
+ is not None
+ )
+
+ with pytest.warns(UserWarning):
+ interp = interpolate.idw("tests/idw/test_idw_file.geojson", (0.01, 0.01))
+ # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all()
+ assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2
+ assert interp.save("tes.tif") is None
+ os.remove("tes.tif")
+
+ with pytest.warns(UserWarning):
+ interp = interpolate.idw("tests/idw/test_idw_file_8327.geojson", (10000, 10000))
+ # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all()
+ assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2
+ assert interp.save("tes.tif") is None
+ os.remove("tes.tif")
+
+ assert interpolate.idw(1, np.array([0, 1]), (0.1, 0.1)) is None
+ assert interpolate.idw_single([101, -7], xy, values) == 113.8992997794633
+
+ assert (
+ round(
+ interpolate.idw_single(
+ [860209.0, 9295740.0],
+ np.array([[767984.0, 9261620.0], [838926.0, 9234594.0]]),
+ np.array([[101.1, 102.2]]),
+ epsg=32748,
+ ),
+ 8,
+ )
+ == round(101.86735169471324, 8)
+ )
diff --git a/tests/test_geosardine_raster.py b/tests/test_geosardine_raster.py
index 0838b8b..634273e 100644
--- a/tests/test_geosardine_raster.py
+++ b/tests/test_geosardine_raster.py
@@ -1,45 +1,45 @@
-import numpy as np
-from geosardine import Raster
-
-
-def test_raster() -> None:
- raster = Raster(np.arange(32).reshape(4, 4, 2), 0.3, 120, 20)
-
- assert (raster.array == np.arange(32).reshape(4, 4, 2)).all()
- assert raster.resolution == (0.3, 0.3)
- assert raster.x_max == 120 + (0.3 * 4)
- assert raster.y_min == 20 - (0.3 * 4)
- assert isinstance(raster[1:3, 1:3], np.ndarray)
- assert raster[1:3, 1:3].shape == (2, 2, 2)
-
-
-def test_raster_operator() -> None:
- raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.3, 120, 0.7)
- arr = np.ones(32, dtype=np.float32).reshape(4, 4, 2)
- assert ((raster * 2).array == arr * 2).all()
- assert ((raster + 2).array == arr + 2).all()
- assert ((raster - 2).array == arr - 2).all()
- assert ((raster / 2).array == arr / 2).all()
- assert ((raster ** 2).array == arr ** 2).all()
-
-
-def test_raster_manipulation() -> None:
- raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.4, 120, 0.7)
- resized = raster.resize(16, 16)
- resampled = raster.resample((0.1, 0.1))
-
- assert (
- resized.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2)
- ).all()
- assert (round(resized.resolution[0], 2), round(resized.resolution[1], 2)) == (
- 0.1,
- 0.1,
- )
- assert (
- resampled.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2)
- ).all()
- assert resampled.rows == 16
- assert resampled.cols == 16
- assert resampled.layers == 2
- assert raster.transform[5] == resampled.transform[5]
- assert raster.transform[2] == resampled.transform[2]
+import numpy as np
+from geosardine import Raster
+
+
+def test_raster() -> None:
+ raster = Raster(np.arange(32).reshape(4, 4, 2), 0.3, 120, 20)
+
+ assert (raster.array == np.arange(32).reshape(4, 4, 2)).all()
+ assert raster.resolution == (0.3, -0.3)
+ assert raster.x_max == 120 + (0.3 * 4)
+ assert raster.y_min == 20 - (0.3 * 4)
+ assert isinstance(raster[1:3, 1:3], np.ndarray)
+ assert raster[1:3, 1:3].shape == (2, 2, 2)
+
+
+def test_raster_operator() -> None:
+ raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.3, 120, 0.7)
+ arr = np.ones(32, dtype=np.float32).reshape(4, 4, 2)
+ assert ((raster * 2).array == arr * 2).all()
+ assert ((raster + 2).array == arr + 2).all()
+ assert ((raster - 2).array == arr - 2).all()
+ assert ((raster / 2).array == arr / 2).all()
+ assert ((raster ** 2).array == arr ** 2).all()
+
+
+def test_raster_manipulation() -> None:
+ raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.4, 120, 0.7)
+ resized = raster.resize(16, 16)
+ resampled = raster.resample((0.1, 0.1))
+
+ assert (
+ resized.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2)
+ ).all()
+ assert (round(resized.resolution[0], 2), round(resized.resolution[1], 2)) == (
+ 0.1,
+ -0.1,
+ )
+ assert (
+ resampled.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2)
+ ).all()
+ assert resampled.rows == 16
+ assert resampled.cols == 16
+ assert resampled.layers == 2
+ assert raster.transform[5] == resampled.transform[5]
+ assert raster.transform[2] == resampled.transform[2]