dea-tools 0.4.5.dev7__tar.gz → 0.4.6.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/PKG-INFO +1 -1
  2. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/bandindices.py +60 -14
  3. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/.gitignore +0 -0
  4. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/LICENSE +0 -0
  5. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/README.md +0 -0
  6. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/__init__.py +0 -0
  7. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/__main__.py +0 -0
  8. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/__init__.py +0 -0
  9. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/animations.py +0 -0
  10. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/changefilmstrips.py +0 -0
  11. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/crophealth.py +0 -0
  12. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/deacoastlines.py +0 -0
  13. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/geomedian.py +0 -0
  14. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/imageexport.py +0 -0
  15. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/miningrehab.py +0 -0
  16. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/wetlandsinsighttool.py +0 -0
  17. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/app/widgetconstructors.py +0 -0
  18. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/bom.py +0 -0
  19. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/classification.py +0 -0
  20. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/coastal.py +0 -0
  21. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/dask.py +0 -0
  22. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/datahandling.py +0 -0
  23. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/landcover.py +0 -0
  24. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/maps.py +0 -0
  25. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/mosaics/README.md +0 -0
  26. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/mosaics/__init__.py +0 -0
  27. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/mosaics/cog.py +0 -0
  28. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/mosaics/styling.py +0 -0
  29. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/mosaics/utils.py +0 -0
  30. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/mosaics/vrt.py +0 -0
  31. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/plotting.py +0 -0
  32. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/spatial.py +0 -0
  33. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/temporal.py +0 -0
  34. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/validation.py +0 -0
  35. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/waterbodies.py +0 -0
  36. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/Tools/dea_tools/wetlands.py +0 -0
  37. {dea_tools-0.4.5.dev7 → dea_tools-0.4.6.dev1}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dea-tools
3
- Version: 0.4.5.dev7
3
+ Version: 0.4.6.dev1
4
4
  Summary: Open-source tools for geospatial analysis with Digital Earth Australia, Open Data Cube, and Xarray
5
5
  Project-URL: Homepage, https://knowledge.dea.ga.gov.au/notebooks/Tools/
6
6
  Project-URL: Repository, https://github.com/GeoscienceAustralia/dea-notebooks
@@ -25,7 +25,16 @@ import numpy as np
25
25
 
26
26
 
27
27
  # Define custom functions
