From 47f529b2f4a1724e05ca9c8bda99ae6c94a1ffea Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 27 Aug 2024 14:47:22 -0700 Subject: [PATCH 01/13] First work on adding more extensive results testing for layers --- tests/test_layer_dimensions.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/tests/test_layer_dimensions.py b/tests/test_layer_dimensions.py index 15768d61..74496681 100644 --- a/tests/test_layer_dimensions.py +++ b/tests/test_layer_dimensions.py @@ -1,3 +1,5 @@ +import numpy as np + from city_metrix.layers import NdviSentinel2 from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 from tests.tools import post_process_layer @@ -7,12 +9,32 @@ def test_ndvi_dimensions(): data = NdviSentinel2(year=2023).get_data(BBOX) - data_for_map = post_process_layer(data, value_threshold=0.4, convert_to_percentage=True) + thinned_data = post_process_layer(data, value_threshold=0.4, convert_to_percentage=True) expected_min = 0 - actual_min = data_for_map.values.min() + actual_min = thinned_data.values.min() expected_max = 85 - actual_max = data_for_map.values.max() + actual_max = thinned_data.values.max() + + # Bounding distribution of values + full_count = thinned_data.size + min_count = thinned_data.values[thinned_data.values == expected_min].size + min_count_pct = get_rounded_pct(full_count, min_count, 1) + max_count = thinned_data.values[thinned_data.values == expected_max].size + max_count_pct = get_rounded_pct(full_count, max_count, 1) + + mid_range_value = round((expected_min+expected_max)/2) + mid_count = thinned_data.values[thinned_data.values == mid_range_value].size + mid_count_pct = get_rounded_pct(full_count, mid_count, 1) + + # Value range + assert actual_min == 0 + assert actual_max == 85 + # Value distribution + assert min_count_pct == 6.7 + assert max_count_pct == 0 + assert mid_count_pct == 0.3 + - assert actual_min == expected_min - assert actual_max == expected_max +def get_rounded_pct(full_count, this_count, precision): + return round((this_count/full_count)*100, precision) From 6014a9cf42de5bdfbd882e6d691bbf03af82b71b Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 27 Aug 2024 17:25:48 -0700 Subject: [PATCH 02/13] Implemented additional dimensional tests on layers --- .../conftest.py | 15 +- tests/test_layer_dimensions.py | 128 +++++++++++++++--- tests/test_layers.py | 84 ++++-------- tests/tools.py | 2 +- 4 files changed, 145 insertions(+), 84 deletions(-) diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py index 5882053d..8684c0eb 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py @@ -22,15 +22,16 @@ def pytest_configure(config): qgis_project_file = 'layers_for_br_lauro_de_freitas.qgz' - source_folder = os.path.dirname(__file__) - target_folder = get_target_folder_path() - create_target_folder(target_folder, True) + if RUN_DUMPS is True: + source_folder = os.path.dirname(__file__) + target_folder = get_target_folder_path() + create_target_folder(target_folder, True) - source_qgis_file = os.path.join(source_folder, qgis_project_file) - target_qgis_file = os.path.join(target_folder, qgis_project_file) - shutil.copyfile(source_qgis_file, target_qgis_file) + source_qgis_file = os.path.join(source_folder, qgis_project_file) + target_qgis_file = os.path.join(target_folder, qgis_project_file) + shutil.copyfile(source_qgis_file, target_qgis_file) - print("\n\033[93m QGIS project file and layer files written to folder %s.\033[0m\n" % target_folder) + print("\n\033[93m QGIS project file and layer files written to folder %s.\033[0m\n" % target_folder) @pytest.fixture def target_folder(): diff --git a/tests/test_layer_dimensions.py b/tests/test_layer_dimensions.py index 74496681..ef2d5f3d 100644 --- a/tests/test_layer_dimensions.py +++ b/tests/test_layer_dimensions.py @@ -1,40 +1,128 @@ -import numpy as np +import ee +import pytest -from city_metrix.layers import NdviSentinel2 +from city_metrix.layers import NdviSentinel2, TreeCover, Albedo, AlosDSM from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 from tests.tools import post_process_layer +from city_metrix.layers.layer import get_image_collection +EE_IMAGE_DIMENSION_TOLERANCE = 1 # Tolerance compensates for variable results from GEE service COUNTRY_CODE_FOR_BBOX = 'BRA' BBOX = BBOX_BRA_LAURO_DE_FREITAS_1 +def test_read_image_collection(): + ic = ee.ImageCollection("ESA/WorldCover/v100") + data = get_image_collection(ic, BBOX, 10, "test") + + expected_crs = 32724 + expected_x_dimension = 187 + expected_y_dimension = 199 + + assert data.rio.crs == expected_crs + assert ( + pytest.approx(expected_x_dimension, rel=EE_IMAGE_DIMENSION_TOLERANCE) == "x", + pytest.approx(expected_y_dimension, rel=EE_IMAGE_DIMENSION_TOLERANCE) == "y" + ) + +def test_read_image_collection_scale(): + ic = ee.ImageCollection("ESA/WorldCover/v100") + data = get_image_collection(ic, BBOX, 100, "test") + expected_x_dimension = 19 + expected_y_dimension = 20 + assert data.dims == {"x": expected_x_dimension, "y": expected_y_dimension} + +def test_albedo_dimensions(): + data = Albedo().get_data(BBOX) + analysis_data = post_process_layer(data, value_threshold=0.1, convert_to_percentage=True) + + expected_min = 0 + expected_max = 34 + expected_peak_value = 15 + # peak_value, peak_count = get_count_by_value(analysis_data, expected_min, expected_max) + + # Bounding values + actual_min = analysis_data.values.min() + actual_max = analysis_data.values.max() + + # Peak frequency + full_count = analysis_data.size + mid_count_pct = get_value_percent(analysis_data, expected_peak_value, full_count, 0) + + # Value range + assert actual_min == expected_min + assert actual_max == expected_max + # Peak frequency + assert mid_count_pct == 21 + +def test_alos_dsm_dimensions(): + analysis_data = AlosDSM().get_data(BBOX) + + expected_min = 16 + expected_max = 86 + expected_peak_value = 56 + peak_value, peak_count = get_count_by_value(analysis_data, expected_min, expected_max) + + # Bounding values + actual_min = analysis_data.values.min() + actual_max = analysis_data.values.max() + + # Peak frequency + full_count = analysis_data.size + mid_count_pct = get_value_percent(analysis_data, expected_peak_value, full_count, 0) + + # Value range + assert actual_min == expected_min + assert actual_max == expected_max + # Peak frequency + assert mid_count_pct == 3 + def test_ndvi_dimensions(): data = NdviSentinel2(year=2023).get_data(BBOX) - thinned_data = post_process_layer(data, value_threshold=0.4, convert_to_percentage=True) + analysis_data = post_process_layer(data, value_threshold=0.4, convert_to_percentage=True) expected_min = 0 - actual_min = thinned_data.values.min() expected_max = 85 - actual_max = thinned_data.values.max() + expected_peak_value = 78 + # peak_value, peak_count = get_count_by_value(analysis_data, expected_min, expected_max) - # Bounding distribution of values - full_count = thinned_data.size - min_count = thinned_data.values[thinned_data.values == expected_min].size - min_count_pct = get_rounded_pct(full_count, min_count, 1) - max_count = thinned_data.values[thinned_data.values == expected_max].size - max_count_pct = get_rounded_pct(full_count, max_count, 1) + # Bounding values + actual_min = analysis_data.values.min() + actual_max = analysis_data.values.max() - mid_range_value = round((expected_min+expected_max)/2) - mid_count = thinned_data.values[thinned_data.values == mid_range_value].size - mid_count_pct = get_rounded_pct(full_count, mid_count, 1) + # Peak frequency + full_count = analysis_data.size + mid_count_pct = get_value_percent(analysis_data, expected_peak_value, full_count, 0) # Value range - assert actual_min == 0 - assert actual_max == 85 - # Value distribution - assert min_count_pct == 6.7 - assert max_count_pct == 0 - assert mid_count_pct == 0.3 + assert actual_min == expected_min + assert actual_max == expected_max + # Peak frequency + assert mid_count_pct == 11 + + +def test_tree_cover(): + actual = TreeCover().get_data(BBOX).mean() + expected = 54.0 + tolerance = 0.1 + assert ( + pytest.approx(expected, rel=tolerance) == actual + ) +def get_value_percent(data, value, full_count, precision): + count_for_value = data.values[data.values == value].size + percent_of_cells_with_value = get_rounded_pct(full_count, count_for_value, precision) + return percent_of_cells_with_value def get_rounded_pct(full_count, this_count, precision): return round((this_count/full_count)*100, precision) + +def get_count_by_value(data, min_value, max_value): + peak_value = None + peak_count = 0 + for x in range(min_value, max_value): + count = data.values[data.values == x].size + if count > peak_count: + peak_count = count + peak_value = x + + return peak_value, peak_count \ No newline at end of file diff --git a/tests/test_layers.py b/tests/test_layers.py index bfcf4a03..2ac62804 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -1,4 +1,3 @@ -import ee import pytest from city_metrix.layers import ( @@ -24,92 +23,70 @@ UrbanLandUse, WorldPop ) -from city_metrix.layers.layer import get_image_collection from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 -EE_IMAGE_DIMENSION_TOLERANCE = 1 # Tolerance compensates for variable results from GEE service # Tests are implemented for the same bounding box in Brazil. COUNTRY_CODE_FOR_BBOX = 'BRA' BBOX = BBOX_BRA_LAURO_DE_FREITAS_1 def test_albedo(): - assert Albedo().get_data(BBOX).mean() + count = Albedo().get_data(BBOX).count() + assert count def test_alos_dsm(): - mean = AlosDSM().get_data(BBOX).mean() - assert mean + count = AlosDSM().get_data(BBOX).count() + assert count def test_average_net_building_height(): - assert AverageNetBuildingHeight().get_data(BBOX).mean() + count = AverageNetBuildingHeight().get_data(BBOX).count() + assert count def test_esa_world_cover(): + land_cover_class = EsaWorldCoverClass.BUILT_UP count = ( - EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) + EsaWorldCover(land_cover_class=land_cover_class) .get_data(BBOX) .count() ) assert count -def test_read_image_collection(): - ic = ee.ImageCollection("ESA/WorldCover/v100") - data = get_image_collection(ic, BBOX, 10, "test") - - expected_crs = 32724 - expected_x_dimension = 187 - expected_y_dimension = 199 - - assert data.rio.crs == expected_crs - assert ( - pytest.approx(expected_x_dimension, rel=EE_IMAGE_DIMENSION_TOLERANCE) == "x", - pytest.approx(expected_y_dimension, rel=EE_IMAGE_DIMENSION_TOLERANCE) == "y" - ) - - -def test_read_image_collection_scale(): - ic = ee.ImageCollection("ESA/WorldCover/v100") - data = get_image_collection(ic, BBOX, 100, "test") - expected_x_dimension = 19 - expected_y_dimension = 20 - assert data.dims == {"x": expected_x_dimension, "y": expected_y_dimension} - - def test_high_land_surface_temperature(): - data = HighLandSurfaceTemperature().get_data(BBOX) - assert data.any() + count = HighLandSurfaceTemperature().get_data(BBOX).count() + assert count def test_land_surface_temperature(): - mean_lst = LandSurfaceTemperature().get_data(BBOX).mean() - assert mean_lst + count = LandSurfaceTemperature().get_data(BBOX).count() + assert count @pytest.mark.skip(reason="layer is deprecated") def test_landsat_collection_2(): bands = ["blue"] - data = LandsatCollection2(bands).get_data(BBOX) - assert data.any() + count = LandsatCollection2(bands).get_data(BBOX).count() + assert count def test_nasa_dem(): - mean = NasaDEM().get_data(BBOX).mean() - assert mean + count = NasaDEM().get_data(BBOX).count() + assert count def test_natural_areas(): - data = NaturalAreas().get_data(BBOX) - assert data.any() + count = NaturalAreas().get_data(BBOX).count() + assert count def test_ndvi_sentinel2(): - data = NdviSentinel2(year=2023).get_data(BBOX) - assert data is not None + count = NdviSentinel2(year=2023).get_data(BBOX).count() + assert count def test_openbuildings(): - count = OpenBuildings(COUNTRY_CODE_FOR_BBOX).get_data(BBOX).count().sum() + count = OpenBuildings(COUNTRY_CODE_FOR_BBOX).get_data(BBOX).count() assert count @@ -118,21 +95,20 @@ def test_open_street_map(): OpenStreetMap(osm_class=OpenStreetMapClass.ROAD) .get_data(BBOX) .count() - .sum() ) assert count def test_overture_buildings(): - count = OvertureBuildings().get_data(BBOX).count().sum() + count = OvertureBuildings().get_data(BBOX).count() assert count @pytest.mark.skip(reason="layer is deprecated") def test_sentinel_2_level2(): sentinel_2_bands = ["green"] - data = Sentinel2Level2(sentinel_2_bands).get_data(BBOX) - assert data.any() + count = Sentinel2Level2(sentinel_2_bands).get_data(BBOX).count() + assert count def test_smart_surface_lulc(): @@ -144,12 +120,8 @@ def test_tree_canopy_height(): assert count def test_tree_cover(): - actual = TreeCover().get_data(BBOX).mean() - expected = 54.0 - tolerance = 0.1 - assert ( - pytest.approx(expected, rel=tolerance) == actual - ) + count = TreeCover().get_data(BBOX).count() + assert count def test_urban_land_use(): @@ -157,5 +129,5 @@ def test_urban_land_use(): def test_world_pop(): - data = WorldPop().get_data(BBOX) - assert data.any() + count = WorldPop().get_data(BBOX).count() + assert count diff --git a/tests/tools.py b/tests/tools.py index 99425df4..4ca59392 100644 --- a/tests/tools.py +++ b/tests/tools.py @@ -10,7 +10,7 @@ def post_process_layer(data, value_threshold=0.4, convert_to_percentage=True): """ # Remove values less than the specified threshold if value_threshold is not None: - data = data.where(data >= value_threshold) + data = data.where(data >= value_threshold, drop=True) # Convert to percentage in byte data_type if convert_to_percentage is True: From b34cef5151483fc40b85537d65f8db15fd4611f7 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 6 Sep 2024 15:45:46 -0700 Subject: [PATCH 03/13] initial exploration --- city_metrix/layers/built_up_vegetation.py | 49 ++++ .../test_write_layers_to_qgis_files.py | 242 +++++++++--------- tests/test_layers.py | 7 + 3 files changed, 183 insertions(+), 115 deletions(-) create mode 100644 city_metrix/layers/built_up_vegetation.py diff --git a/city_metrix/layers/built_up_vegetation.py b/city_metrix/layers/built_up_vegetation.py new file mode 100644 index 00000000..441262cf --- /dev/null +++ b/city_metrix/layers/built_up_vegetation.py @@ -0,0 +1,49 @@ +from dask.diagnostics import ProgressBar +import xarray as xr +import xee +import ee + +from . import EsaWorldCoverClass +from .layer import Layer, get_utm_zone_epsg, get_image_collection + + +class BuiltUpVegetation(Layer): + """ + Attributes: + spatial_resolution: raster resolution in meters (see https://github.com/stac-extensions/raster) + """ + + def __init__(self, land_cover_class=None, year=2020, spatial_resolution=10, **kwargs): + super().__init__(**kwargs) + self.land_cover_class = land_cover_class + self.year = year + self.spatial_resolution = spatial_resolution + + def get_data(self, bbox): + data = None + if self.year == 2020: + data = get_image_collection( + ee.ImageCollection("ESA/WorldCover/v100"), + bbox, + self.spatial_resolution, + "ESA world cover" + ).Map + elif self.year >= 2021: + data = get_image_collection( + ee.ImageCollection("ESA/WorldCover/v200"), + bbox, + self.spatial_resolution, + "ESA world cover" + ).Map + + # built_up_class = EsaWorldCoverClass.BUILT_UP + data.where(data == self.land_cover_class.value) + + # built_height = ee.Image("JRC/GHSL/P2023A/GHS_BUILT_H/2018") + # data = get_image_collection(ee.ImageCollection(built_height), bbox, self.spatial_resolution, "built up height") + # + + p = 2 + + return data + diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py index 5e89328e..b20d1dd0 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py @@ -21,141 +21,153 @@ TreeCanopyHeight, TreeCover, UrbanLandUse, - WorldPop, Layer + WorldPop, Layer, EsaWorldCoverClass ) +from city_metrix.layers.built_up_vegetation import BuiltUpVegetation from .conftest import RUN_DUMPS, prep_output_path, verify_file_is_populated from ...tools.general_tools import get_class_default_spatial_resolution -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_albedo(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'albedo.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(Albedo()) - Albedo(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_albedo(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'albedo.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(Albedo()) +# Albedo(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_alos_dsm(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'alos_dsm.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AlosDSM()) +# AlosDSM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_average_net_building_height(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'average_net_building_height.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AverageNetBuildingHeight()) +# AverageNetBuildingHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_alos_dsm(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'alos_dsm.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AlosDSM()) - AlosDSM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) +def test_write_built_up_vegetation(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'built_up_vegetation.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(BuiltUpVegetation()) -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_average_net_building_height(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'average_net_building_height.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AverageNetBuildingHeight()) - AverageNetBuildingHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + built_up_class = EsaWorldCoverClass.BUILT_UP + BuiltUpVegetation(land_cover_class=built_up_class, spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_write_esa_world_cover(target_folder, bbox_info, target_spatial_resolution_multiplier): file_path = prep_output_path(target_folder, 'esa_world_cover.tif') target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(EsaWorldCover()) - EsaWorldCover(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_high_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'high_land_surface_temperature.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(HighLandSurfaceTemperature()) - HighLandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'land_surface_temperature.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(LandSurfaceTemperature()) - LandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + built_up_class = EsaWorldCoverClass.BUILT_UP + EsaWorldCover(land_cover_class=built_up_class, spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -# TODO Class is no longer used, but may be useful later # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_landsat_collection_2(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'landsat_collection2.tif') -# bands = ['green'] -# LandsatCollection2(bands).write(bbox_info.bounds, file_path, tile_degrees=None) +# def test_write_high_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'high_land_surface_temperature.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(HighLandSurfaceTemperature()) +# HighLandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_nasa_dem(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'nasa_dem.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NasaDEM()) - NasaDEM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_natural_areas(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'natural_areas.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NaturalAreas()) - NaturalAreas(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_ndvi_sentinel2_gee(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'ndvi_sentinel2_gee.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NdviSentinel2()) - NdviSentinel2(year=2023, spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_openbuildings(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'open_buildings.tif') - OpenBuildings(bbox_info.country).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -# TODO Class write is not functional. Is class still needed or have we switched to overture? +# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_open_street_map(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'open_street_map.tif') -# OpenStreetMap().write(bbox_info.bounds, file_path, tile_degrees=None) +# def test_write_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'land_surface_temperature.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(LandSurfaceTemperature()) +# LandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_overture_buildings(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'overture_buildings.tif') - OvertureBuildings().write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -# TODO Class is no longer used, but may be useful later +# +# # TODO Class is no longer used, but may be useful later +# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# # def test_write_landsat_collection_2(target_folder, bbox_info, target_spatial_resolution_multiplier): +# # file_path = prep_output_path(target_folder, 'landsat_collection2.tif') +# # bands = ['green'] +# # LandsatCollection2(bands).write(bbox_info.bounds, file_path, tile_degrees=None) +# # assert verify_file_is_populated(file_path) +# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_sentinel_2_level2(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'sentinel_2_level2.tif') -# sentinel_2_bands = ["green"] -# Sentinel2Level2(sentinel_2_bands).write(bbox_info.bounds, file_path, tile_degrees=None) +# def test_write_nasa_dem(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'nasa_dem.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NasaDEM()) +# NasaDEM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_natural_areas(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'natural_areas.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NaturalAreas()) +# NaturalAreas(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_ndvi_sentinel2_gee(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'ndvi_sentinel2_gee.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NdviSentinel2()) +# NdviSentinel2(year=2023, spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_openbuildings(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'open_buildings.tif') +# OpenBuildings(bbox_info.country).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# # TODO Class write is not functional. Is class still needed or have we switched to overture? +# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# # def test_write_open_street_map(target_folder, bbox_info, target_spatial_resolution_multiplier): +# # file_path = prep_output_path(target_folder, 'open_street_map.tif') +# # OpenStreetMap().write(bbox_info.bounds, file_path, tile_degrees=None) +# # assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_overture_buildings(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'overture_buildings.tif') +# OvertureBuildings().write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# # TODO Class is no longer used, but may be useful later +# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# # def test_write_sentinel_2_level2(target_folder, bbox_info, target_spatial_resolution_multiplier): +# # file_path = prep_output_path(target_folder, 'sentinel_2_level2.tif') +# # sentinel_2_bands = ["green"] +# # Sentinel2Level2(sentinel_2_bands).write(bbox_info.bounds, file_path, tile_degrees=None) +# # assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_smart_surface_lulc(target_folder, bbox_info, target_spatial_resolution_multiplier): +# # Note: spatial_resolution not implemented for this raster class +# file_path = prep_output_path(target_folder, 'smart_surface_lulc.tif') +# SmartSurfaceLULC().write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_tree_canopy_height(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'tree_canopy_height.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCanopyHeight()) +# TreeCanopyHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_tree_cover(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'tree_cover.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCover()) +# TreeCover(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_urban_land_use(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'urban_land_use.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(UrbanLandUse()) +# UrbanLandUse(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) +# +# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +# def test_write_world_pop(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'world_pop.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(WorldPop()) +# WorldPop(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_smart_surface_lulc(target_folder, bbox_info, target_spatial_resolution_multiplier): - # Note: spatial_resolution not implemented for this raster class - file_path = prep_output_path(target_folder, 'smart_surface_lulc.tif') - SmartSurfaceLULC().write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_tree_canopy_height(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'tree_canopy_height.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCanopyHeight()) - TreeCanopyHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_tree_cover(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'tree_cover.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCover()) - TreeCover(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_urban_land_use(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'urban_land_use.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(UrbanLandUse()) - UrbanLandUse(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) - -@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_world_pop(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'world_pop.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(WorldPop()) - WorldPop(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) - assert verify_file_is_populated(file_path) diff --git a/tests/test_layers.py b/tests/test_layers.py index 27cb7c5d..dde6260b 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -25,6 +25,7 @@ UrbanLandUse, WorldPop ) +from city_metrix.layers.built_up_vegetation import BuiltUpVegetation from city_metrix.layers.layer import get_image_collection from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 @@ -46,6 +47,12 @@ def test_average_net_building_height(): assert AverageNetBuildingHeight().get_data(BBOX).mean() +def test_built_up_vegetation(): + p = BuiltUpVegetation().get_data(BBOX) + + assert 1==1 + + def test_esa_world_cover(): count = ( EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) From 22ab280fb814907eeeed0741f58024f5048eecf6 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Sun, 8 Sep 2024 20:49:54 -0700 Subject: [PATCH 04/13] Initial work --- city_metrix/layers/built_up_vegetation.py | 23 ++++++++---------- city_metrix/layers/ndvi_sentinel2_gee.py | 9 +++++-- .../layers_for_br_lauro_de_freitas.qgz | Bin 24158 -> 26777 bytes .../test_write_layers_to_qgis_files.py | 16 ++++++------ tests/test_layer_parameters.py | 17 +++++++++++++ 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/city_metrix/layers/built_up_vegetation.py b/city_metrix/layers/built_up_vegetation.py index 441262cf..4c9a48c4 100644 --- a/city_metrix/layers/built_up_vegetation.py +++ b/city_metrix/layers/built_up_vegetation.py @@ -3,7 +3,7 @@ import xee import ee -from . import EsaWorldCoverClass +from . import EsaWorldCoverClass, NdviSentinel2 from .layer import Layer, get_utm_zone_epsg, get_image_collection @@ -13,37 +13,34 @@ class BuiltUpVegetation(Layer): spatial_resolution: raster resolution in meters (see https://github.com/stac-extensions/raster) """ - def __init__(self, land_cover_class=None, year=2020, spatial_resolution=10, **kwargs): + def __init__(self, land_cover_class=None, year=2021, spatial_resolution=10, **kwargs): super().__init__(**kwargs) self.land_cover_class = land_cover_class self.year = year self.spatial_resolution = spatial_resolution def get_data(self, bbox): - data = None + esa_data = None if self.year == 2020: - data = get_image_collection( + esa_data = get_image_collection( ee.ImageCollection("ESA/WorldCover/v100"), bbox, self.spatial_resolution, "ESA world cover" ).Map elif self.year >= 2021: - data = get_image_collection( + esa_data = get_image_collection( ee.ImageCollection("ESA/WorldCover/v200"), bbox, self.spatial_resolution, "ESA world cover" ).Map - # built_up_class = EsaWorldCoverClass.BUILT_UP - data.where(data == self.land_cover_class.value) - - # built_height = ee.Image("JRC/GHSL/P2023A/GHS_BUILT_H/2018") - # data = get_image_collection(ee.ImageCollection(built_height), bbox, self.spatial_resolution, "built up height") - # + esa_data = esa_data.where(esa_data == EsaWorldCoverClass.BUILT_UP.value) - p = 2 + ndvi_threshold = 0.4 + ndvi_data = (NdviSentinel2(year=self.year, spatial_resolution=self.spatial_resolution, ndvi_threshold=ndvi_threshold) + .get_data(bbox)) - return data + return esa_data diff --git a/city_metrix/layers/ndvi_sentinel2_gee.py b/city_metrix/layers/ndvi_sentinel2_gee.py index e49b3d38..abea8c1c 100644 --- a/city_metrix/layers/ndvi_sentinel2_gee.py +++ b/city_metrix/layers/ndvi_sentinel2_gee.py @@ -7,15 +7,17 @@ class NdviSentinel2(Layer): Attributes: year: The satellite imaging year. spatial_resolution: raster resolution in meters (see https://github.com/stac-extensions/raster) + ndvi_threshold: minimum NDVI value for retrieval return: a rioxarray-format DataArray Author of associated Jupyter notebook: Ted.Wong@wri.org Notebook: https://github.com/wri/cities-cities4forests-indicators/blob/dev-eric/scripts/extract-VegetationCover.ipynb Reference: https://en.wikipedia.org/wiki/Normalized_difference_vegetation_index """ - def __init__(self, year=None, spatial_resolution=10, **kwargs): + def __init__(self, year=None, spatial_resolution=10, ndvi_threshold=None, **kwargs): super().__init__(**kwargs) self.year = year self.spatial_resolution = spatial_resolution + self.ndvi_threshold = ndvi_threshold def get_data(self, bbox): if self.year is None: @@ -45,4 +47,7 @@ def calculate_ndvi(image): ndvi_data = (get_image_collection(ic, bbox, self.spatial_resolution, "NDVI") .NDVI) - return ndvi_data + if self.ndvi_threshold is not None: + return ndvi_data.where(ndvi_data >= self.ndvi_threshold) + else: + return ndvi_data diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz index 759515e6e49022f8cbd0bbc699ed843efc6440b7..d226ab223498b7a9e9109a234fe5ad51f1a478d4 100644 GIT binary patch delta 24809 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 delta 22239 zcmZs@WmF!`vId$U0fM`0a0`&&?(XjHZo!%0?he7--QC^Yg9nEfUR-YWxA#8xoV)Iy zr>44}mNjd-x>j}dq|JWZ>iCGGAPotH@d4rk><0^Nd`+G2%O7G?KYS=uiNm1CQcxNdB-EZ&n*UPurV^q54Q()^b>wPC}7ncAt5OdpO!9 z@e}(el!l1zJ}upMUPg!!1ac5wTpI zcrhD_Uz>?HzP4uYay@OzQVxe@PKMb1SZGg`eUFhoMCbky6U{d2s}(606a9u5f0tDi z|71OVw$Vxa)DX#pib7a(#ap;tf8~Wo#QRpX%*~k{y{XO3f2rF82pr}B9NffH;uqJW zIWOA3(pDwy5;zl^*|UmBK&wp63M(#YrkV}eVt4eH2Xe$R|z*nb4yKPsjnp!vS|ygi(^v%fzdx6f}!`@TLl6pPx=JRiK4Zyg;E zfKxemPu?H)Zy%?pw_kJsN#_ON?dkThoLHYP;CYMx-QlfT9N?#ZoF=7$DPAPy=U^xVIrORo?OqM!8o^MRCE{m4 zJdUS)-OB3nxVBM#3=c^M)l4JYTH>+{74E*KOzXeDynXHN@Vy4!n)7QjrgPSgx8J+$ zN~z?t-#{0m^Y0H)gys@%{=<{!_7hcEv?QD#B4p*TIRCsqTgR4=BuI z8$M#WspzNp2Vjynhf$n$G)>0*=0*sGV&6b&s=oyu38e7u#?3ZQQK+;$*EF4K*Y* zu>UxAV7^!-_mh%i^cuIUfw{>E2;=t?=Ltpy?{D5vbrZh+IV8?Ky@z_fe1B>jnZkTI zxd$B^`2rVa30tlB$T#p0$DY?LwUqC#`o*F~_c1}2{jXat@!9gEVf>tvb-TY??)N5q ziK3&uiuF>7ckAnO8RmYT9jq#I+v_))!aXGn8o zVEf&dbK{UxlPhzVwC}Cl)Ll z{Vrwb$AO#ps6OYU!8|`q(DwLufpoU+etkfDpi6?sx_}7j3f=x%{Z+nFsen=5tRH?` zDF#0!EkTe~5+<%hX1KsMV5^;zZjG!L%OqXQsZo!bUYzD zZ3f)!dZ(JyH1JKmq;lZeWHMkc3EG-6U~LQffO-8mktm(H+YYTZ78)jHMex=`zBf;9 zVR1HqxEEhGRUgz4`ztp?jL={~&KZ3q$ObjVOg847H#-&$T$~e-)w(_(2Ez%!I$WRU z4EdT92B3XqFwDjK>u)?h2)lJ$wc!=l$pD(8(lMSn&O`lS(vYbsQ^m(xdPwyP`xEB3 zH-BdDHisi-y;G6Q$3GLOUUJZ4w~LDlE#3GajV3a*@OM#s$2; zJr^JJDppHql3$NCJiC0n`6VyHp4nBYu?}thRjbosaN2a|jQYnh2JLF5U`*)mw=SHS z{P-JcV&7nlkLNHAGf(^ox#KSx?cOdf$!oJqkgqI~YB3FoN&1n&H`G6lYM>sM{E7&Q z%DKhD@u$$Kz8tv|z}Z@03@3|kltu!B;or)0&J8@X9)o#^5?7;-`YW`g_e+#;&%q7a z%3h~dHM*MW%e&uW=Dc4_Pis5OO}^o`Pn1wMNMePpoQ(XO!o8k|6R|jGm;^NG*RaV{ z4y~JR&Wky;M)7&B(@7N(cTl_^(E6S(#pUwsNt%5TWPPC`XJKJnoPi~y5Md%U)u}wI ze7SG%pU%DhQavyBX!PkcC8DPWx^(NwQNOP39*aCYDXOx7O({G~Vnjwn4IS0;i;$e^ ziOnxHI-t72YYpQ*7gGzrhdButWJCPIn7bxQZ(^ccMb^&|g?^x9uG9FDNMlo;K5}Wn zXEw;$by~ubK?UJ;ZD>feFHoUbspsUlLIO7CTd{SfSJL&?l4-3o+G<+;V@l=BSX4g! zqTwN$26mMHdx?q&B|7D!C?5S!KTG89f?rTP92v)CV4Y#3|LLmF!Q1w3ZFupTZwV#-WlW`Ox2{6P9UwA! zxxup=?r@-kRT$aVQPB!~@(Bp1HbzPoN*^n*n>h<#vGWUt>2RxzjXAgJ(rXisPy|sN zU2V3D^N{v^9wuWlf1yY3r%(7v3;QWL4EKu?CF`QG`T%dH=}Q=OZNl;30kMI`#TM^p zL_=m$2d`agE<+ZG`b<%#X$fng%-#mQ%41#B`?jL)2I$sSYmo$CfU{IpM3{q$AnMC$ z9aFr4f|O;C0hLp;*=6l!OX}bcB`uAJmxy#~Ft<288;vw9eVi12H<03Q2%(EJ(Z|F} zla$uDm|kh#UEHXBfv+R;waa9%${vp3!3 zxpHdl@#Kf+xbFiH!{%0fHt4g7`tHHSi{GlJ*=N`Jdyk{rj*9vc@3CDhJ^Z`lCrSnd zt}lj~Xqp+OaRqSlbqaK{bZh1;2V(|rf0GTRggmtL` z=D;=;WsB{zsWmpB#de)*G|}Jx7-6mKh%$&>!xe(ZPm7qpYxZqzG$&ROeZ{qdZM5Z> zE|@ZHd6gHik9WSY-5H|dd)d@?zC)_+NQcsyAG1Vrm1XVHUFdzXN(i;4HkUPOD0d7kphf$ zTeEYvh@?#sl7_WV7%3|JNDXNbI3pi-LA2+E{4+}5NFQo*B5_7(=q)M93Dnldt=8lf zR%1*hTrHwK5_DQR;^1LOmfHu3GCsAIH&6iqR>$&Y<45<5)~DOs6~E?l`o`DNY}+1k zqh0>2L`R?h2i|fB*X`FEeX^aOiSF-&2{x+FcYP75?ycKe-9YVjw;gv>8ES_KbDMa# znU4%es}}ZZsh17ad$4*ns1%Jwl>l425O^EB z8LKff2ixwiTiqy{ElIm7l-3~mJE=1k+Z(-QF+&EE@2#jQEa6tx+imf`myFRihzWNp?uq+;T~1PZOPnZ$_X`$vMcv_q8sx_bFWMUjU8c z-2IZKj7CNSQ+#V>|4wj|6F}e_%DO!I@$v4|E<67UvSJFKn_$}$@zVVxe}`6Q7W;MO z@;>H87jm_peZTF)lJ(=XN-z5@Y!|p~)BS|6qwVa^wHJ)5`ptw-DCWv$|NWhHZ7*DN zCvEoDba+SAx66=8q(A2ihfV5M<##}aPaOt8$Lhflv#EWVAe&W)3{+88pZa;7Hm>eN zJYP|cTer_`dHS$%w()g5bu{iTAHvj%as4{mwB+HzO(b#Qegqn}kS8xP8YcT^44 z-Ig;JwoX(g>0HerUG`!<6BuUFxBm#we{5^d-tsKo0?&5Tv0fNs{%{3%gc)_ucdApV zZD9fdN_-iV-PNxQKyZS=o?5L-Tw}!JZRWTcBmY-UpDki@Urs0a9mT1l`rL71LSEb` zxzi)HDjIwbI`ft0FACmM#a}EEv5mdd6d>5Q=oWm$Z>Mo*8uQ+4^O9~x|Q zJr6+MG@y;cASizC`95J2Sg`N$4j?);=G~N((k<&4(g4@;&Xg-TlMFL zlV5VQUYuhfYzUvjntFlaG{Oq04RS1mSVLfJzHyzy@&$J`TXZ};?b*6*5$6arvy`gWI%lyl3 zIC9CJds3T@N&OS81WuU1($9WL7VvWjkxk1}YxGKnYQQbhvU+-I%=yMJ@7b{0+aBMi zeM5qg3;K~No{_1{hQbW2s&~xJ+FO84&&!MbeuM1HVDXmfjS>Ij*JR%L)5VzM(VQP0 zQnyo4#l&hfY%t~H#Zy!9H;dr0S=!$9)hozbzHNu{>~RS7&(3sLL+sdWeuFD1`9E|h z{a9p`?4=&!ZIHS&k+ybB-gw4yI+uyG5tq~!y~;Ui+xRuCn~kC;4G^~i*ZBbyWt(AJ z;Gl(=Nywc#jPKAtXpN~CQIS-Az3Z9o@^up-cQ=x$u&)jBeJlugM`V+Gp<{o01<}d9 z2UH3K#+bKaG001@T6z#L#DoNKSeyW z9^frnWHm9R*lsU5(8cds4F~L-_V5`V(;4(vi8g8vPM2O>mxgsC-fS#0NkA#k!KY!^N)Se23?GiRhf2;b$9m^_6_ee*FPp-Yu`t0HQu$=o@{acus2Sm z1ReW4UvARhs=|40zYT+B!1}rfWumCW8mYa+WxU45Nh$f}ws!q<1%MjXJ?OXVpv;~5 zlW*r)3jdD!rcUsI$*|T|UCQtbzSs7u`1tkmGvn3^!Kw#T5sRPxyrjrWjQm0NIB5DZ z#$qw6=@@qf?J@t|z78kKbGz5paMGr^o;|tgPTDRasIG0rrl2BalCCnTX)q@ObC0gP zp29hH(Z`EY)|IYf5_sxbd%H06yKL@NS98x*Zt>W}vHv!FkH61N`53LZWs`i#KG7_D z6FnxL;n6iMux*`p$vk(TaU6novdp~Lj(?i@{KNWki)FPr>h4E)QJlF3BB?au}342INNM;7;_8mDTkos5jH*>5SUC2jJmn^hbR{kvlf5s+*QcQ)EK zwmJ{1JyBna^sq-acsTXz(XDb{%M(Po>4$1FY*F3ocBoRi0z5_*#cv2yApTSyY_C=D zN=CquR(Ai`N(LYj7V6xSzNXRhQz_Byns;Mg9G)sAFZkzeT>gr&2}qyHuCB{Ueshdv z(6vuH(z2wu9AY3%3%jS{slW{v90 zAAPH~27ivQ1JAZJ{mN*+ls__U-Xu+n7CUfJPH|*$uLnBe`C34;uN?Om5M5Jp5wsQe zKX+B^!JS=o0$=pId23qHu_vdb4OAg+G{0wy9Y85Jj4;KVnZPQ)*F~NG+1FMgy~x5BYcx|=2?;(y986qSx120$wKk}T*P z33CF0xd4(3^)5+m+RQ?$4C>RnH~bn8;NrqXpr5$8Q^KB}?E7s%dFn;f$>m1v1M8a& zS|J;MjKO4j`)WaD(a0iZ=1PQ-m_2&jyYWY^m5)y0QM&piY?2_DB~ckDX}NvX*OJt{ zwE~d*cEa1!JJ)6pygmB!$>L&O83Rhv{3Rk@9w4|zs46(0X{Uqz?U@-*P9WPQPJHT@ ztov@mt#@rsiYCdV^tQZNu*_L}YGp^uR`(y;N^Ep`rCG4V` zlWx8=BE!WLN371WoM#Na#15P;0otFMqtB^`SDMHEpw0(WUUaC=B+M;4z0!c|Ku#k( zPH)f>wQ>(994E3xZ65nr!1)ThC>{-WV{CoYm-VY#M+bv5YHLhWZ-vq9X~O5BG_=QK z!uy(bxRJBGbxrOQ_(!Eqm^l$YlcPtL43%?sMKh;rNxu0H9!A?R)$nuJ)f;FRxl2zK zgs%FuPI{M2uy%LeG6H`)(3d~{tp|L#!M&{?QSxUI7pK(DiH-mMPRdXFo+&0T`+(Kb zp0cr@SUPHcd<(;@y`bERIvDEql1^;IY$j`}lWySfq1dRp%w17eS}}uTN!)9*0)~#? z(j`Nz`55MiZS(OIS-;PX3!v_rKV1`sv2w`~`(FV3fAoK=x2zUdtRLq4k2OsEM*HYd zL}CSs)jkd3W>EGOnk_GXAS{{n!y_!Y?1pSSe2oS7myL@`2p{lY^nT>C| zxK3u56FiMWycW*_c>f2ATBq5f$3DUB(X-`!{?|gV zfJ?U6y`@X`P$S`H@vINt|G-mjn>_J8?dHC*u3Pq&WBk^hybrKhT*x9;YitRdf+pi1 z%Y+$h+cmFcMTx*)6z;b(Sc;kp_tyx%4Y5FR7mEH!7_Y?=Vju4+n*Y8G3_F-J!eR6P zNUIpTc%3CQ+)I(ciLiD;`2{<_*!WdRldRGF7ik2U@`Yv(#c2!Bs)QJ$RG{K%OOagi zoAOr*=OrAeC3j8s31VK&@BbTB`d3iNB;)4xItRlEA+xl68}wTt7=En7HN}ArOkm3m%^gcQZIc8c#i(8ckqubep7V`NFE)6M{-volhT$AKngVbD0^jyD8o}{-e zA~uw_Bac~XO?w?XAe5KBe{S0T2KI`~CL)}j2^@163sQ?z#zm72GRZaI2^9MRu>?(A zMEo}_nzk+e%@h+;XHObMT+(f?3Ms-Fd2i6->QytTmJni3;4 z#4@{Yq8e!Q6D}jI#d3gu0QxA9DOAPiAl&jrf~BO!zJIBCf_ryL$LVX_L12ML>ziyK z*AgI`LL9ks+lzdbyO{XmlOZGjDQXJZ`+(F%$WmS%Zr4@liMh-eqSc|nXDlr_g zkWC}s8qcIDgEkck&`}kl<9ke@(C}I=>)hE#YX`Q#?OPN-I!~9fLVO8q)e`c!_*3F+ z`$vxmFQ*gEQ|lMQcg*@N+xA)&IC?JH{8}X22y!^jWl-OZN?_)~+%8pioCtEIjfBipgbT)*6-1D> z_zj?mvEZXw)gwSsFe{)zQV{Fp6u6ZZDc$4VZ!O{+g*rz6AD|q4WtBvuF~-+IrIr@9 zj~^kCi$sz!iiAh6kt28y-z8`-bHpifZ#E3aF$on6#xZesAlRz@Yvvn9FU{+ZjpDm* zgLG6C{#xdxM&;ln#5-Wjqdio-|7FAeA{*-x%Qr2mifSUtIHid3)ipJ%)q_tW$KmuN z^DTcy(zNxU{M+PvYvao3#~~S`iG5l#P~LBhuPIeRqp#8z~UUzj-WPO@!$jrWYb3P76bH43O+;5*T%WSK~A`t7C zaitUwxXn2GSQr>A>|b@_v&mrQC!(a3H?zC=8{;{%p=Z>tksWC>MT$+*Zz+(SI-}>4 z81VLtyPOR^K>l9fGnDg~cm;lignc7@eBk9w=6AO)t0_UK)c^d-Y5`WbmDOlnkk!<7 z+s%{~zP!|l%s;T$8Na^%^Cw%Q!o!Acx`sf;U)hiv`2g^|$*sM&87-2ji?X4xAxH?f zX^|hD!BS#HvO&L! zEpHwr*g*;P{Oh+8q{Gghf)=3$;{2}>24H3O`>X?xulgpdSM#8CeP3HI&8^3h=B&sF z(*^Ni`9tYXAGE)gpDtj3Yfh{m*_@|Ig-sZAiAw?8);Ia-eSTpXv*S~mK1kIfVy%0p zp6L$XRsZ0o`$)fK%pL9ogQtZWU&H2>^EpHRv{7m_!-m2&HM9@qwz{nBu7@b2+!dE2 z+c%O?EaF80-JzOfW(S+|Pis3^8J#=_t59-qMV?u2$ZsTD5lh zBc&eLRIKYfuPL-yYFsv>zzidmKoB$<(KCWQ6+?i#^v5B45l5z>pRaiR7M~eLsv_Bo zuvep`+=PvTM*A^|Qt&+Aa0Ka7u*?nhCAlM*s3v6`DQCN$SHXN)05v(Brfj>kaY8WJAsEde>{pH{7Jlt1Mrk)Z( ze3%%mq$7xecCb#uvH1QQDEq-VvQFK$XjpV)Ebl&mOInG*z!Y??B3Ec@;{x0+PN6O%faxH7%A#~wkQz(018UrPZB67QWDsYt$&q8Lh(m;qo$rdqQS+QX$OJb1U{04O206mkW5#+cqz7sAy9r?dI zi-ie6&W#5PcAhCuqW+)G1ifL`$nV!FCFeDi^Y;J&u3QLIB|-~|@2S+^l_gWD86VUG zk&i2eN&ho;66U|AAm}}^9EEH+T!+pdNW!--ABjxk+3)&D`p^6Xy(Q3*{LYF)Vv$UO zY!$W7VlzV5$bvRR7O-&kDf5~*NZ3&ugI-(WO1Sp-#PUvLVi@yQYMFEz(0G8c@kq2$ zjAEs20T5Pqe!j_o8%Y=BHDTzbfH%x8_XTlRfLp)YpY~oi_rPGRE#s99v@YR<*l!H~ zcx0UqNSIER1^(b)fBmrmx1JB7d`~@{)MhiF__!(7$w&bjVqP z&_jXmFiS-LCPl9cI-~qk(f_+D?9iZAf@4T z2!FHfB4ZI(XGQ8IfISpof?=%qNBDDg*)fHXX0{Mu^b!DOe;=2RoD`s(Nm3zu38GRV zJ)zSAe&jOG(5(=#qc@2jwWQTB@C{D}+M;sVQQAbzItm-QN)00hEpifO0)fnXx+SLE zrTHz47!tewe`a6?iRpEoCvq)=ToacY$s?TxcaZ0}Vwe0HkP2K$Dj_Wik)xM-+h)1? z+H+iCXJ|1F=9m`m3^pwZ|FMq0f)dYzTmz*93MK8J5QTq`RO}HPhFhq}#6@U+(xn9v zrQ02bQ3f1*3T z0Z)=8$XcRMu)tsE^}k;1KY9g>5iiQAp9XRT@Bd4xfEk*3&1H7MrPr@Tkp0cE>?ctP zYgAfCQqSl@DyxDc{SOtWB|=6z-RYhos`I6eJMmLNF7PB-ge)bJ01K4CX#HI%WN^5% zZ?L3hz2gn{r*6NpEZfpH+N zTOG>p;0sAW*JR!pOKRyefugP#9yx{OT#yZ2z-SlRV z_}Hn!-OR&-ZGIfT{|oAV3<&`B_+^Ax@NGoBkJwT)hNGx%rO0rA0yQo)DAHz36-qSM zF;C|t(po&`g>(TGD%#*D{ihM5{{VzI3I_l>@cROLCGZLbMqiLu;1_&_`bY$OrC}d} z$n+Z@vWxj2=-BlOR4<`Fa2#^~t&auOXNi@X8b*R3oK!T{{>uU3Vd$ql!h^5F$8Ce4 zdzzBHaDxGMF>mAl4e8|fo8*!z@zjJIWwIox4t_hdh(a`(vH-Qb(s@^2=w+1^L9n;+ z2z#*iUSBxrHV!C?bX(tTgk61D3-z<7N^z`xQ8b*QSOki2*ZTnJcE*Fr`ml(1!OJ5PCEuF|362{MIi?h)jrCt8PG%)D z=~An*Ed@G2Q?O^sauDSP0Pe+Etlby0Sj9Wl)x%bTEsaDelP2Jt9~N?)`&*=Au3(T) zVJ_nu4i286L@>3kxCe2uE3lK^mdUZ&MXTZjSJrNgpF#{Nk0gF}P5I!?Um)XE;^v_n zf*{2hR?w#G!s}wBS(#X=aS3Wukh01}TxjVrum=$Ch79cg2QI70SG zEn4-J6N2wqXR6Ol9$Ik%z;xKk8WV0)zNttF45(?Z4VYKoK5@7B0#rAF?-i!*6GkEOkMmrPT-alFRa*bq^BJed=nNu53C(0}NNp${=U??# zD1jk79PY45704&1+kidJF{uQypeO8{a4eDkElNSiU+1dY7EMqYw@B<$?SdnTP4cH& zB|{YSi`1DlRJ$%RPYH8gq<`lC^;&K7}l|Q~dlUnajiDKKJa|J!BNO(~w3f-UB5TA=Ms~x_~0g*#S z-@3+6Row4M@;J{)v^|$il!7c*=%d&l;tyQM3Xy`4`sE6cXmSmdn#shHm($1sJ+s78 zmQ;MtNsFX#Bnzk5NJ2nd%MhQCj4R-wMS`wogj7w6YgO?3MnGJ9Qc}Y3c9Xqzjs8x| z^PfM`R9p84k%vp$#eVchKr#7A0zg9Hl8k)ta6mxWiu#y$>Hm@JZ!{+VyA0{Y4;&Km zeVKqEGF;5?i=dw+vC@ANVT@HIU74T?LP;XdCRTaIlnBijo%q2FO4s@XfVmlOp=icf--1$v5AAhK>T+& zTM#CxU|X4^1e72dESjK$q3FLvEG)Jbbu`05XOD*#>4U3C>WsVa0zzBbJ{XYrj@qdCGD((M7aN=Atoy!;UL|`O|BJJ-2IS@~h3{^`W zO3_M_yzjWv#h$@FEBP6o-lrrqzRgFsfZ74O>p~65Yuz3X27eZo<8ki;l_?$L-?O1b zZKto7KtU-TyXzi)t$f)?LZh3#=7rk@#1qGY%bRx+*o7HVdxVtmKyX%ZDK}(YFbpT$ zy*M{iP8u7Y6w;6YG0>IvXCn)|#?Y^ytf_^Oq=eAN)Dq$z4lWoo4$p}heAI_Q*pFxQ zZ&?HZ;j&T7C(x;%a_`BghLt2Bl0UFVN*z=}13*>$Cr}NaXxC?uYHYQ?H|Bmhi9Ylr zt;NEIe!iGQ!m2{S$HqiIQ{ng?TEPH?IdTjYZn*{Z0rf{vI0>58MehuCI(9dE@ZDM zy=&jT+Xdpzskcq{$yz??y{|tVVXBjzQgEFes^3_kNX+L2DZfD)7oE|{sI)~?tp&~4 ziWqPIbXojn;Bad>T13;rD)aimxNN!ufHu+)_0+)DbLn6xFTAW}KaEy!K~O`VnnYHa z<;$OuHfb!T)5BK9sJHtQ{HF72$>UN?t5-)%jS#;ZS5k#H=QN&pM^TB)2uLl6Wgwi+ zCA|pxB_Wy1E=rhd*ZB;V)bP>%#?W6J0hx3z3BN*qb^DOm+UIGr_Q62=evfqrIE0xi z9=HuEi8534(op?QjMz+M{^gHdk0?{bJYo_Bd_8%BYDE14JdSdrkO%h%eUfUpL9vE} zG?xO}wLl$OnnFL!uoJnwR!XZcTyU9^WqGfrL{_#qihZX-gd*^RlVS~prOb|^4c!QP z@ywF$?7cO2by2?+$jMYNd*4_{0R_Tz0d|v25jwejv4$MBWJ@qB36+p?3DO@MtsA*K z;W1Zen?YClvR6n(Vf&Di-=C~>T+nUHq9j74G%;cKzdBDw8frNfa)sT6%c(Y?G^~Y6 z^GY~YQKx*;6du77T0*G{j%9V>uE;gQn>vjo&ge>uWQ+)?BldNWoTaPw2VVBy7U!AT zz1ixCa~lA^o$M5(@{pN`CB4eak`7_U_b3YhPWC?)u6 zJxO{&>S>%NG0!{vAdTva{{G`*%UPSfc3aa=rXkhZwQB)+e8^a$yQz~n_ollEo7M_ z@mpVZ@Cf+T1mm4aK~}rAUR_ur(4-Ot1K6g+p*D>VK%v%6r5Z1ORN6qV4)KLM8#O>a zF`4cZnZkt(*4t{p)2F#_ZaeIGRHHR{>Dbyj zlj<8(#GaSfSWNz6mIq_RQr0yQ^8K?jQ;hImCwsHQcNJQIgi7`+_`JUQu`I4zzgwzp zEZ;8;e-fvcZB;tDw2O3$aD_5_%lb*eWvo%HzXyh7V#*oNd5f&kKctMJXkiC0s` z-cxa^$kn9cz9X{C7(ocOAXe;>p-dE&s)_~GiZVg_)1b&)U-e-4W3|i26W=vD4oH!x zLDZs!CJ9tPiDi+gLCD7QkCBt&8V^x88i;Lq+FB z96QVbTt~iwTk~DM*+}Q^T#}0X4{P86ZmXpAMM3Y`Jjaj9tIN5W+vx3DYgf+C&P2(t z(N>ixKJ#OsT$BF&r+QRc`+G4DYo(d=5}oqY;op$jWgml>@zn$VNHHnUSc8ka_m|_m zF(K7Hbsl8oGz-ns^~0Th?okq)SWgo3&tO3YRLo`E%_)%EsnJxY?e`7G7Emf-zJNMFm&1{eAaJ#p;33GBr%s!F)*QrBxQiNvDp2omApm{ zV3g+G(P=GqB2ZFP{b|YD3y-FInpC?zEUb6hNnTxT4k&#yFc-xbvgR1O2W6$-U|KBu z;BsG8+{Xok|GpzD`#tpXl=mQoUw3wQBqsH^SqhplC zAO2*2bYhikah_GM=EE1v$)+x2LU`uPiS4QoL1eQiP#E3pV(f8)o9BgC{#O00W(?Ss zKgVY^1?(gw{z{ns!Rol8B5nsD7&26P(RsKyBX+?Jci~)vZme#9`W&JGO`05|NYGt+ zTW^Cq-9Q1C?y&6sVC*mM@UbHa+F_c~kRU_E%z(c{1KJ-C&pp{zfI{B5j9!+e`v=n~ zcx^xUBSkZ|l9RO{g+58ez8a*o9e2aN^rw^!S@%&}nAD9d(>30aecA}%94kPk3f-(v zg6)Gvf4o0rL@p)JH9*Sdp8wD6j~ z{%2N8TY0be+UCGsi_9T_sVbhr4BU9K{B0OO-2p#iolU)G@q7>r zOOu>;rBU*2On=->WxSRCYx}O36XImMc3OtnmeuIwmO*WHbD2L#*RsYa;+a|5+uE@4 zRJ}AYq0w38v9^!)dgwCvd$O^sBUrZw4LLz2fidLywDeu^5`vL%YMgM()C1mOe0FNN zqoW}i+bKY|Kj1idC51K-9P$#rQnE_BvQgZ ze)Hg?%-tTzLw~e$-zpTo?eJRPFl`kc&iBUG-TUP=qn)0g{7IZ=4pifT)|8(+Xer~khD6$rCoTWmnL21yx1l_ z2xn2QChw#md}v>s6Jc}x>!ozubMbC0AtrihOuAA8OuwGsozjui+MwKYlDJ4=?CSI< zzMAjT{r>IBO0XxNW*N$2xPI2jYDC2BLB{A;?BjHhns7(skEdveI|Tpe_;eUiby9|a zg8bBE!FfeMYMo@wj*Va2Q=;QtOC}Son`gb8oZ5~(ZHg*lmU?Vi|C(l8fxk8t;l0)Y z>|A;7o8q=UFL?oKn&dr^yIh%jy#Qq~_<$MhSC?w>pBxJb@P|yKzlM;V$;b|JAGh%? zWtn=-{)um{vv3(x)BWCNQo)F)3tGgEI{&rEW>ErM^2RQMGu$&Kn$s;f^?7M{eE_!_ z3Esv8WH$Yb@%Ppz0_B;j?8WYPb!BobyJni<4g9A=+Ntji z@wjtw{J(kbaT%*l39k1b2bN##*|IN729L5V zN^8o9>gg;`J>Br!{Px(-5BtE&-R)|^y*%LiT&#E1?XMSB_SV&$YVLPu-o?qq^>kRx z-^~H$W83RUS&_Wl@O9u__wwT853wZImKl3A@xACqI7x^UV?6iaaeMnk$I|y`|H3|_ zG!FrbN1FI^+7r1%H+V7bp8e|vQH@M()BF@FX${O&=Byb z&Nt1~>$$1?O5~&5aCprw&lAz|kW3m1#t(hGAG|TGKW@2?sW~%AqFLtos z%ItYuRv%omZ}&j0;p>Za$;1J_?B{cXcJI6fPk;K_AIm&cZ)1bcVZ<(HPxh~^etADv z4=(QB#LlCVQwI^4GgGjl-&RRE)k-dk3QT#`%Fha}qP)I&@ON_5V6o#ibx*D;#lV=AEbSX=mI1CF8quD% zM9Jow*$iQ?*3IXidD2=%FZ9;D_0IGOHLAffFiW-}GK){VJlc)X$kVFTNBuVpr=Iek zi0PJ8TE}CMG3+Jbsb7a+Todm1=E^%jqEPpSfB5V$x`va+z}2fwU)A}vuYBDVU5N;O z4;ysn#q@e2K-1?WA@@0nwg66y5lUjZk1H1$qoKxyf6{_ zre5~?q#{p9+85no_9Fkkt^cV*=AQ`pn|;A1=~A>SQ$i10DhVNIi9i`f{&6}!k^40A z+pe`ykDJOK3XT^H@m5@geA+R5H1VOZ(OI^U;~?^lPa}MVN^UOmBt)MwDy+4vf$%Ow zUMdFQ8#W0wjC`}{PCA5qlk0o+6Abz9@sim8EnSE5-%WB&87X-r&?F&pg|Jpss6Hm; zO4BfxlHJm+CFZ_;>&QX2dSN8?9faxL4H$pQzHIkiehQrV&F5=>BsWtwzNPYmlDODy z;ew^5Iv^XNOz9q^1#_Rt?1{bt?D_PN`3LQ{_d^2Vb6&i_Z+S<%n?HS1hsdv-JwIvq zf>eB^PjY!D7=+p883QL5EzW)}>A1ck8BEIZpZ;9juv*CY!otl$wT!NsB6I4ID_u0k zbQW*hzWmPYK8~+QlF_Cwjw-uZn;&|3vD!$c)qd*pQ_+`G!$>({>)t$S~{O2;oikuzA^sW)no17u3lCs*6&_I$%n0D31CL9+bN>AUw;lD;>DT=V3{oc zPOeo7$oQF$B*ew4m?1UU<(;5pjK|PTur6g^RvTL-s@xW?zc>|ACL{F5Dr>so?N8-S zpTrzaC@tKQNb2{_j2R5@@Ze&ku$O*)%}q{+>yIfl8jz5Sf|ZqM;l$NhQU?6Red&eE zJR)pbbdnH5NVH)$>Ae#0xJ=JE<@mA=w7&Ce_kfu<(xf4vXSAr5L#;h)e%2XJT1bTb zru;62H)VOFjH%R0Noua;Zy*+wHyNWML7@|*gI5YmuBv3qFW(P9x|6H%-OYaRz!k-h z!pbM#g+o>2z+!H(CYSjoLYd1ZjJ4n-G00CaU1hY z^8e>*HD{h8N|cgcgpIJkll*qa+xm@L@z<@6xAT%MFFju1J%v5C!$P;Zplyo|V3&S5 z>WiUuLYRQ=Qjy={^&{wV(yRJIJ3n#18$^ZC)8@qXi$HH~46%XI<@A&Fj8s1%gk6;@ zvRb!z?bfZqZQtJAnfJY5G$K9W>wK}inj7e{pV4Q0@nEcNBl{(#+cOJckA3yIZbm7? zOF%c;Dqi`g^=Co4y5FREIh~&+fGOqFd>y`q1Vpl<^&?k1L=)TN%<_G z>>KA)Bd;Sno{6u&i%$o~2hv~eflREhO@6E{=a&f?O%9##UCV2XJapBvJtm?vJkPsqU8Iv zM=Dt^WuWD#Yf0#Wm{es>YvNqZM4-xNvKLLp(%fmc@w8c2nRrIf*VW|2#Yk`Sg;GKvh;=y?0Ix@Qx< zAU)9kWbXY>;vUgN^4~uol>a|noOM7`@At=5kdhcB4P%ay5-EX6jFuYGA&P)>jgS!= zF-k;gl(a}Uh;)ODPC<}RVTg1}Dg1^Xzw!I-kLS71z2`iC-FtWLIj{3p*UiW>T6}%n zd`402thD0L<5u%kY~Fof7Uw2Wc`sQ+R))qKkxo$|SiUkPE32_t7^EkYDvK&Ho5zv1 zQ7rzeK>;(W1>?5Rse^>B)0`XgZf0GTO>02FTf;^S$Ex^^H#nfkGECR=kWLe-$PzX4 z9<@fwIM3mFFg1kyuJQd2K(5#*sfR)mwQ*=!NTMFdo&M4)z^&T=CU}_=zK@;6$0;WJ=E(GpMQZjoK3`fef>W12e*8XYOOFxZO7tuccb#pd3S zc0bL0?9cYZ!`2{LX`rw>sfbr<&}%kZn0+^w zwC_zF6L!+DxF9FEAoS}l%Ojl>mR=#PN2lv|Z}J3nmZ6B16y7*a$>Mt+v{A_+r8_c? zj>jOC!dEkeb%*S->W)`pjY7j1gz9}6>J-h`WQ{3Vz>;jNP4r$^Q3iTFBPPe~6hma@ z6p9=PpE~;w@ojL`9ewI{bA0G=)7KdU`TZ@s)Sp97k!s((N)msMwRQU~v2`UewV+U4 zPaHj6=nvkK_nHQIIba|cQ%j)dQJ#(FjbzbwDJQYsg*8S~xz|%-N)8VVD!rPun~^5f ziT?Kxo^+LYug|RFuuF&eTy4+HwjbRr-SOgwJV_Yv9f%2UC3Gd*u5fM{K@HtO{VG`$f;)QVo`^br;CIDB~t-%N3SCH!1Ji`le|?$mK~EoU{Y5?++H zRlC(KlN`1X)W9fyN1WYHXB>Cz<9VPXFa>!}@4xA=on2M4L7#`dE_!UJl#0g{=U)_p zJ!kXlK>b`MjA>@ni8eyDb$Xkr8ZTQj97bNM<2E7L6L(j3Yn9wl)m;1(mRN8a>5$Kb zQ?9t=T;-i+JXA=-Rlhko)MD$sFu-6U@k_ruB>6_~z}~QG%i)}nfV%9pfV+>8O(|u` zgsb>8q%UeI_=r;PEHe!uZ?#;fl(ELjjs#ZnO{UHh^ehLf8&aQeG_0^mO6&%2eSW4)@?1jdSvBWnB|}SrbC}!Gp?C?bLg%2@e=$yt+gvz&7*Mx zak>>c-WDTcBbJbDPnVIorJ-G&9+`8f&UCOMS~> zB~6Gke5ITU8-ES61!>IYur^)Wrt7crlSzotWj z^asISeGY=d{#+pVQqFLN;jW_q?k+%m^_s#{>Q73If%eA9mL|EWm4BR|Qta#)MQrP{ z08Z+@AT>%QI53_djx}Og9{dlT6Q^FPDA-P@PI$dWsR8)R97X(UeN+ls2;ZGXFR$kJ zaK;h@v63ved(mG`^1$9{isdIODXXz#vCj!SVwYm6hkYUfU&)DNTg}U)n4C9Vt+blA z!LD&AqlrNfz}K;ERp1#l`&$Bspbb@@OQfwcWRATvcZX1d`>l$i46IK&;^tW#JI)45 z$hnXhfkLw>mHdvNGD$K;tKbvTO&HT{RphEokvM1kZ7t>GM(#5vAeUp8ngd26U$2O- zEts_P!OUwGip0*AO!rE+wqF~e=v8qrTK!u_A%HeG1<;KKaubShMvx+WQUFsFw4K|8 zw3p$gPX+FC7aE;zPa1q#A@4<_FXKuSKCtxqhSs#CQx;QCPcT&$Lwj_N-K!S5aVyo@ z@B!^W3by1JXfew0CHVL=kcx20NCZj$cZeenh5(j>@Mr(cR~_>GStEd00tI%GJ$Za> z{2!w^N-8wo5CLQic;2$wL}zGw@j_yBDjp@jbBE$(NY^L3RJ#j&)cto)2!uU?Gk|$b zHjyq8__xpn9*ggn< zDSFF*VFP`DeKGp(u5AChDUC|Qx1EBJjnVHP^Xd1hnuoz$4<=yaLa{L*VdnyW%yf~2 zIg>V~K5j!Aw`6GJYANdi`b_8CW5&lZu#O4sZ$gH0LS+GaL9tY5f8a6!CkM(G8{SHb zB~DyGDVV@+UjVSg6XsnH@J|(60C3q#Bx)197bhQwA{~61P>t@^EqoV=mawhUYNz^dM)-0~hy?Bs1aXl3YM)j7 zw-JgE`NVCWgV|h_qAw*%y*)jefRmQVm^w^>#`gAbVWhL>pS=i?5cx0RYy9KMoZn;t zM?v*e-2uQY0(XvxGx@0HOfztB!LSK)ELiIrHJrwd+4ky3CN0sNPV{~S+0mGKl;S7i zPFcWDJoNTws*I^%{TWn9r4&$#f^m?X%8wEU%K{GEMRm>6WAH3!r|;#1({sswj=o}v zEEbh^(Kqq}t1{?%YE0e?%H8Rg2oud!+&;37Z4V-(1iJx)2uNAgzWBHiQhtnX9|N7` z6H?~C{ie_KVOfy+9#riu7j3))#mKwl_OJYc=xzw+#cR9+M}Ut7%2T8z0;8#T{Wffw zTn7{v3K|DR-f~G51FevSA!Pim1ix!Hu&g%$;RK3GB1&|B2kM3(EQOK_{_KC<`hV7O zED>|^%S0f_%AbIL8^y6O;?oniBnv&lh*h{OfppJ@S>?~@}hhQuRmp&C$ zL^O;UL@TZmK_vl=K{xpSOry~iER7wnqUpL}3ly#Hn)Ra?7PK24EM!e=b$4d$EzXTS zltYF2Q!aY|vvNaoujJ-sj8w5|nmQD{duZxuC5AoxD^t)QxF&LN8rx1CIwd^~q2LXfmjbdQ$M3H(1TxgqK@9Zy}(FWtyP6 z76k1dNDoUVv4hR$9d+F0!q_Q?VUkHbsc+kP07bQOy~UA zWs1S<>i{cmt0k*iMS0PD@NQZ?)^DRB73Iw!^*^+sHDiJM8+k^R35CUla0uK`iUP2=4j# zTQ@XR{}SBc2JS}SNq7Bf_IN(En09!7Hi<;A0qr?04HHwc13>s8RDM79t_#2eMQIaZ z>L_3+@jiZ5jgLs2Ta?;_!mA*fM9QG3#(nmn{-2()F2tXnv9EpP(ceDpMaU#p8M{AA zbQ-)rlq<%eDiKmE5YkWS9IxPK!p1bL-z}<2Q^-sFaXwa#<7|4cq?buhMZKFARO%)W z+;1Is$DJmXko`vSboWbY6kkGqQn!nUE5(5%9&34>O-8D38T6lgpWc@#=bbQN8o)zb>6Quhnr~_F7PYpsA9l; z{%CTJ@j~Q%{OgK|H?ZkpW0fW|p{CPT9jZ5OJUhK-l;6qeiwH`SBt)Iej?-2d>XR;& zA+aLdxdW2%kcg?)56{+x)=83`=RTxP)nw#FQ%c>iln>JiO|hu&^JT?RtLNm#k*`7F z*B)9kcC4a@lkj>zq4`x>A>(x_GXvA{^&oSpWM#hG9oTEf)ir&kbI~Ufc}1Gcesl1! zd$k@MZDP-3*-+1jdif@+18KNuxS4X7)W*=A*>CR{SZgIFAQ?N0*9^oZpN=sdP&u+n z-bCJe>OVq}^F56Fs`}_yC!+vIBkR<_{iDNlpXwHR#GaFnL^_pRS3)_@S00Z1u7jR# z;g~#!)HC(^Hxws*4N_wc`3p(Dd;3r8lP)HMAH*`;NPLWnTIj@bpGWRKw}%R5H|?w2Hy+38IBB+Z1|S1xDYjk0&U2 zym_#Fq|1vli_h4tYj~$lMMNidkT6#0bNr!rM!O~hp?Bs7ccpQ*J-X#eV$VYMg`%St z?b}$3Iog`=w;!9%dhTJF;cbBH$zI%ALk^7lDIT}szh(SPSrrne;bo`ijRjfFwfp;8 z?wP3W6VG=kP5H&fkIV)>Ekh7ZZ_%ZTSDe5?D|$W=mg6w-b;qu#St6Y$rtO#!{nz-O-mk5)o5m!pvk!V;EE5&`n8erAhfZV3M(9!z0c6?Uzg zKAzG_UB?TwoYt;sSri#c52bu-D&(2;?wfqO?7U1dkGKOh%GUVhQ#fE|TD|HA#wDRRexLHJoGZGTTAq51->1!O%oXRG9{`_GVTEi_Fr@x=v@e#RLpEyDMc$2|Vu&Z0ay)yJZ*UXZ%TjKHUd+XIx{rZBX zss$AT(nrJ|&vofaBlr$;@>6WOQ4 z3nN{BuE8^6MA^)8ztyM}=!?>AZkA?4EOx$VU0GC^$b zDuE;8@Fwig#uxFdm)p@d6#094W!m3h;oB+w$CgO5#n{E=&C}?G!o>xY*@2m_2XeCx zcPP2c6Jkni>Rev&y;h5%^q_L+U2>`L~nVnT7Y)xb$GZxRLx6 z0`T+FWQNTuk(n1Ov&QN~8@I^vX?}&uQGBL38w6kQ!qm<3#|&=9#g_Jf_MXo<0uo6n zE5j)z1CvH}xL#)O&8zaT6x#eWGrMW_+TFnZ`~>uvfAD-?Rp-e#9e2Ue zRB))p$7c<+QSN3ppMGX9jW4>d=+Ma32+@x2IX=)SSlV?vPvAF?-z)BcF>-nP?@o+H zj|*xPJ}m5AOea5gmq52&$o)q@*2s*dhT%yn0m0=#jTL~9^8YK!CXCraE%4V&MCP4r zT?npRxdOX-1%RLa^?M&Qf|s7vGqzUsGJfpgiEy&<5VC#>)3|y~j^H1O+Dq^G;sEs0 VrMKJvdOMmVxZ8n<{2yIz_ max_albedo,\ + f"Maximum value ({max_albedo}) in Albedo dataset is not < threshold of {threshold}." + +def test_ndvi_sentinel2_threshold(): + ndvi_threshold=0.4 + data = NdviSentinel2(year=2023, ndvi_threshold=ndvi_threshold).get_data(BBOX) + min_ndvi = data.values[~np.isnan(data.values)].min() + + assert ndvi_threshold <= min_ndvi,\ + f"Minimum value ({min_ndvi}) in NDVI dataset is not >= threshold of {ndvi_threshold}." + + def test_function_validate_layer_instance(): is_valid, except_str = validate_layer_instance('t') assert is_valid is False From 10b22056a1405b462b302786f9d4cb4225746a01 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Mon, 9 Sep 2024 19:57:37 -0700 Subject: [PATCH 05/13] Extending testing --- city_metrix/layers/impervious_surface.py | 10 ++++++++-- .../conftest.py | 2 +- .../test_write_layers_to_qgis_files.py | 9 ++++++++- tests/test_layer_parameters.py | 14 +++++++++++++- tests/test_layers.py | 9 +++++++-- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/city_metrix/layers/impervious_surface.py b/city_metrix/layers/impervious_surface.py index 74e624d6..ea6772ec 100644 --- a/city_metrix/layers/impervious_surface.py +++ b/city_metrix/layers/impervious_surface.py @@ -7,8 +7,14 @@ class ImperviousSurface(Layer): - def __init__(self, **kwargs): + """ + Attributes: + spatial_resolution: raster resolution in meters (see https://github.com/stac-extensions/raster) + """ + + def __init__(self, spatial_resolution=100, **kwargs): super().__init__(**kwargs) + self.spatial_resolution = spatial_resolution def get_data(self, bbox): # load impervious_surface @@ -19,5 +25,5 @@ def get_data(self, bbox): .sum() ) - data = get_image_collection(imperv_surf, bbox, 100, "imperv surf") + data = get_image_collection(imperv_surf, bbox, self.spatial_resolution, "imperv surf") return data.change_year_index diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py index 13c6e487..d933c200 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py @@ -10,7 +10,7 @@ # RUN_DUMPS is the master control for whether the writes and tests are executed # Setting RUN_DUMPS to True turns on code execution. # Values should normally be set to False in order to avoid unnecessary execution. -RUN_DUMPS = False +RUN_DUMPS = True # Multiplier applied to the default spatial_resolution of the layer # Use value of 1 for default resolution. diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py index 5e89328e..a4dd2de1 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py @@ -21,7 +21,7 @@ TreeCanopyHeight, TreeCover, UrbanLandUse, - WorldPop, Layer + WorldPop, Layer, ImperviousSurface ) from .conftest import RUN_DUMPS, prep_output_path, verify_file_is_populated from ...tools.general_tools import get_class_default_spatial_resolution @@ -62,6 +62,13 @@ def test_write_high_land_surface_temperature(target_folder, bbox_info, target_sp HighLandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_impervious_surface(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'impervious_surface.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(ImperviousSurface()) + LandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_write_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): file_path = prep_output_path(target_folder, 'land_surface_temperature.tif') diff --git a/tests/test_layer_parameters.py b/tests/test_layer_parameters.py index ec2127be..68f97a93 100644 --- a/tests/test_layer_parameters.py +++ b/tests/test_layer_parameters.py @@ -9,14 +9,17 @@ AverageNetBuildingHeight, BuiltUpHeight, EsaWorldCover, EsaWorldCoverClass, + HighLandSurfaceTemperature, + ImperviousSurface, LandSurfaceTemperature, NasaDEM, NaturalAreas, NdviSentinel2, + OpenStreetMap, TreeCanopyHeight, TreeCover, UrbanLandUse, - WorldPop, OpenStreetMap, HighLandSurfaceTemperature + WorldPop ) from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 from tests.tools.general_tools import get_class_from_instance, get_class_default_spatial_resolution @@ -90,6 +93,15 @@ def test_high_land_surface_temperature_downsampled_spatial_resolution(self): assert pytest.approx(target_downsized_res, rel=RESOLUTION_TOLERANCE) == estimated_actual_res assert downsizing_is_within_tolerances + def test_impervious_surface_downsampled_spatial_resolution(self): + class_instance = ImperviousSurface() + default_res_data, downsized_res_data, target_downsized_res, estimated_actual_res = ( + _get_sample_data(class_instance, BBOX, DOWNSIZE_FACTOR)) + downsizing_is_within_tolerances = _evaluate_raster_value(default_res_data, downsized_res_data) + + assert pytest.approx(target_downsized_res, rel=RESOLUTION_TOLERANCE) == estimated_actual_res + assert downsizing_is_within_tolerances + def test_land_surface_temperature_downsampled_spatial_resolution(self): class_instance = LandSurfaceTemperature() default_res_data, downsized_res_data, target_downsized_res, estimated_actual_res = ( diff --git a/tests/test_layers.py b/tests/test_layers.py index b48624a1..d26a9173 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -4,7 +4,7 @@ Albedo, AlosDSM, AverageNetBuildingHeight, - NdviSentinel2, + BuiltUpHeight, EsaWorldCover, EsaWorldCoverClass, HighLandSurfaceTemperature, @@ -13,6 +13,7 @@ LandSurfaceTemperature, NasaDEM, NaturalAreas, + NdviSentinel2, OpenBuildings, OpenStreetMap, OpenStreetMapClass, @@ -42,6 +43,10 @@ def test_average_net_building_height(): data = AverageNetBuildingHeight().get_data(BBOX) assert np.size(data) > 0 +def test_built_up_height(): + data = BuiltUpHeight().get_data(BBOX) + assert np.size(data) > 0 + def test_esa_world_cover(): land_cover_class = EsaWorldCoverClass.BUILT_UP data = EsaWorldCover(land_cover_class=land_cover_class).get_data(BBOX) @@ -53,7 +58,7 @@ def test_high_land_surface_temperature(): def test_impervious_surface(): data = ImperviousSurface().get_data(BBOX) - assert data.any() + assert np.size(data) > 0 def test_land_surface_temperature(): data = LandSurfaceTemperature().get_data(BBOX) From 7977d11ec76d35c4476e364b2d9badd9f90bec3c Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Mon, 9 Sep 2024 22:05:09 -0700 Subject: [PATCH 06/13] Additional tests --- city_metrix/layers/ndvi_sentinel2_gee.py | 2 +- .../conftest.py | 2 +- .../layers_for_br_lauro_de_freitas.qgz | Bin 24158 -> 25861 bytes tests/test_layer_parameters.py | 51 +++++++++++++++--- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/city_metrix/layers/ndvi_sentinel2_gee.py b/city_metrix/layers/ndvi_sentinel2_gee.py index e49b3d38..fce30219 100644 --- a/city_metrix/layers/ndvi_sentinel2_gee.py +++ b/city_metrix/layers/ndvi_sentinel2_gee.py @@ -12,7 +12,7 @@ class NdviSentinel2(Layer): Notebook: https://github.com/wri/cities-cities4forests-indicators/blob/dev-eric/scripts/extract-VegetationCover.ipynb Reference: https://en.wikipedia.org/wiki/Normalized_difference_vegetation_index """ - def __init__(self, year=None, spatial_resolution=10, **kwargs): + def __init__(self, year=2021, spatial_resolution=10, **kwargs): super().__init__(**kwargs) self.year = year self.spatial_resolution = spatial_resolution diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py index d933c200..13c6e487 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py @@ -10,7 +10,7 @@ # RUN_DUMPS is the master control for whether the writes and tests are executed # Setting RUN_DUMPS to True turns on code execution. # Values should normally be set to False in order to avoid unnecessary execution. -RUN_DUMPS = True +RUN_DUMPS = False # Multiplier applied to the default spatial_resolution of the layer # Use value of 1 for default resolution. diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz index 759515e6e49022f8cbd0bbc699ed843efc6440b7..eff75bb16ff05d4b7e2c4b6471720fbc8a5cb1c9 100644 GIT binary patch delta 23912 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%0A;{z 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 ZZbJXZr8cEOBQZ~UY|4zuVtoho`5%i&kjMZ4 delta 22219 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

