Skip to content

Commit 4ed7f6b

Browse files
authored
refactor: use global fixtures (#161)
2 parents c71b1c7 + c354fc5 commit 4ed7f6b

File tree

113 files changed

+1916
-1258
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+1916
-1258
lines changed

geetools/DateRange/__init__.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ def split(self, interval: ee_int, unit: str = "day") -> ee.List:
4848
indexList = ee.List.sequence(0, timestampList.size().subtract(2))
4949

5050
return indexList.map(
51-
lambda i: ee.DateRange(
52-
timestampList.get(i), timestampList.get(ee.Number(i).add(1))
53-
)
51+
lambda i: ee.DateRange(timestampList.get(i), timestampList.get(ee.Number(i).add(1)))
5452
)
5553

5654
# -- utils -----------------------------------------------------------------

geetools/FeatureCollection/__init__.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ def addId(self, name: ee_str = "id", start: ee_int = 1) -> ee.FeatureCollection:
5757
indexes = ee.List(self._obj.aggregate_array("system:index"))
5858
ids = ee.List.sequence(start, start.add(self._obj.size()).subtract(1))
5959
idByIndex = ee.Dictionary.fromLists(indexes, ids)
60-
return self._obj.map(
61-
lambda f: f.set(name, idByIndex.get(f.get("system:index")))
62-
)
60+
return self._obj.map(lambda f: f.set(name, idByIndex.get(f.get("system:index"))))
6361

6462
def mergeGeometries(self) -> ee.Geometry:
6563
"""Merge the geometries the included features.

geetools/Float/__init__.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ class Float:
1212

1313
def __init__(self):
1414
"""Avoid initializing the class."""
15-
raise NotImplementedError(
16-
"This class is a placeholder, it should not be initialized"
17-
)
15+
raise NotImplementedError("This class is a placeholder, it should not be initialized")
1816

1917
def __name__(self):
2018
"""Return the class name."""

geetools/Image/__init__.py

+3-13
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,7 @@ def getValues(self, point: ee.Geometry.Point, scale: ee_int = 0) -> ee.Dictionar
237237
value = image.geetools.getValues(point, 10)
238238
print(value.getInfo())
239239
"""
240-
scale = (
241-
self._obj.select(0).projection().nominalScale()
242-
if scale == 0
243-
else ee.Number(scale)
244-
)
240+
scale = self._obj.select(0).projection().nominalScale() if scale == 0 else ee.Number(scale)
245241
return self._obj.reduceRegion(ee.Reducer.mean(), point, scale)
246242

247243
def minScale(self) -> ee.Number:
@@ -263,9 +259,7 @@ def minScale(self) -> ee.Number:
263259
image.geetools.minScale().getInfo()
264260
"""
265261
bandNames = self._obj.bandNames()
266-
scales = bandNames.map(
267-
lambda b: self._obj.select(ee.String(b)).projection().nominalScale()
268-
)
262+
scales = bandNames.map(lambda b: self._obj.select(ee.String(b)).projection().nominalScale())
269263
return ee.Number(scales.sort().get(0))
270264

271265
def merge(self, images: ee_list) -> ee.Image:
@@ -782,11 +776,7 @@ def isletMask(self, offset: ee_number) -> ee.Image:
782776
pixelsLimit = offset.multiply(2).sqrt().divide(scale).max(ee.Number(2)).toInt()
783777
area = ee.Image.pixelArea().rename("area")
784778
isletArea = (
785-
self._obj.select(0)
786-
.mask()
787-
.toInt()
788-
.connectedPixelCount(pixelsLimit)
789-
.multiply(area)
779+
self._obj.select(0).mask().toInt().connectedPixelCount(pixelsLimit).multiply(area)
790780
)
791781
return isletArea.lt(offset).rename("mask").selfMask()
792782

geetools/ImageCollection/__init__.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,7 @@ def getCitation(self) -> str:
319319
"""
320320
return ee_extra.STAC.core.getCitation(self._obj)
321321

322-
def panSharpen(
323-
self, method: str = "SFIM", qa: str = "", **kwargs
324-
) -> ee.ImageCollection:
322+
def panSharpen(self, method: str = "SFIM", qa: str = "", **kwargs) -> ee.ImageCollection:
325323
"""Apply panchromatic sharpening to the ImageCollection images.
326324
327325
Optionally, run quality assessments between the original and sharpened Image to

geetools/Integer/__init__.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ class Integer:
1212

1313
def __init__(self):
1414
"""Avoid initializing the class."""
15-
raise NotImplementedError(
16-
"This class is a placeholder, it should not be initialized"
17-
)
15+
raise NotImplementedError("This class is a placeholder, it should not be initialized")
1816

1917
def __name__(self):
2018
"""Return the class name."""

geetools/Join/__init__.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ def byProperty(
5454
5555
"""
5656
field = ee.String(field)
57-
primary, secondary = ee.FeatureCollection(primary), ee.FeatureCollection(
58-
secondary
59-
)
57+
primary, secondary = ee.FeatureCollection(primary), ee.FeatureCollection(secondary)
6058
Filter = ee.Filter.equals(leftField=field, rightField=field)
6159
join = ee.Join.saveFirst(matchKey="match", outer=outer)
6260
joined = join.apply(primary, secondary, Filter)

geetools/List/__init__.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,7 @@ def product(self, other: ee_list) -> ee.List:
4141
l1 = ee.List(self._obj).map(lambda e: ee.String(e))
4242
l2 = ee.List(other).map(lambda e: ee.String(e))
4343
product = l1.map(
44-
lambda e: l2.map(
45-
lambda f: ee.Algorithms.String(e).cat(ee.Algorithms.String(f))
46-
)
44+
lambda e: l2.map(lambda f: ee.Algorithms.String(e).cat(ee.Algorithms.String(f)))
4745
)
4846
return product.flatten()
4947

@@ -204,9 +202,7 @@ def replaceMany(self, replace: ee_dict) -> ee.List:
204202
"""
205203
replace = ee.Dictionary(replace)
206204
keys = replace.keys()
207-
list = keys.iterate(
208-
lambda k, p: ee.List(p).replace(k, replace.get(k)), self._obj
209-
)
205+
list = keys.iterate(lambda k, p: ee.List(p).replace(k, replace.get(k)), self._obj)
210206
return ee.List(list) # to avoid returning a COmputedObject
211207

212208
def join(self, separator: ee_str = ", ") -> ee.string:

geetools/_deprecated_utils.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ def getReducerName(reducer):
1414

1515

1616
@deprecated(version="1.0.0", reason="Use geopandas instead")
17-
def reduceRegionsPandas(
18-
data, index="system:index", add_coordinates=False, duplicate_index=False
19-
):
17+
def reduceRegionsPandas(data, index="system:index", add_coordinates=False, duplicate_index=False):
2018
"""Transform data coming from Image.reduceRegions to a pandas dataframe."""
2119
raise NotImplementedError("Use geopandas.GeoDataFrame(data.getInfo()) instead")
2220

geetools/_deprecated_visualization.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,15 @@
33
from deprecated.sphinx import deprecated
44

55

6-
@deprecated(
7-
version="1.0.0", reason="Removed as this lib does not deal with map anymore"
8-
)
6+
@deprecated(version="1.0.0", reason="Removed as this lib does not deal with map anymore")
97
def stretch_std(image, region, bands=None, std=1, scale=None):
108
"""Get mins and maxs values for stretching a visualization using standard deviation."""
119
raise NotImplementedError(
1210
"Interactive methods have been moved to ipygee. For non-interactive, rely on your visualization library like rasterio, matplotlib, etc."
1311
)
1412

1513

16-
@deprecated(
17-
version="1.0.0", reason="Removed as this lib does not deal with map anymore"
18-
)
14+
@deprecated(version="1.0.0", reason="Removed as this lib does not deal with map anymore")
1915
def stretch_percentile(image, region, bands=None, percentile=90, scale=None):
2016
"""Get mins and maxs values for stretching a visualization using percentiles."""
2117
raise NotImplementedError(

geetools/algorithms.py

+17-53
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,9 @@ def pansharpenKernel(image, pan, rgb=None, kernel=None):
272272
bgr_mean = bgr.reduce("mean").rename("mean")
273273
# Compute the aggregate mean of the unsharpened bands and the pan band
274274
mean_values = pani.addBands(bgr_mean).reduceNeighborhood(ee.Reducer.mean(), kernel)
275-
gain = mean_values.select("mean_mean").divide(
276-
mean_values.select("{}_mean".format(pan))
277-
)
275+
gain = mean_values.select("mean_mean").divide(mean_values.select("{}_mean".format(pan)))
278276
sharpen = bgr.divide(bgr_mean).multiply(pani).multiply(gain)
279-
return ee.Image(
280-
sharpen.copyProperties(source=image, properties=image.propertyNames())
281-
)
277+
return ee.Image(sharpen.copyProperties(source=image, properties=image.propertyNames()))
282278

283279

284280
def pansharpenIhsFusion(image, pan=None, rgb=None):
@@ -338,9 +334,7 @@ def compute(i):
338334
return ee.Image(ee.Algorithms.If(condition, compute(image), image))
339335

340336
@staticmethod
341-
def _rescale(
342-
image, bands=None, thermal_bands=None, original="TOA", to="SR", number="all"
343-
):
337+
def _rescale(image, bands=None, thermal_bands=None, original="TOA", to="SR", number="all"):
344338
"""Rescaling logic."""
345339
if not bands:
346340
bands = ["B1", "B2", "B3", "B4", "B5", "B6", "B7"]
@@ -514,11 +508,7 @@ def toImage(img, band, args=None):
514508
"""
515509
if isinstance(band, str):
516510
# print('band:', band)
517-
if (
518-
(band.find(".") > -1)
519-
or (band.find(" ") > -1)
520-
or (band.find("{") > -1)
521-
):
511+
if (band.find(".") > -1) or (band.find(" ") > -1) or (band.find("{") > -1):
522512
# print('formatted:', format_str(band, args), '\n')
523513
band = img.expression(format_str(band, args), {"i": img})
524514
else:
@@ -558,9 +548,7 @@ def pointBetween(pointA, pointB):
558548
return ee.Geometry.LineString([pointA, pointB]).centroid().coordinates()
559549

560550
def slopeBetween(pointA, pointB):
561-
return ((y(pointA)).subtract(y(pointB))).divide(
562-
(x(pointA)).subtract(x(pointB))
563-
)
551+
return ((y(pointA)).subtract(y(pointB))).divide((x(pointA)).subtract(x(pointB)))
564552

565553
def toLine(pointA, pointB):
566554
return ee.Geometry.LineString([pointA, pointB])
@@ -633,12 +621,8 @@ def viewAngles(img):
633621

634622
leftLine = toLine(corners["upperLeft"], corners["lowerLeft"])
635623
rightLine = toLine(corners["upperRight"], corners["lowerRight"])
636-
leftDistance = ee.FeatureCollection(leftLine).distance(
637-
maxDistanceToSceneEdge
638-
)
639-
rightDistance = ee.FeatureCollection(rightLine).distance(
640-
maxDistanceToSceneEdge
641-
)
624+
leftDistance = ee.FeatureCollection(leftLine).distance(maxDistanceToSceneEdge)
625+
rightDistance = ee.FeatureCollection(rightLine).distance(maxDistanceToSceneEdge)
642626
viewZenith = (
643627
rightDistance.multiply(maxSatelliteZenith * 2)
644628
.divide(rightDistance.add(leftDistance))
@@ -668,13 +652,9 @@ def solarPosition(img):
668652
ee.Number(date.getRelative("second", "day")).divide(secondsInHour),
669653
)
670654

671-
img = set_name(
672-
img, "jdp", date.getFraction("year") # Julian Date Proportion
673-
)
655+
img = set_name(img, "jdp", date.getFraction("year")) # Julian Date Proportion
674656

675-
img = set_name(
676-
img, "jdpr", "i.jdp * 2 * {pi}" # Julian Date Proportion in Radians
677-
)
657+
img = set_name(img, "jdpr", "i.jdp * 2 * {pi}") # Julian Date Proportion in Radians
678658

679659
img = set_name(img, "meanSolarTime", "i.hourGMT + i.longDeg / 15")
680660

@@ -686,9 +666,7 @@ def solarPosition(img):
686666
+ "* 12 * 60 / {pi}",
687667
)
688668

