From af4927a787c0b7162a0f4d9fee6e969aad91c66b Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Thu, 8 Aug 2024 10:20:17 -0700 Subject: [PATCH 01/31] initial exploration --- city_metrix/layers/esa_ndvi.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 city_metrix/layers/esa_ndvi.py diff --git a/city_metrix/layers/esa_ndvi.py b/city_metrix/layers/esa_ndvi.py new file mode 100644 index 0000000..91e4af7 --- /dev/null +++ b/city_metrix/layers/esa_ndvi.py @@ -0,0 +1,34 @@ +import ee +import xee +import xarray as xr + +from .layer import Layer, get_image_collection + +"""" +NDVI = Sential-2 Normalized Difference Vegetation Index +""" +class Ndvi(Layer): + def __init__(self, **kwargs): + super().__init__(**kwargs) + + def get_data(self, bbox): + NDVIthreshold = 0.4 # decimal + year = 2020 + + yearStr = str(year) + NDVIthresholdStr = str(NDVIthreshold) + startdate = '' + yearStr + '-01-01' + enddate = '' + yearStr + '-12-31' + + S2 = ee.ImageCollection("COPERNICUS/S2") + s2. + + # dataset = ee.Image("NASA/NASADEM_HGT/001") + # nasa_dem = ee.ImageCollection(ee.ImageCollection(dataset) + # .filterBounds(ee.Geometry.BBox(*bbox)) + # .select('elevation') + # .mean() + # ) + # data = get_image_collection(nasa_dem, bbox, 30, "NASA DEM").elevation + + return data From e3a95e59f2b9beaf908288ed3b06a55f59935c7d Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Thu, 8 Aug 2024 10:21:07 -0700 Subject: [PATCH 02/31] initial exploration --- city_metrix/layers/esa_ndvi.py | 193 +++++++++++++++++++++++++++++++-- 1 file changed, 181 insertions(+), 12 deletions(-) diff --git a/city_metrix/layers/esa_ndvi.py b/city_metrix/layers/esa_ndvi.py index 91e4af7..ad117d1 100644 --- a/city_metrix/layers/esa_ndvi.py +++ b/city_metrix/layers/esa_ndvi.py @@ -1,27 +1,44 @@ +def test_esa_ndvi(): + count = ( + EsaNdvi() + .get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + .count() + ) + assert count + + + import ee import xee import xarray as xr +from shapely.geometry import box from .layer import Layer, get_image_collection """" NDVI = Sential-2 Normalized Difference Vegetation Index """ -class Ndvi(Layer): - def __init__(self, **kwargs): +class EsaNdvi(Layer): + def __init__(self, start_date="2013-01-01", end_date="2023-01-01", **kwargs): super().__init__(**kwargs) + self.start_date = start_date + self.end_date = end_date + # https://gis.stackexchange.com/questions/457822/retrieving-maximum-ndvi-for-a-year-and-associated-date-for-each-pixel-in-google def get_data(self, bbox): - NDVIthreshold = 0.4 # decimal - year = 2020 + ndvi = self.get_ndvi(bbox) - yearStr = str(year) - NDVIthresholdStr = str(NDVIthreshold) - startdate = '' + yearStr + '-01-01' - enddate = '' + yearStr + '-12-31' - - S2 = ee.ImageCollection("COPERNICUS/S2") - s2. + # NDVIthreshold = 0.4 # decimal + # year = 2020 + # + # yearStr = str(year) + # NDVIthresholdStr = str(NDVIthreshold) + # startdate = '' + yearStr + '-01-01' + # enddate = '' + yearStr + '-12-31' + # + # s2 = ee.ImageCollection("COPERNICUS/S2_HARMONIZED") + # + # green = s2.filterDate(startdate, enddate).map(self.addNDVI) # dataset = ee.Image("NASA/NASADEM_HGT/001") # nasa_dem = ee.ImageCollection(ee.ImageCollection(dataset) @@ -31,4 +48,156 @@ def get_data(self, bbox): # ) # data = get_image_collection(nasa_dem, bbox, 30, "NASA DEM").elevation - return data + return 2 # data + + # def get_ndvi(self, bbox): + # # centroid = box(*bbox).centroid + # + # NDVIthreshold = 0.4 # decimal + # year = 2020 + # + # yearStr = str(year) + # NDVIthresholdStr = str(NDVIthreshold) + # startdate = '' + yearStr + '-01-01' + # enddate = '' + yearStr + '-12-31' + # + # dataset = ee.ImageCollection("COPERNICUS/S2_HARMONIZED") + # + # # green = s2.filterDate(startdate, enddate).map(self.addNDVI) + # + # # dataset = ee.ImageCollection("ECMWF/ERA5/DAILY") + # + # def addNDVI(image): + # ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI') + # return image.addBands(ndvi) + # + # ndvi = (dataset + # .filter(ee.Filter.And( + # ee.Filter.date(self.start_date, self.end_date), + # ee.Filter.bounds(ee.Geometry.BBox(*bbox)))) + # ) + # + # green = dataset.map(addNDVI) + # green = green.qualityMosaic('NDVI').select('NDVI').float(); + # greenScale = green.projection().nominalScale() + # # green = green.addBands(ee.Image(year).rename('time_start')) + # # Map.addLayer(green,{},"NDVI") + # greenmask = green.updateMask(green.select('NDVI').gte(NDVIthreshold)) + # + # g=2 + + +import ee + +# Initialize GEE +ee.Initialize() + +# Define the bounding box (lon1, lat1, lon2, lat2) +bbox = ee.Geometry.Rectangle([lon1, lat1, lon2, lat2]) + +# Define the date range +start_date = 'YYYY-MM-DD' +end_date = 'YYYY-MM-DD' + +# Load Sentinel-2 data +collection = ee.ImageCollection('COPERNICUS/S2').filterBounds(bbox).filterDate(start_date, end_date) + +# Calculate NDVI +def calculate_ndvi(image): + ndvi = image.normalizedDifference(['B8', 'B4']) + return image.addBands(ndvi.rename('NDVI')) + +ndvi_collection = collection.map(calculate_ndvi) + +# Export the data +task = ee.batch.Export.image.toDrive( + image=ndvi_collection.select('NDVI'), + description='NDVI_export', + folder='your_folder', + fileNamePrefix='ndvi', + region=bbox, + scale=10 # Set the desired resolution (e.g., 10 meters) +) + +task.start() + + +# import ee +# +# # Initialize GEE +# ee.Initialize() +# +# # Define the bounding box (lon1, lat1, lon2, lat2) +# bbox = ee.Geometry.Rectangle([lon1, lat1, lon2, lat2]) +# +# # Define the date range +# start_date = 'YYYY-MM-DD' +# end_date = 'YYYY-MM-DD' +# +# # Load Sentinel-2 data +# collection = ee.ImageCollection('COPERNICUS/S2').filterBounds(bbox).filterDate(start_date, end_date) +# +# # Calculate NDVI +# def calculate_ndvi(image): +# ndvi = image.normalizedDifference(['B8', 'B4']) +# return image.addBands(ndvi.rename('NDVI')) +# +# ndvi_collection = collection.map(calculate_ndvi) +# +# # Export the data +# task = ee.batch.Export.image.toDrive( +# image=ndvi_collection.select('NDVI'), +# description='NDVI_export', +# folder='your_folder', +# fileNamePrefix='ndvi', +# region=bbox, +# scale=10 # Set the desired resolution (e.g., 10 meters) +# ) +# +# task.start() + + + + +# import ee +# +# # Initialize GEE +# ee.Initialize() +# +# # Define your region of interest (ROI) as a polygon +# asset_polygon = ee.Geometry.Polygon( +# [[[-122.5, 37.5], +# [-122.5, 37.6], +# [-122.4, 37.6], +# [-122.4, 37.5]]]) +# +# # Define the year for which you want to retrieve data +# year = 2023 +# +# # Load Sentinel-2 Surface Reflectance (SR) data +# sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED') \ +# .filterBounds(asset_polygon) \ +# .filterDate(f'{year}-01-01', f'{year}-12-31') \ +# .select(['B4', 'B8']) # Red (B4) and Near-Infrared (B8) bands +# +# # Compute NDVI for each image +# def calculate_ndvi(image): +# ndvi = image.normalizedDifference(['B8', 'B4']).rename('ndvi') +# return image.addBands(ndvi) +# +# sentinel2_with_ndvi = sentinel2.map(calculate_ndvi) +# +# # Compute the maximum NDVI and acquisition date for each pixel +# max_ndvi = sentinel2_with_ndvi.qualityMosaic('ndvi').select('ndvi') +# acquisition_date = sentinel2_with_ndvi.qualityMosaic('system:time_start').select('system:time_start') +# +# # Export the rasters as single-band images to Google Drive +# task_max_ndvi = ee.batch.Export.image.toDrive( +# image=max_ndvi, +# description=f'S2_max_ndvi_{year}', +# folder='gee', +# scale=10, +# region=asset_polygon.geometry() +# ) +# +# task_acquisition_date = ee.batch \ No newline at end of file From 0d026e3ef06d8f7b2ee443b4e68642b6ea1c7a91 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 13 Aug 2024 20:18:50 -0700 Subject: [PATCH 03/31] Use pytest to dump layers to geotiff files --- .../layers/high_land_surface_temperature.py | 5 +- .../layers/land_surface_temperature.py | 5 +- tests/fixtures/bbox_constants.py | 2 +- tests/resources/README.md | 2 + .../layers_for_br_lauro_de_freitas.qgs | 5175 +++++++++++++++++ tests/test_layers.py | 43 +- tests/test_methods.py | 1 - tests/test_write_layers_to_geotiff.py | 165 + tools/general_tools.py | 20 + 9 files changed, 5391 insertions(+), 27 deletions(-) create mode 100644 tests/resources/README.md create mode 100644 tests/resources/layers_for_br_lauro_de_freitas.qgs create mode 100644 tests/test_write_layers_to_geotiff.py create mode 100644 tools/general_tools.py diff --git a/city_metrix/layers/high_land_surface_temperature.py b/city_metrix/layers/high_land_surface_temperature.py index 610651b..f7f5dff 100644 --- a/city_metrix/layers/high_land_surface_temperature.py +++ b/city_metrix/layers/high_land_surface_temperature.py @@ -55,7 +55,8 @@ def addDate(image): # convert to date object return datetime.datetime.strptime(hottest_date, "%Y%m%d").date() - def write(self, output_path): - self.data.rio.to_raster(output_path) + # TODO: Is this inherited class function needed? + # def write(self, output_path): + # self.data.rio.to_raster(output_path) diff --git a/city_metrix/layers/land_surface_temperature.py b/city_metrix/layers/land_surface_temperature.py index 0c87f30..a29255b 100644 --- a/city_metrix/layers/land_surface_temperature.py +++ b/city_metrix/layers/land_surface_temperature.py @@ -34,7 +34,8 @@ def apply_scale_factors(image): data = get_image_collection(ee.ImageCollection(l8_st), bbox, 30, "LST").ST_B10_mean return data - def write(self, output_path): - self.data.rio.to_raster(output_path) + # TODO: Is this inherited class function needed? + # def write(self, output_path): + # self.data.rio.to_raster(output_path) diff --git a/tests/fixtures/bbox_constants.py b/tests/fixtures/bbox_constants.py index 6814b7a..9f20f53 100644 --- a/tests/fixtures/bbox_constants.py +++ b/tests/fixtures/bbox_constants.py @@ -1,7 +1,7 @@ # File defines bboxes using in the test code -BBOX_BRAZIL_LAURO_DE_FREITAS_1 = ( +BBOX_BR_LAURO_DE_FREITAS_1 = ( -38.35530428121955, -12.821710300686393, -38.33813814352424, diff --git a/tests/resources/README.md b/tests/resources/README.md new file mode 100644 index 0000000..7250a3e --- /dev/null +++ b/tests/resources/README.md @@ -0,0 +1,2 @@ +# QGIS project files +QGIS files are used for testing layers geotiff files diff --git a/tests/resources/layers_for_br_lauro_de_freitas.qgs b/tests/resources/layers_for_br_lauro_de_freitas.qgs new file mode 100644 index 0000000..999bd52 --- /dev/null +++ b/tests/resources/layers_for_br_lauro_de_freitas.qgs @@ -0,0 +1,5175 @@ + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + land_surface_temperature_e26fbad7_3504_4b45_ad36_9231bc6ede9e + Google_Maps_814dce96_1bde_4a2c_aaff_51c3cf786817 + average_net_building_height_cb2fbeee_22a5_4862_a170_b5b97d8c2359 + esa_world_cover_913f3cfa_418a_4705_9ed8_cb4d0042455b + high_land_surface_temperature_b6aba51a_6624_45f4_a804_8947316deabd + albedo_63933ce5_ee3b_4891_bba3_3e6f2b632a65 + alos_dsm_afabef96_7acf_4ba8_9326_3fe0c486e868 + smart_surface_lulc_3c04a4e2_2352_49bc_9c1a_d8c9b22055ce + tree_canopy_height_7902b00d_e052_4c25_86e2_f465a978f4fc + tree_cover_1ccee586_17ee_4e1b_aef7_5cfa559b5b05 + urban_land_use_2b9d2c0b_7689_489d_ad0d_7317d9d15faa + world_pop_65d76980_e93c_4f74_84cb_3a2594b36255 + nasa_dem_68846b24_ab9e_4975_a548_9ea4c03bfe8d + natural_areas_fd87fec5_4965_46d4_9f49_3a87327de975 + open_buildings_0d3930fb_7530_4657_bde1_bf40431f46a7 + overture_buildings_36036eef_d21e_4838_8914_f2ebad1d5c68 + Google_Satellite_d2a2ce31_6540_4c56_998b_61c1ed81cf7f + + + + + + + + + + + + meters + + 569483.20351014251355082 + 8582439.30899122543632984 + 572298.77636430819984525 + 8584530.33974483050405979 + + 0 + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Annotations_fcde2ed1_e785_4cb5_af26_e512b670ceae + + + + + Annotations + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + 1 + 1 + 1 + 0 + + + + 1 + 0 + + + + + + -20037508.34278924390673637 + -20037508.34278924763202667 + 20037508.34278924390673637 + 20037508.34278924763202667 + + + -180 + -85.05112877980660357 + 179.99999999999997158 + 85.05112877980660357 + + Google_Maps_814dce96_1bde_4a2c_aaff_51c3cf786817 + crs=EPSG:3857&format&type=xyz&url=https://mt1.google.com/vt/lyrs%3Dm%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0 + + + + Google Maps + + + PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]] + +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo-Mercator + merc + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + 0 + 0 + + + + + false + + + + + wms + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + None + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + resamplingFilter + + 0 + + + + -20037508.34278924390673637 + -20037508.34278924763202667 + 20037508.34278924390673637 + 20037508.34278924763202667 + + + -180 + -85.05112877980660357 + 179.99999999999997158 + 85.05112877980660357 + + Google_Satellite_d2a2ce31_6540_4c56_998b_61c1ed81cf7f + crs=EPSG:3857&format&type=xyz&url=https://mt1.google.com/vt/lyrs%3Ds%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0 + + + + Google Satellite + + + PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]] + +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs + 3857 + 3857 + EPSG:3857 + WGS 84 / Pseudo-Mercator + merc + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + 0 + 0 + + + + + false + + + + + wms + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + None + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571832.59035570570267737 + 8584483.1620953194797039 + + + -38.35535003588469039 + -12.82171043979659331 + -38.33807328503521461 + -12.80367359560521656 + + albedo_63933ce5_ee3b_4891_bba3_3e6f2b632a65 + ./albedo.tif + + + + albedo + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571822.59035570570267737 + 8584473.1620953194797039 + + + -38.35534980613592637 + -12.82171043979659331 + -38.3381654292332712 + -12.80376424953941772 + + alos_dsm_afabef96_7acf_4ba8_9326_3fe0c486e868 + ./alos_dsm.tif + + + + alos_dsm + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571862.59035570570267737 + 8584493.1620953194797039 + + + -38.35535026563169225 + -12.82171043979659331 + -38.33779685245188773 + -12.80358247852375619 + + average_net_building_height_cb2fbeee_22a5_4862_a170_b5b97d8c2359 + ./average_net_building_height.tif + + + + average_net_building_height + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571832.59035570570267737 + 8584483.1620953194797039 + + + -38.35535003588469039 + -12.82171043979659331 + -38.33807328503521461 + -12.80367359560521656 + + esa_world_cover_913f3cfa_418a_4705_9ed8_cb4d0042455b + ./esa_world_cover.tif + + + + esa_world_cover + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571822.59035570570267737 + 8584473.1620953194797039 + + + -38.35534980613592637 + -12.82171043979659331 + -38.3381654292332712 + -12.80376424953941772 + + high_land_surface_temperature_b6aba51a_6624_45f4_a804_8947316deabd + ./high_land_surface_temperature.tif + + + + high_land_surface_temperature + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571822.59035570570267737 + 8584473.1620953194797039 + + + -38.35534980613592637 + -12.82171043979659331 + -38.3381654292332712 + -12.80376424953941772 + + land_surface_temperature_e26fbad7_3504_4b45_ad36_9231bc6ede9e + ./land_surface_temperature.tif + + + + land_surface_temperature + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571822.59035570570267737 + 8584473.1620953194797039 + + + -38.35534980613592637 + -12.82171043979659331 + -38.3381654292332712 + -12.80376424953941772 + + nasa_dem_68846b24_ab9e_4975_a548_9ea4c03bfe8d + ./nasa_dem.tif + + + + nasa_dem + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571832.59035570570267737 + 8584483.1620953194797039 + + + -38.35535003588469039 + -12.82171043979659331 + -38.33807328503521461 + -12.80367359560521656 + + natural_areas_fd87fec5_4965_46d4_9f49_3a87327de975 + ./natural_areas.tif + + + + natural_areas + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + open_buildings_0d3930fb_7530_4657_bde1_bf40431f46a7 + ./open_buildings.tif|layername=open_buildings + + + + open_buildings + + + GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + dataset + + + + + + + + + + + + + + + + + + GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + + + + + + ogr + + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + "bf_source" + + + + overture_buildings_36036eef_d21e_4838_8914_f2ebad1d5c68 + ./overture_buildings.tif|layername=overture_buildings + + + + overture_buildings + + + GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + dataset + + + + + + + + + GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + ogr + + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571832.59035570570267737 + 8584483.1620953194797039 + + + -38.35535003588469039 + -12.82171043979659331 + -38.33807328503521461 + -12.80367359560521656 + + smart_surface_lulc_3c04a4e2_2352_49bc_9c1a_d8c9b22055ce + ./smart_surface_lulc.tif + + + + smart_surface_lulc + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571830.59035570570267737 + 8584488.1620953194797039 + + + -38.35535015075841159 + -12.82171043979659331 + -38.33809171387467529 + -12.8036284306771595 + + tree_canopy_height_7902b00d_e052_4c25_86e2_f465a978f4fc + ./tree_canopy_height.tif + + + + tree_canopy_height + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571832.59035570570267737 + 8584483.1620953194797039 + + + -38.35535003588469039 + -12.82171043979659331 + -38.33807328503521461 + -12.80367359560521656 + + tree_cover_1ccee586_17ee_4e1b_aef7_5cfa559b5b05 + ./tree_cover.tif + + + + tree_cover + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571832.59035570570267737 + 8584488.1620953194797039 + + + -38.35535015075841159 + -12.82171043979659331 + -38.33807328503521461 + -12.80362838437874551 + + urban_land_use_2b9d2c0b_7689_489d_ad0d_7317d9d15faa + ./urban_land_use.tif + + + + urban_land_use + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + 569962.59035570570267737 + 8582493.1620953194797039 + 571862.59035570570267737 + 8584493.1620953194797039 + + + -38.35535026563169225 + -12.82171043979659331 + -38.33779685245188773 + -12.80358247852375619 + + world_pop_65d76980_e93c_4f74_84cb_3a2594b36255 + ./world_pop.tif + + + + world_pop + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + dataset + + + + + + + + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + gdal + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MinMax + WholeRaster + Estimated + 0.02 + 0.98 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + resamplingFilter + + 0 + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 255 + 255 + 255 + 255 + 0 + 255 + 255 + + + false + + + EPSG:7030 + + + m2 + meters + + + 5 + 2.5 + false + false + false + 1 + 0 + false + false + true + 0 + 255,0,0,255 + + + false + + + true + 2 + + + 1 + + + + + + + + + + + + + + + + + + + Kenn Cartier + 2024-08-13T11:33:46 + + + + + + + + + + + PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] + +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs + 3174 + 32724 + EPSG:32724 + WGS 84 / UTM zone 24S + utm + EPSG:7030 + false + + + + + + + + + + + + + + + + + + + + + + GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + diff --git a/tests/test_layers.py b/tests/test_layers.py index 8372614..09e9369 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -24,27 +24,28 @@ WorldPop ) from city_metrix.layers.layer import get_image_collection -from tests.fixtures.bbox_constants import BBOX_BRAZIL_LAURO_DE_FREITAS_1 +from tests.fixtures.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 EE_IMAGE_DIMENSION_TOLERANCE = 1 # Tolerance compensates for variable results from GEE service + def test_albedo(): - assert Albedo().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + assert Albedo().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() def test_alos_dsm(): - mean = AlosDSM().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + mean = AlosDSM().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() assert mean def test_average_net_building_height(): - assert AverageNetBuildingHeight().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + assert AverageNetBuildingHeight().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() def test_esa_world_cover(): count = ( EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) - .get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + .get_data(BBOX_BR_LAURO_DE_FREITAS_1) .count() ) assert count @@ -52,7 +53,7 @@ def test_esa_world_cover(): def test_read_image_collection(): ic = ee.ImageCollection("ESA/WorldCover/v100") - data = get_image_collection(ic, BBOX_BRAZIL_LAURO_DE_FREITAS_1, 10, "test") + data = get_image_collection(ic, BBOX_BR_LAURO_DE_FREITAS_1, 10, "test") expected_crs = 32724 expected_x_dimension = 187 @@ -67,47 +68,47 @@ def test_read_image_collection(): def test_read_image_collection_scale(): ic = ee.ImageCollection("ESA/WorldCover/v100") - data = get_image_collection(ic, BBOX_BRAZIL_LAURO_DE_FREITAS_1, 100, "test") + data = get_image_collection(ic, BBOX_BR_LAURO_DE_FREITAS_1, 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_BRAZIL_LAURO_DE_FREITAS_1) + data = HighLandSurfaceTemperature().get_data(BBOX_BR_LAURO_DE_FREITAS_1) assert data.any() def test_land_surface_temperature(): - mean_lst = LandSurfaceTemperature().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + mean_lst = LandSurfaceTemperature().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() assert mean_lst def test_landsat_collection_2(): bands = ['green'] - data = LandsatCollection2(bands).get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + data = LandsatCollection2(bands).get_data(BBOX_BR_LAURO_DE_FREITAS_1) assert data.any() def test_nasa_dem(): - mean = NasaDEM().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + mean = NasaDEM().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() assert mean def test_natural_areas(): - data = NaturalAreas().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + data = NaturalAreas().get_data(BBOX_BR_LAURO_DE_FREITAS_1) assert data.any() def test_openbuildings(): - count = OpenBuildings().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).count().sum() + count = OpenBuildings().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count().sum() assert count def test_open_street_map(): count = ( OpenStreetMap(osm_class=OpenStreetMapClass.ROAD) - .get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + .get_data(BBOX_BR_LAURO_DE_FREITAS_1) .count() .sum() ) @@ -115,28 +116,28 @@ def test_open_street_map(): def test_overture_buildings(): - count = OvertureBuildings().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).count().sum() + count = OvertureBuildings().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count().sum() assert count def test_sentinel_2_level2(): sentinel_2_bands = ["green"] - data = Sentinel2Level2(sentinel_2_bands).get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + data = Sentinel2Level2(sentinel_2_bands).get_data(BBOX_BR_LAURO_DE_FREITAS_1) assert data.any() def test_smart_surface_lulc(): - count = SmartSurfaceLULC().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).count() + count = SmartSurfaceLULC().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count() assert count def test_tree_canopy_height(): - count = TreeCanopyHeight().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).count() + count = TreeCanopyHeight().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count() assert count def test_tree_cover(): - actual = TreeCover().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + actual = TreeCover().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() expected = 54.0 tolerance = 0.1 assert ( @@ -145,9 +146,9 @@ def test_tree_cover(): def test_urban_land_use(): - assert UrbanLandUse().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).count() + assert UrbanLandUse().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count() def test_world_pop(): - data = WorldPop().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) + data = WorldPop().get_data(BBOX_BR_LAURO_DE_FREITAS_1) assert data.any() diff --git a/tests/test_methods.py b/tests/test_methods.py index 4651883..176f305 100644 --- a/tests/test_methods.py +++ b/tests/test_methods.py @@ -9,7 +9,6 @@ MockLayer, MockMaskLayer, ) -from .fixtures.bbox_constants import * def test_count(): diff --git a/tests/test_write_layers_to_geotiff.py b/tests/test_write_layers_to_geotiff.py new file mode 100644 index 0000000..5b3ddc2 --- /dev/null +++ b/tests/test_write_layers_to_geotiff.py @@ -0,0 +1,165 @@ +import pytest +import os +import shutil + +from city_metrix.layers import ( + Albedo, + AlosDSM, + AverageNetBuildingHeight, + EsaWorldCover, + HighLandSurfaceTemperature, + LandsatCollection2, + LandSurfaceTemperature, + NasaDEM, + NaturalAreas, + OpenBuildings, + OpenStreetMap, + OvertureBuildings, + Sentinel2Level2, + SmartSurfaceLULC, + TreeCanopyHeight, + TreeCover, + UrbanLandUse, + WorldPop +) +from tests.fixtures.bbox_constants import * +from tools.general_tools import create_temp_folder, verify_file_is_populated + +RUN_DUMPS = False +BBOX = BBOX_BR_LAURO_DE_FREITAS_1 + +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_prepare_target(): + qgis_project_file = 'layers_for_br_lauro_de_freitas.qgs' + + source_folder = os.path.join(os.path.dirname(__file__), 'resources') + output_temp_folder = create_temp_folder('test_result_tif_files') + source_qgis_file = os.path.join(source_folder, qgis_project_file) + target_qgis_file = os.path.join(output_temp_folder, qgis_project_file) + shutil.copyfile(source_qgis_file, target_qgis_file) + + process_layers(output_temp_folder) + + +def process_layers(output_temp_folder): + write_albedo(output_temp_folder) + write_alos_dsm(output_temp_folder) + write_average_net_building_height(output_temp_folder) + write_esa_world_cover(output_temp_folder) + write_high_land_surface_temperature(output_temp_folder) + write_land_surface_temperature(output_temp_folder) + # write_landsat_collection_2(output_temp_folder) + write_nasa_dem(output_temp_folder) + write_natural_areas(output_temp_folder) + write_openbuildings(output_temp_folder) + # write_open_street_map(output_temp_folder) + write_overture_buildings(output_temp_folder) + # write_sentinel_2_level2(output_temp_folder) + write_smart_surface_lulc(output_temp_folder) + write_tree_canopy_height(output_temp_folder) + write_tree_cover(output_temp_folder) + write_urban_land_use(output_temp_folder) + write_world_pop(output_temp_folder) + + +def write_albedo(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'albedo.tif') + Albedo().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_alos_dsm(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'alos_dsm.tif') + AlosDSM().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_average_net_building_height(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'average_net_building_height.tif') + AverageNetBuildingHeight().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_esa_world_cover(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'esa_world_cover.tif') + EsaWorldCover().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_high_land_surface_temperature(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'high_land_surface_temperature.tif') + HighLandSurfaceTemperature().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_land_surface_temperature(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'land_surface_temperature.tif') + LandSurfaceTemperature().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +# TODO: Determine how to output xarray.Dataset with time dimension for QGIS rendering +# def write_landsat_collection_2(output_temp_folder): +# file_path = prep_output_path(output_temp_folder, 'landsat_collection2.tif') +# bands = ['green'] +# LandsatCollection2(bands).write(BBOX, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) + +def write_nasa_dem(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'nasa_dem.tif') + NasaDEM().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_natural_areas(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'natural_areas.tif') + NaturalAreas().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_openbuildings(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'open_buildings.tif') + OpenBuildings().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +# TODO: class function "write" does not properly handle call +# def write_open_street_map(output_temp_folder): +# file_path = prep_output_path(output_temp_folder, 'open_street_map.tif') +# OpenStreetMap().write(BBOX, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) + +def write_overture_buildings(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'overture_buildings.tif') + OvertureBuildings().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +# TODO: Determine how to output xarray.Dataset with time dimension for QGIS rendering +# def write_sentinel_2_level2(output_temp_folder): +# file_path = prep_output_path(output_temp_folder, 'sentinel_2_level2.tif') +# sentinel_2_bands = ["green"] +# Sentinel2Level2(sentinel_2_bands).write(BBOX, file_path, tile_degrees=None) +# assert verify_file_is_populated(file_path) + +def write_smart_surface_lulc(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'smart_surface_lulc.tif') + SmartSurfaceLULC().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_tree_canopy_height(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'tree_canopy_height.tif') + TreeCanopyHeight().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_tree_cover(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'tree_cover.tif') + TreeCover().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_urban_land_use(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'urban_land_use.tif') + UrbanLandUse().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + +def write_world_pop(output_temp_folder): + file_path = prep_output_path(output_temp_folder, 'world_pop.tif') + WorldPop().write(BBOX, file_path, tile_degrees=None) + assert verify_file_is_populated(file_path) + + +def prep_output_path(output_temp_folder, file_name): + file_path = os.path.join(output_temp_folder, file_name) + if os.path.isfile(file_path): + os.remove(file_path) + return file_path diff --git a/tools/general_tools.py b/tools/general_tools.py new file mode 100644 index 0000000..aa082a1 --- /dev/null +++ b/tools/general_tools.py @@ -0,0 +1,20 @@ +import platform +import os + +def create_temp_folder(sub_directory): + if platform.system() == 'Linux': + path = '/tmp/%s' % sub_directory + elif platform.system() == 'Windows': + localappdata_path = os.getenv("LOCALAPPDATA") + path = r'%s\Temp\%s' % (localappdata_path, sub_directory) + else: + raise ValueError('Method not implemented for this OS.') + + if os.path.isdir(path) == False: + os.makedirs(path) + + return path + +def verify_file_is_populated(file_path): + is_populated = True if os.path.getsize(file_path) > 0 else False + return is_populated From bc996c3007900d3b0f2355848dfe52c06fe7595b Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 13 Aug 2024 21:04:18 -0700 Subject: [PATCH 04/31] Move testing of layer writing into resources folder --- tests/resources/__init__.py | 0 tests/{fixtures => resources}/bbox_constants.py | 0 .../test_write_layers_to_geotiff.py | 14 +++++++++----- tests/test_layers.py | 2 +- tools/general_tools.py | 3 --- 5 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 tests/resources/__init__.py rename tests/{fixtures => resources}/bbox_constants.py (100%) rename tests/{ => resources}/test_write_layers_to_geotiff.py (95%) diff --git a/tests/resources/__init__.py b/tests/resources/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/bbox_constants.py b/tests/resources/bbox_constants.py similarity index 100% rename from tests/fixtures/bbox_constants.py rename to tests/resources/bbox_constants.py diff --git a/tests/test_write_layers_to_geotiff.py b/tests/resources/test_write_layers_to_geotiff.py similarity index 95% rename from tests/test_write_layers_to_geotiff.py rename to tests/resources/test_write_layers_to_geotiff.py index 5b3ddc2..e5a5431 100644 --- a/tests/test_write_layers_to_geotiff.py +++ b/tests/resources/test_write_layers_to_geotiff.py @@ -22,17 +22,17 @@ UrbanLandUse, WorldPop ) -from tests.fixtures.bbox_constants import * -from tools.general_tools import create_temp_folder, verify_file_is_populated +from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 +from tools.general_tools import create_temp_folder -RUN_DUMPS = False +RUN_DUMPS = True BBOX = BBOX_BR_LAURO_DE_FREITAS_1 @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_prepare_target(): +def test_geotiff_writing(): qgis_project_file = 'layers_for_br_lauro_de_freitas.qgs' - source_folder = os.path.join(os.path.dirname(__file__), 'resources') + source_folder = os.path.dirname(__file__) output_temp_folder = create_temp_folder('test_result_tif_files') source_qgis_file = os.path.join(source_folder, qgis_project_file) target_qgis_file = os.path.join(output_temp_folder, qgis_project_file) @@ -163,3 +163,7 @@ def prep_output_path(output_temp_folder, file_name): if os.path.isfile(file_path): os.remove(file_path) return file_path + +def verify_file_is_populated(file_path): + is_populated = True if os.path.getsize(file_path) > 0 else False + return is_populated diff --git a/tests/test_layers.py b/tests/test_layers.py index 09e9369..7980aa1 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -24,7 +24,7 @@ WorldPop ) from city_metrix.layers.layer import get_image_collection -from tests.fixtures.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 +from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 EE_IMAGE_DIMENSION_TOLERANCE = 1 # Tolerance compensates for variable results from GEE service diff --git a/tools/general_tools.py b/tools/general_tools.py index aa082a1..fb1f437 100644 --- a/tools/general_tools.py +++ b/tools/general_tools.py @@ -15,6 +15,3 @@ def create_temp_folder(sub_directory): return path -def verify_file_is_populated(file_path): - is_populated = True if os.path.getsize(file_path) > 0 else False - return is_populated From ea49e28641963dc650c9a7f96bbaf076478e5499 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 13 Aug 2024 21:16:31 -0700 Subject: [PATCH 05/31] Set RUN_DUMPS to False --- tests/resources/test_write_layers_to_geotiff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/resources/test_write_layers_to_geotiff.py b/tests/resources/test_write_layers_to_geotiff.py index e5a5431..e27aaa1 100644 --- a/tests/resources/test_write_layers_to_geotiff.py +++ b/tests/resources/test_write_layers_to_geotiff.py @@ -25,7 +25,7 @@ from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 from tools.general_tools import create_temp_folder -RUN_DUMPS = True +RUN_DUMPS = False BBOX = BBOX_BR_LAURO_DE_FREITAS_1 @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') From 47b27127f29d22c1459fb6cb78647a7c8b6e9713 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Wed, 14 Aug 2024 09:12:38 -0700 Subject: [PATCH 06/31] Added documentation --- tests/resources/README.md | 2 -- .../resources/layer_dumps_for_br_lauro_de_freitas/README.md | 4 ++++ .../layer_dumps_for_br_lauro_de_freitas/__init__.py | 0 .../layers_for_br_lauro_de_freitas.qgs | 0 .../test_write_layers_to_geotiff.py | 6 ++++++ 5 files changed, 10 insertions(+), 2 deletions(-) delete mode 100644 tests/resources/README.md create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/README.md create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/__init__.py rename tests/resources/{ => layer_dumps_for_br_lauro_de_freitas}/layers_for_br_lauro_de_freitas.qgs (100%) rename tests/resources/{ => layer_dumps_for_br_lauro_de_freitas}/test_write_layers_to_geotiff.py (95%) diff --git a/tests/resources/README.md b/tests/resources/README.md deleted file mode 100644 index 7250a3e..0000000 --- a/tests/resources/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# QGIS project files -QGIS files are used for testing layers geotiff files diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/README.md b/tests/resources/layer_dumps_for_br_lauro_de_freitas/README.md new file mode 100644 index 0000000..d4dc944 --- /dev/null +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/README.md @@ -0,0 +1,4 @@ +# QGIS manual analysis for Lauro de Freitas, Brazil +Folder contains: +1. Test code that can be set to output the layers as geotiff files. Execution is controlled by a "master switch" +1. A QGIS file used for manually inspecting the generated geotiff files diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/__init__.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/resources/layers_for_br_lauro_de_freitas.qgs b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgs similarity index 100% rename from tests/resources/layers_for_br_lauro_de_freitas.qgs rename to tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgs diff --git a/tests/resources/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py similarity index 95% rename from tests/resources/test_write_layers_to_geotiff.py rename to tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index e27aaa1..fa9082e 100644 --- a/tests/resources/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -1,3 +1,5 @@ +# This code is mostly intended for manual execution + import pytest import os import shutil @@ -25,7 +27,11 @@ from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 from tools.general_tools import create_temp_folder +# 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 to avoid unnecessary execution. RUN_DUMPS = False +# Both the tests and QGIS file are implemented for the same bounding box in Brazil. BBOX = BBOX_BR_LAURO_DE_FREITAS_1 @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') From ec5421d46b16964d91337d63c25aebb63c11bf62 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 20 Aug 2024 14:29:16 -0700 Subject: [PATCH 07/31] added todo comments --- .../test_write_layers_to_geotiff.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index fa9082e..335b78c 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -54,13 +54,14 @@ def process_layers(output_temp_folder): write_esa_world_cover(output_temp_folder) write_high_land_surface_temperature(output_temp_folder) write_land_surface_temperature(output_temp_folder) - # write_landsat_collection_2(output_temp_folder) + # write_landsat_collection_2(output_temp_folder) # TODO no longer used, but may be useful write_nasa_dem(output_temp_folder) write_natural_areas(output_temp_folder) write_openbuildings(output_temp_folder) - # write_open_street_map(output_temp_folder) + # TODO Talk to Saif + # write_open_street_map(output_temp_folder) # TODO still needed or have we switched to overture write_overture_buildings(output_temp_folder) - # write_sentinel_2_level2(output_temp_folder) + # write_sentinel_2_level2(output_temp_folder) # TODO no longer used, but may be useful write_smart_surface_lulc(output_temp_folder) write_tree_canopy_height(output_temp_folder) write_tree_cover(output_temp_folder) From 30153fe205eb71ec7b48fbd9115652d7c115d0f0 Mon Sep 17 00:00:00 2001 From: weiqi-tori Date: Wed, 21 Aug 2024 15:59:41 +0800 Subject: [PATCH 08/31] update to use harmonized s2 --- city_metrix/layers/albedo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/city_metrix/layers/albedo.py b/city_metrix/layers/albedo.py index dd3ba8a..7bf7b11 100644 --- a/city_metrix/layers/albedo.py +++ b/city_metrix/layers/albedo.py @@ -13,7 +13,7 @@ def __init__(self, start_date="2021-01-01", end_date="2022-01-01", threshold=Non self.threshold = threshold def get_data(self, bbox): - S2 = ee.ImageCollection("COPERNICUS/S2_SR") + S2 = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED") S2C = ee.ImageCollection("COPERNICUS/S2_CLOUD_PROBABILITY") MAX_CLOUD_PROB = 30 From 0551fe6a693630d1fcaa689351b75799760f6492 Mon Sep 17 00:00:00 2001 From: Ted Wong Date: Fri, 23 Aug 2024 03:35:24 -0400 Subject: [PATCH 09/31] Add economic opportunity (i.e., jobs, services) to OSM --- city_metrix/layers/open_street_map.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/city_metrix/layers/open_street_map.py b/city_metrix/layers/open_street_map.py index a56ff6b..f8ebaa4 100644 --- a/city_metrix/layers/open_street_map.py +++ b/city_metrix/layers/open_street_map.py @@ -19,6 +19,9 @@ class OpenStreetMapClass(Enum): BUILDING = {'building': True} PARKING = {'amenity': ['parking'], 'parking': True} + ECONOMIC_OPPORTUNITY = {'landuse': ['commercial', 'industrial', 'retail', 'institutional', 'education'], + 'building': ['office', 'commercial', 'industrial', 'retail', 'supermarket'], + 'shop': True} class OpenStreetMap(Layer): From 621c1e2d9092a81ab7e276ad771a0b84d612697e Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 10:08:18 -0700 Subject: [PATCH 10/31] Now use tempfile library to create temporary directory --- .../test_write_layers_to_geotiff.py | 3 ++- tools/general_tools.py | 25 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index 335b78c..6703910 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -39,7 +39,8 @@ def test_geotiff_writing(): qgis_project_file = 'layers_for_br_lauro_de_freitas.qgs' source_folder = os.path.dirname(__file__) - output_temp_folder = create_temp_folder('test_result_tif_files') + output_temp_folder = create_temp_folder('test_result_tif_files', True) + source_qgis_file = os.path.join(source_folder, qgis_project_file) target_qgis_file = os.path.join(output_temp_folder, qgis_project_file) shutil.copyfile(source_qgis_file, target_qgis_file) diff --git a/tools/general_tools.py b/tools/general_tools.py index fb1f437..d3429f4 100644 --- a/tools/general_tools.py +++ b/tools/general_tools.py @@ -1,17 +1,16 @@ -import platform import os +import tempfile +import shutil -def create_temp_folder(sub_directory): - if platform.system() == 'Linux': - path = '/tmp/%s' % sub_directory - elif platform.system() == 'Windows': - localappdata_path = os.getenv("LOCALAPPDATA") - path = r'%s\Temp\%s' % (localappdata_path, sub_directory) - else: - raise ValueError('Method not implemented for this OS.') +def create_temp_folder(sub_directory_name: str, delete_existing_files: bool): + scratch_dir_name = tempfile.TemporaryDirectory().name + dirpath = os.path.dirname(scratch_dir_name) + temp_dir = os.path.join(dirpath, sub_directory_name) - if os.path.isdir(path) == False: - os.makedirs(path) - - return path + if os.path.isdir(temp_dir) is False: + os.makedirs(temp_dir) + elif delete_existing_files is True: + shutil.rmtree(temp_dir) + os.makedirs(temp_dir) + return temp_dir From 0d316099cef46407a10a6f24dfa91eeb75408e53 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 10:25:09 -0700 Subject: [PATCH 11/31] Addressed review issues --- city_metrix/layers/high_land_surface_temperature.py | 6 ------ city_metrix/layers/land_surface_temperature.py | 6 ------ .../test_write_layers_to_geotiff.py | 7 ++++--- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/city_metrix/layers/high_land_surface_temperature.py b/city_metrix/layers/high_land_surface_temperature.py index f7f5dff..d3943e9 100644 --- a/city_metrix/layers/high_land_surface_temperature.py +++ b/city_metrix/layers/high_land_surface_temperature.py @@ -54,9 +54,3 @@ def addDate(image): # convert to date object return datetime.datetime.strptime(hottest_date, "%Y%m%d").date() - - # TODO: Is this inherited class function needed? - # def write(self, output_path): - # self.data.rio.to_raster(output_path) - - diff --git a/city_metrix/layers/land_surface_temperature.py b/city_metrix/layers/land_surface_temperature.py index a29255b..7fff632 100644 --- a/city_metrix/layers/land_surface_temperature.py +++ b/city_metrix/layers/land_surface_temperature.py @@ -33,9 +33,3 @@ def apply_scale_factors(image): data = get_image_collection(ee.ImageCollection(l8_st), bbox, 30, "LST").ST_B10_mean return data - - # TODO: Is this inherited class function needed? - # def write(self, output_path): - # self.data.rio.to_raster(output_path) - - diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index 6703910..24cd7db 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -29,9 +29,10 @@ # 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 to avoid unnecessary execution. -RUN_DUMPS = False +# Values should normally be set to False in order to avoid unnecessary execution. +RUN_DUMPS = True # Both the tests and QGIS file are implemented for the same bounding box in Brazil. +COUNTRY_CODE_FOR_BBOX = 'BRA' BBOX = BBOX_BR_LAURO_DE_FREITAS_1 @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') @@ -119,7 +120,7 @@ def write_natural_areas(output_temp_folder): def write_openbuildings(output_temp_folder): file_path = prep_output_path(output_temp_folder, 'open_buildings.tif') - OpenBuildings().write(BBOX, file_path, tile_degrees=None) + OpenBuildings(COUNTRY_CODE_FOR_BBOX).write(BBOX, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) # TODO: class function "write" does not properly handle call From 350b30441fd8d26be67745a99ef69e7992a69212 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 10:35:05 -0700 Subject: [PATCH 12/31] Turned off execution of code for test_write_layers_to_geotiff --- .../test_write_layers_to_geotiff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index 24cd7db..e34c7a6 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -30,7 +30,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 # Both the tests and QGIS file are implemented for the same bounding box in Brazil. COUNTRY_CODE_FOR_BBOX = 'BRA' BBOX = BBOX_BR_LAURO_DE_FREITAS_1 From e1976fc6c33e6412bb16bf4402e0111cc6e89c69 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 13:31:00 -0700 Subject: [PATCH 13/31] Added option of specifying a customer target directory --- .../test_write_layers_to_geotiff.py | 12 +++++-- tools/general_tools.py | 33 +++++++++++++++---- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index e34c7a6..ba939f5 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -25,7 +25,7 @@ WorldPop ) from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 -from tools.general_tools import create_temp_folder +from tools.general_tools import create_temp_folder, create_folder # RUN_DUMPS is the master control for whether the writes and tests are executed # Setting RUN_DUMPS to True turns on code execution. @@ -34,13 +34,19 @@ # Both the tests and QGIS file are implemented for the same bounding box in Brazil. COUNTRY_CODE_FOR_BBOX = 'BRA' BBOX = BBOX_BR_LAURO_DE_FREITAS_1 +# Specify None to write to a temporary default folder otherwise specify a valid custom target path. +CUSTOM_DUMP_DIRECTORY = None @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_geotiff_writing(): qgis_project_file = 'layers_for_br_lauro_de_freitas.qgs' source_folder = os.path.dirname(__file__) - output_temp_folder = create_temp_folder('test_result_tif_files', True) + + if CUSTOM_DUMP_DIRECTORY is None: + output_temp_folder = create_temp_folder('test_result_tif_files', True) + else: + output_temp_folder = create_folder(CUSTOM_DUMP_DIRECTORY, True) source_qgis_file = os.path.join(source_folder, qgis_project_file) target_qgis_file = os.path.join(output_temp_folder, qgis_project_file) @@ -48,6 +54,8 @@ def test_geotiff_writing(): process_layers(output_temp_folder) + print("\n\033[93mQGIS project file and layer files were written to the %s folder.\033[0m" % output_temp_folder) + def process_layers(output_temp_folder): write_albedo(output_temp_folder) diff --git a/tools/general_tools.py b/tools/general_tools.py index d3429f4..1497864 100644 --- a/tools/general_tools.py +++ b/tools/general_tools.py @@ -1,16 +1,37 @@ import os import tempfile -import shutil def create_temp_folder(sub_directory_name: str, delete_existing_files: bool): scratch_dir_name = tempfile.TemporaryDirectory().name dirpath = os.path.dirname(scratch_dir_name) temp_dir = os.path.join(dirpath, sub_directory_name) - if os.path.isdir(temp_dir) is False: - os.makedirs(temp_dir) - elif delete_existing_files is True: - shutil.rmtree(temp_dir) - os.makedirs(temp_dir) + _create_target_folder(temp_dir, delete_existing_files) return temp_dir + +def create_folder(folder_path, delete_existing_files: bool): + if _is_valid_path(folder_path) is False: + raise ValueError(f"The custom path '%s' is not valid. Stopping." % folder_path) + _create_target_folder(folder_path, delete_existing_files) + return folder_path + +def _is_valid_path(path: str): + return os.path.exists(path) + +def _create_target_folder(folder_path, delete_existing_files: bool): + if os.path.isdir(folder_path) is False: + os.makedirs(folder_path) + elif delete_existing_files is True: + _remove_all_files_in_directory(folder_path) + +def _remove_all_files_in_directory(directory): + # Iterate over all the files in the directory + for filename in os.listdir(directory): + file_path = os.path.join(directory, filename) + try: + # Check if it is a file and remove it + if os.path.isfile(file_path): + os.remove(file_path) + except Exception as e: + print(f"Error: {e}") \ No newline at end of file From 4a4b4ad5dc9c8f63bbd8be31691a880c406fc0cb Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 20:02:54 -0700 Subject: [PATCH 14/31] Updated ndvi. Moved control of layer-writing test into conftest file. --- city_metrix/layers/__init__.py | 1 + city_metrix/layers/landsat_collection_2.py | 8 +- city_metrix/layers/layer.py | 43 +- city_metrix/layers/ndvi_sentinel2_gee.py | 65 + city_metrix/layers/open_street_map.py | 7 + city_metrix/layers/sentinel_2_level_2.py | 5 +- tests/resources/bbox_constants.py | 17 +- .../conftest.py | 67 + .../layers_for_br_lauro_de_freitas.qgs | 5175 ----------------- .../layers_for_br_lauro_de_freitas.qgz | Bin 0 -> 24185 bytes .../sample_dataset/2019/part-0.parquet | Bin 0 -> 3110 bytes .../sample_dataset/2020/part-0.parquet | Bin 0 -> 3075 bytes .../sample_dataset/2021/part-0.parquet | Bin 0 -> 3079 bytes .../sample_dataset/2022/part-0.parquet | Bin 0 -> 3075 bytes .../test_write_layers_to_geotiff.py | 206 +- tests/test_layers.py | 57 +- tools/general_tools.py | 22 +- tools/xarray_tools.py | 18 + 18 files changed, 328 insertions(+), 5363 deletions(-) create mode 100644 city_metrix/layers/ndvi_sentinel2_gee.py create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py delete mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgs create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgz create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2019/part-0.parquet create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2020/part-0.parquet create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2021/part-0.parquet create mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2022/part-0.parquet create mode 100644 tools/xarray_tools.py diff --git a/city_metrix/layers/__init__.py b/city_metrix/layers/__init__.py index ea7fa8a..669e727 100644 --- a/city_metrix/layers/__init__.py +++ b/city_metrix/layers/__init__.py @@ -1,4 +1,5 @@ from .albedo import Albedo +from .ndvi_sentinel2_gee import NdviSentinel2 from .esa_world_cover import EsaWorldCover, EsaWorldCoverClass from .land_surface_temperature import LandSurfaceTemperature from .tree_cover import TreeCover diff --git a/city_metrix/layers/landsat_collection_2.py b/city_metrix/layers/landsat_collection_2.py index d82180d..1739fa1 100644 --- a/city_metrix/layers/landsat_collection_2.py +++ b/city_metrix/layers/landsat_collection_2.py @@ -1,9 +1,10 @@ import odc.stac import pystac_client +from jupyterlab.utils import deprecated from .layer import Layer - +@deprecated class LandsatCollection2(Layer): def __init__(self, bands, start_date="2013-01-01", end_date="2023-01-01", **kwargs): super().__init__(**kwargs) @@ -29,8 +30,7 @@ def get_data(self, bbox): fail_on_error=False, ) + # TODO: Determine how to output xarray + qa_lst = lc2.where((lc2.qa_pixel & 24) == 0) return qa_lst.drop_vars("qa_pixel") - - - diff --git a/city_metrix/layers/layer.py b/city_metrix/layers/layer.py index 299b0a1..f3e2174 100644 --- a/city_metrix/layers/layer.py +++ b/city_metrix/layers/layer.py @@ -18,10 +18,8 @@ import shapely.geometry as geometry import pandas as pd - MAX_TILE_SIZE = 0.5 - class Layer: def __init__(self, aggregate=None, masks=[]): self.aggregate = aggregate @@ -39,6 +37,15 @@ def get_data(self, bbox: Tuple[float]) -> Union[xr.DataArray, gpd.GeoDataFrame]: """ ... + @abstractmethod + def post_processing_adjustment(self, data, **kwargs) -> Union[xr.DataArray, gpd.GeoDataFrame]: + """ + Applies the standard post-processing adjustment used for rendering of the layer + :param are specific to the layer + :return: A rioxarray-format DataArray or a GeoPandas DataFrame + """ + return data + def mask(self, *layers): """ Apply layers as masks @@ -56,7 +63,7 @@ def groupby(self, zones, layer=None): """ return LayerGroupBy(self.aggregate, zones, layer, self.masks) - def write(self, bbox, output_path, tile_degrees=None): + def write(self, bbox, output_path, tile_degrees=None, **kwargs): """ Write the layer to a path. Does not apply masks. @@ -76,6 +83,7 @@ def write(self, bbox, output_path, tile_degrees=None): file_names = [] for tile in tiles["geometry"]: data = self.aggregate.get_data(tile.bounds) + data = self.post_processing_adjustment(data, **kwargs) file_name = f"{output_path}/{uuid4()}.tif" file_names.append(file_name) @@ -83,6 +91,7 @@ def write(self, bbox, output_path, tile_degrees=None): write_layer(file_name, data) else: data = self.aggregate.get_data(bbox) + data = self.post_processing_adjustment(data, **kwargs) write_layer(output_path, data) @@ -301,21 +310,23 @@ def get_image_collection( return data - def write_layer(path, data): if isinstance(data, xr.DataArray): - # for rasters, need to write to locally first then copy to cloud storage - if path.startswith("s3://"): - tmp_path = f"{uuid4()}.tif" - data.rio.to_raster(raster_path=tmp_path, driver="COG") - - s3 = boto3.client('s3') - s3.upload_file(tmp_path, path.split('/')[2], '/'.join(path.split('/')[3:])) - - os.remove(tmp_path) - else: - data.rio.to_raster(raster_path=path, driver="COG") + write_dataarray(path, data) elif isinstance(data, gpd.GeoDataFrame): data.to_file(path, driver="GeoJSON") else: - raise NotImplementedError("Can only write DataArray or GeoDataFrame") + raise NotImplementedError("Can only write DataArray, Dataset, or GeoDataFrame") + +def write_dataarray(path, data): + # for rasters, need to write to locally first then copy to cloud storage + if path.startswith("s3://"): + tmp_path = f"{uuid4()}.tif" + data.rio.to_raster(raster_path=tmp_path, driver="COG") + + s3 = boto3.client('s3') + s3.upload_file(tmp_path, path.split('/')[2], '/'.join(path.split('/')[3:])) + + os.remove(tmp_path) + else: + data.rio.to_raster(raster_path=path, driver="COG") diff --git a/city_metrix/layers/ndvi_sentinel2_gee.py b/city_metrix/layers/ndvi_sentinel2_gee.py new file mode 100644 index 0000000..3ab36c0 --- /dev/null +++ b/city_metrix/layers/ndvi_sentinel2_gee.py @@ -0,0 +1,65 @@ +import ee +from tools.xarray_tools import convert_ratio_to_percentage +from .layer import Layer, get_image_collection + +class NdviSentinel2(Layer): + """" + NDVI = Sentinel-2 Normalized Difference Vegetation Index + param: year: The satellite imaging year. + 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, **kwargs): + super().__init__(**kwargs) + self.year = year + + def get_data(self, bbox): + if self.year is None: + raise Exception('NdviSentinel2.get_data() requires a year value') + + start_date = "%s-01-01" % self.year + end_date = "%s-12-31" % self.year + + # Compute NDVI for each image + def calculate_ndvi(image): + ndvi = (image + .normalizedDifference(['B8', 'B4']) + .rename('NDVI')) + return image.addBands(ndvi) + + s2 = ee.ImageCollection("COPERNICUS/S2_HARMONIZED") + ndvi = (s2 + .filterBounds(ee.Geometry.BBox(*bbox)) + .filterDate(start_date, end_date) + .map(calculate_ndvi) + .select('NDVI') + ) + + ndvi_mosaic = ndvi.qualityMosaic('NDVI') + + ic = ee.ImageCollection(ndvi_mosaic) + ndvi_data = get_image_collection(ic, bbox, 10, "NDVI") + + xdata = ndvi_data.to_dataarray() + + return xdata + + def post_processing_adjustment(self, data, ndvi_threshold=0.4, convert_to_percentage=True, **kwargs): + """ + Applies the standard post-processing adjustment used for rendering of NDVI including masking + to a threshold and conversion to percentage values. + :param ndvi_threshold: (float) minimum threshold for keeping values + :param convert_to_percentage: (bool) controls whether NDVI values are converted to a percentage + :return: A rioxarray-format DataArray + """ + # Remove values less than the specified threshold + if ndvi_threshold is not None: + data = data.where(data >= ndvi_threshold) + + # Convert to percentage in byte data_type + if convert_to_percentage is True: + data = convert_ratio_to_percentage(data) + + return data diff --git a/city_metrix/layers/open_street_map.py b/city_metrix/layers/open_street_map.py index 8a32936..a56ff6b 100644 --- a/city_metrix/layers/open_street_map.py +++ b/city_metrix/layers/open_street_map.py @@ -54,3 +54,10 @@ def get_data(self, bbox): osm_feature = osm_feature.reset_index()[keep_col] return osm_feature + + def write(self, output_path): + self.data['bbox'] = str(self.data.total_bounds) + self.data['osm_class'] = str(self.osm_class.value) + + # Write to a GeoJSON file + self.data.to_file(output_path, driver='GeoJSON') diff --git a/city_metrix/layers/sentinel_2_level_2.py b/city_metrix/layers/sentinel_2_level_2.py index a7ae944..bc17d6e 100644 --- a/city_metrix/layers/sentinel_2_level_2.py +++ b/city_metrix/layers/sentinel_2_level_2.py @@ -1,9 +1,10 @@ import odc.stac import pystac_client +from jupyterlab.utils import deprecated from .layer import Layer - +@deprecated class Sentinel2Level2(Layer): def __init__(self, bands, start_date="2013-01-01", end_date="2023-01-01", **kwargs): super().__init__(**kwargs) @@ -50,4 +51,6 @@ def get_data(self, bbox): cloud_masked = s2.where(s2 != 0).where(s2.scl != 3).where(s2.scl != 8).where(s2.scl != 9).where( s2.scl != 10) + # TODO: Determine how to output as an xarray + return cloud_masked.drop_vars("scl") diff --git a/tests/resources/bbox_constants.py b/tests/resources/bbox_constants.py index 9f20f53..9aaf8ad 100644 --- a/tests/resources/bbox_constants.py +++ b/tests/resources/bbox_constants.py @@ -1,9 +1,22 @@ # File defines bboxes using in the test code -BBOX_BR_LAURO_DE_FREITAS_1 = ( +BBOX_BRA_LAURO_DE_FREITAS_1 = ( -38.35530428121955, -12.821710300686393, -38.33813814352424, -12.80363249765361, -) \ No newline at end of file +) + +BBOX_BRA_SALVADOR_ADM4 = ( + -38.647320153390055, + -13.01748678217598787, + -38.3041637148564007, + -12.75607703449720631 +) + +BBOX_SMALL_TEST = ( + -38.43864,-12.97987, + -38.39993,-12.93239 +) + 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 new file mode 100644 index 0000000..c288548 --- /dev/null +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py @@ -0,0 +1,67 @@ +import tempfile +import pytest +import os +import shutil +from collections import namedtuple + +from tests.resources.bbox_constants import BBOX_BRA_LAURO_DE_FREITAS_1 +from tools.general_tools import create_target_folder, is_valid_path + +# 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 + +# Specify None to write to a temporary default folder otherwise specify a valid custom target path. +CUSTOM_DUMP_DIRECTORY = None + +# 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 + +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) + + 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) + +@pytest.fixture +def target_folder(): + return get_target_folder_path() + +@pytest.fixture +def bbox_info(): + bbox = namedtuple('bbox', ['bounds', 'country']) + bbox_instance = bbox(bounds=BBOX, country=COUNTRY_CODE_FOR_BBOX) + return bbox_instance + +def get_target_folder_path(): + if CUSTOM_DUMP_DIRECTORY is not None: + if is_valid_path(CUSTOM_DUMP_DIRECTORY) is False: + raise ValueError(f"The custom path '%s' is not valid. Stopping." % CUSTOM_DUMP_DIRECTORY) + else: + output_dir = CUSTOM_DUMP_DIRECTORY + else: + sub_directory_name = 'test_result_tif_files' + scratch_dir_name = tempfile.TemporaryDirectory(ignore_cleanup_errors=True).name + dir_path = os.path.dirname(scratch_dir_name) + output_dir = os.path.join(dir_path, sub_directory_name) + + return output_dir + +def prep_output_path(output_folder, file_name): + file_path = os.path.join(output_folder, file_name) + if os.path.isfile(file_path): + os.remove(file_path) + return file_path + +def verify_file_is_populated(file_path): + is_populated = True if os.path.getsize(file_path) > 0 else False + return is_populated diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgs b/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgs deleted file mode 100644 index 999bd52..0000000 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/layers_for_br_lauro_de_freitas.qgs +++ /dev/null @@ -1,5175 +0,0 @@ - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - land_surface_temperature_e26fbad7_3504_4b45_ad36_9231bc6ede9e - Google_Maps_814dce96_1bde_4a2c_aaff_51c3cf786817 - average_net_building_height_cb2fbeee_22a5_4862_a170_b5b97d8c2359 - esa_world_cover_913f3cfa_418a_4705_9ed8_cb4d0042455b - high_land_surface_temperature_b6aba51a_6624_45f4_a804_8947316deabd - albedo_63933ce5_ee3b_4891_bba3_3e6f2b632a65 - alos_dsm_afabef96_7acf_4ba8_9326_3fe0c486e868 - smart_surface_lulc_3c04a4e2_2352_49bc_9c1a_d8c9b22055ce - tree_canopy_height_7902b00d_e052_4c25_86e2_f465a978f4fc - tree_cover_1ccee586_17ee_4e1b_aef7_5cfa559b5b05 - urban_land_use_2b9d2c0b_7689_489d_ad0d_7317d9d15faa - world_pop_65d76980_e93c_4f74_84cb_3a2594b36255 - nasa_dem_68846b24_ab9e_4975_a548_9ea4c03bfe8d - natural_areas_fd87fec5_4965_46d4_9f49_3a87327de975 - open_buildings_0d3930fb_7530_4657_bde1_bf40431f46a7 - overture_buildings_36036eef_d21e_4838_8914_f2ebad1d5c68 - Google_Satellite_d2a2ce31_6540_4c56_998b_61c1ed81cf7f - - - - - - - - - - - - meters - - 569483.20351014251355082 - 8582439.30899122543632984 - 572298.77636430819984525 - 8584530.33974483050405979 - - 0 - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Annotations_fcde2ed1_e785_4cb5_af26_e512b670ceae - - - - - Annotations - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - - - - - - 0 - 0 - - - - - false - - - - - - - 1 - 1 - 1 - 0 - - - - 1 - 0 - - - - - - -20037508.34278924390673637 - -20037508.34278924763202667 - 20037508.34278924390673637 - 20037508.34278924763202667 - - - -180 - -85.05112877980660357 - 179.99999999999997158 - 85.05112877980660357 - - Google_Maps_814dce96_1bde_4a2c_aaff_51c3cf786817 - crs=EPSG:3857&format&type=xyz&url=https://mt1.google.com/vt/lyrs%3Dm%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0 - - - - Google Maps - - - PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]] - +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs - 3857 - 3857 - EPSG:3857 - WGS 84 / Pseudo-Mercator - merc - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - 0 - 0 - - - - - false - - - - - wms - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - None - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - resamplingFilter - - 0 - - - - -20037508.34278924390673637 - -20037508.34278924763202667 - 20037508.34278924390673637 - 20037508.34278924763202667 - - - -180 - -85.05112877980660357 - 179.99999999999997158 - 85.05112877980660357 - - Google_Satellite_d2a2ce31_6540_4c56_998b_61c1ed81cf7f - crs=EPSG:3857&format&type=xyz&url=https://mt1.google.com/vt/lyrs%3Ds%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0 - - - - Google Satellite - - - PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]] - +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs - 3857 - 3857 - EPSG:3857 - WGS 84 / Pseudo-Mercator - merc - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - 0 - 0 - - - - - false - - - - - wms - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - None - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571832.59035570570267737 - 8584483.1620953194797039 - - - -38.35535003588469039 - -12.82171043979659331 - -38.33807328503521461 - -12.80367359560521656 - - albedo_63933ce5_ee3b_4891_bba3_3e6f2b632a65 - ./albedo.tif - - - - albedo - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571822.59035570570267737 - 8584473.1620953194797039 - - - -38.35534980613592637 - -12.82171043979659331 - -38.3381654292332712 - -12.80376424953941772 - - alos_dsm_afabef96_7acf_4ba8_9326_3fe0c486e868 - ./alos_dsm.tif - - - - alos_dsm - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571862.59035570570267737 - 8584493.1620953194797039 - - - -38.35535026563169225 - -12.82171043979659331 - -38.33779685245188773 - -12.80358247852375619 - - average_net_building_height_cb2fbeee_22a5_4862_a170_b5b97d8c2359 - ./average_net_building_height.tif - - - - average_net_building_height - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571832.59035570570267737 - 8584483.1620953194797039 - - - -38.35535003588469039 - -12.82171043979659331 - -38.33807328503521461 - -12.80367359560521656 - - esa_world_cover_913f3cfa_418a_4705_9ed8_cb4d0042455b - ./esa_world_cover.tif - - - - esa_world_cover - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571822.59035570570267737 - 8584473.1620953194797039 - - - -38.35534980613592637 - -12.82171043979659331 - -38.3381654292332712 - -12.80376424953941772 - - high_land_surface_temperature_b6aba51a_6624_45f4_a804_8947316deabd - ./high_land_surface_temperature.tif - - - - high_land_surface_temperature - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571822.59035570570267737 - 8584473.1620953194797039 - - - -38.35534980613592637 - -12.82171043979659331 - -38.3381654292332712 - -12.80376424953941772 - - land_surface_temperature_e26fbad7_3504_4b45_ad36_9231bc6ede9e - ./land_surface_temperature.tif - - - - land_surface_temperature - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571822.59035570570267737 - 8584473.1620953194797039 - - - -38.35534980613592637 - -12.82171043979659331 - -38.3381654292332712 - -12.80376424953941772 - - nasa_dem_68846b24_ab9e_4975_a548_9ea4c03bfe8d - ./nasa_dem.tif - - - - nasa_dem - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571832.59035570570267737 - 8584483.1620953194797039 - - - -38.35535003588469039 - -12.82171043979659331 - -38.33807328503521461 - -12.80367359560521656 - - natural_areas_fd87fec5_4965_46d4_9f49_3a87327de975 - ./natural_areas.tif - - - - natural_areas - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - open_buildings_0d3930fb_7530_4657_bde1_bf40431f46a7 - ./open_buildings.tif|layername=open_buildings - - - - open_buildings - - - GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] - +proj=longlat +datum=WGS84 +no_defs - 3452 - 4326 - EPSG:4326 - WGS 84 - longlat - EPSG:7030 - true - - - - - - - dataset - - - - - - - - - - - - - - - - - - GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] - +proj=longlat +datum=WGS84 +no_defs - 3452 - 4326 - EPSG:4326 - WGS 84 - longlat - EPSG:7030 - true - - - - - - - - - - - - - ogr - - - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - generatedlayout - - - - - - - - - - - - - - - - - - - - - - - - - - - "bf_source" - - - - overture_buildings_36036eef_d21e_4838_8914_f2ebad1d5c68 - ./overture_buildings.tif|layername=overture_buildings - - - - overture_buildings - - - GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] - +proj=longlat +datum=WGS84 +no_defs - 3452 - 4326 - EPSG:4326 - WGS 84 - longlat - EPSG:7030 - true - - - - - - - dataset - - - - - - - - - GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] - +proj=longlat +datum=WGS84 +no_defs - 3452 - 4326 - EPSG:4326 - WGS 84 - longlat - EPSG:7030 - true - - - - - ogr - - - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - generatedlayout - - - - - - - - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571832.59035570570267737 - 8584483.1620953194797039 - - - -38.35535003588469039 - -12.82171043979659331 - -38.33807328503521461 - -12.80367359560521656 - - smart_surface_lulc_3c04a4e2_2352_49bc_9c1a_d8c9b22055ce - ./smart_surface_lulc.tif - - - - smart_surface_lulc - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571830.59035570570267737 - 8584488.1620953194797039 - - - -38.35535015075841159 - -12.82171043979659331 - -38.33809171387467529 - -12.8036284306771595 - - tree_canopy_height_7902b00d_e052_4c25_86e2_f465a978f4fc - ./tree_canopy_height.tif - - - - tree_canopy_height - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571832.59035570570267737 - 8584483.1620953194797039 - - - -38.35535003588469039 - -12.82171043979659331 - -38.33807328503521461 - -12.80367359560521656 - - tree_cover_1ccee586_17ee_4e1b_aef7_5cfa559b5b05 - ./tree_cover.tif - - - - tree_cover - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571832.59035570570267737 - 8584488.1620953194797039 - - - -38.35535015075841159 - -12.82171043979659331 - -38.33807328503521461 - -12.80362838437874551 - - urban_land_use_2b9d2c0b_7689_489d_ad0d_7317d9d15faa - ./urban_land_use.tif - - - - urban_land_use - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - 569962.59035570570267737 - 8582493.1620953194797039 - 571862.59035570570267737 - 8584493.1620953194797039 - - - -38.35535026563169225 - -12.82171043979659331 - -38.33779685245188773 - -12.80358247852375619 - - world_pop_65d76980_e93c_4f74_84cb_3a2594b36255 - ./world_pop.tif - - - - world_pop - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - dataset - - - - - - - - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - gdal - - - - - - - - - 1 - 1 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MinMax - WholeRaster - Estimated - 0.02 - 0.98 - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - resamplingFilter - - 0 - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 255 - 255 - 255 - 255 - 0 - 255 - 255 - - - false - - - EPSG:7030 - - - m2 - meters - - - 5 - 2.5 - false - false - false - 1 - 0 - false - false - true - 0 - 255,0,0,255 - - - false - - - true - 2 - - - 1 - - - - - - - - - - - - - - - - - - - Kenn Cartier - 2024-08-13T11:33:46 - - - - - - - - - - - PROJCRS["WGS 84 / UTM zone 24S",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 24S",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-39,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",10000000,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 42°W and 36°W, southern hemisphere between 80°S and equator, onshore and offshore. Brazil. South Georgia and the South Sandwich Islands."],BBOX[-80,-42,0,-36]],ID["EPSG",32724]] - +proj=utm +zone=24 +south +datum=WGS84 +units=m +no_defs - 3174 - 32724 - EPSG:32724 - WGS 84 / UTM zone 24S - utm - EPSG:7030 - false - - - - - - - - - - - - - - - - - - - - - - GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]] - +proj=longlat +datum=WGS84 +no_defs - 3452 - 4326 - EPSG:4326 - WGS 84 - longlat - EPSG:7030 - true - - - - - - - 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 new file mode 100644 index 0000000000000000000000000000000000000000..c0e237d2aebdf43b04800b384d412afb2eae3917 GIT binary patch literal 24185 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 w{r&%Qy-j5M_kVvG`1jfWen9DsJ^%m! literal 0 HcmV?d00001 diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2019/part-0.parquet b/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2019/part-0.parquet new file mode 100644 index 0000000000000000000000000000000000000000..8702ef4e3829056b6b855c501420053b9f5c193d GIT binary patch literal 3110 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 literal 0 HcmV?d00001 diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2022/part-0.parquet b/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2022/part-0.parquet new file mode 100644 index 0000000000000000000000000000000000000000..7ac70fb4a18ea97091be53c75e04a63c93e57c15 GIT binary patch literal 3075 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 XwJuxv3?3>4B*J`4l>h)Q+4ukNzsftR literal 0 HcmV?d00001 diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py index ba939f5..c7072f5 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py @@ -1,8 +1,8 @@ # This code is mostly intended for manual execution +# Execution configuration is specified in the conftest file import pytest import os -import shutil from city_metrix.layers import ( Albedo, @@ -18,169 +18,131 @@ OpenStreetMap, OvertureBuildings, Sentinel2Level2, + NdviSentinel2, SmartSurfaceLULC, TreeCanopyHeight, TreeCover, UrbanLandUse, WorldPop ) -from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 -from tools.general_tools import create_temp_folder, create_folder - -# 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 -# Both the tests and QGIS file are implemented for the same bounding box in Brazil. -COUNTRY_CODE_FOR_BBOX = 'BRA' -BBOX = BBOX_BR_LAURO_DE_FREITAS_1 -# Specify None to write to a temporary default folder otherwise specify a valid custom target path. -CUSTOM_DUMP_DIRECTORY = None +from .conftest import RUN_DUMPS, prep_output_path, verify_file_is_populated @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') -def test_geotiff_writing(): - qgis_project_file = 'layers_for_br_lauro_de_freitas.qgs' - - source_folder = os.path.dirname(__file__) - - if CUSTOM_DUMP_DIRECTORY is None: - output_temp_folder = create_temp_folder('test_result_tif_files', True) - else: - output_temp_folder = create_folder(CUSTOM_DUMP_DIRECTORY, True) - - source_qgis_file = os.path.join(source_folder, qgis_project_file) - target_qgis_file = os.path.join(output_temp_folder, qgis_project_file) - shutil.copyfile(source_qgis_file, target_qgis_file) - - process_layers(output_temp_folder) - - print("\n\033[93mQGIS project file and layer files were written to the %s folder.\033[0m" % output_temp_folder) - - -def process_layers(output_temp_folder): - write_albedo(output_temp_folder) - write_alos_dsm(output_temp_folder) - write_average_net_building_height(output_temp_folder) - write_esa_world_cover(output_temp_folder) - write_high_land_surface_temperature(output_temp_folder) - write_land_surface_temperature(output_temp_folder) - # write_landsat_collection_2(output_temp_folder) # TODO no longer used, but may be useful - write_nasa_dem(output_temp_folder) - write_natural_areas(output_temp_folder) - write_openbuildings(output_temp_folder) - # TODO Talk to Saif - # write_open_street_map(output_temp_folder) # TODO still needed or have we switched to overture - write_overture_buildings(output_temp_folder) - # write_sentinel_2_level2(output_temp_folder) # TODO no longer used, but may be useful - write_smart_surface_lulc(output_temp_folder) - write_tree_canopy_height(output_temp_folder) - write_tree_cover(output_temp_folder) - write_urban_land_use(output_temp_folder) - write_world_pop(output_temp_folder) - - -def write_albedo(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'albedo.tif') - Albedo().write(BBOX, file_path, tile_degrees=None) +def test_write_albedo(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'albedo.tif') + Albedo().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_alos_dsm(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'alos_dsm.tif') - AlosDSM().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_alos_dsm(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'alos_dsm.tif') + AlosDSM().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_average_net_building_height(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'average_net_building_height.tif') - AverageNetBuildingHeight().write(BBOX, 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): + file_path = prep_output_path(target_folder, 'average_net_building_height.tif') + AverageNetBuildingHeight().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_esa_world_cover(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'esa_world_cover.tif') - EsaWorldCover().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_esa_world_cover(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'esa_world_cover.tif') + EsaWorldCover().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_high_land_surface_temperature(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'high_land_surface_temperature.tif') - HighLandSurfaceTemperature().write(BBOX, file_path, tile_degrees=None) +@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): + file_path = prep_output_path(target_folder, 'high_land_surface_temperature.tif') + HighLandSurfaceTemperature().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_land_surface_temperature(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'land_surface_temperature.tif') - LandSurfaceTemperature().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_land_surface_temperature(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'land_surface_temperature.tif') + LandSurfaceTemperature().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -# TODO: Determine how to output xarray.Dataset with time dimension for QGIS rendering -# def write_landsat_collection_2(output_temp_folder): -# file_path = prep_output_path(output_temp_folder, 'landsat_collection2.tif') +# 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): +# file_path = prep_output_path(target_folder, 'landsat_collection2.tif') # bands = ['green'] -# LandsatCollection2(bands).write(BBOX, file_path, tile_degrees=None) +# LandsatCollection2(bands).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) -def write_nasa_dem(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'nasa_dem.tif') - NasaDEM().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_nasa_dem(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'nasa_dem.tif') + NasaDEM().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): + file_path = prep_output_path(target_folder, 'natural_areas.tif') + NaturalAreas().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_natural_areas(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'natural_areas.tif') - NaturalAreas().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_ndvi_sentinel2_gee(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'ndvi_sentinel2_gee.tif') + (NdviSentinel2(year=2023) + .write(bbox_info.bounds, file_path, tile_degrees=None, ndvi_threshold=0.4, convert_to_percentage=True)) assert verify_file_is_populated(file_path) -def write_openbuildings(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'open_buildings.tif') - OpenBuildings(COUNTRY_CODE_FOR_BBOX).write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_openbuildings(target_folder, bbox_info): + 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 function "write" does not properly handle call -# def write_open_street_map(output_temp_folder): -# file_path = prep_output_path(output_temp_folder, 'open_street_map.tif') -# OpenStreetMap().write(BBOX, file_path, tile_degrees=None) +# 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): +# 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) -def write_overture_buildings(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'overture_buildings.tif') - OvertureBuildings().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_overture_buildings(target_folder, bbox_info): + 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: Determine how to output xarray.Dataset with time dimension for QGIS rendering -# def write_sentinel_2_level2(output_temp_folder): -# file_path = prep_output_path(output_temp_folder, 'sentinel_2_level2.tif') +# 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): +# file_path = prep_output_path(target_folder, 'sentinel_2_level2.tif') # sentinel_2_bands = ["green"] -# Sentinel2Level2(sentinel_2_bands).write(BBOX, file_path, tile_degrees=None) +# Sentinel2Level2(sentinel_2_bands).write(bbox_info.bounds, file_path, tile_degrees=None) # assert verify_file_is_populated(file_path) -def write_smart_surface_lulc(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'smart_surface_lulc.tif') - SmartSurfaceLULC().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_smart_surface_lulc(target_folder, bbox_info): + 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) -def write_tree_canopy_height(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'tree_canopy_height.tif') - TreeCanopyHeight().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_tree_canopy_height(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'tree_canopy_height.tif') + TreeCanopyHeight().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_tree_cover(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'tree_cover.tif') - TreeCover().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_tree_cover(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'tree_cover.tif') + TreeCover().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_urban_land_use(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'urban_land_use.tif') - UrbanLandUse().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_urban_land_use(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'urban_land_use.tif') + UrbanLandUse().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) -def write_world_pop(output_temp_folder): - file_path = prep_output_path(output_temp_folder, 'world_pop.tif') - WorldPop().write(BBOX, file_path, tile_degrees=None) +@pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') +def test_write_world_pop(target_folder, bbox_info): + file_path = prep_output_path(target_folder, 'world_pop.tif') + WorldPop().write(bbox_info.bounds, file_path, tile_degrees=None) assert verify_file_is_populated(file_path) - - -def prep_output_path(output_temp_folder, file_name): - file_path = os.path.join(output_temp_folder, file_name) - if os.path.isfile(file_path): - os.remove(file_path) - return file_path - -def verify_file_is_populated(file_path): - is_populated = True if os.path.getsize(file_path) > 0 else False - return is_populated diff --git a/tests/test_layers.py b/tests/test_layers.py index 7980aa1..bfcf4a0 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -5,6 +5,7 @@ Albedo, AlosDSM, AverageNetBuildingHeight, + NdviSentinel2, EsaWorldCover, EsaWorldCoverClass, HighLandSurfaceTemperature, @@ -24,28 +25,30 @@ WorldPop ) from city_metrix.layers.layer import get_image_collection -from tests.resources.bbox_constants import BBOX_BR_LAURO_DE_FREITAS_1 +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_BR_LAURO_DE_FREITAS_1).mean() + assert Albedo().get_data(BBOX).mean() def test_alos_dsm(): - mean = AlosDSM().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() + mean = AlosDSM().get_data(BBOX).mean() assert mean def test_average_net_building_height(): - assert AverageNetBuildingHeight().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() + assert AverageNetBuildingHeight().get_data(BBOX).mean() def test_esa_world_cover(): count = ( EsaWorldCover(land_cover_class=EsaWorldCoverClass.BUILT_UP) - .get_data(BBOX_BR_LAURO_DE_FREITAS_1) + .get_data(BBOX) .count() ) assert count @@ -53,7 +56,7 @@ def test_esa_world_cover(): def test_read_image_collection(): ic = ee.ImageCollection("ESA/WorldCover/v100") - data = get_image_collection(ic, BBOX_BR_LAURO_DE_FREITAS_1, 10, "test") + data = get_image_collection(ic, BBOX, 10, "test") expected_crs = 32724 expected_x_dimension = 187 @@ -68,47 +71,52 @@ def test_read_image_collection(): def test_read_image_collection_scale(): ic = ee.ImageCollection("ESA/WorldCover/v100") - data = get_image_collection(ic, BBOX_BR_LAURO_DE_FREITAS_1, 100, "test") + 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_BR_LAURO_DE_FREITAS_1) + data = HighLandSurfaceTemperature().get_data(BBOX) assert data.any() def test_land_surface_temperature(): - mean_lst = LandSurfaceTemperature().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() + mean_lst = LandSurfaceTemperature().get_data(BBOX).mean() assert mean_lst +@pytest.mark.skip(reason="layer is deprecated") def test_landsat_collection_2(): - bands = ['green'] - data = LandsatCollection2(bands).get_data(BBOX_BR_LAURO_DE_FREITAS_1) + bands = ["blue"] + data = LandsatCollection2(bands).get_data(BBOX) assert data.any() def test_nasa_dem(): - mean = NasaDEM().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() + mean = NasaDEM().get_data(BBOX).mean() assert mean def test_natural_areas(): - data = NaturalAreas().get_data(BBOX_BR_LAURO_DE_FREITAS_1) + data = NaturalAreas().get_data(BBOX) assert data.any() +def test_ndvi_sentinel2(): + data = NdviSentinel2(year=2023).get_data(BBOX) + assert data is not None + def test_openbuildings(): - count = OpenBuildings().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count().sum() + count = OpenBuildings(COUNTRY_CODE_FOR_BBOX).get_data(BBOX).count().sum() assert count def test_open_street_map(): count = ( OpenStreetMap(osm_class=OpenStreetMapClass.ROAD) - .get_data(BBOX_BR_LAURO_DE_FREITAS_1) + .get_data(BBOX) .count() .sum() ) @@ -116,28 +124,27 @@ def test_open_street_map(): def test_overture_buildings(): - count = OvertureBuildings().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count().sum() + count = OvertureBuildings().get_data(BBOX).count().sum() 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_BR_LAURO_DE_FREITAS_1) + data = Sentinel2Level2(sentinel_2_bands).get_data(BBOX) assert data.any() def test_smart_surface_lulc(): - count = SmartSurfaceLULC().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count() + count = SmartSurfaceLULC().get_data(BBOX).count() assert count - def test_tree_canopy_height(): - count = TreeCanopyHeight().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count() + count = TreeCanopyHeight().get_data(BBOX).count() assert count - def test_tree_cover(): - actual = TreeCover().get_data(BBOX_BR_LAURO_DE_FREITAS_1).mean() + actual = TreeCover().get_data(BBOX).mean() expected = 54.0 tolerance = 0.1 assert ( @@ -146,9 +153,9 @@ def test_tree_cover(): def test_urban_land_use(): - assert UrbanLandUse().get_data(BBOX_BR_LAURO_DE_FREITAS_1).count() + assert UrbanLandUse().get_data(BBOX).count() def test_world_pop(): - data = WorldPop().get_data(BBOX_BR_LAURO_DE_FREITAS_1) + data = WorldPop().get_data(BBOX) assert data.any() diff --git a/tools/general_tools.py b/tools/general_tools.py index 1497864..b38d1b5 100644 --- a/tools/general_tools.py +++ b/tools/general_tools.py @@ -1,31 +1,17 @@ import os import tempfile -def create_temp_folder(sub_directory_name: str, delete_existing_files: bool): - scratch_dir_name = tempfile.TemporaryDirectory().name - dirpath = os.path.dirname(scratch_dir_name) - temp_dir = os.path.join(dirpath, sub_directory_name) - _create_target_folder(temp_dir, delete_existing_files) - - return temp_dir - -def create_folder(folder_path, delete_existing_files: bool): - if _is_valid_path(folder_path) is False: - raise ValueError(f"The custom path '%s' is not valid. Stopping." % folder_path) - _create_target_folder(folder_path, delete_existing_files) - return folder_path - -def _is_valid_path(path: str): +def is_valid_path(path: str): return os.path.exists(path) -def _create_target_folder(folder_path, delete_existing_files: bool): +def create_target_folder(folder_path, delete_existing_files: bool): if os.path.isdir(folder_path) is False: os.makedirs(folder_path) elif delete_existing_files is True: - _remove_all_files_in_directory(folder_path) + remove_all_files_in_directory(folder_path) -def _remove_all_files_in_directory(directory): +def remove_all_files_in_directory(directory): # Iterate over all the files in the directory for filename in os.listdir(directory): file_path = os.path.join(directory, filename) diff --git a/tools/xarray_tools.py b/tools/xarray_tools.py new file mode 100644 index 0000000..2ef773d --- /dev/null +++ b/tools/xarray_tools.py @@ -0,0 +1,18 @@ +import numpy as np +from rasterio import uint8 + +def convert_ratio_to_percentage(data): + """ + Converts xarray variable from a ratio to a percentage + :param data: (xarray) xarray to be converted + :return: A rioxarray-format DataArray + """ + + # convert to percentage and to bytes for efficient storage + values_as_percent = np.round(data * 100).astype(uint8) + + # reset CRS + source_crs = data.rio.crs + values_as_percent.rio.write_crs(source_crs, inplace=True) + + return values_as_percent From e2437b082caf1c68c9d184043a96e26501514f6e Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 20:23:33 -0700 Subject: [PATCH 15/31] removed deprecated decorator since causing issues --- city_metrix/layers/landsat_collection_2.py | 3 +-- city_metrix/layers/sentinel_2_level_2.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/city_metrix/layers/landsat_collection_2.py b/city_metrix/layers/landsat_collection_2.py index 1739fa1..248227a 100644 --- a/city_metrix/layers/landsat_collection_2.py +++ b/city_metrix/layers/landsat_collection_2.py @@ -1,10 +1,9 @@ import odc.stac import pystac_client -from jupyterlab.utils import deprecated from .layer import Layer -@deprecated + class LandsatCollection2(Layer): def __init__(self, bands, start_date="2013-01-01", end_date="2023-01-01", **kwargs): super().__init__(**kwargs) diff --git a/city_metrix/layers/sentinel_2_level_2.py b/city_metrix/layers/sentinel_2_level_2.py index bc17d6e..a609293 100644 --- a/city_metrix/layers/sentinel_2_level_2.py +++ b/city_metrix/layers/sentinel_2_level_2.py @@ -1,10 +1,9 @@ import odc.stac import pystac_client -from jupyterlab.utils import deprecated from .layer import Layer -@deprecated + class Sentinel2Level2(Layer): def __init__(self, bands, start_date="2013-01-01", end_date="2023-01-01", **kwargs): super().__init__(**kwargs) From 1b04cf57ca6cb1d6be7bf0807efddd24763573d5 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 20:31:07 -0700 Subject: [PATCH 16/31] Turned off layer writing test --- tests/resources/layer_dumps_for_br_lauro_de_freitas/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c288548..5882053 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 # Specify None to write to a temporary default folder otherwise specify a valid custom target path. CUSTOM_DUMP_DIRECTORY = None From d21be6560b867ea3b81e2e3cd32597c27cf238b3 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 20:39:07 -0700 Subject: [PATCH 17/31] Removed obsolete file --- city_metrix/layers/esa_ndvi.py | 203 --------------------------------- 1 file changed, 203 deletions(-) delete mode 100644 city_metrix/layers/esa_ndvi.py diff --git a/city_metrix/layers/esa_ndvi.py b/city_metrix/layers/esa_ndvi.py deleted file mode 100644 index ad117d1..0000000 --- a/city_metrix/layers/esa_ndvi.py +++ /dev/null @@ -1,203 +0,0 @@ -def test_esa_ndvi(): - count = ( - EsaNdvi() - .get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1) - .count() - ) - assert count - - - -import ee -import xee -import xarray as xr -from shapely.geometry import box - -from .layer import Layer, get_image_collection - -"""" -NDVI = Sential-2 Normalized Difference Vegetation Index -""" -class EsaNdvi(Layer): - def __init__(self, start_date="2013-01-01", end_date="2023-01-01", **kwargs): - super().__init__(**kwargs) - self.start_date = start_date - self.end_date = end_date - - # https://gis.stackexchange.com/questions/457822/retrieving-maximum-ndvi-for-a-year-and-associated-date-for-each-pixel-in-google - def get_data(self, bbox): - ndvi = self.get_ndvi(bbox) - - # NDVIthreshold = 0.4 # decimal - # year = 2020 - # - # yearStr = str(year) - # NDVIthresholdStr = str(NDVIthreshold) - # startdate = '' + yearStr + '-01-01' - # enddate = '' + yearStr + '-12-31' - # - # s2 = ee.ImageCollection("COPERNICUS/S2_HARMONIZED") - # - # green = s2.filterDate(startdate, enddate).map(self.addNDVI) - - # dataset = ee.Image("NASA/NASADEM_HGT/001") - # nasa_dem = ee.ImageCollection(ee.ImageCollection(dataset) - # .filterBounds(ee.Geometry.BBox(*bbox)) - # .select('elevation') - # .mean() - # ) - # data = get_image_collection(nasa_dem, bbox, 30, "NASA DEM").elevation - - return 2 # data - - # def get_ndvi(self, bbox): - # # centroid = box(*bbox).centroid - # - # NDVIthreshold = 0.4 # decimal - # year = 2020 - # - # yearStr = str(year) - # NDVIthresholdStr = str(NDVIthreshold) - # startdate = '' + yearStr + '-01-01' - # enddate = '' + yearStr + '-12-31' - # - # dataset = ee.ImageCollection("COPERNICUS/S2_HARMONIZED") - # - # # green = s2.filterDate(startdate, enddate).map(self.addNDVI) - # - # # dataset = ee.ImageCollection("ECMWF/ERA5/DAILY") - # - # def addNDVI(image): - # ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI') - # return image.addBands(ndvi) - # - # ndvi = (dataset - # .filter(ee.Filter.And( - # ee.Filter.date(self.start_date, self.end_date), - # ee.Filter.bounds(ee.Geometry.BBox(*bbox)))) - # ) - # - # green = dataset.map(addNDVI) - # green = green.qualityMosaic('NDVI').select('NDVI').float(); - # greenScale = green.projection().nominalScale() - # # green = green.addBands(ee.Image(year).rename('time_start')) - # # Map.addLayer(green,{},"NDVI") - # greenmask = green.updateMask(green.select('NDVI').gte(NDVIthreshold)) - # - # g=2 - - -import ee - -# Initialize GEE -ee.Initialize() - -# Define the bounding box (lon1, lat1, lon2, lat2) -bbox = ee.Geometry.Rectangle([lon1, lat1, lon2, lat2]) - -# Define the date range -start_date = 'YYYY-MM-DD' -end_date = 'YYYY-MM-DD' - -# Load Sentinel-2 data -collection = ee.ImageCollection('COPERNICUS/S2').filterBounds(bbox).filterDate(start_date, end_date) - -# Calculate NDVI -def calculate_ndvi(image): - ndvi = image.normalizedDifference(['B8', 'B4']) - return image.addBands(ndvi.rename('NDVI')) - -ndvi_collection = collection.map(calculate_ndvi) - -# Export the data -task = ee.batch.Export.image.toDrive( - image=ndvi_collection.select('NDVI'), - description='NDVI_export', - folder='your_folder', - fileNamePrefix='ndvi', - region=bbox, - scale=10 # Set the desired resolution (e.g., 10 meters) -) - -task.start() - - -# import ee -# -# # Initialize GEE -# ee.Initialize() -# -# # Define the bounding box (lon1, lat1, lon2, lat2) -# bbox = ee.Geometry.Rectangle([lon1, lat1, lon2, lat2]) -# -# # Define the date range -# start_date = 'YYYY-MM-DD' -# end_date = 'YYYY-MM-DD' -# -# # Load Sentinel-2 data -# collection = ee.ImageCollection('COPERNICUS/S2').filterBounds(bbox).filterDate(start_date, end_date) -# -# # Calculate NDVI -# def calculate_ndvi(image): -# ndvi = image.normalizedDifference(['B8', 'B4']) -# return image.addBands(ndvi.rename('NDVI')) -# -# ndvi_collection = collection.map(calculate_ndvi) -# -# # Export the data -# task = ee.batch.Export.image.toDrive( -# image=ndvi_collection.select('NDVI'), -# description='NDVI_export', -# folder='your_folder', -# fileNamePrefix='ndvi', -# region=bbox, -# scale=10 # Set the desired resolution (e.g., 10 meters) -# ) -# -# task.start() - - - - -# import ee -# -# # Initialize GEE -# ee.Initialize() -# -# # Define your region of interest (ROI) as a polygon -# asset_polygon = ee.Geometry.Polygon( -# [[[-122.5, 37.5], -# [-122.5, 37.6], -# [-122.4, 37.6], -# [-122.4, 37.5]]]) -# -# # Define the year for which you want to retrieve data -# year = 2023 -# -# # Load Sentinel-2 Surface Reflectance (SR) data -# sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED') \ -# .filterBounds(asset_polygon) \ -# .filterDate(f'{year}-01-01', f'{year}-12-31') \ -# .select(['B4', 'B8']) # Red (B4) and Near-Infrared (B8) bands -# -# # Compute NDVI for each image -# def calculate_ndvi(image): -# ndvi = image.normalizedDifference(['B8', 'B4']).rename('ndvi') -# return image.addBands(ndvi) -# -# sentinel2_with_ndvi = sentinel2.map(calculate_ndvi) -# -# # Compute the maximum NDVI and acquisition date for each pixel -# max_ndvi = sentinel2_with_ndvi.qualityMosaic('ndvi').select('ndvi') -# acquisition_date = sentinel2_with_ndvi.qualityMosaic('system:time_start').select('system:time_start') -# -# # Export the rasters as single-band images to Google Drive -# task_max_ndvi = ee.batch.Export.image.toDrive( -# image=max_ndvi, -# description=f'S2_max_ndvi_{year}', -# folder='gee', -# scale=10, -# region=asset_polygon.geometry() -# ) -# -# task_acquisition_date = ee.batch \ No newline at end of file From 6c623f72efd329e7cb1a209819313b6bc265aad2 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Fri, 23 Aug 2024 20:48:03 -0700 Subject: [PATCH 18/31] removed sample data --- .../sample_dataset/2019/part-0.parquet | Bin 3110 -> 0 bytes .../sample_dataset/2020/part-0.parquet | Bin 3075 -> 0 bytes .../sample_dataset/2021/part-0.parquet | Bin 3079 -> 0 bytes .../sample_dataset/2022/part-0.parquet | Bin 3075 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2019/part-0.parquet delete mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2020/part-0.parquet delete mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2021/part-0.parquet delete mode 100644 tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2022/part-0.parquet diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2019/part-0.parquet b/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2019/part-0.parquet deleted file mode 100644 index 8702ef4e3829056b6b855c501420053b9f5c193d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3110 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 diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2022/part-0.parquet b/tests/resources/layer_dumps_for_br_lauro_de_freitas/sample_dataset/2022/part-0.parquet deleted file mode 100644 index 7ac70fb4a18ea97091be53c75e04a63c93e57c15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3075 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 XwJuxv3?3>4B*J`4l>h)Q+4ukNzsftR From 7a98f52cfe0ac2d2cb16704ac1d545c455db6e6c Mon Sep 17 00:00:00 2001 From: Ted Wong Date: Sun, 25 Aug 2024 20:01:30 -0400 Subject: [PATCH 19/31] add SCHOOLS and HIGHER_EDUCATION classes to osm layer --- city_metrix/layers/open_street_map.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/city_metrix/layers/open_street_map.py b/city_metrix/layers/open_street_map.py index f8ebaa4..34ea62c 100644 --- a/city_metrix/layers/open_street_map.py +++ b/city_metrix/layers/open_street_map.py @@ -22,6 +22,12 @@ class OpenStreetMapClass(Enum): ECONOMIC_OPPORTUNITY = {'landuse': ['commercial', 'industrial', 'retail', 'institutional', 'education'], 'building': ['office', 'commercial', 'industrial', 'retail', 'supermarket'], 'shop': True} + SCHOOLS = {'building': ['school',], + 'amenity': ['school', 'kindergarten'] + } + HIGHER_EDUCATION = {'amenity': ['college', 'university'], + 'building': ['college', 'university'] + } class OpenStreetMap(Layer): From 7fb392cfc491a55257a813475c792eea3d9dd090 Mon Sep 17 00:00:00 2001 From: Ted Wong Date: Sun, 25 Aug 2024 20:07:50 -0400 Subject: [PATCH 20/31] fix whitespace disparity --- city_metrix/layers/open_street_map.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/city_metrix/layers/open_street_map.py b/city_metrix/layers/open_street_map.py index 34ea62c..3ae6c61 100644 --- a/city_metrix/layers/open_street_map.py +++ b/city_metrix/layers/open_street_map.py @@ -19,15 +19,13 @@ class OpenStreetMapClass(Enum): BUILDING = {'building': True} PARKING = {'amenity': ['parking'], 'parking': True} - ECONOMIC_OPPORTUNITY = {'landuse': ['commercial', 'industrial', 'retail', 'institutional', 'education'], + ECONOMIC_OPPORTUNITY = {'landuse': ['commercial', 'industrial', 'retail', 'institutional', 'education'], 'building': ['office', 'commercial', 'industrial', 'retail', 'supermarket'], 'shop': True} - SCHOOLS = {'building': ['school',], - 'amenity': ['school', 'kindergarten'] - } - HIGHER_EDUCATION = {'amenity': ['college', 'university'], - 'building': ['college', 'university'] - } + SCHOOLS = {'building': ['school',], + 'amenity': ['school', 'kindergarten']} + HIGHER_EDUCATION = {'amenity': ['college', 'university'], + 'building': ['college', 'university']} class OpenStreetMap(Layer): From 8ae631e28e4643bea84bc9e1964ded9086257931 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Sun, 25 Aug 2024 21:09:55 -0700 Subject: [PATCH 21/31] Changed name of post-processing function. --- city_metrix/layers/layer.py | 6 +++--- city_metrix/layers/ndvi_sentinel2_gee.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/city_metrix/layers/layer.py b/city_metrix/layers/layer.py index f3e2174..1c40664 100644 --- a/city_metrix/layers/layer.py +++ b/city_metrix/layers/layer.py @@ -38,7 +38,7 @@ def get_data(self, bbox: Tuple[float]) -> Union[xr.DataArray, gpd.GeoDataFrame]: ... @abstractmethod - def post_processing_adjustment(self, data, **kwargs) -> Union[xr.DataArray, gpd.GeoDataFrame]: + def prepare_for_map_rendering(self, data, **kwargs) -> Union[xr.DataArray, gpd.GeoDataFrame]: """ Applies the standard post-processing adjustment used for rendering of the layer :param are specific to the layer @@ -83,7 +83,7 @@ def write(self, bbox, output_path, tile_degrees=None, **kwargs): file_names = [] for tile in tiles["geometry"]: data = self.aggregate.get_data(tile.bounds) - data = self.post_processing_adjustment(data, **kwargs) + data = self.prepare_for_map_rendering(data, **kwargs) file_name = f"{output_path}/{uuid4()}.tif" file_names.append(file_name) @@ -91,7 +91,7 @@ def write(self, bbox, output_path, tile_degrees=None, **kwargs): write_layer(file_name, data) else: data = self.aggregate.get_data(bbox) - data = self.post_processing_adjustment(data, **kwargs) + data = self.prepare_for_map_rendering(data, **kwargs) write_layer(output_path, data) diff --git a/city_metrix/layers/ndvi_sentinel2_gee.py b/city_metrix/layers/ndvi_sentinel2_gee.py index 3ab36c0..8458cb2 100644 --- a/city_metrix/layers/ndvi_sentinel2_gee.py +++ b/city_metrix/layers/ndvi_sentinel2_gee.py @@ -46,7 +46,7 @@ def calculate_ndvi(image): return xdata - def post_processing_adjustment(self, data, ndvi_threshold=0.4, convert_to_percentage=True, **kwargs): + def prepare_for_map_rendering(self, data, ndvi_threshold=0.4, convert_to_percentage=True, **kwargs): """ Applies the standard post-processing adjustment used for rendering of NDVI including masking to a threshold and conversion to percentage values. From 5e6138011ca01cc08e23a9cc4fe83309fd74a37f Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 27 Aug 2024 13:53:28 -0700 Subject: [PATCH 22/31] Removed post-processing function form Layers class and moved into testing code --- city_metrix/layers/layer.py | 11 ------ city_metrix/layers/ndvi_sentinel2_gee.py | 19 ---------- .../layers_for_br_lauro_de_freitas.qgz | Bin 24185 -> 24158 bytes ....py => test_write_layers_to_qgis_files.py} | 7 +--- tests/test_layer_dimensions.py | 21 +++++++++++ tests/tools.py | 35 ++++++++++++++++++ tools/xarray_tools.py | 18 --------- 7 files changed, 58 insertions(+), 53 deletions(-) rename tests/resources/layer_dumps_for_br_lauro_de_freitas/{test_write_layers_to_geotiff.py => test_write_layers_to_qgis_files.py} (97%) create mode 100644 tests/test_layer_dimensions.py create mode 100644 tests/tools.py delete mode 100644 tools/xarray_tools.py diff --git a/city_metrix/layers/layer.py b/city_metrix/layers/layer.py index 1c40664..01ad6e4 100644 --- a/city_metrix/layers/layer.py +++ b/city_metrix/layers/layer.py @@ -37,15 +37,6 @@ def get_data(self, bbox: Tuple[float]) -> Union[xr.DataArray, gpd.GeoDataFrame]: """ ... - @abstractmethod - def prepare_for_map_rendering(self, data, **kwargs) -> Union[xr.DataArray, gpd.GeoDataFrame]: - """ - Applies the standard post-processing adjustment used for rendering of the layer - :param are specific to the layer - :return: A rioxarray-format DataArray or a GeoPandas DataFrame - """ - return data - def mask(self, *layers): """ Apply layers as masks @@ -83,7 +74,6 @@ def write(self, bbox, output_path, tile_degrees=None, **kwargs): file_names = [] for tile in tiles["geometry"]: data = self.aggregate.get_data(tile.bounds) - data = self.prepare_for_map_rendering(data, **kwargs) file_name = f"{output_path}/{uuid4()}.tif" file_names.append(file_name) @@ -91,7 +81,6 @@ def write(self, bbox, output_path, tile_degrees=None, **kwargs): write_layer(file_name, data) else: data = self.aggregate.get_data(bbox) - data = self.prepare_for_map_rendering(data, **kwargs) write_layer(output_path, data) diff --git a/city_metrix/layers/ndvi_sentinel2_gee.py b/city_metrix/layers/ndvi_sentinel2_gee.py index 8458cb2..c5b21b9 100644 --- a/city_metrix/layers/ndvi_sentinel2_gee.py +++ b/city_metrix/layers/ndvi_sentinel2_gee.py @@ -1,5 +1,4 @@ import ee -from tools.xarray_tools import convert_ratio_to_percentage from .layer import Layer, get_image_collection class NdviSentinel2(Layer): @@ -45,21 +44,3 @@ def calculate_ndvi(image): xdata = ndvi_data.to_dataarray() return xdata - - def prepare_for_map_rendering(self, data, ndvi_threshold=0.4, convert_to_percentage=True, **kwargs): - """ - Applies the standard post-processing adjustment used for rendering of NDVI including masking - to a threshold and conversion to percentage values. - :param ndvi_threshold: (float) minimum threshold for keeping values - :param convert_to_percentage: (bool) controls whether NDVI values are converted to a percentage - :return: A rioxarray-format DataArray - """ - # Remove values less than the specified threshold - if ndvi_threshold is not None: - data = data.where(data >= ndvi_threshold) - - # Convert to percentage in byte data_type - if convert_to_percentage is True: - data = convert_ratio_to_percentage(data) - - return 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 c0e237d2aebdf43b04800b384d412afb2eae3917..759515e6e49022f8cbd0bbc699ed843efc6440b7 100644 GIT binary patch delta 22259 zcmZs@WmF!`vId$U0fM`0a0`&&?(XjHZo!%0?he7--QC^Yg9nEfUR-YWxA#8xoV)Iy zr>44}mNjd-x>j}dJa&BC>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|noMl{8UDt8cJHE8$`N6hE73{P+<`1lu~#H^|_z>ea?ry&)#RP{psxU+h?t7{nd0cvJ4kr z9XFqmRXZ!LIP|#Hd=Z^@ADG3uiC5lB7M78w@`k6ARS1-?Ov%WoZx#mWNvFynOHAjn z#BF4Y|0z&Fk80|0S!maRL)WR!jd(V*uF9k}z+tUnBL-ttd`25=5JVZe>sd&rF-2sF zs#%X}BYB+Xa6JblnDnmE{SH8`=qRy=d=jNmXjw?29>|^c(kj5M8>%C484|va#tXtg z70W>|+PIPkvmPXowPN{e&Asp$4g--APsVQHUB&ut0%aqrJ9O$DDYwv=ipZ@oXpBO0 zZ%DhJMn2|8d*Wg1jzL>Q$2XYpku?Z;7QViJ=9F z?0W3z=|X$(hP2lt$jbo@zL;79J&W>eG;1V@wo5sQ^)9S2oXWkP5>s+`2(9#L)@nu= zS10=4gL~3c=Dj+zio+}&=5w|^HQhG9S-RuJ2Y#F|;5!f#-iq%^vR&caGJ+hsgZx>n zdX?G`UXOkIuvPo#9}3*mxy@>>8EO1V*0@prJ|c5O{W|MP>)MHcklLUeRWTDf(wB)WG|sWKjHh}&~ZtY;Mk1~HBa-ljbQj$qlk?=B7g zOTi5=T?>KIv^}znU!u%H?~$es!cGMrq9lBn^=;XfjVu9?Uo|~AE4CSXoRJG1&I`$l z`u@MpPnzmnEo9&qKWEBcw+K$a4lWE@0q1891ozTrJc%~pp3>|7?$Wd3ErDAalAC&E zv!eCN@KTnx4QPkVMEG;{@EYvFl=xKySVJRoaITpt%hxv7Z6??mG9};<$bWHtNL;d} z<`_u1|6Qq7r6EyvH1-EW2y#WQbNYw^cpSdGge#^vzY>0~pT%g>Msw;ox|Xw=RtYOg z+p68_mQD^^2x_1gyCcTxr#+56_VGN>=AQz;qxIi(*v_u1*`UosT^BhvP)x<)iu2D4 zIXq|c>p=aS#`I~Xl!-QiwRL)%sp>CUGaN=ie^tXL4a+vVrPnt45@;?=Bq!-vzAS-MMmcz4H&KB94 z($*}!(DJ1#!i6rM!wzPK@+AcA{1}ejS$@I=Q(r;P=C{_Wq#t;z*@^X(l@p8e`IqeT zrDel73G#ORW!&LgA(j5s3oH7<$HN;wPU@RTWa^WWuJm-F_R3VD?+*8Mt_wzKHq~Aj z>VExVYp6JJJg?Rwc{Kb<3ejnlC24NuTbSja{klV+Pb03GYjfz0_wf?!8@077Nsak9 zRE%bYhNs2Q$dD;y+tX!aZfR&&yGMGW)3z$<^;1t)MN*~Py}z{aZmm>5J^CPkPbNt_HUl*atuV{ zHL0z_qm+z3f)~te(YU<+Uhm=CzKx*8w2f)k}ZvMQ!9Ua zK_ppO(F&N>rvdDgeLVlL14g_v2GRM871o*JcpnS6`xDatuthfwKI1IU!3cWvVycu zpH#%nvp80)4FsQkAu$5QqFC}Pg2Fh-1f`4%Qa7PZwp9?THbr9W$oSiuO395}XAD42 z$1YU|w0OQ=5pP>Cap!}XS4?Dyoh_N}m2Pc6H$qXXVjL*7uNj2^>fjVWHwwswFU%f6 z4EIR^Op#G{ZsSv5o3XfaCnIr#V!kOF_nP#8h`w}~SR1_PFZaI^nFSBJd6$8aD9 zPo9-%PY#zb|6?>qPJzN1!h!Sw&stWSXbfyGo{Nu8#mnv7A$t+h_0cZX?gDob|GOj@ z%o>4Y4`5uANu-Gc{>^^J5(O&)ID-E$svR`yrL|W_B5t6rtWUmw(U}7{zaE{-b@D0# zXnuI_Z`QuP8g!YX$KandrUI1)O$q6VtfNEwn-HPw5E;N;P%H(?AGnOi z&W7~Ggtt;-2oo3NjdgBc05F6TW?c_(JB=j(xNIdHwaKv;hm?y$5)VE}s77_`7QT%{ ziQ8N2#Vaq!gMSM=ls*$)lLZ_HwNv~X9KIamBY-=2 zL2N`n+h-O2F~UbYcAIBoG*cn#ONmlzPmji9r)Dss43noq+TI>6jC9ucy%s(KEcZEl zjc+`e{i_V%D5##II{>(a=gt;!CKt7wY042?Fl@{i%b|IV5=LdmXnXYogQiGMCu+Zf z{|G9iPz)&5VIw+~8zl^u0UWrC=$fX-;P}u^-^+c2 z?70L&M_)2U7K=!^=o@-*sL<(ps!!ew%H8P~4-?5%*gmq3Z4bgH=WqiC;Sn>de)e(0 zC;t%LJ_b6=$0yH!^HrbW{jvb%J&5WXPU?6EvXQsR?O*r=P~Bkk^H(?rwg4XsPvMpb zw1&d<+d9jn+Mu{l&^RdamP@KAXaz|U2AB4?68NUoz_i{3gyAVD3MWb`oG6SkSTz1i=}tYPC8CDyn}I>!j=Hu*oL4%B$>4f&;u`(2{R|RLV%;xK5>T5->?~@} z2csC;G zH90TOFpcvgmnk~aF9Xcjt(L56Wu-;4!Mkbo7{85%RHQeZC_UB8+&o>w)d9oC;sBpwWNdvv9fGu(}N|w3$p4aRH^u^H;SjbUr_QU8GQ%IATMu( zCgv2dgQQ~O4b+qr#yH%y99ALh>C`XZ$9WmktJ#5h$wZ~?ixYeJ-z8M%{Y-PXnTF=% zcnKL*2$;_wP0le|h`f*cTruzjHa%>t(qP2baN4Rv_Qs88r}vEVIXQh6)*uQ|Be7$* zRf71WOJ<0#2zBm&q&>uAs`ZiK*}9NA36k^Nhm@%r^gJkX$s3k(VVa>S7WI9;%vegb zoZL9lH3;n5Lu>kuRn%}2PUI&vze+P?yiR#$U^>1YWG0!c#GAXL^U85`O<(a`!nm%gjgEEF^RqQFPYv8ZI!yPeZlQ(mIr)gEQ^%YXcGA}%Ip&bRkmS3!|D-BdY^)G7AInw{D- zsG#g2BksWOKi|!rXYwwRgGWD*O~|sU)FHJ*wWS}MSXdmGV0eeOJ;E%?ua$&wZq}|S zjI?~Blw%52s`#>G42Y{$KIsX!bctdSS=}s&T3;SXBG(u)PG>{XA?Wp~oM~-5_7m!~ zEex8TO7VZhTc}+wOS>OXi_X-dlkvH5pOLJi79;X8l?oQ`d)zC=`vINCojwy2`sKL4 z!-^BG_sO}S$Ob_efE}{-oJn%`YDxN@+!w0yHqSZLV0t>0y)so%z9Bshn+(Zn+ZK zGm(5I>!?NfHrAq#wkG`T$ELHMd01w6L$N*Ci(6}mfpI^D<2Kw6j-Ls$eBv~$?DV{` zAgj4{e_zu*v-`yJZAw#qv5~pyz{h1Uyy*?9bn%K4hu{iQ&nLoiTt{r(F)h<@i-l&M zqe9bfbiH_bD%7rZx6hsd_;c8%fYxW=lh=VqD?W+K(MSe<3DYJKKWSD!qs1{7m~RnB zt1zqzxz-IT9 zFJ!g-`{9VI_oyiMVP89&!1@nfeqE2cndGOa$iUUWy(2VYH!%1WOe8e+vl33&t%wWE{Zvj-ye2)Rhkp8ovDH3nt@=cVAICC^i7Bd3AhuoHN^w(UR&)@T<#b(Y(<>;i9;^GBbt;UIvPx+=!Zo)1tl zFrO7?%bRaKC9|2fvNBS8rRse%RXJW$Sltn7?x=MQA_Tv8Ir8@2Ky0W!i(XG6=rJ>i zGV+Gq+qSKJb(_y`ZIc0NU~N4Q!Rtn1Ok7JHb3khXb`hdfc?^zD7!7$!FfT4-$Hr$z z!MzGl9<4o*n|_REo^WF_l6Vq>x94z?1k+iQAe&Wz^6{!-9c!0a4kEw%9M1@ZCX$z_ z6H2T->UFu>vePuT-=I0%l5zU$@f{!G3*`F53H#&Cs%iJL*geK1A72j$#=}Hffl|yfnONAcgHW_b^F>M~*dbE`Y=JPE3*-w6q zZQP1JTfoeKkVVQCZQmU`UAVByT{#Clr?V=0XBgxBkLd`LZdq`dPKq?+ce}vcs}{oT z9UHSemATPhye_e<3KB&Agf+cg4S&UbOVlgIpft8n$Q88_rELJ65!cz=yk zPv<8Wf{%&xY7ukFBD%?zkHa|>FZ<@YxhuWW?fFAJ;p6{z@kJE4!EFZPO ze@Pi{jY0&5T6}!gKpW+5cJs>VXZBLKO#F&Am28b5_2{1C1MPyPUAOZDKC}3};vOA( zPH+F+iP7kB0rkR%g}saEr04G9sJ08)|BA{QnljZKK~wSYE^iWy0r=$qUuHI;${b>j zduA*=?_}$Ocjd|zovT*>xb8pKyPy%A9<82{wThR~BM(owlZ}U<^%EWStJh@l{^-_T bde0XJpq4JZ-Tv3xF+s=T7JUs0oGiS}rK4;Ck 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 diff --git a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py similarity index 97% rename from tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py rename to tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py index c7072f5..5e0efb9 100644 --- a/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_geotiff.py +++ b/tests/resources/layer_dumps_for_br_lauro_de_freitas/test_write_layers_to_qgis_files.py @@ -1,8 +1,6 @@ # This code is mostly intended for manual execution # Execution configuration is specified in the conftest file - import pytest -import os from city_metrix.layers import ( Albedo, @@ -23,7 +21,7 @@ TreeCanopyHeight, TreeCover, UrbanLandUse, - WorldPop + WorldPop, Layer ) from .conftest import RUN_DUMPS, prep_output_path, verify_file_is_populated @@ -86,8 +84,7 @@ def test_write_natural_areas(target_folder, bbox_info): @pytest.mark.skipif(RUN_DUMPS == False, reason='Skipping since RUN_DUMPS set to False') def test_write_ndvi_sentinel2_gee(target_folder, bbox_info): file_path = prep_output_path(target_folder, 'ndvi_sentinel2_gee.tif') - (NdviSentinel2(year=2023) - .write(bbox_info.bounds, file_path, tile_degrees=None, ndvi_threshold=0.4, convert_to_percentage=True)) + NdviSentinel2(year=2023).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') diff --git a/tests/test_layer_dimensions.py b/tests/test_layer_dimensions.py new file mode 100644 index 0000000..84fa669 --- /dev/null +++ b/tests/test_layer_dimensions.py @@ -0,0 +1,21 @@ +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 + +COUNTRY_CODE_FOR_BBOX = 'BRA' +BBOX = BBOX_BRA_LAURO_DE_FREITAS_1 + +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) + + expected_size = 37213 + actual_size = data_for_map.size + expected_min = 0 + actual_min = data_for_map.values.min() + expected_max = 85 + actual_max = data_for_map.values.max() + + assert actual_size == expected_size + assert actual_min == expected_min + assert actual_max == expected_max diff --git a/tests/tools.py b/tests/tools.py new file mode 100644 index 0000000..99425df --- /dev/null +++ b/tests/tools.py @@ -0,0 +1,35 @@ +import numpy as np + +def post_process_layer(data, value_threshold=0.4, convert_to_percentage=True): + """ + Applies the standard post-processing adjustment used for rendering of NDVI including masking + to a threshold and conversion to percentage values. + :param value_threshold: (float) minimum threshold for keeping values + :param convert_to_percentage: (bool) controls whether NDVI values are converted to a percentage + :return: A rioxarray-format DataArray + """ + # Remove values less than the specified threshold + if value_threshold is not None: + data = data.where(data >= value_threshold) + + # Convert to percentage in byte data_type + if convert_to_percentage is True: + data = convert_ratio_to_percentage(data) + + return data + +def convert_ratio_to_percentage(data): + """ + Converts xarray variable from a ratio to a percentage + :param data: (xarray) xarray to be converted + :return: A rioxarray-format DataArray + """ + + # convert to percentage and to bytes for efficient storage + values_as_percent = np.round(data * 100).astype(np.uint8) + + # reset CRS + source_crs = data.rio.crs + values_as_percent.rio.write_crs(source_crs, inplace=True) + + return values_as_percent diff --git a/tools/xarray_tools.py b/tools/xarray_tools.py deleted file mode 100644 index 2ef773d..0000000 --- a/tools/xarray_tools.py +++ /dev/null @@ -1,18 +0,0 @@ -import numpy as np -from rasterio import uint8 - -def convert_ratio_to_percentage(data): - """ - Converts xarray variable from a ratio to a percentage - :param data: (xarray) xarray to be converted - :return: A rioxarray-format DataArray - """ - - # convert to percentage and to bytes for efficient storage - values_as_percent = np.round(data * 100).astype(uint8) - - # reset CRS - source_crs = data.rio.crs - values_as_percent.rio.write_crs(source_crs, inplace=True) - - return values_as_percent From 499355c56e76a36873733a472ddc1f0eae5f9521 Mon Sep 17 00:00:00 2001 From: Kenn Cartier Date: Tue, 27 Aug 2024 14:00:29 -0700 Subject: [PATCH 23/31] Removed size count since varies between runs --- tests/test_layer_dimensions.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_layer_dimensions.py b/tests/test_layer_dimensions.py index 84fa669..15768d6 100644 --- a/tests/test_layer_dimensions.py +++ b/tests/test_layer_dimensions.py @@ -9,13 +9,10 @@ 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) - expected_size = 37213 - actual_size = data_for_map.size expected_min = 0 actual_min = data_for_map.values.min() expected_max = 85 actual_max = data_for_map.values.max() - assert actual_size == expected_size assert actual_min == expected_min assert actual_max == expected_max From de31e0717e4308bb450773a017bc6003044065ad Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Wed, 28 Aug 2024 10:20:49 -0400 Subject: [PATCH 24/31] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6b23e83..7c7fec6 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ The Cities Indicator Framework (CIF) is a set of Python tools to make it easier * `pip install git+https://github.com/wri/cities-cif/releases/latest` gives you the latest stable release. * `pip install git+https://github.com/wri/cities-cif` gives you the main branch with is not stable. +NOTE: If you have already installed the package and want to update to the latest code you may need to add the `--force-reinstall` flag + ## PR Review 0. Prerequisites From 0ecf8c519609ff742024b91d9b8b04b8b741bb03 Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Thu, 29 Aug 2024 11:29:00 -0400 Subject: [PATCH 25/31] Update developer.md --- docs/developer.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/developer.md b/docs/developer.md index c6b1855..7ac9a23 100644 --- a/docs/developer.md +++ b/docs/developer.md @@ -132,7 +132,5 @@ Ensure the columns in the `GeoDataFrame` align with the [boundaries table](https You can run the tests by setting the credentials above and running the following: ``` -cd ./tests -pytest layers.py -pytest metrics.py +pytest ``` From 8267fa548cd1936c946f06ebf23ffc0effc77fb3 Mon Sep 17 00:00:00 2001 From: Elizabeth Jane Wesley <23467296+elizabethjanewesley@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:19:12 -0400 Subject: [PATCH 26/31] Fix road buffer in smart_surface_lulc.py Fixed buffer to be half the desired width of the road --- city_metrix/layers/smart_surface_lulc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/city_metrix/layers/smart_surface_lulc.py b/city_metrix/layers/smart_surface_lulc.py index d58f468..2ab2a02 100644 --- a/city_metrix/layers/smart_surface_lulc.py +++ b/city_metrix/layers/smart_surface_lulc.py @@ -66,7 +66,7 @@ def get_data(self, bbox): # cap is flat to the terminus of the road # join style is mitred so intersections are squared roads_osm['geometry'] = roads_osm.apply(lambda row: row['geometry'].buffer( - row['lanes'] * 3.048, + row['lanes'] * 3.048 / 2, cap_style=CAP_STYLE.flat, join_style=JOIN_STYLE.mitre), axis=1 From de895686591863ebc5840284b4401bdd39d1c581 Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Fri, 30 Aug 2024 14:56:44 -0400 Subject: [PATCH 27/31] set exactextract version --- .github/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/requirements.txt b/.github/requirements.txt index 9928a46..6b06f18 100644 --- a/.github/requirements.txt +++ b/.github/requirements.txt @@ -17,4 +17,4 @@ pip==23.3.1 boto3==1.34.124 scikit-learn==1.5.0 overturemaps==0.6.0 -git+https://github.com/isciences/exactextract \ No newline at end of file +exactextract==0.2.0.dev252 From e74db45137f62cf4814608b89d1f789eda3a77a7 Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Fri, 30 Aug 2024 15:09:50 -0400 Subject: [PATCH 28/31] Use exactextract for conda and and package install --- environment.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/environment.yml b/environment.yml index 24ec040..0459608 100644 --- a/environment.yml +++ b/environment.yml @@ -22,6 +22,6 @@ dependencies: - pip=23.3.1 - boto3=1.34.124 - scikit-learn=1.5.0 + - exactextract=0.2.0.dev252 - pip: - - git+https://github.com/isciences/exactextract - overturemaps==0.6.0 diff --git a/setup.py b/setup.py index 3124621..179b595 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ "s3fs", "dask>=2023.11.0", "boto3", - "exactextract", + "exactextract<=0.2.0.dev252", "overturemaps", "scikit-learn>=1.5.0", ], From f073a6fc3ea08476ae210ed36b7ec3c87319c7dc Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Tue, 3 Sep 2024 15:58:42 -0400 Subject: [PATCH 29/31] Update dev_ci_cd.yml --- .github/workflows/dev_ci_cd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev_ci_cd.yml b/.github/workflows/dev_ci_cd.yml index 6d55444..c57fd39 100644 --- a/.github/workflows/dev_ci_cd.yml +++ b/.github/workflows/dev_ci_cd.yml @@ -14,9 +14,9 @@ jobs: python-version: ["3.10"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install Linux dependencies From 7ac9b26e1cd17c67c032a7dfbd772fd00b41b8b1 Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Wed, 4 Sep 2024 17:06:28 -0400 Subject: [PATCH 30/31] Update dev_ci_cd.yml --- .github/workflows/dev_ci_cd.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dev_ci_cd.yml b/.github/workflows/dev_ci_cd.yml index c57fd39..6701372 100644 --- a/.github/workflows/dev_ci_cd.yml +++ b/.github/workflows/dev_ci_cd.yml @@ -2,6 +2,7 @@ name: Dev CIF API CI/CD on: pull_request: + workflow_dispatch: permissions: contents: read From bd77d0aa8f117d06db11629f7da6d2f25bf8382a Mon Sep 17 00:00:00 2001 From: Chris Rowe Date: Thu, 5 Sep 2024 13:52:20 -0400 Subject: [PATCH 31/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7c7fec6..beea254 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ There are 2 ways to install dependencies. Choose one... ### Conda -`conda env create -f environment.yml` +`conda env create -f environment.yml` or `conda env update -f environment.yml` ### Setuptools