*cQEYVzLS-W%>dY`NkLanLI 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

8TupP=@`vyHp7+`&LsIli*O8>eYmY|VoXkP=$9 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 B!%+YL diff --git a/tests/test_layer_parameters.py b/tests/test_layer_parameters.py index 68f97a93..a1eb5e82 100644 --- a/tests/test_layer_parameters.py +++ b/tests/test_layer_parameters.py @@ -19,7 +19,7 @@ TreeCanopyHeight, TreeCover, UrbanLandUse, - WorldPop + WorldPop, OpenBuildings ) from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 from tests.tools.general_tools import get_class_from_instance, get_class_default_spatial_resolution @@ -191,8 +191,7 @@ def test_null_spatial_resolution(self): with pytest.raises(Exception) as e_info: _get_modified_resolution_data(class_instance, spatial_resolution, BBOX) -class TestThreshold: - +class TestOtherParameters: def test_albedo_threshold(self): threshold=0.1 data = Albedo(threshold=threshold).get_data(BBOX) @@ -201,6 +200,44 @@ def test_albedo_threshold(self): assert threshold > max_albedo,\ f"Maximum value ({max_albedo}) in Albedo dataset is not < threshold of {threshold}." + def test_albedo_dates(self): + with pytest.raises(Exception) as e_info: + Albedo(start_date="2021-01-01", end_date="2021-01-02").get_data(BBOX) + + with pytest.raises(Exception) as e_info: + Albedo(start_date="2021-01-01", end_date=None).get_data(BBOX) + + def test_high_land_surface_temperature_dates(self): + with pytest.raises(Exception) as e_info: + HighLandSurfaceTemperature(start_date="2021-01-01", end_date="2021-01-02").get_data(BBOX) + + def test_land_surface_temperature_dates(self): + with pytest.raises(Exception) as e_info: + LandSurfaceTemperature(start_date="2021-01-01", end_date="2021-01-02").get_data(BBOX) + + with pytest.raises(Exception) as e_info: + LandSurfaceTemperature(start_date="2021-01-01", end_date=None).get_data(BBOX) + + def test_ndvi_sentinel2_dates(self): + with pytest.raises(Exception) as e_info: + data = NdviSentinel2(Year=None).get_data(BBOX) + + with pytest.raises(Exception) as e_info: + NdviSentinel2(Year="1970").get_data(BBOX) + + def test_open_buildings_country(self): + with pytest.raises(Exception) as e_info: + OpenBuildings(country="ZZZ").get_data(BBOX) + + def test_tree_cover_min_max_cover(self): + data = TreeCover(min_tree_cover = 150).get_data(BBOX) + non_null_cells = data.values[~np.isnan(data)].size + assert non_null_cells == 0 + + data = TreeCover(max_tree_cover = -1).get_data(BBOX) + non_null_cells = data.values[~np.isnan(data)].size + assert non_null_cells == 0 + def test_function_validate_layer_instance(): is_valid, except_str = _validate_layer_instance('t') @@ -288,12 +325,12 @@ def _evaluate_raster_value(raw_data, downsized_data): # Below values where determined through trial and error evaluation of results in QGIS ratio_tolerance = 0.2 normalized_rmse_tolerance = 0.3 - ssim_index_tolerance = 0.6 + populated_raw_data_ratio = _get_populate_ratio(raw_data) populated_downsized_data_ratio = _get_populate_ratio(raw_data) - diff = abs(populated_raw_data_ratio - populated_downsized_data_ratio) - ratio_eval = True if diff <= ratio_tolerance else False + ratio_diff = abs(populated_raw_data_ratio - populated_downsized_data_ratio) + ratio_eval = True if ratio_diff <= ratio_tolerance else False filled_raw_data = raw_data.fillna(0) filled_downsized_data = downsized_data.fillna(0) @@ -320,9 +357,9 @@ def _evaluate_raster_value(raw_data, downsized_data): matching_rmse = True if normalized_rmse < normalized_rmse_tolerance else False # Calculate and evaluate Structural Similarity Index (SSIM) + ssim_index_tolerance = 0.6 if (processed_downsized_data_np.size > 100 and ratio_diff <= 0.1) else 0.4 ssim_index, _ = ssim(processed_downsized_data_np, processed_raw_data_np, full=True, data_range=max_val) matching_ssim = True if ssim_index > ssim_index_tolerance else False - results_match = True if (ratio_eval & matching_rmse & matching_ssim) else False return results_match From 0271e197ca22ded8015a74cabbfb755f4d5dd660 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 10 Sep 2024 10:39:10 -0700 Subject: [PATCH 07/13] Changed output file type for vector layers --- .../layers_for_br_lauro_de_freitas.qgz | Bin 25861 -> 25729 bytes .../test_write_layers_to_qgis_files.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz index eff75bb16ff05d4b7e2c4b6471720fbc8a5cb1c9..1cc53ce2df38d8b5e7bd55634a44fd0b186de69d 100644 GIT binary patch delta 23786 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 z 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 u#Q}nnsf)IZm<2Y!BmM_5TXg9F delta 23860 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 arnhDK6GCk1vB)ixO>Eh4*==uNUjG3!vv%D8 diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py index a4dd2de1..160d7bc8 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py @@ -107,7 +107,7 @@ def test_write_ndvi_sentinel2_gee(target_folder, bbox_info, target_spatial_resol @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_write_openbuildings(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'open_buildings.tif') + file_path = prep_output_path(target_folder, 'open_buildings.geojson') OpenBuildings(bbox_info.country).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) @@ -120,7 +120,7 @@ def test_write_openbuildings(target_folder, bbox_info, target_spatial_resolution @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_write_overture_buildings(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'overture_buildings.tif') + file_path = prep_output_path(target_folder, 'overture_buildings.geojson') OvertureBuildings().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) From 949e097165b50c223dcfec23b6e9c1825b7b7d39 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 10 Sep 2024 10:55:54 -0700 Subject: [PATCH 08/13] Delete populated directories during diretory cleanup --- tests/tools/general_tools.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/tools/general_tools.py b/tests/tools/general_tools.py index 2e291595..9e310b6c 100644 --- a/tests/tools/general_tools.py +++ b/tests/tools/general_tools.py @@ -1,4 +1,5 @@ import os +import shutil import tempfile import numpy as np @@ -19,6 +20,8 @@ def remove_all_files_in_directory(directory): # Check if it is a file and remove it if os.path.isfile(file_path): os.remove(file_path) + else: + shutil.rmtree(file_path) except Exception as e: print(f"Error: {e}") From a3936fecd317e8de35975cc9148fc852cf031c14 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 10 Sep 2024 14:18:06 -0700 Subject: [PATCH 09/13] Added metrics tests --- tests/test_metrics.py | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/tests/test_metrics.py b/tests/test_metrics.py index eb2c4407..dcd731bc 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -2,17 +2,43 @@ from .conftest import ZONES -def test_urban_open_space(): - indicator = urban_open_space(ZONES) - assert indicator.size == 100 +def test_built_land_with_high_lst(): + indicator = built_land_with_high_land_surface_temperature(ZONES) + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size def test_built_land_with_low_surface_reflectivity(): indicator = built_land_with_low_surface_reflectivity(ZONES) - assert indicator.size == 100 + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size -def test_high_lst(): - indicator = built_land_with_high_land_surface_temperature(ZONES) - assert indicator.size == 100 +def test_built_land_without_tree_cover(): + indicator = built_land_without_tree_cover(ZONES) + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size + + +def test_mean_tree_cover(): + indicator = mean_tree_cover(ZONES) + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size + +def test_natural_areas(): + indicator = natural_areas(ZONES) + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size + + +def test_urban_open_space(): + indicator = urban_open_space(ZONES) + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size From c28cc9ef7deac8f220b3ccd7a702d2c55c427d3b Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Wed, 11 Sep 2024 09:24:46 -0700 Subject: [PATCH 10/13] Moved built_up_vegegation into metric --- city_metrix/layers/built_up_vegetation.py | 46 ---- .../metrics/built_land_with_tree_cover.py | 20 ++ .../test_write_layers_to_qgis_files.py | 229 +++++++++--------- tests/test_layers.py | 7 - tests/test_metrics.py | 6 + 5 files changed, 139 insertions(+), 169 deletions(-) delete mode 100644 city_metrix/layers/built_up_vegetation.py create mode 100644 city_metrix/metrics/built_land_with_tree_cover.py diff --git a/city_metrix/layers/built_up_vegetation.py b/city_metrix/layers/built_up_vegetation.py deleted file mode 100644 index 4c9a48c4..00000000 --- a/city_metrix/layers/built_up_vegetation.py +++ /dev/null @@ -1,46 +0,0 @@ -from dask.diagnostics import ProgressBar -import xarray as xr -import xee -import ee - -from . import EsaWorldCoverClass, NdviSentinel2 -from .layer import Layer, get_utm_zone_epsg, get_image_collection - - -class BuiltUpVegetation(Layer): - """ - Attributes: - spatial_resolution: raster resolution in meters (see https://github.com/stac-extensions/raster) - """ - - def __init__(self, land_cover_class=None, year=2021, spatial_resolution=10, **kwargs): - super().__init__(**kwargs) - self.land_cover_class = land_cover_class - self.year = year - self.spatial_resolution = spatial_resolution - - def get_data(self, bbox): - esa_data = None - if self.year == 2020: - esa_data = get_image_collection( - ee.ImageCollection("ESA/WorldCover/v100"), - bbox, - self.spatial_resolution, - "ESA world cover" - ).Map - elif self.year >= 2021: - esa_data = get_image_collection( - ee.ImageCollection("ESA/WorldCover/v200"), - bbox, - self.spatial_resolution, - "ESA world cover" - ).Map - - esa_data = esa_data.where(esa_data == EsaWorldCoverClass.BUILT_UP.value) - - ndvi_threshold = 0.4 - ndvi_data = (NdviSentinel2(year=self.year, spatial_resolution=self.spatial_resolution, ndvi_threshold=ndvi_threshold) - .get_data(bbox)) - - return esa_data - diff --git a/city_metrix/metrics/built_land_with_tree_cover.py b/city_metrix/metrics/built_land_with_tree_cover.py new file mode 100644 index 00000000..1f908de6 --- /dev/null +++ b/city_metrix/metrics/built_land_with_tree_cover.py @@ -0,0 +1,20 @@ +from geopandas import GeoDataFrame, GeoSeries + +from city_metrix.layers import EsaWorldCoverClass, TreeCover, EsaWorldCover + + +def built_land_with_tree_cover(zones: GeoDataFrame) -> GeoSeries: + """ + Get percentage of built up land (using ESA world cover) + with tree cover (>0 WRI tropical tree cover). + :param zones: GeoDataFrame with geometries to collect zonal stats on + :return: Pandas Series of percentages + """ + built_up_land = EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) + tree_cover = TreeCover(min_tree_cover=0) + + built_land = built_up_land.groupby(zones).count() + tree_cover_in_built_land = tree_cover.mask(built_up_land).groupby(zones).count() + + percent_tree_cover_in_built_up_land = 1 - (tree_cover_in_built_land.fillna(0) / built_land) + return percent_tree_cover_in_built_up_land diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py index edd2eeba..fcc4b685 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py @@ -21,41 +21,31 @@ TreeCanopyHeight, TreeCover, UrbanLandUse, - WorldPop, Layer, EsaWorldCoverClass + WorldPop, Layer, ImperviousSurface ) -from city_metrix.layers.built_up_vegetation import BuiltUpVegetation from .conftest import RUN_DUMPS, prep_output_path, verify_file_is_populated from ...tools.general_tools import get_class_default_spatial_resolution -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_albedo(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'albedo.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(Albedo()) -# Albedo(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_alos_dsm(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'alos_dsm.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AlosDSM()) -# AlosDSM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_average_net_building_height(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'average_net_building_height.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AverageNetBuildingHeight()) -# AverageNetBuildingHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_albedo(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'albedo.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(Albedo()) + Albedo(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_write_built_up_vegetation(target_folder, bbox_info, target_spatial_resolution_multiplier): - file_path = prep_output_path(target_folder, 'built_up_vegetation.tif') - target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(BuiltUpVegetation()) +def test_write_alos_dsm(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'alos_dsm.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AlosDSM()) + AlosDSM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) - built_up_class = EsaWorldCoverClass.BUILT_UP - BuiltUpVegetation(land_cover_class=built_up_class, spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_average_net_building_height(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'average_net_building_height.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(AverageNetBuildingHeight()) + AverageNetBuildingHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') @@ -65,107 +55,114 @@ def test_write_esa_world_cover(target_folder, bbox_info, target_spatial_resoluti EsaWorldCover(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_high_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'high_land_surface_temperature.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(HighLandSurfaceTemperature()) + HighLandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_high_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'high_land_surface_temperature.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(HighLandSurfaceTemperature()) -# HighLandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'land_surface_temperature.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(LandSurfaceTemperature()) +# def test_write_impervious_surface(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'impervious_surface.tif') +# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(ImperviousSurface()) # LandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) -# -# # TODO Class is no longer used, but may be useful later -# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# # def test_write_landsat_collection_2(target_folder, bbox_info, target_spatial_resolution_multiplier): -# # file_path = prep_output_path(target_folder, 'landsat_collection2.tif') -# # bands = ['green'] -# # LandsatCollection2(bands).write(bbox_info.bounds, file_path, tile_degrees=None) -# # assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_nasa_dem(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'nasa_dem.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NasaDEM()) -# NasaDEM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_land_surface_temperature(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'land_surface_temperature.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(LandSurfaceTemperature()) + LandSurfaceTemperature(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +# TODO Class is no longer used, but may be useful later # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_natural_areas(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'natural_areas.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NaturalAreas()) -# NaturalAreas(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# def test_write_landsat_collection_2(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'landsat_collection2.tif') +# bands = ['green'] +# LandsatCollection2(bands).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) -# + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_nasa_dem(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'nasa_dem.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NasaDEM()) + NasaDEM(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_natural_areas(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'natural_areas.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NaturalAreas()) + NaturalAreas(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_write_ndvi_sentinel2_gee(target_folder, bbox_info, target_spatial_resolution_multiplier): file_path = prep_output_path(target_folder, 'ndvi_sentinel2_gee.tif') target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(NdviSentinel2()) NdviSentinel2(year=2023, spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_openbuildings(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'open_buildings.tif') -# OpenBuildings(bbox_info.country).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# # TODO Class write is not functional. Is class still needed or have we switched to overture? -# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# # def test_write_open_street_map(target_folder, bbox_info, target_spatial_resolution_multiplier): -# # file_path = prep_output_path(target_folder, 'open_street_map.tif') -# # OpenStreetMap().write(bbox_info.bounds, file_path, tile_degrees=None) -# # assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_overture_buildings(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'overture_buildings.tif') -# OvertureBuildings().write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# # TODO Class is no longer used, but may be useful later -# # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# # def test_write_sentinel_2_level2(target_folder, bbox_info, target_spatial_resolution_multiplier): -# # file_path = prep_output_path(target_folder, 'sentinel_2_level2.tif') -# # sentinel_2_bands = ["green"] -# # Sentinel2Level2(sentinel_2_bands).write(bbox_info.bounds, file_path, tile_degrees=None) -# # assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_smart_surface_lulc(target_folder, bbox_info, target_spatial_resolution_multiplier): -# # Note: spatial_resolution not implemented for this raster class -# file_path = prep_output_path(target_folder, 'smart_surface_lulc.tif') -# SmartSurfaceLULC().write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_tree_canopy_height(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'tree_canopy_height.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCanopyHeight()) -# TreeCanopyHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# -# @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_tree_cover(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'tree_cover.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCover()) -# TreeCover(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) -# assert verify_file_is_populated(file_path) -# + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_openbuildings(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'open_buildings.geojson') + OpenBuildings(bbox_info.country).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +# TODO Class write is not functional. Is class still needed or have we switched to overture? # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_urban_land_use(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'urban_land_use.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(UrbanLandUse()) -# UrbanLandUse(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# def test_write_open_street_map(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'open_street_map.tif') +# OpenStreetMap().write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) -# + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_overture_buildings(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'overture_buildings.geojson') + OvertureBuildings().write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +# TODO Class is no longer used, but may be useful later # @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -# def test_write_world_pop(target_folder, bbox_info, target_spatial_resolution_multiplier): -# file_path = prep_output_path(target_folder, 'world_pop.tif') -# target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(WorldPop()) -# WorldPop(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) +# def test_write_sentinel_2_level2(target_folder, bbox_info, target_spatial_resolution_multiplier): +# file_path = prep_output_path(target_folder, 'sentinel_2_level2.tif') +# sentinel_2_bands = ["green"] +# Sentinel2Level2(sentinel_2_bands).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_smart_surface_lulc(target_folder, bbox_info, target_spatial_resolution_multiplier): + # Note: spatial_resolution not implemented for this raster class + file_path = prep_output_path(target_folder, 'smart_surface_lulc.tif') + SmartSurfaceLULC().write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_tree_canopy_height(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'tree_canopy_height.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCanopyHeight()) + TreeCanopyHeight(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_tree_cover(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'tree_cover.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(TreeCover()) + TreeCover(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_urban_land_use(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'urban_land_use.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(UrbanLandUse()) + UrbanLandUse(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_world_pop(target_folder, bbox_info, target_spatial_resolution_multiplier): + file_path = prep_output_path(target_folder, 'world_pop.tif') + target_resolution = target_spatial_resolution_multiplier * get_class_default_spatial_resolution(WorldPop()) + WorldPop(spatial_resolution=target_resolution).write(bbox_info.bounds, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) \ No newline at end of file diff --git a/tests/test_layers.py b/tests/test_layers.py index dde6260b..27cb7c5d 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -25,7 +25,6 @@ UrbanLandUse, WorldPop ) -from city_metrix.layers.built_up_vegetation import BuiltUpVegetation from city_metrix.layers.layer import get_image_collection from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 @@ -47,12 +46,6 @@ def test_average_net_building_height(): assert AverageNetBuildingHeight().get_data(BBOX).mean() -def test_built_up_vegetation(): - p = BuiltUpVegetation().get_data(BBOX) - - assert 1==1 - - def test_esa_world_cover(): count = ( EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) diff --git a/tests/test_metrics.py b/tests/test_metrics.py index eb2c4407..ab4dc0d1 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -1,4 +1,5 @@ from city_metrix import * +from city_metrix.metrics.built_land_with_tree_cover import built_land_with_tree_cover from .conftest import ZONES @@ -16,3 +17,8 @@ def test_high_lst(): indicator = built_land_with_high_land_surface_temperature(ZONES) assert indicator.size == 100 +def test_built_land_with_tree_cover(): + indicator = built_land_with_tree_cover(ZONES) + expected_zone_size = ZONES.geometry.size + actual_indicator_size = indicator.size + assert expected_zone_size == actual_indicator_size \ No newline at end of file From 7bc35c40a58fb75455a33a7ce71c20ee50f33b7c Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Wed, 11 Sep 2024 10:51:18 -0700 Subject: [PATCH 11/13] First attempt at metric emulating existing built_land_with_tree cover metric --- .../metrics/built_land_with_tree_cover.py | 8 ++++---- .../layers_for_br_lauro_de_freitas.qgz | Bin 26777 -> 25729 bytes tests/test_metrics.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/city_metrix/metrics/built_land_with_tree_cover.py b/city_metrix/metrics/built_land_with_tree_cover.py index 1f908de6..788cda46 100644 --- a/city_metrix/metrics/built_land_with_tree_cover.py +++ b/city_metrix/metrics/built_land_with_tree_cover.py @@ -6,15 +6,15 @@ def built_land_with_tree_cover(zones: GeoDataFrame) -> GeoSeries: """ Get percentage of built up land (using ESA world cover) - with tree cover (>0 WRI tropical tree cover). + with no tree cover (>0 WRI tropical tree cover). :param zones: GeoDataFrame with geometries to collect zonal stats on :return: Pandas Series of percentages """ built_up_land = EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) - tree_cover = TreeCover(min_tree_cover=0) + tree_cover = TreeCover(min_tree_cover=1) built_land = built_up_land.groupby(zones).count() tree_cover_in_built_land = tree_cover.mask(built_up_land).groupby(zones).count() - percent_tree_cover_in_built_up_land = 1 - (tree_cover_in_built_land.fillna(0) / built_land) - return percent_tree_cover_in_built_up_land + fraction_tree_cover_in_built_up_land = (tree_cover_in_built_land.fillna(0) / built_land) + return fraction_tree_cover_in_built_up_land diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz index d226ab223498b7a9e9109a234fe5ad51f1a478d4..1cc53ce2df38d8b5e7bd55634a44fd0b186de69d 100644 GIT binary patch delta 23853 zcmag^V|XQ9*RTtxyVJ2cwr$&X$F^;&(lI+7TOHe0$F`jn+ve`;zOV0j-uK%-_Mdak zQ8mV_I;z&112s~oKm8c~gsC9&1soOZGZ+*Yp$fHT;YLVbtu`2#P*E%ox``hL1UZi;@z=abt32^hC z#?0Ij;@u_>+ARIpOBRo1ZQWiFb~rJu=x>vysvayZHU%9HH0d6%5HlyHm#Z%}Tdy<^aNoZ)aMC{f1lo4803R2PH@b(Y zwH${dOzN2-&L66*s*6>+Qkg)vCMw`$L^O1#tTIej+s(Heq<_4(#J*5r67F#4Asc;*5~1t@(4iXA`D zGJIa`c7_Ey5g#`3K2A0^o4DW9$A=dVu*aMDla*RJ3`*;l-c2f&7AROoY&oAE_eL@7 zzi+gA@T+%juP9VLqy|q=vl;79cYa(y-c?szA#S z0V$;JG*NV&pTSO`o_gHx-`Njd$m_Lxz76WNJ+yQCeJpY~crCYrxNb7l{SsQQ9O@T; z8N*NKs(lAG_X9zfIfDGd zJsI?e+Jk>1ZiDoM0Vj5LVgMzPc4WYPK#0H-37i|ydDz;`|MK!44*;L?`eFt@TAK*0 znm+c|otqI*b!T}_ZuEPfOzDn4+t~g${M7 z%R?_GG<+mhgb%^Ph~R}et=!!I#p8EYJCEP>;D)lmJGgEa$rA9fcwy>TxwYt5gegB@ z?#BuoW<2>dafW7h#?MjUTyK83DrKF1FhTozbg|%~nu~Cfo#O6$wm43Cay#j_b_7mH zA)(`6OU?DvK?6!-7TXHVO*$nd)^DbiV$|hX zBtplP)79lRgv{V(oX5BjUqHItnj?v;Ewq|ucb82(cy<`z8Cy%Ovu2N6J1Akz4`jG^ssUpg4$MF_Qs*c zkxi+arlQNQ@Vy0ZgHA|c5iH5wBKY0CS>47w$NsJ?6z{}3QOA8$R@upH;g5*O8$EYiig!5j+^Ih% zUN?!=%bpI41s6;iQNoMdoaMkzf~Yo6WikcaRxdAfjCBSFEzyU(mL&FLOHE}QSJ&p^ za-6yC>ae=s1Z`_%{7uvg^y9{{oG99isK!~|aWHx9ie@-`YTN9VwcI<}b7WCY=W~N! z5L;7SybY(qCVf2icUTQQw>x66oRM2gjB4`I`od+)CuCvX{nv#%PO5-vp`8<0-@xcC zSPTG0UMm9uG+->_IWfD|AAtQBL(bgD&oV_wOd`riWa`wijgeoee%}+mnG-OXv(wl8 z7#%qbWhPA!2nm;rXcrfQvWHAj5}9a3jLwWv!y?)@05e`P(k@dwI^S`HeUjK!v&6B4 zy6)hd(<;T(W;i+%bqTEXO+m1u3tujoDD`=cJQvr9Op_L0)p5+Vt+^d$BR!m8Zw=z*uP3NkC&9ByFJK7=Bk%jqO7B zb%|;tJmHe`!7Q@Il-jPtuE^XczLgfE&WPi>GVEsTaIMH7Mg#czp_m$GOK&rlIh|p7 z*rsKdHx)7_r)8UQPglzRvJ?#~fEjqRVthrlO3RC6yksN z4)jbxw+#4bUlb@Z%~yZ-Nb8$8;7-~ama#-hMQW)C;ov#F zaqbj~mKP7lQNh2;zhsiJ8BqGHT)@m;o@lmJF315fsbkKb$LxOYRM8k*xoGp!Zm-Zb z&pr8c$qT44&yHXtdymd)>}vIi=R;%8$ZEwp^zWjtyOP^?$eS0fakw_#bLbnM-Xd(5 z(7e*P``K>@`y6AWxBaQ=1zAoG=1$b)63cW1Gr^utYH%hEOze5mT8_->;Funwhggu+ zC|er3a!5+_=N5gZtiKNm#~99z=w(rJt|VzmNu=(VXx+reLw+b7Gbm-jUZx*ICl2 z3-Ao71pEd;VYlo+nu6;oyvq_=w0}HmMS4ht7DOfe(anBWWv+agu}B;%YyYB2cJM6o zMswlug3(kKd2u=5l;}^>Dqkk5JI$fNU}e4Io)|`>;a%2uYPL`wS3MhXX7#C!Ub!;P zDLD9dqEThzagE`hC0i%WlAJO+_DW>eejr&=PH{H29oxSwEL)Z2PLavs;D9Kh@Nx$U zLes^dlj;loXh|(pSJul75)7*(gI?md`RXp13Nwd*i@j+TNi<^?f>WOLZcgyBLRB5b zn{uaZxLI{H9&mwyUi>Iy(=DX0-Hh|&rHY%%?!R2Stx}rx*uIV*w;PzxwXM24RRHs~ z`+TaofN6BmLv`+PsP^I+wRQ1gCB|*4oHQS|&N0E>dF(}Ejgc50x4^0HZD<~n>wTqf z{>6kLV@|0?V_EJ*@}loVW;{h)tyUaRMw~J$>Q=*40y`Ls_&-Qh#F7p6l7ls-7rk4s)?K z1N=_eIip?B_r4xg%vZ|2CET_zm)8cKjih5HD%P%=C(_?^yWUrRu2t?P!9WOrY#xs= z^y!s(apWO(_O+0700u}rRW`fCfQ`g)4(&+wXzY-lOuH+i%YEa^^w**p{CCa;m@_=Zx8c%pTN&8vJvzL+<-JY2X9ryH}>Wc#IDx6fmMQpu@rp_3x4yEEJ zUF+*Oh2xjvMVv6kE^E3fn3T?#(hjS>N8OVfL)WDfvCz#1!0zDF)PrJjo0#`z$GKL` z#Dnq=o=}g?7Ibw{)=e2zJ*NDZ%DWa!=e5fkH&s*B!vQwW#0Ply%6>Ga-Uo$vb)Pbq z#T6Yi2_J&&t1<|s%?5sTG1yHBUp+RR=aa*mckbji2$9W(cl12}i#&uXOzdo@z2L*xpOA1ue+?!^S@|@27o>vVe9;hj{tPn*x!p8tA8C z=i*I0+_@N_oT#JF^ zWu(nrmF>L^L^9#Mr)2bQPe@cfre2fMehAHd1g9+Esg6x}!l~Uq4)exQOw5k4WKS(WEB#UU8~WOGig7Oh7AsQ0u3V zR`jq|=!jN4Ojmc#<4XUzOrE1OJ1uf$*3$uMKW}t_uGWL3aNOBK0T}gESP#XAF@t`A zLW$6dvm>bsAK=l^Yrx0Y>#?s*(TkmLV<|1`(rxYys)K=b?bciuBo3I`1(`kXuN5$2 zg?iODmMQ1R2hw_o<&xh-6C8&&@n8}haMeH1Lf8d2%}0gOxXV@{ZmcwI|BU_v2L+qG z+GZpZjx?(h7WS>Dfpp&=wlLZ>K>IhVdgL`3tHGk#o-lyTT?$^)nMWKSNs5X^E3ms9734G?tza8y$@NiG!diA=m^o#3 zrmn)lIi@ZtJ)Y(~G$+&PuDL(T|7ykH*FexU6L0@?9WB;Hrr&usu5aq6bAPyr?iUB2 z*K!an&&Pe&#(8HSdJvz5<7%*w(u^<5Q!v{wS5dg}UO21%`~f6@ckRDFe(aLBe|%+l zBgefx@!EGa|Cqz>#1sNgPR?WYii$Oc*x~&d*8;NpVU8K7=AUMj5c;ignq?FFhch8 zseIQ_0p5K?(}DN;QTgs$kRecV*4TZ2->+&%;?mhj+KBzRSvD+u3|{ zlF9GE?B{s}6Ea8BOW7#yBNJ5o-x7=!`*t(d9Wh#z%3ZseSxe0e*r1!pMfVTGIqOPgwq%+{o$6+n zVWUW~NC18m9TpbDkoEHI#;{uKS(#i6CFIwOqZfOgYQh=g5ryAeUt(faqrl54UX)1Z z8*5BAssD!7n{D(;U^y;Q?Y;GZ7!{-B{Jgc#O3{0#{DF)j&!cMp2*JEu`wbBvQi3+_ z_euWLeR?10vVFgHm!f_#0j&FwB8-@OJvYd44&bWb1XHMrvTMCA_LC}uuzy|yr_%gj zQO$yHvD8t|xH|p28#Dgbyb}lI;iq|yYz)zf%3lcH9acWe9u;}L9Fb*Pp~)Lw9up$X zf>X;pH8f%XewE$%SpH``YV4H)icBWb*++(27q2yew*Q zYvLPbtjJpFLsqe(C8NQ)8wU|nAB!ITBW{jjR~8rfs{&Q6y?R9)<;0fKLB^bt_m!J4 z1_Rj$+hb_vOk-z=!C)`Gr8_ylT-HgIoPQb z0c6W&AI)Ek(5qD?W?e@ZHdt1KMuV$?1%EsBoCf%mG^h)cl zbF=P^1o$=~9_^Ky&90zv9s5dpnY7)wE;aVJZ}P&#SzM;%eKV->=*~{I(%`K8oVu z;i|*{ZU4~{%?3ZMCiRwfzFiGNo@RN_o6}hYKccBJ5`qZzhw`q|dm|$sKly^f;NW## z=3z}DnPL6h!Flze^2}@A74V*|?P+W|P-3!Wsk&3MdPZLCwjm&f?1T&T&F;W#Pe1e8 z8#M3zGkJ+HfzyRxxi##-Y^4G3+G(YFKW@@42kLymMSdxyfFOPZ3A^hRA1b09YIJ|= z{*&7AiOP1QXitq5XBrl1sB{D3DD$jDA6tI(v>#M3A@yI%ud z3&#F znWG#=5#1L1Jhlc3u2JH2P%FFrJjeK;zumd+m7nD^4O7p_PJikwN+eod`-)gfknwXe z;AHmKgPB5yQMztxDQHMHp>W~$Z5tGEuFH?CYI0pjVe&qe1w@HZ_W8UdJ5`kWD6Vto zu{n%2vWI9A$nWGc*N>8q|G)MRjDY{jrSJH?E6c91azzh^V-&Q8EslZ~Wcj;X z(O^&KfEgz(qaXH85!3&Ti*CqdvNh9Ln^eJYu?wfn*H&S&j*oxRNtOAG21Ov$SkRoPIG2EjDb7X~plzF2pD{b{ zt}4A3VsR-*24$u~+4`I$T@pkyUXU2^r$oAxuD4j1;cA&t4c98p3(I>l{<4G*n*s>m zVS1o858oc6YN7Xd-l|4+0$aCUY~Jg&{gPBBvnG|o?AHQqoNzTN_qa#?>NMN?=rlVH zv{~LPrnCEXS++57>h9pkt3OA~iok{OuOWf^HWTkYITQ&V^rC&6829atv=ZYE)lgyN zS+S$PwdOeVbBvw@$y)OU4f|ML3<8E6x=68YlV^CH7p)!lmDAO_px%NNTddH(>wJE> zG~211&Jy;9IispCn#%HOzMr$zP)S}^N!CzZT~S@EEw8lD*6nR=eap{Kz46qTetETs zu_{a4OMuP8EK))d2{zGUtjtXe^A9K7-Lw7-kio*5vzKdP!O9gU66M0d0`?KmhT=|n zXt4v*mZKas`CMr+aZQb}0&k_ye9WA{|WV>?J?qqy1(6d_X1Z$dr~Vf>(-% z&q+&zSnhhI9SY4k+z!NI`(1{sMXlWdVr&Fat@@Rg-~0D#Tr&bD-M9{ zKY$MH&=IF%prSBD!z#65K!IEe%F#RmTPT&0P(9f7teTPkB6#olFxjc3 z;eua3h=aCxvFs47ojE;>4k?Uq)7h%!E;hKMP;PVl7e`z7=b=2DsC=qsBpn6Gk{~~=^;+ibI=SR z*q1ZfAl;YSR(T)am3x0b-Yt>&;KhTd2s||{-jx+{rPd`Q!$R;*kAo7LSe2SNK{p5a z_Demr?)DbDvl(_~KhoYTU#y?b#YFa^QaAM!93l*)=asy_WKwhfj5b45Bi#yiuJXlll!DkX5&2F)tQ{)9a1<{(Wa_4wZd!6tSJulYdxe zDrO|ju^A?G8g;6s{I+y5)g@$-OCkmi1HQ8zeXz5U9RCzC`^bU4)!Fv8m*77`Hzh8j zY_l!XnEnn!3>Qj}ni?3qdUj9_)$dHRDvuS>x1;eLFS;vy!Sq3v^>)nYHuPcTn& z)%E@5;%LZJ*W$V(oe6Gabb8r?^v~3eOE&gAEB0uN#DoBONw;8vEo>~LL4+P*VRc2+ zKq8xw^I#yvi)%KUfWIX=zni5@Ro+v93{jxFFowHciLjW|axGAlEg1C56-KizC4(bxVPQeH!e3;CK9@@xHep^D6>ds%7^1}(+(+sc0mPM#wwl|O)2*8ig6Peq6ldbT0^a`K?`=j+1TK9aZ)ey zsklwLX&~}GB_|zbiiWm$(sR!;8s)=JgBZWKRwEr!^ppMWWqGb8h0S<$l%%BOJ|JOi z6M)>QPT9SyTH*K5oF@|9n4cBrnt?p+HqbF9+Dc7FeP2deE9^D_IH{sY8FiKt`D2rO)-I9yByrGYb~DZVP!jcgQV8hx76F}euOwsxxJ zx@m*Nj^vFQB`F74`8|~O3Cp4pC4FnmG=;5DGe(SUSasK= zzl8kZKAW7ksP`g^iB|fUn3fX9dJvGQrBZ?>6dA(I6Z|;9QmgEsiIpKznTHa(m+}4? zgbLx9P3cWXg2oPb{D(1vQBytD^ z_t37f>LUgNB|nu*KuNi1hXuD$g%0$&)oRu?jPs6EXe4Q0n->sj#g?_a=r9VoD}`Yd z<-(SOVM%iI#M2uLQjVM16CA#h5Um$%#D#d(G?=6udw?xd%8NmXtcrOk6z5wnGu}Cl z2$!b>3|c`h!%&;0XuyV+#GvHTl7uMM%5bRc|FMz*7PbvXb_TE~;EnrcbhT!K7L45J z2nxCFXhR`29X+WYpq?0qLWTI@t_^=72KuDD42CMUT^XL*UK*0>s0TcKP6CVP=nI{8 zh>L}5=loKLu?ZChEj{bNyr`tuMn?#dMPPC3u{G$(d~`n&zE4Zb75zWoqnHu6AZmaw zWz6y>My_T`mq@1&W@BE%O_8yhfG+8%0XeIgu<^f$GyO#yXo5vLn!^`-kGi64@jaI> z_#c^26JnTIGD)ZwjvDdb$$xcIU$O%&4bE#5j)ri~NeofYmswq7cUCOvQ9wbWwQ&C^ z-Bb@T11hz?jO-63plE;F<*-Y7<3167N1jXV5FM5EAt9*lHMsw4)&E>^Kg*jyu?al(zjwQJ`tyHoGC9t4DAV6`>4#|Tmxw)~xe-#Ne_sNHuO;|KSPQlhSP#gRcTYeUQ4I6V6rDHU%B(eJR%^6P-Ry4&r z-0DWZlB_h^dsz&X2PrAC!6EsWF;A4azl3%1SG&L4vLbVw?yu7T6AaQe!sV~S^bawo zJ?^fBcV8VTl_S%q^mYfBejSFY#b zg-jX=>wvGRbet_Db$^E;8zD29^yS*r2`7XbmdCJVa>7ygKy^JtNct2nmyZj z>Bx(svW~&Pt3#tSHhHOox3-;~$K~|RpPS?HgIw-Ge|a>3`j8lab(HaXw;o!=klpUL zAt^oSOTRB8Z{yyQ;o|4}u)CX2$6=^xx1Rxkb++jUaZhe^c&?(K=qBCx$XhP!mXl@{ z5$Lu15C9&lQ^L~FnR!sV=SFB@zSrlRemC^|o-e!W!;Y`3f4f*NvfF{Heb>OFEgNiR zkD`{tHhl>ZnohqPZ#b=ReO?~B0IZ&_REv%_3lVPnn9UBa>*vS2m&b>{G00~B_f3Eo zaP(pBf*Nm->N_Pidx+GSc{;gjEBc;=*Y)Ip{NeY?uXoOIgqvgN-u0O*|K@mnSgPcA zGDFte-J`3r3^zso6{hVk{ey@q4;KbglWnmg#>0D0-%3{X9DQUpxrJlY~Ce#;%BGIirM+ zg;T~-$2c7{EV8O{$NsDJUOhA0OOemEx;P$`w1+5KB`p}>dv-A?^<()cCG+S14ZlfW z?C~&Y2F|=W3U*|r>mfz5ydW|xDP3t->ds`~^tQ?t(#VOMyvW#zd*Uo54v{XjgE{|LvgeM(9Nq1jiSG$0XN8*xD3tK!i*hia{)pT z%lH00m(w{wevAC64&dgA+X_LV^w)!OEYDbNkcvExwG`TLBCI5>L7{99yCKo%lxc0C zo-12Re$ht$*_-z#D3?gu7GwF=-*Oncwqkr&hw9GJ$ny!8x*^`d4UDD4)?#fah{72( ze^pH=(V&)aPK;A%X@@O6%nCqEPb;Tw@cB-cfu47%&U9mBj0zmht!{p{51Z*(vA!>#x{o@qUMtr&%hnmBHQBz+lk@$yM3M`%NQ<_>Zoo+!*nmhA z?{O{IR?!^Th0nEQ%`hSTQa6U#Toi4Smcv@DiS;)|0ousY3vqtY5wtPNPcYIa6<~o{ z!pU6O(YFo<$>WJ9l=0(`;&>g6_jhgko| zCi5Rzbdt~uVwxo^OK6Yi-^qVY^oD&;G0b!!To(UFdV*GXFWS|`~%aB8? ze+>73i5}6c#r<7Zq3Muy2J{aB=ms*u|Q=DJ;L>v zBk?9(Qy}~I&f-0zuPvtLJbnyKhN$48FvONzUQ#BWJ+586Veq^V*gZ0rj)u4}^0ho8 zDkY5uN`0+hc1a8@vM7x)=c-(@X;gVXFqtqo3grR+@q@oM(#H8uFq-uh%ipjSTy+Xm zz9GjhD}HkHSN@C$RRHcaDv#a7xXsdrE}%>hdeB$vzpvQlf`%}OS7$=!SIBEuo+K-y zz>~-m8)5L*(U;V{p0SfR< zP*`N=_y*iVuTVgF2myaaZMaU6etzK63G4?LA}kb`-!uQ$K;2lgOVbzU9r2LIHaC}SS^?Qk2mEWWUy%O1 zV7s3P5y3pchQ0{m|9Nw_Qc5fw5zWHJfhPAcX&E7=D{!aUvor%3qezJLu5l4i=AS zY__%}K@3jNQ-_i)nh~9q{?`|OT(Dg*LP#(!u%SpU&?q%B zw z-kUt^a|4b`SHh&h%g_@N`AtCwLFl@Rkmxx-11WIVjc9j)4Zn)UuTzTW1ocl$0{mOq z6h`>u1f@ndIDT+bUHI74YcPyjbZlO`=Bx-?3Lw#Jw%$QyNo8scS4Yoqjq z0_Rh*|Hn7_mLwI;JSd%LWS}H5ApuL=pcMrq##Ix9Gm3?ZF5254MJoPBDnt7hUgZFm zx&ylLSVZ+tv%f{mZo12z|927de`}b~bD4}{a$5;Fzi=1ueHUh7!i_sC6O2A3x zOqDdE6RL!BGW|t!Q{Bw0|8cVol_XRR7hsA+8)$$v#wSq?=f&oJG!K;~1!QVsk>0;M}aj=5nuCK%`u{t;OHIFhln zMd2xk;q#8v!U>qSQmuhDSYB9`PHH+?WH%2ef49tn=^l#?ls+-(;uKcve>TlRC|(?; zI9)B};HT6jav$<|^6VY{(w#LZj|nW}HZY@vkaTpQl!!+rKdsmNcqfX6ijFQ;Tzixq z=D7bB25+zL|symAZ z=5H<*gBnTk;NLh;jMC1QWGQA*)FqAky$Qp?H8`H?eV%46=gL^H#oDwg2`+-}te<7{|w{3)k5!j6Rf4bIx@sQVvny)MgVthcAX`j>{_ zQ>Pg)PI&63(+nlFWJJ_1AR1ZcX3)s`Zzbw~D^He84{Ie-O6CPJ@k2}y^3jRp(vs37 zaW#EPaRn;{o3M2IWjFy)kwO}9Jw^^r68{WH=z-NKGKNgM@)}I2icE-jXd;b-{R;n< z)u19;6cyl>$HD<39zoW_fa0$q;#gX?Y(=tVNPMOWtP$@BVk9^a%Zx)ILhNw0hQHtg zZBpz*;p2Tz2Z;QecrN+Sv%Ls-PFh?qdr?M>3|+BBbZ0dbV~e;!^3x_?2+gFn&XkOj z=tGM!Wo-xM%>ISA3fylaB(%Wd|9PUo-|s5_IUw3kNDZOL6c+LKky7s$Dl*xcH}mH0 zMg`Gx_&Q+dpWsc1kytO~LJ(YkKd_oV6(IhF!CYvaHeKZGuJ6 zfX%m6GkJ)JP+i6sdvJM?`^05)_+m*y&C+0iEX*u6z*B?}n{>LIXj{Q_mLC!BMsxAT! zNyRqzF7t)>skLdgkm{knXKm2+8HFChfM4O|uY@MibQLlp44p%T+528JxA28oa#!uv zI02f=3BxK|?gJYkH-#}6a-{5)i(A)lRndE_+W^^CDcI zWj5Wasme|;58K3o;X)xwn1XzW>mGN)J8n9ARW1uZfLfsNh9^m_uwcc6ab`*n@L5JQ zrpb^M)H60I)Wuuag{4KxH#Au)yKs&*FeQB>`{S}KR@jjG+a`n)G2B;I!A+Ks3sNm*JM2D6 zJLKt80tZZPf#N{zspciQdRum4fQZ^yZbqJS48AT2t3Po?%7sxg?RRj_xOh1oc7Mxn z9j%~8!ahhMeyA&jA9e?CH9-e%F^>{dLLQcT#Py;5)T|GmU4Egr513v-#iSDM zM~UpD^^Ra7(qtAZNEG6wXsl+3ibru%Q;jLI%FG3lz ztsRUA7)-;>d!*lu=(xgzmA@d7017?1L6htTOv9<-_MS2)x2g&j|uc!uY`Zny}c|fY9?@xX1rhR zIZVmlnXby%7F@rxjTwB3n+iNC2l#RQRdJB(o}4iYg}ujE+(-A*C`Pqv2^2-{K@6{& zv6-Ez{K$3?bM?OnytynyB^%LMkt@BS&GWfUX~u@=bz-0G&LilMfm0>XNJ1?WcrEZE znv6<^*4A?u*Kz2RS}NmD%o6VM1lt-jSnjq}?u5b`}77&3YNa>FU~Y#D2K4*S4$x(xi> z4Sj4HO`@MTu|=NU26R;7=q7wi3*AI*$layjwXdu&zZ(b@!nlRm>E6ISQ*ayA7hVk# zn?;8q!sW_p(3b)br>&~?Rl>@BJ-jltbTC?b4?2)t)F8sfrR5kN5*@#R`e$i4o@Zl9 zx3(~pdHYs39CSLq{PmZ|j-C*7yx1Yt7xf3v2Ya0leymPHKQHv+fkrpKrG=<1%i}c_w5_5n`T6*#A<0rx@E(`LG(@$ zk&=wbrt+EvD4_~4K}v)P+dqV;!0D3HO|Z_wB%wv636(y_B8Mdi=7STHAyGM2=_1Fm znE9rO%A0J(0VZ1F6QrJ`8H`-tm8BA2?S3IIvg{y1Ierm@l0NK2HbtILT`^#r0$DBG zY88GV#&dA$kjn4%ak8yE(sTDZORjYYcpE{nF)}%(V~Smf5+erDI#FT7P8z0jen(x0 z`t7UAv2#}b{B`Qj9s2Wjy5>>aaQLGQIuAIXKybyQ53ppbAkv9{QZj#0S9yX6iM0Z0 zK~R4hsBM*)-XJ7AzwHODVCib1PakkbUGY-jn5|CjC!<9prmwC^#8Z*3=gTU*bGCtL zUj|pNDq3l|VSF2_Dz2Rf$@wPgn+T^i7T;ZZ)aBw4A2}ealj~o4BDY!i&@)$O05%6< zR8ui62{#asnO;*Imn$brKd+F^aFvX$@YtpmCf4lCW9bxQ#C{cP*!O=-)7F8#|G?*`K!H)RSf6fiW|9s>f#+Q8QP5<$YONd{CF5;@3w2&&*W1hT&$L zH~i+n$OEh2;KNeKjpE=YtYTtHOhSYgnb9aE3gC_El!}>^yy%(T5e7f)5HTWnRuS>db zaI)V}Io$q5GqaMF<)TFIJSUnNd7$eKV>Z@CC9@ozD?=7vW52afdz=vwcC$#oCb?vT z4QMqaluS|OoPo=>P_q$5&DYIk|I;umzA+BoWofj@pK%dvzaDzAsvb^h$XVjfyAtng zGVLsY+2i`T5!UMHLwHQD2she52IBPQ@WD!k-e|v2?I4}|F5oD5(mU%b_g!-w%GmVr zgoxM{Le?0Q2OB1*LGZH!r1HRB*GB^_u-O`eEnd$l7tC~`$dz}`GY zDA)&vgbI!z@fyc+AtyF|VmS5Uj(gI(2(Qupo}`uG!L+P(or%}aGBb+x_#L_e0BiEo zTHhzVJ;`bLs-ZD-p5}HZ&o5_lEY}ir)KihTYQK-I_X}KF(+$5<{u)Z&pM&`mJuNbM zxST1%d!V!mX>oy~;EK4)HEr(5bksGD6nTqQx(-Y3?!J<=9c{@j!i=;XYt3$0LqNr^W*cNT<%+?<)qGOOwV2r^q-8}=!uoiA3qyuw!r8>QHR$J_1(iai;AQ^Krco3#N981af7)%w z;Md>PM`Y2j$DEF?B5Jrjow|L8BAlZW8xis2lzOQW_ z!0UL(9vrN`;a^jU8$|ndtlg4beR(8~;RwC$dFfl3fV?o?m3W_upmqt7x2nXgq^agSrcKB{kzvO_3l_E!$=$!H zQ;4c!SU4?$E$Dj&l+Grq73A41ZDFRgB*Zy&aX`@F^&^`01=U}naVza`~ zRC%B`#evx@(NNxNL$#syO?I+vu&2bTuA#a0QAtOV>tAd`XT8wAE2Sf+rehZ*5I6i`3PXZhLD?L?IkFGlR_oO#S;pFM8{#uI@Jag{(R8 zWxYC@Q+yjj6O!#OQs7!YQXcO+2ZGTrY@e)TNH*4W8o6{frqQ&G&(?M7*c3L$$uPv9 zaJnqGVi@js#QFBYM=HFy<_btvpNWIJ+Fa*#M;ZqU&LZieM71$=Fufb;n^;%Msh4d6 z(VjQJJTp6haQ7pR-0U6}RIrg$(un3d>TCU6}@rQ>}KZ8jg=;;Pj)UD_FoQ?!)sb-8r@Q#1a>3CK-vwj(Jg&KW@ z-7BcQ=Qdxby$Rf-3`vUW@ARNEjGpl1;~L-aqLTu~&%Nn{&fa~*6lMC4&siCk*vAkt zS_Sh+*q^nXFGofgDw_44sB7>zK1x>Hn-7iXPU*9U=Z$_wTsiF4Jt;5mGKs|ca2~r4 z^kxyXSQ)xLIk->ZRc)k)eC<6>H_5*)Qp43$Wh8yiY`a?as)>ntA0(K}67c-kjRB5D zKWKnsmEz-U?s!N1)arxKj*bq3_xqE`cqI2(2JR9Zmx(orO~=e8j2#wC@$2Cn?C%5S zppzU>g5IQg=HI{C>5Zw-(uc?+MA{^R-y=u_1Om(8V&Fb)rltATUO9`C;e z`KMNRMqW8S`qfT{ylaJHK0#~ew*!LBsy_xin&zJ>3~kGh=ksSV>Csi)R6_bXu-XZ- z7>3gctoj;sO9vAR*e#u0e?+(HXaXjA?CMF)qS-W~w3aTKKO{&5s9t5%qekz_=#tY` zgVE*A*-lz`P^~6rRxzyQhgXxWCc9RX%WU)EzY13_QSU7f5KwN$B^f+Cd+9S>ya_^e9jRUgY5g1#yP87@!ZPU#w;+v9 z))7y>)I4^p;=VgR4kA|CaeUo^RJT74EDL=M=6@C5?06L>@XJ6Hmd>$SDpH9v)E~>8k`^q2;2s3ndm$Y=J zfFPaHEieq-96Ch0Ll6-}kPgA2k&qhc?vxxrN<<&@x~}KB?&p8M`kxnTul+e|?Y&=| z7w4SyUB9;IGdC#|ZMb=D75Jaj?!?p8KewTzvWc|Y*RZDqspU+h9EpMrj!bOo9n8s0 zYkoOyM=fXifx=Xmd)aQ__}19OqeqQTvKL9IZnvK>{2{VD`PSgpwq{urk7ck3CW4U) zOnG(5E(rew_= zMQ#B{h2nE^W+9!3V4gUB!NBLF`?BH7Ti4H&NP|CPPTQd71AWe1+Bk!hc2H8m9^3k; zGOy`({u=$`CZDxhTf%9ng^FP|jWocL&&ZBfNaDracrcB&7UVwkJ9pX6*;?pwPd4Y8 zhcJcox9dB!B|osW&tyxZy#=PxTl8IM2%`Sis_4xwG(5e{%lAUw^hk#d7Q(}#jYGlLlCLV00IE9j3`GT znwJ6%n{)Rb_Ps$guZ@Lx1F=cs3?#YGv#H3O#N(;RIq2b3kG@3NBaaq_;bT0bVBt?E z2-;Uo-NZ9>-4ACfyD62_sLe2GCcA`O=u}+p>3+=HsL$YUpn*2zH|dI!P6iZ`V3vI^ zIl{iwv&O^bF{eNd+q3;N<>eK*{eELCPD_gPwRNPN|K|n2BD=^pHwv} zzUULe5+OWu_5cR6bVd$Eo01R}Y#>TK=|P0igMeTm&w;5RsvxlkFARfR@r5zrw%k~{ z9b|>h?6Apr#s9_!|BZeaENio;1MuSJdTo3WJ(UJuX-*iOMa}czehjuUoW&;Luf=>% zV&PqNS)F>;mZ^e`>|Snm+PS<+Zyw+Hb4}HDfOfn;D76~5Ej-YyT51b8ZKs?`{V!4* ze6O|e;>SYbxa4Hc3tIhd=8qAnq^@SaYNih*tAK>%UuU>^W{t3Fy`b%M+TvBp?78xY4T*5R0a8=pEJpWW37Ch|tDT%Bqk>=lcMH0wNF3Z;%n*r- zHo-T`#Ut1%KDjE^zL@m7!4atNqo-^bJ_Ofy}hoTinkS??$Xt|2Lfpbaan~3v{9G z)M-DhZ!7kEZx6|8X|XUCCDzK$n%qjVn_e^vkza@dSWi|MS;PQ#SNpr|gkna=rR}&e zxF4^L@l1?z)gC#YiJBD7kd)+`_B+FoK8m)S?OhiK*1#-U0Ht?>ApTH-kTvK}?V_oe z__FBKa@2I`+HFRiRAJ-r6s@B8-*omO?F*{E8LZzh7IZrQBW~O-f9@_p`7;y5u5rdB zu}e8+50#mf`N5Fr(}xAodhMtZQ(XLTMuE&rwe}S2dZiM z*w*16;BoN1D0U@uV!7^Nd0Wv5eI0qOh9P5Xwp8?8jjY#7nk+c|dUjPHB~xGu}$;%ew2z2WpveMh~{w`=6NL`QzC3>wx3S} zB$*ygv;}sRAHsCR$)sEZ7AF&`ah9`*e%hq9ar@}XJmF_X?9spj%LY=9tr#e@9^1O~}X&$B(fSYCdRQolE?1*u~cF;7!sv6UL| zK&yLy$}6DCRLS5*99s^JYr^(km)i6O3e1v0q5Zet?hNk4$>lLmdvI(NDqlZwe=8L$ zFvOm!s3M1k&+U~=oS-nos?EEF#e9M&40t-8Am7q=^CbiBLN2So6lj}#vn|Zoo$ajRu&|p)Y(G@?t1EXEh;uPg2lM`V`82g0e#pq^v zlX(5)Idsq)`q_&%!B)}516gb}$6~!lJuWyh9*IOiHN?%My4#RuI7`FctsL|Tub@XO zEyqsFl9Fn#`W|v6eMIQlEigI@y*r`%P@C3S7`~E1C0AW-<^PqPq_Aj`+o~_;nmeVth1N%gP zI>BJ=Xjw@q?%s4?-3X~h5ph$`Xr6Rm`5BGnM5auJ z_B^vg-t?Idpqlzt_udU3OucH=aBJv|6Uclp%_&IbE4)29I%fZ_i}>Tp#N+SnddR0c z9JWH%;p|KUuvrl-3jdlLU~oE6g2}MkcB#{L$)G?i@aE^`;=J%JwI&_h=Insn)s?;h zba^6vNgbrWWz6&{l)Ql1<@4|;+jrle8A%%tdNz?kvY_hsKGYmivLYp5K$PjFJU$8& zyA%8u%ySG2+%1mm`gqS?&Q84s@gBuIl$|%~=uV8kzUntB2*5Uxy5m8;uddR--+z*$ z|H=#g9!u3h2cCFZVK zGsyCrScV(TG{8aIa8@l<5qPYtLfSC@;Y56lYJ)I00$)pN*vraQK{x+;Xz|6IM}e`2 zz%%46Iy1Zgyb|VL{hY4gR!he@jzS-%HMNruY*MTt zvv;w`FtP89mN3**Qhtww^-{msTyx^ZOS8+A2!J&3)fiFEA^W&f*KTq4QGhXzgOK;j zp%}?D!Hw2;?eUTbPrdGB1lu&u+hn_F&Zk9VFUvYeb6d)ryM6e*-~K$l?eIEz=}2BT zBUZHO2~)&Tq`Ml{OT`+(4HpgYQojh5(#?MH=0M62<6hBv{5qkHM|!=2i)nBK%rD3RSdre z@W$nNDAk6HKo|M6589T+c?j8X=@xj$7Zs9VG@Tu^k`D{r&+@u!w+FdK$`fc^;R{qv(H8I{_I$B^VE(@a{*q0`el$Lvrmln=*1 zjV6s9%89@w2w-B)St&T{<5U!$N_wFcscGskPSW!ROXh|FLxfHRdwT>{7sqUr2}pI- zg4mfyVu+EFp56`v%Q7V*g#A+l9Sb@ieGHcDW3ZJR4Gl}gK@`^NhcK*AY%)fu?37f~|c zKk>6Zr~3#TyJeKI5dTQ>Blt_jsct)~_{ZwL+c~!VAmBFXM23b8`Y9!-Y*;FtD3f6PNFcc(Rp_ee{Ir z*>wHro!P{{2U(VWVI(@ePZ%23JNN!Oek(Y5wf9g(1F;HSm;_QusL+T+VNnqr?F2aJNOk#Vd=Eu6wTKpZVC-al3NzQ&23_RNiiT`TIDice@@n(bHr z0cEc|iox_vg;=N0FdZqF?m61lx>&8ttbX8w%_1p{Y<>D6HK&L`x(yILE%-{NA5%`M z&96VYnYbS_ou14{lcODbBb*#&!6GcCAP2Z&U1hx>5RQ>&(WEj%tNUcf#jNr^y{3j& zD9%)=Rs=o#k8%%8a;NCQzP=^xff_vuM5xOrOZ>ONzYOhwq6gEVK>tF%|I9;a!9QeH zFwvwn{r-0Fe#btpM4WDjJyRJ8lw;U31qiUR2l}xpiUdFFrRd}~Mcgj*JJHvn1KLp4 z-!>6*Ewg~RCWUtq+64U+M0W^sqrF&W#Fsc-8jX2lM1eJ|V&jmaJh34-7&*qiy$n5E z7t^QelEOO=t%l|q;Qt;Xg6Q_w?JQ_xzF%@{(t^Lse8CKp!uwWZHi5Pctc$%Ssiv96 zZ;&}|$|x18UpIa|_aedRYgzopj3SXKUW3dETTyMr<`4z7RUQ|CNK!{AI)n*M7Yf3n zf+lnndNab`CkL6LVd`kRm2p|0M1iR&H271nRN_Me<{qtp|LKKb4qexIgp5N*Z`Y(` z>sz4pES(6FG?M@|_>Ke~eQ$`d3{d-3(XK-q3miVy-oy$pi|1@5F;;&Y24TGB(0*J6 z*uNkB-*Y;5P%>rAg3Ja62lQ{}Pb?P99Mmk^`az$! z*RUU#R}8r5ELqG%%cksKklDiE7fxyp9m2JN(Rr*dA(-TN^TEXoD4CQ;zB$SozQoNh zoZb=UGnobP48=R;xPcdCb};0G;Z};j2fUBR2lB!YFlm%~04oaD+oG5*!#x5n;S27o zUr(BqZoHRiy#z`^h6X}5JoZ0rhhV}a3yOeXns`BN^5PdW@uPIz>j=mUK19bQLO-Yb zmq%T$^Fy^7Gg%ZH^uEUXY6SGnQE(Eu~)l6Rr|TAT8G-S(J_+J*mI~FdyXehORTwLV-y)|_W3KV z21V4hHw9d8zUfn*1XDvgb>b}}IIRGA#SH&)s~j6Cl7!+K4?h~U9QQ0_Jil%g-l|N& ztJr^fXF|8Rn%34u)D81}kF0z1UdV&p_bql~2(t}eW~aGj5oaofC9FR`OM=My<8W(2 z^x%9$IVf6n8|NT9nU;R=-9h;Qo5(DIQu!8r>sa^L)QKKdzAsrrioib3&WK^5=pU4R z*E=8<8CA2EaXK+L6OiBW(ujifU;V+g-~Q5}qp~ZbN~W$3_$1qMDwr9X+$WwDZ)yu2a{PI4J?U|;Bi^d)2Uc2R#j_Si+Od|` z^OG~fG#hk%b%qIYYtoo%FvJCSgu>f!Cb94CWe=AQb>4ZJQA;^!6B!c9*>&P7t&j1d z4&6UejcXxl62+@>_rb=?M_5nXU2D@f2L*wanfMmYH3HzcD0#yD8Gn-h1^pxC7hdyl}>S&EMH^CxtT6Z$ARL*ZXr&E*4armQzh77Y1^%r zZ6R$H&n#^y+kiziSFA#EhG*4 zZ}Gf^4#Uk?ec(>(RF$R=Y0;me(4&;JRLTsF?2GnB*IsXpo*p{-EZm@p<>GEXk%Ay* z<7BfOILGV3-G1FU*xf&NQ%eBrpRXs1%vl$+f7nA_#J$dw?RLH-$v-YZrL@$o<>_q> zlArV6txMHc2{F2^Jvn2q8)I#|RkBNz!qVte#djJpVYE-@=zpEWY+4VkGU&@Wo$5Dw zo0e{`J|8&sNjW`K7^%V*AN!V+_dw{ugyV?$I!aepr(=|p%xq;gKUN&bXCdL{dM}s? zwcmcs+!*m#@jTa$`H2PDH6DQ&Y0o+NxAU)^vtN;Wnx&J9fxg^b)?Y*%3pq~XXj_9$ zYG)tT!BqIbvK+2AJG14+{@|ycK zRn!|!ddF?oW4DL5o!ET=5QYYD{}#QS?iC5TxmvHtl0N%L)z>DPTgNLzX~&do!H0tx zrkOOr4L7<19&w{Yhn zUZZuk=BYRo2&bMb0W{N2po8m|v{^63_57~B@OYn9lTdVVbuEtqjwgfTh~F^PZrbC(u*7n4ov7~W`PuB*^-WFO%=!!BC|1M%Jue7~V7Dalv`P0qUoNVc3 zbdSK!muQ`NR<`Ds!ZR{Q5|EDe*B0bZ3dmN@UDpYuDw}|bBQQD1WZkncd)=p<*=CoFcVlhh<`j=BYkH7IVobavp!4U7b+-;=@ z-v4e6geAQWPJAfodM`*ozt;MD;kD;Z8VL zt$uDqI)+f#QAKAjBIs@#p`Jf`IQfk#Dk&e4<+wWw7a91-3%$J1iQYAOWRQCVoHU!X zkf(n*X;Hi*>c4A>^3HMHESFT{o-Ok^HUNGB!96~QPFDSEk<~V}ddG`qdOS)lI+v|RAnJ=j&2-{e{D?I5BW%Q60+w%gpY`eeccHu0xiLT zj?RM|%IenUbuY2j^reY_pZGs^?rmeY)VNgDv3YIr{{k<0%=cN};#XI20C!dO?(pK? z8~JJyOiN~53HP5ZI%x-dKC=T`IRPppKNztq34TOMb7n9LHLI-Z%c$J19JQrMPI8V{ zCaP>2r7zQ%>7t!mx?6U%%ANOWcd}0dkouA{>bhmbW!S4;bTxfyWyc#0Ws{^lzg|4% zX~R+CurrVKPqF2-D+Yd&3?0@>-5H>aE)U}$sBhzc?A>;hX;~%wLsvqjJH(`b_cWB_ zZTA@x`1;+faRuuk$Ju3cQ8$q1y?XQu`u{Y@32!yX`4*k+VW2yA?$ps+B!X^V=sD`@ ztnttx|EW)&I%+Rx_8;MzckkfcX8m(DhMwFCnd=zZD0>;2dwBXe+j?-@SZS)=MUw{o gC3yZjd$BAiV*U4K@c%zM!93N?fdQky`uBqW2lkbSDF6Tf delta 24831 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 diff --git a/tests/test_metrics.py b/tests/test_metrics.py index ab4dc0d1..d94d1af6 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -21,4 +21,4 @@ def test_built_land_with_tree_cover(): indicator = built_land_with_tree_cover(ZONES) expected_zone_size = ZONES.geometry.size actual_indicator_size = indicator.size - assert expected_zone_size == actual_indicator_size \ No newline at end of file + assert expected_zone_size == actual_indicator_size From 103b762ae07a8ba6587f37183794fcf74056f003 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Wed, 11 Sep 2024 21:35:10 -0700 Subject: [PATCH 12/13] Added tests for metrics --- .../metrics/built_land_with_tree_cover.py | 20 - .../metrics/built_land_with_vegetation.py | 20 + tests/conftest.py | 30 +- tests/resources/bbox_constants.py | 17 +- .../conftest.py | 6 +- .../layers_for_br_lauro_de_freitas.qgz | Bin 25729 -> 73278 bytes .../layers_for_br_lauro_de_freitas2.qgz | Bin 0 -> 70054 bytes .../test_write_layers_to_qgis_files.py | 355 +++++++++++------- tests/test_metrics.py | 7 +- tests/tools/general_tools.py | 51 ++- 10 files changed, 303 insertions(+), 203 deletions(-) delete mode 100644 city_metrix/metrics/built_land_with_tree_cover.py create mode 100644 city_metrix/metrics/built_land_with_vegetation.py create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas2.qgz diff --git a/city_metrix/metrics/built_land_with_tree_cover.py b/city_metrix/metrics/built_land_with_tree_cover.py deleted file mode 100644 index 788cda46..00000000 --- a/city_metrix/metrics/built_land_with_tree_cover.py +++ /dev/null @@ -1,20 +0,0 @@ -from geopandas import GeoDataFrame, GeoSeries - -from city_metrix.layers import EsaWorldCoverClass, TreeCover, EsaWorldCover - - -def built_land_with_tree_cover(zones: GeoDataFrame) -> GeoSeries: - """ - Get percentage of built up land (using ESA world cover) - with no tree cover (>0 WRI tropical tree cover). - :param zones: GeoDataFrame with geometries to collect zonal stats on - :return: Pandas Series of percentages - """ - built_up_land = EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) - tree_cover = TreeCover(min_tree_cover=1) - - built_land = built_up_land.groupby(zones).count() - tree_cover_in_built_land = tree_cover.mask(built_up_land).groupby(zones).count() - - fraction_tree_cover_in_built_up_land = (tree_cover_in_built_land.fillna(0) / built_land) - return fraction_tree_cover_in_built_up_land diff --git a/city_metrix/metrics/built_land_with_vegetation.py b/city_metrix/metrics/built_land_with_vegetation.py new file mode 100644 index 00000000..3a967a90 --- /dev/null +++ b/city_metrix/metrics/built_land_with_vegetation.py @@ -0,0 +1,20 @@ +from geopandas import GeoDataFrame, GeoSeries +from city_metrix.layers import EsaWorldCoverClass, EsaWorldCover, NdviSentinel2 + +def built_land_with_vegetation(zones: GeoDataFrame) -> GeoSeries: + """ + Get percentage of built up land (using ESA world cover) with NDVI vegetation cover. + :param zones: GeoDataFrame with geometries to collect zonal stats on + :return: Pandas Series of percentages + """ + ndvi_sampling_year = 2020 + ndvi_threshold = 0.4 + built_up_land = EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) + vegetation = NdviSentinel2(year=ndvi_sampling_year, ndvi_threshold=ndvi_threshold) + + built_land = built_up_land.groupby(zones).count() + vegetation_cover_in_built_land = vegetation.mask(built_up_land).groupby(zones).count() + + fraction_vegetation_in_built_up_land = (vegetation_cover_in_built_land.fillna(0) / built_land) + + return fraction_vegetation_in_built_up_land diff --git a/tests/conftest.py b/tests/conftest.py index b56318ce..bd3cd7da 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,34 +1,6 @@ from city_metrix.layers import Layer - -import shapely.geometry as geometry -import geopandas as gpd from geocube.api.core import make_geocube - - -def create_fishnet_grid(min_x, min_y, max_x, max_y, cell_size): - x, y = (min_x, min_y) - geom_array = [] - - # Polygon Size - while y < (max_y - 0.000001): - while x < (max_x - 0.000001): - geom = geometry.Polygon( - [ - (x, y), - (x, y + cell_size), - (x + cell_size, y + cell_size), - (x + cell_size, y), - (x, y), - ] - ) - geom_array.append(geom) - x += cell_size - x = min_x - y += cell_size - - fishnet = gpd.GeoDataFrame(geom_array, columns=["geometry"]).set_crs("EPSG:4326") - return fishnet - +from tests.tools.general_tools import create_fishnet_grid # Test zones of a regular 0.01x0.01 grid over a 0.1x0.1 extent ZONES = create_fishnet_grid(106.7, -6.3, 106.8, -6.2, 0.01).reset_index() diff --git a/tests/resources/bbox_constants.py b/tests/resources/bbox_constants.py index 789ab48f..331f9e49 100644 --- a/tests/resources/bbox_constants.py +++ b/tests/resources/bbox_constants.py @@ -2,10 +2,13 @@ BBOX_BRA_LAURO_DE_FREITAS_1 = ( - -38.35530428121955, - -12.821710300686393, - -38.33813814352424, - -12.80363249765361, + -38.35530428121955,-12.821710300686393, + -38.33813814352424,-12.80363249765361 +) + +BBOX_BRA_LAURO_DE_FREITAS_2 = ( + -38.36184,-12.84134, + -38.34614,-12.82917 ) BBOX_BRA_SALVADOR_ADM4 = ( @@ -13,6 +16,7 @@ -38.3041637148564007,-12.75607703449720631 ) + # UTM Zones 22S and 23S BBOX_BRA_BRASILIA = ( -48.07651,-15.89788 @@ -24,3 +28,8 @@ -38.39993,-12.93239 ) +BBOX_JAKARTA_ZONE_TEST = ( + 106, -7, + 107, -6 +) + diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py index 7ca45811..ecfe8eaf 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py @@ -4,7 +4,7 @@ import shutil from collections import namedtuple -from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 +from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1, BBOX_BRA_LAURO_DE_FREITAS_2 from tests.tools.general_tools import create_target_folder, is_valid_path # RUN_DUMPS is the master control for whether the writes and tests are executed @@ -18,13 +18,13 @@ # Both the tests and QGIS file are implemented for the same bounding box in Brazil. COUNTRY_CODE_FOR_BBOX = 'BRA' -BBOX = BBOX_BRA_LAURO_DE_FREITAS_1 +BBOX = BBOX_BRA_LAURO_DE_FREITAS_2 # Specify None to write to a temporary default folder otherwise specify a valid custom target path. CUSTOM_DUMP_DIRECTORY = None def pytest_configure(config): - qgis_project_file = 'layers_for_br_lauro_de_freitas.qgz' + qgis_project_file = 'layers_for_br_lauro_de_freitas2.qgz' source_folder = os.path.dirname(__file__) target_folder = get_target_folder_path() diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz index 1cc53ce2df38d8b5e7bd55634a44fd0b186de69d..1b7d5d30967aea551019b1060211c9aceb477543 100644 GIT binary patch literal 73278 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 G0vP~$BTsMu delta 23795 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 Date: Thu, 12 Sep 2024 07:41:10 -0700 Subject: [PATCH 13/13] Added exception evaluation --- tests/test_layer_parameters.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/test_layer_parameters.py b/tests/test_layer_parameters.py index a1eb5e82..703752ca 100644 --- a/tests/test_layer_parameters.py +++ b/tests/test_layer_parameters.py @@ -190,6 +190,8 @@ def test_null_spatial_resolution(self): with pytest.raises(Exception) as e_info: _get_modified_resolution_data(class_instance, spatial_resolution, BBOX) + msg_correct = False if str(e_info.value).find("Spatial_resolution cannot be None.") == -1 else True + assert msg_correct class TestOtherParameters: def test_albedo_threshold(self): @@ -203,32 +205,49 @@ def test_albedo_threshold(self): def test_albedo_dates(self): with pytest.raises(Exception) as e_info: Albedo(start_date="2021-01-01", end_date="2021-01-02").get_data(BBOX) + msg_correct = False if str(e_info.value).find("max() arg is an empty sequence") == -1 else True + assert msg_correct with pytest.raises(Exception) as e_info: Albedo(start_date="2021-01-01", end_date=None).get_data(BBOX) + msg_correct = False if str(e_info.value).find("max() arg is an empty sequence") == -1 else True + assert msg_correct def test_high_land_surface_temperature_dates(self): with pytest.raises(Exception) as e_info: HighLandSurfaceTemperature(start_date="2021-01-01", end_date="2021-01-02").get_data(BBOX) + msg_correct = False if str(e_info.value).find("Dictionary does not contain key: 'date'") == -1 else True + assert msg_correct def test_land_surface_temperature_dates(self): with pytest.raises(Exception) as e_info: LandSurfaceTemperature(start_date="2021-01-01", end_date="2021-01-02").get_data(BBOX) + msg_correct = False if str(e_info.value).find("max() arg is an empty sequence") == -1 else True + assert msg_correct with pytest.raises(Exception) as e_info: LandSurfaceTemperature(start_date="2021-01-01", end_date=None).get_data(BBOX) + msg_correct = False if str(e_info.value).find("max() arg is an empty sequence") == -1 else True + assert msg_correct def test_ndvi_sentinel2_dates(self): with pytest.raises(Exception) as e_info: - data = NdviSentinel2(Year=None).get_data(BBOX) + data = NdviSentinel2(year=None).get_data(BBOX) + msg_correct = False if str(e_info.value).find("get_data() requires a year value") == -1 else True + assert msg_correct with pytest.raises(Exception) as e_info: - NdviSentinel2(Year="1970").get_data(BBOX) + NdviSentinel2(year="1970").get_data(BBOX) + msg_correct = False if str(e_info.value).find("max() arg is an empty sequence") == -1 else True + assert msg_correct def test_open_buildings_country(self): with pytest.raises(Exception) as e_info: OpenBuildings(country="ZZZ").get_data(BBOX) + msg_correct = False if str(e_info.value).find("projects/sat-io/open-datasets/VIDA_COMBINED/ZZZ' not found.") == -1 else True + assert msg_correct + def test_tree_cover_min_max_cover(self): data = TreeCover(min_tree_cover = 150).get_data(BBOX) non_null_cells = data.values[~np.isnan(data)].size