689-
img = set_name(
690-
img, "trueSolarTime", "i.meanSolarTime + i.localSolarDiff / 60 - 12"
691-
)
669+
img = set_name(img, "trueSolarTime", "i.meanSolarTime + i.localSolarDiff / 60 - 12")
692670

693671
img = set_name(img, "angleHour", "i.trueSolarTime * 15 * {pi} / 180")
694672

@@ -713,9 +691,7 @@ def solarPosition(img):
713691
img = set_name(
714692
img,
715693
"sinSunAzSW",
716-
toImage(img, "cos(i.delta) * sin(i.angleHour) / sin(i.sunZen)").clamp(
717-
-1, 1
718-
),
694+
toImage(img, "cos(i.delta) * sin(i.angleHour) / sin(i.sunZen)").clamp(-1, 1),
719695
)
720696

721697
img = set_name(
@@ -727,9 +703,7 @@ def solarPosition(img):
727703

728704
img = set_name(img, "sunAzSW", "asin(i.sinSunAzSW)")
729705

730-
img = setIf(
731-
img, "sunAzSW", "i.cosSunAzSW <= 0", "{pi} - i.sunAzSW", "i.sunAzSW"
732-
)
706+
img = setIf(img, "sunAzSW", "i.cosSunAzSW <= 0", "{pi} - i.sunAzSW", "i.sunAzSW")
733707

734708
img = setIf(
735709
img,
@@ -741,9 +715,7 @@ def solarPosition(img):
741715

742716
img = set_name(img, "sunAz", "i.sunAzSW + {pi}")
743717

744-
img = setIf(
745-
img, "sunAz", "i.sunAz > 2 * {pi}", "i.sunAz - 2 * {pi}", "i.sunAz"
746-
)
718+
img = setIf(img, "sunAz", "i.sunAz > 2 * {pi}", "i.sunAz - 2 * {pi}", "i.sunAz")
747719

748720
return img
749721

@@ -807,9 +779,7 @@ def rossThick(img, bandName, sunZen, viewZen, relativeSunViewAz):
807779
"relativeSunViewAz": relativeSunViewAz,
808780
}
809781

810-
img = cosPhaseAngle(
811-
img, "cosPhaseAngle", sunZen, viewZen, relativeSunViewAz
812-
)
782+
img = cosPhaseAngle(img, "cosPhaseAngle", sunZen, viewZen, relativeSunViewAz)
813783
img = set_name(img, "phaseAngle", "acos(i.cosPhaseAngle)")
814784

815785
img = set_name(
@@ -871,9 +841,7 @@ def liThin(img, bandName, sunZen, viewZen, relativeSunViewAz):
871841
).clamp(-1, 1),
872842
)
873843
img = set_name(img, "t", "acos(i.cosT)")
874-
img = set_name(
875-
img, "overlap", "(1/{pi}) * (i.t - sin(i.t) * i.cosT) * (i.temp)"
876-
)
844+
img = set_name(img, "overlap", "(1/{pi}) * (i.t - sin(i.t) * i.cosT) * (i.temp)")
877845
img = setIf(img, "overlap", "i.overlap > 0", 0)
878846
img = set_name(
879847
img,
@@ -898,18 +866,14 @@ def brdf(img, bandName, kvolBand, kgeoBand, coefficients):
898866
},
899867
)
900868