28
- def calculate_indices(ds, index=None, collection=None, custom_varname=None, normalise=True, drop=False, inplace=False):
28
+ def calculate_indices(
29
+ ds,
30
+ index=None,
31
+ collection=None,
32
+ custom_varname=None,
33
+ normalise=True,
34
+ drop=False,
35
+ inplace=False,
36
+ verbose=True,
37
+ ):
29
38
  """
30
39
  Takes an xarray dataset containing spectral bands, calculates one of
31
40
  a set of remote sensing indices, and adds the resulting array as a
@@ -75,6 +84,8 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
75
84
  * ``'NDTI2'`` (Normalised Difference Turbidity Index, Lacaux et al., 2007)
76
85
  * ``'NDVI'`` (Normalised Difference Vegetation Index, Rouse 1973)
77
86
  * ``'NDWI'`` (Normalised Difference Water Index, McFeeters 1996)
87
+ * ``'NIRv'`` (Near-Infrared Reflectance of Vegetation, Badgley et al. 2017)
88
+ * ``'kNDVI'`` (Kernel Normalized Difference Vegetation Index, Camps-Valls et al. 2021)
78
89
  * ``'SAVI'`` (Soil Adjusted Vegetation Index, Huete 1988)
79
90
  * ``'TCB'`` (Tasseled Cap Brightness, Crist 1985)
80
91
  * ``'TCG'`` (Tasseled Cap Greeness, Crist 1985)
@@ -121,6 +132,8 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
121
132
  array in-place, adding bands to the input dataset. The default
122
133
  is `inplace=False`, which will instead make a new copy of the
123
134
  original data (and use twice the memory).
135
+ verbose : bool, optional
136
+ If True, print statements will be returned
124
137
 
125
138
  Returns
126
139
  -------
@@ -140,23 +153,33 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
140
153
  # Capture input band names in order to drop these if drop=True
141
154
  if drop:
142
155
  bands_to_drop = list(ds.data_vars)
143
- print(f"Dropping bands {bands_to_drop}")
156
+ if verbose:
157
+ print(f"Dropping bands {bands_to_drop}")
144
158
 
145
159
  # Dictionary containing remote sensing index band recipes
146
160
  index_dict = {
147
161
  # Normalised Difference Vegation Index, Rouse 1973
148
162
  "NDVI": lambda ds: (ds.nir - ds.red) / (ds.nir + ds.red),
149
- # Non-linear Normalised Difference Vegation Index,
163
+ # Kernel Normalised Difference Vegation Index,
150
164
  # Camps-Valls et al. 2021
151
165
  "kNDVI": lambda ds: np.tanh(((ds.nir - ds.red) / (ds.nir + ds.red)) ** 2),
152
166
  # Enhanced Vegetation Index, Huete 2002
153
- "EVI": lambda ds: ((2.5 * (ds.nir - ds.red)) / (ds.nir + 6 * ds.red - 7.5 * ds.blue + 1)),
167
+ "EVI": lambda ds: (
168
+ (2.5 * (ds.nir - ds.red)) / (ds.nir + 6 * ds.red - 7.5 * ds.blue + 1)
169
+ ),
154
170
  # Leaf Area Index, Boegh 2002
155
- "LAI": lambda ds: (3.618 * ((2.5 * (ds.nir - ds.red)) / (ds.nir + 6 * ds.red - 7.5 * ds.blue + 1)) - 0.118),
171
+ "LAI": lambda ds: (
172
+ 3.618
173
+ * ((2.5 * (ds.nir - ds.red)) / (ds.nir + 6 * ds.red - 7.5 * ds.blue + 1))
174
+ - 0.118
175
+ ),
156
176
  # Soil Adjusted Vegetation Index, Huete 1988
157
177
  "SAVI": lambda ds: ((1.5 * (ds.nir - ds.red)) / (ds.nir + ds.red + 0.5)),
158
178
  # Mod. Soil Adjusted Vegetation Index, Qi et al. 1994
159
- "MSAVI": lambda ds: ((2 * ds.nir + 1 - ((2 * ds.nir + 1) ** 2 - 8 * (ds.nir - ds.red)) ** 0.5) / 2),
179
+ "MSAVI": lambda ds: (
180
+ (2 * ds.nir + 1 - ((2 * ds.nir + 1) ** 2 - 8 * (ds.nir - ds.red)) ** 0.5)
181
+ / 2
182
+ ),
160
183
  # Normalised Difference Moisture Index, Gao 1996
161
184
  "NDMI": lambda ds: (ds.nir - ds.swir1) / (ds.nir + ds.swir1),
162
185
  # Normalised Burn Ratio, Lopez Garcia 1991
@@ -171,6 +194,9 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
171
194
  # Normalised Difference Tillage Index,
172
195
  # Van Deventer et al. 1997
173
196
  "NDTI": lambda ds: (ds.swir1 - ds.swir2) / (ds.swir1 + ds.swir2),
197
+ # Near-Infrared Reflectance of Vegetation,
198
+ # Badgley et al. 2017
199
+ "NIRv": lambda ds: ((ds.nir - ds.red) / (ds.nir + ds.red)) * ds.nir,
174
200
  # Normalised Difference Turbidity Index,
175
201
  # Lacaux et al., 2007
176
202
  "NDTI2": lambda ds: (ds.red - ds.green) / (ds.red + ds.green),
@@ -181,19 +207,32 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
181
207
  # Normalised Difference Built-Up Index, Zha 2003
182
208
  "NDBI": lambda ds: (ds.swir1 - ds.nir) / (ds.swir1 + ds.nir),
183
209
  # Built-Up Index, He et al. 2010
184
- "BUI": lambda ds: ((ds.swir1 - ds.nir) / (ds.swir1 + ds.nir)) - ((ds.nir - ds.red) / (ds.nir + ds.red)),
210
+ "BUI": lambda ds: ((ds.swir1 - ds.nir) / (ds.swir1 + ds.nir))
211
+ - ((ds.nir - ds.red) / (ds.nir + ds.red)),
185
212
  # Built-up Area Extraction Index, Bouzekri et al. 2015
186
213
  "BAEI": lambda ds: (ds.red + 0.3) / (ds.green + ds.swir1),
187
214
  # New Built-up Index, Jieli et al. 2010
188
215
  "NBI": lambda ds: (ds.swir1 + ds.red) / ds.nir,
189
216
  # Bare Soil Index, Rikimaru et al. 2002
190
- "BSI": lambda ds: ((ds.swir1 + ds.red) - (ds.nir + ds.blue)) / ((ds.swir1 + ds.red) + (ds.nir + ds.blue)),
217
+ "BSI": lambda ds: ((ds.swir1 + ds.red) - (ds.nir + ds.blue))
218
+ / ((ds.swir1 + ds.red) + (ds.nir + ds.blue)),
191
219
  # Automated Water Extraction Index (no shadows), Feyisa 2014
192
- "AWEI_ns": lambda ds: (4 * (ds.green - ds.swir1) - (0.25 * ds.nir * +2.75 * ds.swir2)),
220
+ "AWEI_ns": lambda ds: (
221
+ 4 * (ds.green - ds.swir1) - (0.25 * ds.nir * +2.75 * ds.swir2)
222
+ ),
193
223
  # Automated Water Extraction Index (shadows), Feyisa 2014
194
- "AWEI_sh": lambda ds: (ds.blue + 2.5 * ds.green - 1.5 * (ds.nir + ds.swir1) - 0.25 * ds.swir2),
224
+ "AWEI_sh": lambda ds: (
225
+ ds.blue + 2.5 * ds.green - 1.5 * (ds.nir + ds.swir1) - 0.25 * ds.swir2
226
+ ),
195
227
  # Water Index, Fisher 2016
196
- "WI": lambda ds: (1.7204 + 171 * ds.green + 3 * ds.red - 70 * ds.nir - 45 * ds.swir1 - 71 * ds.swir2),
228
+ "WI": lambda ds: (
229
+ 1.7204
230
+ + 171 * ds.green
231
+ + 3 * ds.red
232
+ - 70 * ds.nir
233
+ - 45 * ds.swir1
234
+ - 71 * ds.swir2
235
+ ),
197
236
  # Tasseled Cap Wetness, Crist 1985
198
237
  "TCW": lambda ds: (
199
238
  0.0315 * ds.blue
@@ -277,7 +316,10 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
277
316
  "list of valid options for `index` (e.g. 'NDVI')"
278
317
  )
279
318
 
280
- if index in ["WI", "BAEI", "AWEI_ns", "AWEI_sh", "EVI", "LAI", "SAVI", "MSAVI"] and not normalise:
319
+ if (
320
+ index in ["WI", "BAEI", "AWEI_ns", "AWEI_sh", "EVI", "LAI", "SAVI", "MSAVI"]
321
+ and not normalise
322
+ ):
281
323
  warnings.warn(
282
324
  f"\nA coefficient-based index ('{index}') normally "
283
325
  "applied to surface reflectance values in the \n"
@@ -324,7 +366,9 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
324
366
  }
325
367
 
326
368
  # Rename bands in dataset to use simple names (e.g. 'red')
327
- bands_to_rename = {a: b for a, b in bandnames_dict.items() if a in ds.variables}
369
+ bands_to_rename = {
370
+ a: b for a, b in bandnames_dict.items() if a in ds.variables
371
+ }
328
372
 
329
373
  elif collection == "ga_s2_3":
330
374
  # Dictionary mapping full data names to simpler 'red' alias names
@@ -348,7 +392,9 @@ def calculate_indices(ds, index=None, collection=None, custom_varname=None, norm
348
392
  }
349
393
 
350
394
  # Rename bands in dataset to use simple names (e.g. 'red')
351
- bands_to_rename = {a: b for a, b in bandnames_dict.items() if a in ds.variables}
395
+ bands_to_rename = {
396
+ a: b for a, b in bandnames_dict.items() if a in ds.variables
397
+ }
352
398
 
353
399
  elif collection == "ga_gm_3":
354
400
  # Pass an empty dict as no bands need renaming
File without changes