openforis-whisp 2.0.0b2__py3-none-any.whl → 2.0.0b3__py3-none-any.whl
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.
- openforis_whisp/datasets.py +201 -216
- openforis_whisp/stats.py +211 -53
- {openforis_whisp-2.0.0b2.dist-info → openforis_whisp-2.0.0b3.dist-info}/METADATA +1 -1
- {openforis_whisp-2.0.0b2.dist-info → openforis_whisp-2.0.0b3.dist-info}/RECORD +6 -6
- {openforis_whisp-2.0.0b2.dist-info → openforis_whisp-2.0.0b3.dist-info}/LICENSE +0 -0
- {openforis_whisp-2.0.0b2.dist-info → openforis_whisp-2.0.0b3.dist-info}/WHEEL +0 -0
openforis_whisp/stats.py
CHANGED
|
@@ -34,6 +34,53 @@ from .reformat import (
|
|
|
34
34
|
|
|
35
35
|
# NB functions that included "formatted" in the name apply a schema for validation and reformatting of the output dataframe. The schema is created from lookup tables.
|
|
36
36
|
|
|
37
|
+
# ============================================================================
|
|
38
|
+
# PERFORMANCE OPTIMIZATION: Cache expensive Earth Engine datasets
|
|
39
|
+
# ============================================================================
|
|
40
|
+
# These images/collections are loaded once and reused across all features
|
|
41
|
+
# to avoid repeated expensive operations. This saves 7-15 seconds per analysis.
|
|
42
|
+
|
|
43
|
+
_WATER_FLAG_IMAGE = None
|
|
44
|
+
_GEOBOUNDARIES_FC = None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_water_flag_image():
|
|
48
|
+
"""
|
|
49
|
+
Get cached water flag image.
|
|
50
|
+
|
|
51
|
+
OPTIMIZATION: Water flag image is created once and reused for all features.
|
|
52
|
+
This avoids recreating ocean/water datasets for every feature (previously
|
|
53
|
+
called in get_type_and_location for each feature).
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
ee.Image
|
|
58
|
+
Cached water flag image
|
|
59
|
+
"""
|
|
60
|
+
global _WATER_FLAG_IMAGE
|
|
61
|
+
if _WATER_FLAG_IMAGE is None:
|
|
62
|
+
_WATER_FLAG_IMAGE = water_flag_all_prep()
|
|
63
|
+
return _WATER_FLAG_IMAGE
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def get_geoboundaries_fc():
|
|
67
|
+
"""
|
|
68
|
+
Get cached geoboundaries feature collection.
|
|
69
|
+
|
|
70
|
+
OPTIMIZATION: Geoboundaries collection is loaded once and reused for all features.
|
|
71
|
+
This avoids loading the large FeatureCollection for every feature (previously
|
|
72
|
+
called in get_geoboundaries_info for each feature).
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
ee.FeatureCollection
|
|
77
|
+
Cached geoboundaries feature collection
|
|
78
|
+
"""
|
|
79
|
+
global _GEOBOUNDARIES_FC
|
|
80
|
+
if _GEOBOUNDARIES_FC is None:
|
|
81
|
+
_GEOBOUNDARIES_FC = ee.FeatureCollection("WM/geoLab/geoBoundaries/600/ADM1")
|
|
82
|
+
return _GEOBOUNDARIES_FC
|
|
83
|
+
|
|
37
84
|
|
|
38
85
|
def whisp_formatted_stats_geojson_to_df(
|
|
39
86
|
input_geojson_filepath: Path | str,
|
|
@@ -425,7 +472,9 @@ def whisp_stats_ee_to_ee(
|
|
|
425
472
|
national_codes=None,
|
|
426
473
|
unit_type="ha",
|
|
427
474
|
keep_properties=None,
|
|
428
|
-
whisp_image=None,
|
|
475
|
+
whisp_image=None,
|
|
476
|
+
validate_external_id=True,
|
|
477
|
+
validate_bands=False, # New parameter
|
|
429
478
|
):
|
|
430
479
|
"""
|
|
431
480
|
Process a feature collection to get statistics for each feature.
|
|
@@ -442,19 +491,25 @@ def whisp_stats_ee_to_ee(
|
|
|
442
491
|
whisp_image (ee.Image, optional): Pre-combined multiband Earth Engine Image containing
|
|
443
492
|
all Whisp datasets. If provided, this image will be used instead of combining
|
|
444
493
|
datasets based on national_codes.
|
|
494
|
+
validate_external_id (bool, optional): If True, validates that external_id_column exists
|
|
495
|
+
in all features (default: True). Set to False to skip validation and save 2-4 seconds.
|
|
496
|
+
Only disable if you're confident the column exists in all features.
|
|
445
497
|
|
|
446
498
|
Returns:
|
|
447
499
|
ee.FeatureCollection: The output feature collection with statistics.
|
|
448
500
|
"""
|
|
449
501
|
if external_id_column is not None:
|
|
450
502
|
try:
|
|
451
|
-
#
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
503
|
+
# OPTIMIZATION: Make validation optional to save 2-4 seconds
|
|
504
|
+
# Validation includes multiple .getInfo() calls which are slow
|
|
505
|
+
if validate_external_id:
|
|
506
|
+
# Validate that the external_id_column exists in all features
|
|
507
|
+
validation_result = validate_external_id_column(
|
|
508
|
+
feature_collection, external_id_column
|
|
509
|
+
)
|
|
455
510
|
|
|
456
|
-
|
|
457
|
-
|
|
511
|
+
if not validation_result["is_valid"]:
|
|
512
|
+
raise ValueError(validation_result["error_message"])
|
|
458
513
|
|
|
459
514
|
# First handle property selection, but preserve the external_id_column
|
|
460
515
|
if keep_properties is not None:
|
|
@@ -506,19 +561,27 @@ def whisp_stats_ee_to_ee(
|
|
|
506
561
|
national_codes=national_codes,
|
|
507
562
|
unit_type=unit_type,
|
|
508
563
|
whisp_image=whisp_image, # Pass through
|
|
564
|
+
validate_bands=validate_bands,
|
|
509
565
|
)
|
|
510
566
|
|
|
511
567
|
return add_id_to_feature_collection(dataset=fc, id_name=plot_id_column)
|
|
512
568
|
|
|
513
569
|
|
|
514
570
|
def _keep_fc_properties(feature_collection, keep_properties):
|
|
571
|
+
"""
|
|
572
|
+
Filter feature collection properties based on keep_properties parameter.
|
|
573
|
+
|
|
574
|
+
OPTIMIZATION: When keep_properties is True, we no longer call .getInfo()
|
|
575
|
+
to get property names. Instead, we simply return the collection as-is,
|
|
576
|
+
since True means "keep all properties". This saves 1-2 seconds.
|
|
577
|
+
"""
|
|
515
578
|
# If keep_properties is specified, select only those properties
|
|
516
579
|
if keep_properties is None:
|
|
517
580
|
feature_collection = feature_collection.select([])
|
|
518
581
|
elif keep_properties == True:
|
|
519
|
-
# If keep_properties is true,
|
|
520
|
-
|
|
521
|
-
|
|
582
|
+
# If keep_properties is true, keep all properties
|
|
583
|
+
# No need to call .select() or .getInfo() - just return as-is
|
|
584
|
+
pass
|
|
522
585
|
elif isinstance(keep_properties, list):
|
|
523
586
|
feature_collection = feature_collection.select(keep_properties)
|
|
524
587
|
else:
|
|
@@ -534,7 +597,8 @@ def whisp_stats_ee_to_df(
|
|
|
534
597
|
remove_geom=False,
|
|
535
598
|
national_codes=None,
|
|
536
599
|
unit_type="ha",
|
|
537
|
-
whisp_image=None,
|
|
600
|
+
whisp_image=None,
|
|
601
|
+
validate_bands=False, # New parameter
|
|
538
602
|
) -> pd.DataFrame:
|
|
539
603
|
"""
|
|
540
604
|
Convert a Google Earth Engine FeatureCollection to a pandas DataFrame and convert ISO3 to ISO2 country codes.
|
|
@@ -561,27 +625,52 @@ def whisp_stats_ee_to_df(
|
|
|
561
625
|
"""
|
|
562
626
|
# First, do the whisp processing to get the EE feature collection with stats
|
|
563
627
|
try:
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
628
|
+
try:
|
|
629
|
+
stats_feature_collection = whisp_stats_ee_to_ee(
|
|
630
|
+
feature_collection,
|
|
631
|
+
external_id_column,
|
|
632
|
+
national_codes=national_codes,
|
|
633
|
+
unit_type=unit_type,
|
|
634
|
+
whisp_image=whisp_image, # Pass through
|
|
635
|
+
validate_bands=False, # try withoutb validation first
|
|
636
|
+
)
|
|
637
|
+
except Exception as e:
|
|
638
|
+
print(f"An error occurred during Whisp stats processing: {e}")
|
|
639
|
+
raise e
|
|
574
640
|
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
641
|
+
# Then, convert the EE feature collection to DataFrame
|
|
642
|
+
try:
|
|
643
|
+
df_stats = convert_ee_to_df(
|
|
644
|
+
ee_object=stats_feature_collection,
|
|
645
|
+
remove_geom=remove_geom,
|
|
646
|
+
)
|
|
647
|
+
except Exception as e:
|
|
648
|
+
print(f"An error occurred during the conversion from EE to DataFrame: {e}")
|
|
649
|
+
raise e
|
|
650
|
+
|
|
651
|
+
except: # retry with validation of whisp input datasets
|
|
652
|
+
try:
|
|
653
|
+
stats_feature_collection = whisp_stats_ee_to_ee(
|
|
654
|
+
feature_collection,
|
|
655
|
+
external_id_column,
|
|
656
|
+
national_codes=national_codes,
|
|
657
|
+
unit_type=unit_type,
|
|
658
|
+
whisp_image=whisp_image,
|
|
659
|
+
validate_bands=True, # If error, try with validation
|
|
660
|
+
)
|
|
661
|
+
except Exception as e:
|
|
662
|
+
print(f"An error occurred during Whisp stats processing: {e}")
|
|
663
|
+
raise e
|
|
584
664
|
|
|
665
|
+
# Then, convert the EE feature collection to DataFrame
|
|
666
|
+
try:
|
|
667
|
+
df_stats = convert_ee_to_df(
|
|
668
|
+
ee_object=stats_feature_collection,
|
|
669
|
+
remove_geom=remove_geom,
|
|
670
|
+
)
|
|
671
|
+
except Exception as e:
|
|
672
|
+
print(f"An error occurred during the conversion from EE to DataFrame: {e}")
|
|
673
|
+
raise e
|
|
585
674
|
try:
|
|
586
675
|
df_stats = convert_iso3_to_iso2(
|
|
587
676
|
df=df_stats,
|
|
@@ -623,12 +712,6 @@ def set_point_geometry_area_to_zero(df: pd.DataFrame) -> pd.DataFrame:
|
|
|
623
712
|
)
|
|
624
713
|
return df
|
|
625
714
|
|
|
626
|
-
if geometry_area_column not in df.columns:
|
|
627
|
-
print(
|
|
628
|
-
f"Warning: {geometry_area_column} column not found. Skipping area adjustment for points."
|
|
629
|
-
)
|
|
630
|
-
return df
|
|
631
|
-
|
|
632
715
|
# Create a copy to avoid modifying the original
|
|
633
716
|
df_modified = df.copy()
|
|
634
717
|
|
|
@@ -696,7 +779,11 @@ def whisp_stats_ee_to_drive(
|
|
|
696
779
|
|
|
697
780
|
# Get stats for a feature or feature collection
|
|
698
781
|
def get_stats(
|
|
699
|
-
feature_or_feature_col,
|
|
782
|
+
feature_or_feature_col,
|
|
783
|
+
national_codes=None,
|
|
784
|
+
unit_type="ha",
|
|
785
|
+
whisp_image=None,
|
|
786
|
+
validate_bands=False,
|
|
700
787
|
):
|
|
701
788
|
"""
|
|
702
789
|
Get stats for a feature or feature collection with optional pre-combined image.
|
|
@@ -725,16 +812,25 @@ def get_stats(
|
|
|
725
812
|
img_combined = whisp_image
|
|
726
813
|
print("Using provided whisp_image")
|
|
727
814
|
else:
|
|
728
|
-
img_combined = combine_datasets(
|
|
815
|
+
img_combined = combine_datasets(
|
|
816
|
+
national_codes=national_codes, validate_bands=validate_bands
|
|
817
|
+
)
|
|
729
818
|
print(f"Combining datasets with national_codes: {national_codes}")
|
|
730
819
|
|
|
731
820
|
# Check if the input is a Feature or a FeatureCollection
|
|
732
821
|
if isinstance(feature_or_feature_col, ee.Feature):
|
|
733
822
|
print("Processing single feature")
|
|
823
|
+
# OPTIMIZATION: Create cached images for single feature processing
|
|
824
|
+
water_all = get_water_flag_image()
|
|
825
|
+
gbounds_ADM0 = get_geoboundaries_fc()
|
|
734
826
|
output = ee.FeatureCollection(
|
|
735
827
|
[
|
|
736
828
|
get_stats_feature(
|
|
737
|
-
feature_or_feature_col,
|
|
829
|
+
feature_or_feature_col,
|
|
830
|
+
img_combined,
|
|
831
|
+
unit_type=unit_type,
|
|
832
|
+
water_all=water_all,
|
|
833
|
+
gbounds_ADM0=gbounds_ADM0,
|
|
738
834
|
)
|
|
739
835
|
]
|
|
740
836
|
)
|
|
@@ -756,6 +852,10 @@ def get_stats_fc(feature_col, national_codes=None, unit_type="ha", img_combined=
|
|
|
756
852
|
"""
|
|
757
853
|
Calculate statistics for a feature collection using Whisp datasets.
|
|
758
854
|
|
|
855
|
+
OPTIMIZATION: Creates water flag and geoboundaries images once and reuses
|
|
856
|
+
them for all features instead of recreating them for each feature.
|
|
857
|
+
This saves 7-15 seconds per analysis.
|
|
858
|
+
|
|
759
859
|
Parameters
|
|
760
860
|
----------
|
|
761
861
|
feature_col : ee.FeatureCollection
|
|
@@ -775,15 +875,19 @@ def get_stats_fc(feature_col, national_codes=None, unit_type="ha", img_combined=
|
|
|
775
875
|
ee.FeatureCollection
|
|
776
876
|
Feature collection with calculated statistics
|
|
777
877
|
"""
|
|
778
|
-
|
|
779
|
-
#
|
|
780
|
-
|
|
781
|
-
|
|
878
|
+
# OPTIMIZATION: Create cached images once before processing features
|
|
879
|
+
# These will be reused for all features instead of being recreated each time
|
|
880
|
+
water_all = get_water_flag_image()
|
|
881
|
+
gbounds_ADM0 = get_geoboundaries_fc()
|
|
782
882
|
|
|
783
883
|
out_feature_col = ee.FeatureCollection(
|
|
784
884
|
feature_col.map(
|
|
785
885
|
lambda feature: get_stats_feature(
|
|
786
|
-
feature,
|
|
886
|
+
feature,
|
|
887
|
+
img_combined,
|
|
888
|
+
unit_type=unit_type,
|
|
889
|
+
water_all=water_all,
|
|
890
|
+
gbounds_ADM0=gbounds_ADM0,
|
|
787
891
|
)
|
|
788
892
|
)
|
|
789
893
|
)
|
|
@@ -796,10 +900,15 @@ def get_stats_fc(feature_col, national_codes=None, unit_type="ha", img_combined=
|
|
|
796
900
|
# Note: This function doesn't need whisp_image parameter since it already accepts img_combined directly
|
|
797
901
|
|
|
798
902
|
|
|
799
|
-
def get_stats_feature(
|
|
903
|
+
def get_stats_feature(
|
|
904
|
+
feature, img_combined, unit_type="ha", water_all=None, gbounds_ADM0=None
|
|
905
|
+
):
|
|
800
906
|
"""
|
|
801
907
|
Get statistics for a single feature using a pre-combined image.
|
|
802
908
|
|
|
909
|
+
OPTIMIZATION: Accepts cached water/geoboundaries images to avoid recreating
|
|
910
|
+
them for every feature.
|
|
911
|
+
|
|
803
912
|
Parameters
|
|
804
913
|
----------
|
|
805
914
|
feature : ee.Feature
|
|
@@ -808,6 +917,10 @@ def get_stats_feature(feature, img_combined, unit_type="ha"):
|
|
|
808
917
|
Pre-combined image with all the datasets
|
|
809
918
|
unit_type : str, optional
|
|
810
919
|
Whether to use hectares ("ha") or percentage ("percent"), by default "ha".
|
|
920
|
+
water_all : ee.Image, optional
|
|
921
|
+
Cached water flag image
|
|
922
|
+
gbounds_ADM0 : ee.FeatureCollection, optional
|
|
923
|
+
Cached geoboundaries feature collection
|
|
811
924
|
|
|
812
925
|
Returns
|
|
813
926
|
-------
|
|
@@ -822,8 +935,8 @@ def get_stats_feature(feature, img_combined, unit_type="ha"):
|
|
|
822
935
|
tileScale=8,
|
|
823
936
|
)
|
|
824
937
|
|
|
825
|
-
# Get basic feature information
|
|
826
|
-
feature_info = get_type_and_location(feature)
|
|
938
|
+
# Get basic feature information with cached images
|
|
939
|
+
feature_info = get_type_and_location(feature, water_all, gbounds_ADM0)
|
|
827
940
|
|
|
828
941
|
# add statistics unit type (e.g., percentage or hectares) to dictionary
|
|
829
942
|
stats_unit_type = ee.Dictionary({stats_unit_type_column: unit_type})
|
|
@@ -872,22 +985,47 @@ def get_stats_feature(feature, img_combined, unit_type="ha"):
|
|
|
872
985
|
|
|
873
986
|
|
|
874
987
|
# Get basic feature information - uses admin and water datasets in gee.
|
|
875
|
-
def get_type_and_location(feature):
|
|
876
|
-
"""
|
|
988
|
+
def get_type_and_location(feature, water_all=None, gbounds_ADM0=None):
|
|
989
|
+
"""
|
|
990
|
+
Extracts basic feature information including country, admin area, geometry type, coordinates, and water flags.
|
|
991
|
+
|
|
992
|
+
OPTIMIZATION: Accepts cached water flag image and geoboundaries collection
|
|
993
|
+
to avoid recreating them for every feature (saves 7-15 seconds per analysis).
|
|
994
|
+
|
|
995
|
+
Parameters
|
|
996
|
+
----------
|
|
997
|
+
feature : ee.Feature
|
|
998
|
+
The feature to extract information from
|
|
999
|
+
water_all : ee.Image, optional
|
|
1000
|
+
Cached water flag image. If None, creates it.
|
|
1001
|
+
gbounds_ADM0 : ee.FeatureCollection, optional
|
|
1002
|
+
Cached geoboundaries feature collection. If None, loads it.
|
|
877
1003
|
|
|
1004
|
+
Returns
|
|
1005
|
+
-------
|
|
1006
|
+
ee.Dictionary
|
|
1007
|
+
Dictionary with feature information
|
|
1008
|
+
"""
|
|
878
1009
|
# Get centroid of the feature's geometry
|
|
879
1010
|
centroid = feature.geometry().centroid(1)
|
|
880
1011
|
|
|
1012
|
+
# OPTIMIZATION: Use cached geoboundaries
|
|
1013
|
+
if gbounds_ADM0 is None:
|
|
1014
|
+
gbounds_ADM0 = get_geoboundaries_fc()
|
|
1015
|
+
|
|
881
1016
|
# Fetch location info from geoboundaries (country, admin)
|
|
882
|
-
location = ee.Dictionary(get_geoboundaries_info(centroid))
|
|
1017
|
+
location = ee.Dictionary(get_geoboundaries_info(centroid, gbounds_ADM0))
|
|
883
1018
|
country = ee.Dictionary({iso3_country_column: location.get("shapeGroup")})
|
|
884
1019
|
|
|
885
1020
|
admin_1 = ee.Dictionary(
|
|
886
1021
|
{admin_1_column: location.get("shapeName")}
|
|
887
1022
|
) # Administrative level 1 (if available)
|
|
888
1023
|
|
|
1024
|
+
# OPTIMIZATION: Use cached water flag image
|
|
1025
|
+
if water_all is None:
|
|
1026
|
+
water_all = get_water_flag_image()
|
|
1027
|
+
|
|
889
1028
|
# Prepare the water flag information
|
|
890
|
-
water_all = water_flag_all_prep()
|
|
891
1029
|
water_flag_dict = value_at_point_flag(
|
|
892
1030
|
point=centroid, image=water_all, band_name=water_flag, output_name=water_flag
|
|
893
1031
|
)
|
|
@@ -939,8 +1077,28 @@ def percent_and_format(val, area_ha):
|
|
|
939
1077
|
|
|
940
1078
|
|
|
941
1079
|
# geoboundaries - admin units from a freqently updated database, allows commercial use (CC BY 4.0 DEED) (disputed territories may need checking)
|
|
942
|
-
def get_geoboundaries_info(geometry):
|
|
943
|
-
|
|
1080
|
+
def get_geoboundaries_info(geometry, gbounds_ADM0=None):
|
|
1081
|
+
"""
|
|
1082
|
+
Get geoboundaries info for a geometry.
|
|
1083
|
+
|
|
1084
|
+
OPTIMIZATION: Accepts cached geoboundaries FeatureCollection to avoid
|
|
1085
|
+
reloading it for every feature (saves 2-5 seconds per analysis).
|
|
1086
|
+
|
|
1087
|
+
Parameters
|
|
1088
|
+
----------
|
|
1089
|
+
geometry : ee.Geometry
|
|
1090
|
+
The geometry to query
|
|
1091
|
+
gbounds_ADM0 : ee.FeatureCollection, optional
|
|
1092
|
+
Cached geoboundaries feature collection. If None, loads it.
|
|
1093
|
+
|
|
1094
|
+
Returns
|
|
1095
|
+
-------
|
|
1096
|
+
ee.Dictionary
|
|
1097
|
+
Dictionary with shapeGroup and shapeName
|
|
1098
|
+
"""
|
|
1099
|
+
if gbounds_ADM0 is None:
|
|
1100
|
+
gbounds_ADM0 = get_geoboundaries_fc()
|
|
1101
|
+
|
|
944
1102
|
polygonsIntersectPoint = gbounds_ADM0.filterBounds(geometry)
|
|
945
1103
|
backup_dict = ee.Dictionary({"shapeGroup": "Unknown", "shapeName": "Unknown"})
|
|
946
1104
|
return ee.Algorithms.If(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: openforis-whisp
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b3
|
|
4
4
|
Summary: Whisp (What is in that plot) is an open-source solution which helps to produce relevant forest monitoring information and support compliance with deforestation-related regulations.
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: whisp,geospatial,data-processing
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
openforis_whisp/__init__.py,sha256=bnEZ4_X-mJInltSKVI0STfvrb09Df-z21buIVFDif5w,2524
|
|
2
2
|
openforis_whisp/data_conversion.py,sha256=Mc6dXbvoHBeRzl3o83pyKeI5_sPC8Yc90Tj4bN6_Bv8,17519
|
|
3
|
-
openforis_whisp/datasets.py,sha256=
|
|
3
|
+
openforis_whisp/datasets.py,sha256=hb8Y35vTcQQNUH_z2_l8Pu6Sjn_E8BzSow1-qAfs9bQ,50194
|
|
4
4
|
openforis_whisp/logger.py,sha256=n9k0EhAZYZKesnfskv8KyWnkGbjqRqk84ulx9-u_Jsc,2308
|
|
5
5
|
openforis_whisp/parameters/config_runtime.py,sha256=NOo39MAi60XCwEx5pwkS0EHKJBh0XY1q06y4j0HAABg,1421
|
|
6
6
|
openforis_whisp/parameters/lookup_context_and_metadata.csv,sha256=KgK0ik_Gd4t_Nq5cUkGPT4ZFZVO93HWSG82jRrOukt4,1298
|
|
@@ -8,9 +8,9 @@ openforis_whisp/parameters/lookup_gee_datasets.csv,sha256=UDvZrQsL5rXJn6CW6P3wof
|
|
|
8
8
|
openforis_whisp/pd_schemas.py,sha256=W_ocS773LHfc05dJqvWRa-bRdX0wKFoNp0lMxgFx94Y,2681
|
|
9
9
|
openforis_whisp/reformat.py,sha256=rtkKs8z1mJd5JD9rXuMk1tbbbTvQxCCh68tA4hIQAv8,25445
|
|
10
10
|
openforis_whisp/risk.py,sha256=d_Di5XB8BnHdVXG56xdHTcpB4-CIF5vo2ZRMQRG7Pek,34420
|
|
11
|
-
openforis_whisp/stats.py,sha256=
|
|
11
|
+
openforis_whisp/stats.py,sha256=1ikeV8UYpL8O5HZJY8lPXrhQwZ9D1IglbOsagZHCYdA,54000
|
|
12
12
|
openforis_whisp/utils.py,sha256=5HHtbK62Swn4-jnlSe1Jc-hVnJhLKMuDW0_ayHY7mIg,17130
|
|
13
|
-
openforis_whisp-2.0.
|
|
14
|
-
openforis_whisp-2.0.
|
|
15
|
-
openforis_whisp-2.0.
|
|
16
|
-
openforis_whisp-2.0.
|
|
13
|
+
openforis_whisp-2.0.0b3.dist-info/LICENSE,sha256=nqyqICO95iw_iwzP1t_IIAf7ZX3DPbL_M9WyQfh2q1k,1085
|
|
14
|
+
openforis_whisp-2.0.0b3.dist-info/METADATA,sha256=Opn73PWlsOQWTiwZ-HYvLkrPh4jYQELtSIIqDf4MsoQ,16684
|
|
15
|
+
openforis_whisp-2.0.0b3.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
|
16
|
+
openforis_whisp-2.0.0b3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|