901-
img = set_name(
902-
img, bandName, "{fiso} + {fvol} * {kvol} + {fgeo} * {kvol}", args
903-
)
869+
img = set_name(img, bandName, "{fiso} + {fvol} * {kvol} + {fgeo} * {kvol}", args)
904870
return img
905871

906872
def applyCFactor(img, bandName, coefficients):
907873
img = brdf(img, "brdf", "kvol", "kgeo", coefficients)
908874
img = brdf(img, "brdf0", "kvol0", "kgeo0", coefficients)
909875
img = set_name(img, "cFactor", "i.brdf0 / i.brdf", coefficients)
910-
img = set_name(
911-
img, bandName, "{bandName} * i.cFactor", {"bandName": "i." + bandName}
912-
)
876+
img = set_name(img, bandName, "{bandName} * i.cFactor", {"bandName": "i." + bandName})
913877
return img
914878

915879
def adjustBands(img):

geetools/batch/featurecollection.py

+7-31
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,7 @@ def toAsset(table, assetPath, name=None, create=True, verbose=False, **kwargs):
334334
# Description
335335
description = utils.matchDescription(name)
336336
# Init task
337-
task = ee.batch.Export.table.toAsset(
338-
table, assetId=assetId, description=description, **kwargs
339-
)
337+
task = ee.batch.Export.table.toAsset(table, assetId=assetId, description=description, **kwargs)
340338
task.start()
341339
if verbose:
342340
print("Exporting {} to {}".format(name, assetPath))
@@ -366,9 +364,7 @@ def _toDriveShapefile(
366364
for gtype, _ in gtypes.items():
367365
if gtype not in types or gtype == "GeometryCollection":
368366
continue
369-
collection = collection.map(
370-
lambda feat: feat.set("GTYPE", feat.geometry().type())
371-
)
367+
collection = collection.map(lambda feat: feat.set("GTYPE", feat.geometry().type()))
372368
onlytype = collection.filter(ee.Filter.eq("GTYPE", gtype))
373369
size = onlytype.size().getInfo()
374370
if size == 0:
@@ -413,15 +409,9 @@ def _toDriveShapefileGeomCol(
413409
multip = multip.merge(fc.filter(ee.Filter.eq("GTYPE", "MultiPoint")))
414410

415411
name = "{}_GC".format(fileNamePrefix)
416-
_toDriveShapefile(
417-
multipol, description, folder, name, selectors, types, verbose, **kwargs
418-
)
419-
_toDriveShapefile(
420-
multils, description, folder, name, selectors, types, verbose, **kwargs
421-
)
422-
_toDriveShapefile(
423-
multip, description, folder, name, selectors, types, verbose, **kwargs
424-
)
412+
_toDriveShapefile(multipol, description, folder, name, selectors, types, verbose, **kwargs)
413+
_toDriveShapefile(multils, description, folder, name, selectors, types, verbose, **kwargs)
414+
_toDriveShapefile(multip, description, folder, name, selectors, types, verbose, **kwargs)
425415

426416

427417
def toDriveShapefile(
@@ -445,22 +435,8 @@ def toDriveShapefile(
445435
notGeomCol = collection.filter(ee.Filter.neq("GTYPE", "GeometryCollection"))
446436
GeomCol = collection.filter(ee.Filter.eq("GTYPE", "GeometryCollection"))
447437
_toDriveShapefile(
448-
notGeomCol,
449-
description,
450-
folder,
451-
fileNamePrefix,
452-
selectors,
453-
types,
454-
verbose,
455-
**kwargs
438+
notGeomCol, description, folder, fileNamePrefix, selectors, types, verbose, **kwargs
456439
)
457440
_toDriveShapefileGeomCol(
458-
GeomCol,
459-
description,
460-
folder,
461-
fileNamePrefix,
462-
selectors,
463-
types,
464-
verbose,
465-
**kwargs
441+
GeomCol, description, folder, fileNamePrefix, selectors, types, verbose, **kwargs
466442
)

0 commit comments

Comments
 (0)