diff --git a/geest/core/algorithms/__init__.py b/geest/core/algorithms/__init__.py
index fcbe9fa..9b34713 100644
--- a/geest/core/algorithms/__init__.py
+++ b/geest/core/algorithms/__init__.py
@@ -1,2 +1,3 @@
from .area_iterator import AreaIterator
from .population_processor import PopulationRasterProcessingTask
+from .wee_score_processor import WEEScoreProcessingTask
diff --git a/geest/core/algorithms/population_processor.py b/geest/core/algorithms/population_processor.py
index 3e0db12..476ac1b 100644
--- a/geest/core/algorithms/population_processor.py
+++ b/geest/core/algorithms/population_processor.py
@@ -1,7 +1,12 @@
import os
import traceback
+import shutil
from typing import Optional, Tuple
+import subprocess
+import platform
+
from qgis.core import (
+ QgsApplication,
QgsTask,
QgsProcessingContext,
QgsFeedback,
@@ -12,7 +17,7 @@
QgsFeature,
)
import processing
-from geest.utilities import log_message
+from geest.utilities import log_message, resources_path
from geest.core.algorithms import AreaIterator
@@ -25,11 +30,11 @@ class PopulationRasterProcessingTask(QgsTask):
three classes based on population values.
Args:
- name (str): Name of the task.
population_raster_path (str): Path to the population raster layer.
study_area_gpkg_path (str): Path to the GeoPackage containing study area masks.
output_dir (str): Directory to save the output rasters.
- crs (Optional[QgsCoordinateReferenceSystem]): CRS for the output rasters.
+ cell_size_m (float): Cell size for the output rasters.
+ crs (Optional[QgsCoordinateReferenceSystem]): CRS for the output rasters. Will use the CRS of the clip layer if not provided.
context (Optional[QgsProcessingContext]): QGIS processing context.
feedback (Optional[QgsFeedback]): QGIS feedback object.
force_clear (bool): Flag to force clearing of all outputs before processing.
@@ -37,39 +42,60 @@ class PopulationRasterProcessingTask(QgsTask):
def __init__(
self,
- name: str,
population_raster_path: str,
study_area_gpkg_path: str,
- output_dir: str,
- crs: Optional[QgsCoordinateReferenceSystem] = None,
+ working_directory: str,
+ cell_size_m: float,
+ target_crs: Optional[QgsCoordinateReferenceSystem] = None,
context: Optional[QgsProcessingContext] = None,
feedback: Optional[QgsFeedback] = None,
force_clear: bool = False,
):
- super().__init__(name, QgsTask.CanCancel)
+ super().__init__("Population Processor", QgsTask.CanCancel)
self.population_raster_path = population_raster_path
self.study_area_gpkg_path = study_area_gpkg_path
- self.output_dir = os.path.join(output_dir, "population")
+ self.output_dir = os.path.join(working_directory, "population")
self.force_clear = force_clear
if self.force_clear and os.path.exists(self.output_dir):
for file in os.listdir(self.output_dir):
os.remove(os.path.join(self.output_dir, file))
+ self.cell_size_m = cell_size_m
os.makedirs(self.output_dir, exist_ok=True)
- self.crs = crs
+ self.target_crs = target_crs
+ if not self.target_crs:
+ layer: QgsVectorLayer = QgsVectorLayer(
+ f"{self.study_area_gpkg_path}|layername=study_area_clip_polygons",
+ "study_area_clip_polygons",
+ "ogr",
+ )
+ self.target_crs = layer.crs()
+ del layer
self.context = context
self.feedback = feedback
self.global_min = float("inf")
self.global_max = float("-inf")
self.clipped_rasters = []
self.reclassified_rasters = []
+ self.resampled_rasters = []
+ log_message(f"---------------------------------------------")
+ log_message(f"Population raster processing task initialized")
+ log_message(f"---------------------------------------------")
+ log_message(f"Population raster path: {self.population_raster_path}")
+ log_message(f"Study area GeoPackage path: {self.study_area_gpkg_path}")
+ log_message(f"Output directory: {self.output_dir}")
+ log_message(f"Cell size: {self.cell_size_m}")
+ log_message(f"CRS: {self.target_crs.authid() if self.target_crs else 'None'}")
+ log_message(f"Force clear: {self.force_clear}")
+ log_message(f"---------------------------------------------")
def run(self) -> bool:
"""
Executes the task to process population rasters.
"""
try:
- self.process_population_rasters()
- self.reclassify_population_rasters()
+ self.clip_population_rasters()
+ self.resample_population_rasters()
+ self.reclassify_resampled_rasters()
self.generate_vrts()
return True
except Exception as e:
@@ -86,7 +112,7 @@ def finished(self, result: bool) -> None:
else:
log_message("Population raster processing failed.")
- def process_population_rasters(self) -> None:
+ def clip_population_rasters(self) -> None:
"""
Clips the population raster using study area masks and records min and max values.
"""
@@ -98,7 +124,7 @@ def process_population_rasters(self) -> None:
return
# create a temporary layer using the clip geometry
clip_layer = QgsVectorLayer("Polygon", "clip", "memory")
- clip_layer.setCrs(self.crs)
+ clip_layer.setCrs(self.target_crs)
clip_layer.startEditing()
feature = QgsFeature()
feature.setGeometry(clip_area)
@@ -141,19 +167,128 @@ def process_population_rasters(self) -> None:
self.clipped_rasters.append(output_path)
- # Calculate min and max values for the clipped raster
- provider: QgsRasterDataProvider = clipped_layer.dataProvider()
+ log_message(f"Processed mask {layer_name}")
+
+ def find_gdalwarp(self) -> str:
+ """
+ Finds the gdalwarp executable using 'which' command on Unix-based systems
+ and QGIS installation path on Windows.
+ """
+ if platform.system() == "Windows":
+ gdal_path = os.path.join(QgsApplication.prefixPath(), "bin", "gdalwarp.exe")
+ if os.path.exists(gdal_path):
+ return gdal_path
+ else:
+ raise FileNotFoundError(
+ "gdalwarp.exe not found in QGIS installation path."
+ )
+ else:
+ result = subprocess.run(
+ ["which", "gdalwarp"], capture_output=True, text=True
+ )
+ if result.returncode == 0 and result.stdout.strip():
+ return result.stdout.strip()
+ else:
+ raise FileNotFoundError("gdalwarp not found in system path.")
+
+ def resample_population_rasters(self) -> None:
+ """
+ Resamples the reclassified rasters to the target CRS and resolution.
+
+ Uses the sum method to aggregate values when resampling via gdalwarp.
+
+ From gdalwarp docs: sum: compute the weighted sum of all non-NODATA contributing pixels (since GDAL 3.1)
+
+ Note: gdal:warpreproject does not expose the -r sum option, so this method
+ uses a direct gdalwarp shell call instead.
+ """
+ try:
+ gdal_path = self.find_gdalwarp()
+ except FileNotFoundError as e:
+ log_message(f"Error: {str(e)}")
+ return
+
+ area_iterator = AreaIterator(self.study_area_gpkg_path)
+
+ for index, (current_area, clip_area, current_bbox, progress) in enumerate(
+ area_iterator
+ ):
+ if self.feedback and self.feedback.isCanceled():
+ return
+
+ layer_name = f"{index}.tif"
+ input_path = os.path.join(self.output_dir, f"clipped_{layer_name}")
+ output_path = os.path.join(self.output_dir, f"resampled_{layer_name}")
+
+ log_message(f"Resampling {output_path} from {input_path}")
+
+ if not self.force_clear and os.path.exists(output_path):
+ log_message(f"Reusing existing resampled raster: {output_path}")
+ self.resampled_rasters.append(output_path)
+ continue
+
+ bbox = current_bbox.boundingBox()
+
+ # Define gdalwarp command arguments
+ gdalwarp_cmd = [
+ gdal_path,
+ "-t_srs",
+ self.target_crs.authid(),
+ "-tr",
+ str(self.cell_size_m),
+ str(self.cell_size_m),
+ "-te",
+ str(bbox.xMinimum()),
+ str(bbox.yMinimum()),
+ str(bbox.xMaximum()),
+ str(bbox.yMaximum()),
+ "-r",
+ "sum",
+ "-of",
+ "GTiff",
+ input_path,
+ output_path,
+ ]
+
+ try:
+ # Run the gdalwarp command
+ log_message(f"Running gdalwarp with command: {' '.join(gdalwarp_cmd)}")
+ subprocess.run(
+ gdalwarp_cmd,
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ except subprocess.CalledProcessError as e:
+ log_message(
+ f"Failed to resample raster: {output_path}\nError: {e.stderr.decode()}"
+ )
+ continue
+
+ # Load the resampled raster
+ resampled_layer = QgsRasterLayer(output_path, f"Resampled {layer_name}")
+
+ if not resampled_layer.isValid():
+ log_message(f"Invalid resampled raster layer for: {layer_name}")
+ continue
+
+ self.resampled_rasters.append(output_path)
+
+ # Calculate min and max values for the resampled raster
+ provider: QgsRasterDataProvider = resampled_layer.dataProvider()
stats = provider.bandStatistics(1)
self.global_min = min(self.global_min, stats.minimumValue)
self.global_max = max(self.global_max, stats.maximumValue)
log_message(
- f"Processed mask {layer_name}: Min={stats.minimumValue}, Max={stats.maximumValue}"
+ f"Processed resample {layer_name}: Min={stats.minimumValue}, Max={stats.maximumValue}"
)
+ log_message(f"Resampled raster: {output_path}")
- def reclassify_population_rasters(self) -> None:
+ def reclassify_resampled_rasters(self) -> None:
"""
- Reclassifies clipped rasters into three classes based on population values.
+ Reclassifies the resampled rasters into three classes based on population values.
"""
area_iterator = AreaIterator(self.study_area_gpkg_path)
range_third = (self.global_max - self.global_min) / 3
@@ -165,9 +300,9 @@ def reclassify_population_rasters(self) -> None:
return
layer_name = f"{index}.tif"
+ input_path = os.path.join(self.output_dir, f"resampled_{layer_name}")
output_path = os.path.join(self.output_dir, f"reclassified_{layer_name}")
- input_path = os.path.join(self.output_dir, f"clipped_{layer_name}")
log_message(f"Reclassifying {output_path} from {input_path}")
if not self.force_clear and os.path.exists(output_path):
@@ -178,7 +313,7 @@ def reclassify_population_rasters(self) -> None:
params = {
"INPUT_RASTER": input_path,
"RASTER_BAND": 1,
- "TABLE": [
+ "TABLE": [ # ['0','52','1','52','95','2','95','140','3'],
self.global_min,
self.global_min + range_third,
1,
@@ -189,12 +324,16 @@ def reclassify_population_rasters(self) -> None:
self.global_max,
3,
],
+ "RANGE_BOUNDARIES": 0,
+ "NODATA_FOR_MISSING": True,
"NO_DATA": 0,
- "DATA_TYPE": 5, # Float32
- # "DATA_TYPE": 1, # Byte
+ # "DATA_TYPE": 5, # Float32
+ "DATA_TYPE": 1, # Byte
"OUTPUT": output_path,
}
+
log_message(f"Reclassifying raster: {input_path}")
+ log_message(f"Reclassification table:\n {params['TABLE']}\n")
result = processing.run("native:reclassifybytable", params)
if not result["OUTPUT"]:
@@ -210,9 +349,15 @@ def generate_vrts(self) -> None:
Generates VRT files combining all clipped and reclassified rasters.
"""
clipped_vrt_path = os.path.join(self.output_dir, "clipped_population.vrt")
+
+ resampled_vrt_path = os.path.join(self.output_dir, "resampled_population.vrt")
+
reclassified_vrt_path = os.path.join(
self.output_dir, "reclassified_population.vrt"
)
+ reclassified_qml_path = os.path.join(
+ self.output_dir, "reclassified_population.qml"
+ )
# Generate VRT for clipped rasters
if self.clipped_rasters:
@@ -225,6 +370,17 @@ def generate_vrts(self) -> None:
processing.run("gdal:buildvirtualraster", params)
log_message(f"Generated VRT for clipped rasters: {clipped_vrt_path}")
+ # Generate VRT for resampled rasters
+ if self.resampled_rasters:
+ params = {
+ "INPUT": self.resampled_rasters,
+ "RESOLUTION": 0, # Use highest resolution among input files
+ "SEPARATE": False, # Combine into a single band
+ "OUTPUT": resampled_vrt_path,
+ }
+ processing.run("gdal:buildvirtualraster", params)
+ log_message(f"Generated VRT for resampled rasters: {resampled_vrt_path}")
+
# Generate VRT for reclassified rasters
if self.reclassified_rasters:
params = {
@@ -237,3 +393,7 @@ def generate_vrts(self) -> None:
log_message(
f"Generated VRT for reclassified rasters: {reclassified_vrt_path}"
)
+ source_qml = resources_path("resources", "qml", f"population_3_classes.qml")
+
+ log_message(f"Copying QML from {source_qml} to {reclassified_qml_path}")
+ shutil.copyfile(source_qml, reclassified_qml_path)
diff --git a/geest/core/algorithms/wee_score_processor.py b/geest/core/algorithms/wee_score_processor.py
new file mode 100644
index 0000000..d82819c
--- /dev/null
+++ b/geest/core/algorithms/wee_score_processor.py
@@ -0,0 +1,201 @@
+import os
+import traceback
+from typing import Optional, List
+import shutil
+
+from qgis.core import (
+ QgsTask,
+ QgsProcessingContext,
+ QgsFeedback,
+ QgsRasterLayer,
+ QgsVectorLayer,
+ QgsCoordinateReferenceSystem,
+)
+import processing
+from geest.utilities import log_message, resources_path
+from geest.core.algorithms import AreaIterator
+
+
+class WEEScoreProcessingTask(QgsTask):
+ """
+ A QgsTask subclass for calculating WEE SCORE using raster algebra.
+
+ It iterates over study areas, calculates the WEE SCORE using aligned input rasters
+ (GEEST and POP), combines the resulting rasters into a VRT, and applies a QML style.
+
+ Args:
+ study_area_gpkg_path (str): Path to the GeoPackage containing study area masks.
+ working_directory (str): Directory to save the output rasters.
+ target_crs (Optional[QgsCoordinateReferenceSystem]): CRS for the output rasters.
+ force_clear (bool): Flag to force clearing of all outputs before processing.
+ """
+
+ def __init__(
+ self,
+ study_area_gpkg_path: str,
+ working_directory: str,
+ target_crs: Optional[QgsCoordinateReferenceSystem] = None,
+ force_clear: bool = False,
+ ):
+ super().__init__("WEE Score Processor", QgsTask.CanCancel)
+ self.study_area_gpkg_path = study_area_gpkg_path
+
+ self.output_dir = os.path.join(working_directory, "wee_score")
+ os.makedirs(self.output_dir, exist_ok=True)
+
+ # These folders should already exist from the aggregation analysis and population raster processing
+ self.population_folder = os.path.join(working_directory, "population")
+ self.wee_folder = working_directory
+
+ self.force_clear = force_clear
+ if self.force_clear and os.path.exists(self.output_dir):
+ for file in os.listdir(self.output_dir):
+ os.remove(os.path.join(self.output_dir, file))
+
+ self.target_crs = target_crs
+ if not self.target_crs:
+ layer: QgsVectorLayer = QgsVectorLayer(
+ f"{self.study_area_gpkg_path}|layername=study_area_clip_polygons",
+ "study_area_clip_polygons",
+ "ogr",
+ )
+ self.target_crs = layer.crs()
+ del layer
+ self.output_rasters: List[str] = []
+
+ log_message("Initialized WEE SCORE Processing Task")
+
+ def run(self) -> bool:
+ """
+ Executes the WEE SCORE calculation task.
+ """
+ try:
+ self.calculate_wee_score()
+ self.generate_vrt()
+ return True
+ except Exception as e:
+ log_message(f"Task failed: {e}")
+ log_message(traceback.format_exc())
+ return False
+
+ def validate_rasters(
+ self,
+ geest_raster: QgsRasterLayer,
+ pop_raster: QgsRasterLayer,
+ dimension_check=False,
+ ) -> None:
+ """
+ Checks if GEEST and POP rasters have the same origin, dimensions, and pixel sizes.
+
+ Raises an exception if the check fails.
+
+ Args:
+ geest_raster_path (QgsRasterLayer): Path to the GEEST raster.
+ pop_raster_path (QgsRasterLayer): Path to the POP raster.
+ dimension_check (bool): Flag to check if the rasters have the same dimensions.
+ returns:
+ None
+ """
+ log_message("Validating input rasters")
+ log_message(f"GEEST Raster: {geest_raster.source()}")
+ log_message(f"POP Raster : {pop_raster.source()}")
+
+ if not geest_raster.isValid() or not pop_raster.isValid():
+ raise ValueError("One or both input rasters are invalid.")
+
+ if not dimension_check:
+ return
+
+ geest_provider = geest_raster.dataProvider()
+ pop_provider = pop_raster.dataProvider()
+
+ geest_extent = geest_provider.extent()
+ pop_extent = pop_provider.extent()
+ if geest_extent != pop_extent:
+ raise ValueError("Input rasters do not share the same extent.")
+
+ geest_size = geest_provider.xSize(), geest_provider.ySize()
+ pop_size = pop_provider.xSize(), pop_provider.ySize()
+ if geest_size != pop_size:
+ raise ValueError("Input rasters do not share the same dimensions.")
+
+ log_message("Validation successful: rasters are aligned.")
+
+ def calculate_wee_score(self) -> None:
+ """
+ Calculates WEE SCORE using raster algebra and saves the result for each area.
+ """
+ area_iterator = AreaIterator(self.study_area_gpkg_path)
+ for index, (_, _, _, _) in enumerate(area_iterator):
+ if self.isCanceled():
+ return
+
+ wee_path = os.path.join(self.wee_folder, f"wee_masked_{index}.tif")
+ population_path = os.path.join(
+ self.population_folder, f"reclassified_{index}.tif"
+ )
+ wee_layer = QgsRasterLayer(wee_path, "WEE")
+ pop_layer = QgsRasterLayer(population_path, "POP")
+ self.validate_rasters(wee_layer, pop_layer)
+
+ output_path = os.path.join(self.output_dir, f"wee_score_{index}.tif")
+ if not self.force_clear and os.path.exists(output_path):
+ log_message(f"Reusing existing raster: {output_path}")
+ self.output_rasters.append(output_path)
+ continue
+
+ log_message(f"Calculating WEE SCORE for area {index}")
+
+ params = {
+ "INPUT_A": wee_layer,
+ "BAND_A": 1,
+ "INPUT_B": pop_layer,
+ "BAND_B": 1,
+ "FORMULA": "((A - 1) * 3) + B",
+ "NO_DATA": None,
+ "EXTENT_OPT": 3,
+ "PROJWIN": None,
+ "RTYPE": 0,
+ "OPTIONS": "",
+ "EXTRA": "",
+ "OUTPUT": output_path,
+ }
+
+ processing.run("gdal:rastercalculator", params)
+ self.output_rasters.append(output_path)
+
+ log_message(f"WEE SCORE raster saved to {output_path}")
+
+ def generate_vrt(self) -> None:
+ """
+ Combines all WEE SCORE rasters into a single VRT and applies a QML style.
+ """
+ vrt_path = os.path.join(self.output_dir, "wee_score.vrt")
+ qml_path = os.path.join(self.output_dir, "wee_score.qml")
+ source_qml = resources_path("resources", "qml", "wee_score_style.qml")
+
+ params = {
+ "INPUT": self.output_rasters,
+ "RESOLUTION": 0, # Use highest resolution
+ "SEPARATE": False, # Combine into a single band
+ "OUTPUT": vrt_path,
+ }
+
+ processing.run("gdal:buildvirtualraster", params)
+ log_message(f"Generated VRT at {vrt_path}")
+
+ # Apply QML Style
+ if os.path.exists(source_qml):
+ shutil.copy(source_qml, qml_path)
+ log_message(f"Copied QML style from {source_qml} to {qml_path}")
+ else:
+ log_message("QML style file not found. Skipping QML copy.")
+
+ def finished(self, result: bool) -> None:
+ """
+ Called when the task completes.
+ """
+ if result:
+ log_message("WEE SCORE calculation completed successfully.")
+ else:
+ log_message("WEE SCORE calculation failed.")
diff --git a/geest/core/tasks/study_area.py b/geest/core/tasks/study_area.py
index 1aa8d02..aa45717 100644
--- a/geest/core/tasks/study_area.py
+++ b/geest/core/tasks/study_area.py
@@ -50,7 +50,6 @@ class StudyAreaProcessingTask(QgsTask):
def __init__(
self,
- name: str,
layer: QgsVectorLayer,
field_name: str,
cell_size_m: float,
@@ -63,7 +62,6 @@ def __init__(
"""
Initializes the StudyAreaProcessingTask.
- :param name: The name of the task.
:param layer: The vector layer containing study area features.
:param field_name: The name of the field containing area names.
:param cell_size: The size of the grid cells in meters.
@@ -74,7 +72,7 @@ def __init__(
:param context: QgsProcessingContext for the task. Default is None.
:param feedback: QgsFeedback object for task cancelling. Default is None.
"""
- super().__init__(name, QgsTask.CanCancel)
+ super().__init__("Study Area Preparation", QgsTask.CanCancel)
self.feedback = feedback
self.layer: QgsVectorLayer = layer
self.field_name: str = field_name
@@ -149,8 +147,6 @@ def run(self) -> bool:
with open(os.path.join(self.working_dir, "error.txt"), "w") as f:
# first the date and time
f.write(f"{datetime.datetime.now()}\n")
- # then the name of the task
- f.write(f"{self.name}\n")
# then the traceback
f.write(traceback.format_exc())
return False
diff --git a/geest/core/workflow_factory.py b/geest/core/workflow_factory.py
index 5d8d696..f92f8f2 100644
--- a/geest/core/workflow_factory.py
+++ b/geest/core/workflow_factory.py
@@ -59,8 +59,7 @@ def create_workflow(
attributes = item.attributes()
log_message(f"Workflow Factory Called")
log_message(f"-----------------------")
- for key, value in attributes.items():
- log_message(f"{key}: {value}")
+ log_message(f"{item.attributesAsMarkdown()}")
log_message(f"-----------------------")
analysis_mode = attributes.get("analysis_mode", "")
diff --git a/geest/core/workflow_job.py b/geest/core/workflow_job.py
index 8bc0c53..6705e9f 100644
--- a/geest/core/workflow_job.py
+++ b/geest/core/workflow_job.py
@@ -90,7 +90,7 @@ def run(self) -> bool:
level=Qgis.Info,
)
attributes = self._item.attributes()
- log_message(f"{attributes}")
+ log_message(f"{self._item.attributesAsMarkdown()}")
if result:
log_message(
f"Workflow {self.description()} completed.",
diff --git a/geest/core/workflows/analysis_aggregation_workflow.py b/geest/core/workflows/analysis_aggregation_workflow.py
index 57c27d7..c4698e4 100644
--- a/geest/core/workflows/analysis_aggregation_workflow.py
+++ b/geest/core/workflows/analysis_aggregation_workflow.py
@@ -2,6 +2,7 @@
from qgis.core import QgsFeedback, QgsProcessingContext
from qgis.analysis import QgsRasterCalculator, QgsRasterCalculatorEntry
from .aggregation_workflow_base import AggregationWorkflowBase
+from geest.core.algorithms import PopulationRasterProcessingTask, WEEScoreProcessingTask
from geest.utilities import resources_path
from geest.core import JsonTreeItem
@@ -43,3 +44,20 @@ def __init__(
self.layer_id = "wee"
self.weight_key = "dimension_weighting"
self.workflow_name = "analysis_aggregation"
+ # Prepare the population data if provided
+ self.population_data = self.item.attribute("population_layer_source", None)
+ population_processor = PopulationRasterProcessingTask(
+ population_raster_path=self.population_data,
+ working_directory=self.working_directory,
+ study_area_gpkg_path=self.gpkg_path,
+ cell_size_m=self.cell_size_m,
+ target_crs=self.target_crs,
+ feedback=self.feedback,
+ )
+ population_processor.run()
+ wee_processor = WEEScoreProcessingTask(
+ study_area_gpkg_path=self.gpkg_path,
+ working_directory=self.working_directory,
+ force_clear=False,
+ )
+ wee_processor.run()
diff --git a/geest/gui/panels/create_project_panel.py b/geest/gui/panels/create_project_panel.py
index 97e1c9e..6e590cc 100644
--- a/geest/gui/panels/create_project_panel.py
+++ b/geest/gui/panels/create_project_panel.py
@@ -178,7 +178,6 @@ def create_project(self):
try:
processor = StudyAreaProcessingTask(
- name="Study Area Processing",
layer=layer,
field_name=field_name,
cell_size_m=self.cell_size_spinbox.value(),
diff --git a/geest/gui/panels/setup_panel.py b/geest/gui/panels/setup_panel.py
index bbceb22..ba2bbb2 100644
--- a/geest/gui/panels/setup_panel.py
+++ b/geest/gui/panels/setup_panel.py
@@ -1,14 +1,8 @@
from PyQt5.QtWidgets import (
QWidget,
)
-from qgis.core import (
- Qgis,
-)
from qgis.PyQt.QtCore import pyqtSignal
-from qgis.PyQt.QtGui import QPixmap
-from geest.core.tasks import StudyAreaProcessingTask, OrsCheckerTask
from geest.utilities import get_ui_class, resources_path, log_message
-from geest.core import WorkflowQueueManager
from geest.gui.widgets import CustomBannerLabel
FORM_CLASS = get_ui_class("setup_panel_base.ui")
diff --git a/geest/gui/panels/tree_panel.py b/geest/gui/panels/tree_panel.py
index 328c8d2..2f5fd02 100644
--- a/geest/gui/panels/tree_panel.py
+++ b/geest/gui/panels/tree_panel.py
@@ -215,6 +215,13 @@ def on_previous_button_clicked(self):
def on_next_button_clicked(self):
self.switch_to_next_tab.emit()
+ def clear_item(self):
+ """Clear the outputs for a single item."""
+ index = self.treeView.currentIndex()
+ item = index.internalPointer()
+ item.clear(recursive=False)
+ self.save_json_to_working_directory()
+
def clear_workflows(self):
"""
Recursively mark workflows as not done, delete their working directories and their file_paths.
@@ -300,7 +307,7 @@ def working_directory_changed(self, new_directory):
# If this is a first time use of the analysis project lets set some things up
analysis_item = self.model.rootItem.child(0)
analysis_data = analysis_item.attributes()
- log_message(str(analysis_data))
+ log_message(analysis_item.attributesAsMarkdown())
if analysis_data.get("working_folder", "Not Set"):
analysis_data["working_folder"] = self.working_directory
else:
@@ -441,7 +448,8 @@ def update_action_text():
# Update initially
update_action_text()
-
+ clear_item_action = QAction("Clear Item", self)
+ clear_item_action.triggered.connect(self.clear_item)
clear_results_action = QAction("Clear Results", self)
clear_results_action.triggered.connect(self.clear_workflows)
@@ -464,6 +472,7 @@ def update_action_text():
) # Connect to method
menu.addAction(edit_analysis_action)
menu.addAction(show_json_attributes_action)
+ menu.addAction(clear_item_action)
menu.addAction(clear_results_action)
menu.addAction(run_item_action)
menu.addAction(add_to_map_action)
@@ -501,6 +510,7 @@ def update_action_text():
menu = QMenu(self)
menu.addAction(edit_aggregation_action)
menu.addAction(show_json_attributes_action)
+ menu.addAction(clear_item_action)
menu.addAction(add_to_map_action)
menu.addAction(run_item_action)
menu.addAction(disable_action)
@@ -526,6 +536,7 @@ def update_action_text():
menu = QMenu(self)
menu.addAction(edit_aggregation_action)
menu.addAction(show_json_attributes_action)
+ menu.addAction(clear_item_action)
menu.addAction(add_to_map_action)
menu.addAction(run_item_action)
menu.addAction(disable_action)
@@ -549,6 +560,7 @@ def update_action_text():
menu = QMenu(self)
menu.addAction(show_properties_action)
menu.addAction(show_json_attributes_action)
+ menu.addAction(clear_item_action)
menu.addAction(add_to_map_action)
menu.addAction(run_item_action)
menu.addAction(disable_action)
@@ -812,24 +824,30 @@ def add_study_area_to_map(self):
) # Insert at the top of the layers panel
layers = [
- "study_area_bbox",
- "study_area_bboxes",
"study_area_polygons",
+ "study_area_clip_polygons",
"study_area_grid",
+ "study_area_bboxes",
+ "study_area_bbox",
]
for layer_name in layers:
gpkg_layer_path = f"{gpkg_path}|layername={layer_name}"
layer = QgsVectorLayer(gpkg_layer_path, layer_name, "ogr")
- if layer.isValid():
- QgsProject.instance().addMapLayer(layer)
- log_message(f"Added '{layer_name}' layer to the map.")
- else:
+ if not layer.isValid():
log_message(
f"Failed to add '{layer_name}' layer to the map.",
tag="Geest",
level=Qgis.Critical,
)
+ continue
+
+ source_qml = resources_path("resources", "qml", f"{layer_name}.qml")
+ result = layer.loadNamedStyle(source_qml)
+ if result[0]: # loadNamedStyle returns (success, error_message)
+ print(f"Successfully applied QML style to layer '{layer_name}'")
+ else:
+ print(f"Failed to apply QML style: {result[1]}")
# Check if a layer with the same data source exists in the correct group
existing_layer = None
diff --git a/geest/resources/qml/population_3_classes.qml b/geest/resources/qml/population_3_classes.qml
new file mode 100644
index 0000000..562f528
--- /dev/null
+++ b/geest/resources/qml/population_3_classes.qml
@@ -0,0 +1,156 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ None
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/geest/resources/qml/study_area_bbox.qml b/geest/resources/qml/study_area_bbox.qml
new file mode 100644
index 0000000..03f009c
--- /dev/null
+++ b/geest/resources/qml/study_area_bbox.qml
@@ -0,0 +1,424 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "area_name"
+
+ 2
+
diff --git a/geest/resources/qml/study_area_bboxes.qml b/geest/resources/qml/study_area_bboxes.qml
new file mode 100644
index 0000000..159f610
--- /dev/null
+++ b/geest/resources/qml/study_area_bboxes.qml
@@ -0,0 +1,424 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "area_name"
+
+ 2
+
diff --git a/geest/resources/qml/study_area_clip_polygons.qml b/geest/resources/qml/study_area_clip_polygons.qml
new file mode 100644
index 0000000..06987f8
--- /dev/null
+++ b/geest/resources/qml/study_area_clip_polygons.qml
@@ -0,0 +1,424 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "area_name"
+
+ 2
+
diff --git a/geest/resources/qml/study_area_grid.qml b/geest/resources/qml/study_area_grid.qml
new file mode 100644
index 0000000..e8cdb52
--- /dev/null
+++ b/geest/resources/qml/study_area_grid.qml
@@ -0,0 +1,424 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "area_name"
+
+ 2
+
diff --git a/geest/resources/qml/study_area_polygons.qml b/geest/resources/qml/study_area_polygons.qml
new file mode 100644
index 0000000..38802d9
--- /dev/null
+++ b/geest/resources/qml/study_area_polygons.qml
@@ -0,0 +1,548 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "area_name"
+
+ 2
+
diff --git a/geest/ui/create_project_panel_base.ui b/geest/ui/create_project_panel_base.ui
index cb5846e..dca11c2 100644
--- a/geest/ui/create_project_panel_base.ui
+++ b/geest/ui/create_project_panel_base.ui
@@ -6,7 +6,7 @@
0
0
- 551
+ 554
884
@@ -198,7 +198,7 @@
- 10
+ 1
100000
diff --git a/test/test_data/wee_score/_combined.qml b/test/test_data/wee_score/_combined.qml
new file mode 100644
index 0000000..05c5c53
--- /dev/null
+++ b/test/test_data/wee_score/_combined.qml
@@ -0,0 +1,176 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ None
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/_combined.vrt b/test/test_data/wee_score/_combined.vrt
new file mode 100644
index 0000000..53ea0c6
--- /dev/null
+++ b/test/test_data/wee_score/_combined.vrt
@@ -0,0 +1,16 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+ 255
+ Gray
+
+ wee_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/admin0.gpkg b/test/test_data/wee_score/admin0.gpkg
new file mode 100644
index 0000000..acad32b
Binary files /dev/null and b/test/test_data/wee_score/admin0.gpkg differ
diff --git a/test/test_data/wee_score/admin0.gpkg-shm b/test/test_data/wee_score/admin0.gpkg-shm
new file mode 100644
index 0000000..fe9ac28
Binary files /dev/null and b/test/test_data/wee_score/admin0.gpkg-shm differ
diff --git a/test/test_data/wee_score/admin0.gpkg-wal b/test/test_data/wee_score/admin0.gpkg-wal
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_data/wee_score/contextual/Contextual_score_combined.qml b/test/test_data/wee_score/contextual/Contextual_score_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/Contextual_score_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/Contextual_score_combined.vrt b/test/test_data/wee_score/contextual/Contextual_score_combined.vrt
new file mode 100644
index 0000000..af8b93e
--- /dev/null
+++ b/test/test_data/wee_score/contextual/Contextual_score_combined.vrt
@@ -0,0 +1,16 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+ 255
+ Gray
+
+ contextual_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/contextual_aggregated_0.tif b/test/test_data/wee_score/contextual/contextual_aggregated_0.tif
new file mode 100644
index 0000000..bac1857
Binary files /dev/null and b/test/test_data/wee_score/contextual/contextual_aggregated_0.tif differ
diff --git a/test/test_data/wee_score/contextual/contextual_masked_0.tif b/test/test_data/wee_score/contextual/contextual_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/contextual_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/contextual_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/contextual_masked_0.tif.aux.xml
new file mode 100644
index 0000000..9875ba0
--- /dev/null
+++ b/test/test_data/wee_score/contextual/contextual_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.qml b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.vrt b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.vrt
new file mode 100644
index 0000000..903b42d
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.vrt
@@ -0,0 +1,23 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+ 255
+ Gray
+
+ entrepeneurship_index_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_0.tif b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_0.tif
new file mode 100644
index 0000000..54bba67
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_0.tif differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_0.tif.aux.xml b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_0.tif.aux.xml
new file mode 100644
index 0000000..c5a093b
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 73.47
+
+
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.cpg b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.cpg
new file mode 100644
index 0000000..8276f19
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.cpg
@@ -0,0 +1 @@
+utf-8
\ No newline at end of file
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.dbf b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.dbf
new file mode 100644
index 0000000..840cdf2
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.dbf differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.prj b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.prj
new file mode 100644
index 0000000..9c7aa3c
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.prj
@@ -0,0 +1 @@
+PROJCS["WGS_1984_UTM_Zone_20N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-63.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
\ No newline at end of file
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.shp b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.shp
new file mode 100644
index 0000000..0bd1267
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.shp differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.shx b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.shx
new file mode 100644
index 0000000..859b767
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_area_0.shx differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_masked_0.tif b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_masked_0.tif.aux.xml
new file mode 100644
index 0000000..1503ede
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/entrepeneurship_index_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_aggregated_0.tif b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_aggregated_0.tif
new file mode 100644
index 0000000..bac1857
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_aggregated_0.tif differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.qml b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.vrt b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.vrt
new file mode 100644
index 0000000..b254013
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.vrt
@@ -0,0 +1,23 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+ 255
+ Gray
+
+ financial_inclusion_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_masked_0.tif b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_masked_0.tif.aux.xml
new file mode 100644
index 0000000..1503ede
--- /dev/null
+++ b/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.qml b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.vrt b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.vrt
new file mode 100644
index 0000000..b9f1c0e
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.vrt
@@ -0,0 +1,23 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+ 255
+ Gray
+
+ pay_parenthood_index_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_0.tif b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_0.tif
new file mode 100644
index 0000000..54bba67
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_0.tif differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_0.tif.aux.xml b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_0.tif.aux.xml
new file mode 100644
index 0000000..c5a093b
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 73.47
+
+
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.cpg b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.cpg
new file mode 100644
index 0000000..8276f19
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.cpg
@@ -0,0 +1 @@
+utf-8
\ No newline at end of file
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.dbf b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.dbf
new file mode 100644
index 0000000..840cdf2
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.dbf differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.prj b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.prj
new file mode 100644
index 0000000..9c7aa3c
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.prj
@@ -0,0 +1 @@
+PROJCS["WGS_1984_UTM_Zone_20N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-63.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
\ No newline at end of file
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.shp b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.shp
new file mode 100644
index 0000000..0bd1267
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.shp differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.shx b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.shx
new file mode 100644
index 0000000..859b767
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_area_0.shx differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_masked_0.tif b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_masked_0.tif.aux.xml
new file mode 100644
index 0000000..1503ede
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/pay_parenthood_index_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_aggregated_0.tif b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_aggregated_0.tif
new file mode 100644
index 0000000..bac1857
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_aggregated_0.tif differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.qml b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.vrt b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.vrt
new file mode 100644
index 0000000..d81378f
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.vrt
@@ -0,0 +1,23 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+ 255
+ Gray
+
+ regulatory_frameworks_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_masked_0.tif b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_masked_0.tif.aux.xml
new file mode 100644
index 0000000..1503ede
--- /dev/null
+++ b/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_aggregated_0.tif b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_aggregated_0.tif
new file mode 100644
index 0000000..bac1857
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_aggregated_0.tif differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.qml b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.vrt b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.vrt
new file mode 100644
index 0000000..36c60a0
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.vrt
@@ -0,0 +1,23 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+ 255
+ Gray
+
+ workplace_discrimination_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_masked_0.tif b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_masked_0.tif.aux.xml
new file mode 100644
index 0000000..1503ede
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.qml b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.qml
new file mode 100644
index 0000000..f632630
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.qml
@@ -0,0 +1,177 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinMax
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.vrt b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.vrt
new file mode 100644
index 0000000..ed9ece7
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.vrt
@@ -0,0 +1,23 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+ 255
+ Gray
+
+ workplace_index_masked_0.tif
+ 1
+
+
+
+ 255
+
+
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_0.tif b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_0.tif
new file mode 100644
index 0000000..54bba67
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_0.tif differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_0.tif.aux.xml b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_0.tif.aux.xml
new file mode 100644
index 0000000..c5a093b
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 73.47
+
+
+
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.cpg b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.cpg
new file mode 100644
index 0000000..8276f19
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.cpg
@@ -0,0 +1 @@
+utf-8
\ No newline at end of file
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.dbf b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.dbf
new file mode 100644
index 0000000..840cdf2
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.dbf differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.prj b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.prj
new file mode 100644
index 0000000..9c7aa3c
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.prj
@@ -0,0 +1 @@
+PROJCS["WGS_1984_UTM_Zone_20N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-63.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
\ No newline at end of file
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.shp b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.shp
new file mode 100644
index 0000000..0bd1267
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.shp differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.shx b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.shx
new file mode 100644
index 0000000..859b767
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_area_0.shx differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_masked_0.tif b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_masked_0.tif differ
diff --git a/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_masked_0.tif.aux.xml b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_masked_0.tif.aux.xml
new file mode 100644
index 0000000..1503ede
--- /dev/null
+++ b/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/workplace_index_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/model.json b/test/test_data/wee_score/model.json
new file mode 100644
index 0000000..d89936f
--- /dev/null
+++ b/test/test_data/wee_score/model.json
@@ -0,0 +1,1013 @@
+{
+ "analysis_name": "Women's Economic Empowerment - wee_score",
+ "description": "No Description",
+ "working_folder": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score",
+ "analysis_cell_size_m": 1000,
+ "guid": "a4e162fd-8f5c-49de-abb4-cc37e10b70f7",
+ "dimensions": [
+ {
+ "name": "Contextual",
+ "guid": "4e9aa391-a502-423d-a1f0-c4bf99b1038a",
+ "factors": [
+ {
+ "name": "Workplace Discrimination",
+ "guid": "15ff7964-15ef-4d78-b383-ca4275a7988f",
+ "indicators": [
+ {
+ "indicator": "WBL 2024 Workplace Index Score",
+ "id": "Workplace_Index",
+ "output_filename": "WD_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 100,
+ "use_index_score": 1,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "use_index_score",
+ "guid": "7ae5a61b-318c-4e6e-acfc-2a7045f03fb9",
+ "result": "index_score Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:26.249349",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/workplace_discrimination/workplace_index/WD_output_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:27.931080",
+ "error_file": null
+ }
+ ],
+ "dimension_weighting": 0.333333,
+ "id": "workplace_discrimination",
+ "output_filename": "workplace_discrimination",
+ "description": "Workplace Discrimination involves laws that address gender biases and stereotypes that hinder women's career advancement, especially in male-dominated fields.",
+ "default_dimension_weighting": 0.333333,
+ "analysis_mode": "factor_aggregation",
+ "result": "factor_aggregation Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:31.713939",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/workplace_discrimination/workplace_discrimination_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:32.528534",
+ "error_file": null
+ },
+ {
+ "name": "Regulatory Frameworks",
+ "guid": "4436c420-6133-43ab-a51d-9d8294187572",
+ "indicators": [
+ {
+ "indicator": "Average value of WBL Pay Score and Parenthood Index Score",
+ "id": "Pay_Parenthood_Index",
+ "output_filename": "RF_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 100,
+ "use_index_score": 1,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "use_index_score",
+ "guid": "853bc6d4-4ca4-4fb8-9511-aaf384d59725",
+ "result": "index_score Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:29.139156",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/regulatory_frameworks/pay_parenthood_index/RF_output_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:30.253193",
+ "error_file": null
+ }
+ ],
+ "dimension_weighting": 0.3333333,
+ "id": "regulatory_frameworks",
+ "output_filename": "regulatory_frameworks",
+ "description": "Regulatory Frameworks pertain to laws and policies that protect women\u2019s employment rights, such as childcare support and parental leave, influencing their workforce participation",
+ "default_dimension_weighting": 0.3333333,
+ "analysis_mode": "factor_aggregation",
+ "result": "factor_aggregation Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:32.656651",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/regulatory_frameworks/regulatory_frameworks_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:33.511264",
+ "error_file": null
+ },
+ {
+ "name": "Financial Inclusion",
+ "guid": "009eef31-644d-4ca5-946a-f03aec41b09f",
+ "indicators": [
+ {
+ "indicator": "WBL 2024 Entrepeneurship Index Score",
+ "id": "Entrepeneurship_Index",
+ "output_filename": "FIN_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 100,
+ "use_index_score": 1,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "use_index_score",
+ "guid": "81a22788-07d9-4397-b68b-aea1596d8342",
+ "result": "index_score Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:30.401850",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/financial_inclusion/entrepeneurship_index/FIN_output_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:31.579591",
+ "error_file": null
+ }
+ ],
+ "dimension_weighting": 0.333333,
+ "id": "financial_inclusion",
+ "output_filename": "financial_inclusion",
+ "description": "Financial Inclusion involves laws concerning women\u2019s access to financial resources like loans and credit, which is crucial for starting businesses and investing in economic opportunities.",
+ "default_dimension_weighting": 0.333333,
+ "analysis_mode": "factor_aggregation",
+ "result": "factor_aggregation Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:33.683431",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/financial_inclusion/financial_inclusion_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:34.529052",
+ "error_file": null
+ }
+ ],
+ "analysis_weighting": 1.0,
+ "description": "The Contextual Dimension refers to the laws and policies that shape workplace gender discrimination, financial autonomy, and overall gender empowerment. Although this dimension may vary between countries due to differences in legal frameworks, it remains consistent within a single country, as national policies and regulations are typically applied uniformly across countries.",
+ "id": "contextual",
+ "output_filename": "Contextual_score",
+ "default_analysis_weighting": 0.333333,
+ "analysis_mode": "dimension_aggregation",
+ "result": "dimension_aggregation Workflow Completed",
+ "execution_start_time": "2024-12-18T23:25:35.741929",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/contextual/Contextual_score_combined.vrt",
+ "execution_end_time": "2024-12-18T23:25:36.623506",
+ "error_file": null
+ },
+ {
+ "name": "Accessibility",
+ "guid": "39f3ffcd-8043-43e1-b440-a284c3853e34",
+ "factors": [
+ {
+ "name": "Women's Travel Patterns",
+ "guid": "7f3df4a0-2a68-4ffa-9fc4-a49b51cc02a0",
+ "indicators": [
+ {
+ "indicator": "Location of kindergartens/childcare",
+ "id": "Kindergartens_Location",
+ "output_filename": "WTP_Kindergartens_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "400, 800, 1200, 1500, 2000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "ef86b2c4-f4b3-4552-8dc4-a619c54e53d6"
+ },
+ {
+ "indicator": "Location of primary schools",
+ "id": "Primary_School_Location",
+ "output_filename": "WTP_Primary_Schools_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "400, 800, 1200, 1500, 2000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "7af1017c-c360-4630-a1e5-ac4874473e35"
+ },
+ {
+ "indicator": "Location of groceries",
+ "id": "Groceries_Location",
+ "output_filename": "WTP_Groceries_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "400, 800, 1200, 1500, 2000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "b0f37ad1-b728-4aa8-8bd6-40e60545a5a7"
+ },
+ {
+ "indicator": "Location of pharmacies",
+ "id": "Pharmacies_Location",
+ "output_filename": "WTP_Pharmacies_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "400, 800, 1200, 1500, 2000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "f96c74f4-492e-484b-b4e7-d72566071911"
+ },
+ {
+ "indicator": "Location of green spaces",
+ "id": "Green_Space_location",
+ "output_filename": "WTP_Green_Spaces_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "400, 800, 1200, 1500, 2000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "6e7df235-9af3-4168-ba97-1004e289d7c7"
+ }
+ ],
+ "dimension_weighting": 0.2,
+ "id": "women_s_travel_patterns",
+ "output_filename": "women_s_travel_patterns",
+ "description": "Women\u2019s Travel Patterns (WTP) refer to the unique travel behaviors of women, often involving multiple stops for household or caregiving tasks, making proximity to essential services like markets, supermarkets, childcare centers, primary schools, pharmacies, and green spaces crucial.",
+ "default_dimension_weighting": 0.2,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Access to Public Transport",
+ "guid": "336b2d06-4cb3-4eea-a4ff-adbccbf35367",
+ "indicators": [
+ {
+ "indicator": "Location of public transportation stops, including maritime",
+ "id": "Pulic_Transport_location",
+ "output_filename": "PBT_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "250, 500, 750, 1000, 1250",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "270bf387-5131-43c9-85f3-75d5c04df854"
+ }
+ ],
+ "dimension_weighting": 0.2,
+ "id": "access_to_public_transport",
+ "output_filename": "access_to_public_transport",
+ "description": "Access to Public Transport focuses on the availability and proximity of public transportation stops, which is crucial for women, especially those who rely on buses, trains, or trams to access jobs, education, and essential services.",
+ "default_dimension_weighting": 0.2,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Access to Health Facilities",
+ "guid": "168b6759-5db7-4df4-8e1a-acae973c7463",
+ "indicators": [
+ {
+ "indicator": "Location of hospitals and clinics",
+ "id": "Hospital_Location",
+ "output_filename": "HEF_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "2000, 4000, 6000, 8000, 10000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "06ce6151-d70a-4564-bfc9-ca72989555e3"
+ }
+ ],
+ "dimension_weighting": 0.2,
+ "id": "access_to_health_facilities",
+ "output_filename": "access_to_health_facilities",
+ "description": "Access to Health Facilities evaluates how easily women can reach healthcare services in terms of distance, impacting their well-being and ability to participate in the workforce.",
+ "default_dimension_weighting": 0.2,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Access to Education and Training Facilities",
+ "guid": "78a98e65-2e70-4ccf-9ffc-2c1cb06bef26",
+ "indicators": [
+ {
+ "indicator": "Location of universities and technical schools",
+ "id": "Universities_Location",
+ "output_filename": "ETF_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "2000, 4000, 6000, 8000, 10000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "b4e36508-0005-4f1d-864c-c679dde965c1"
+ }
+ ],
+ "dimension_weighting": 0.2,
+ "id": "access_to_education_and_training_facilities",
+ "output_filename": "access_to_education_and_training_facilities",
+ "description": "Access to Education and Training Facilities assesses the proximity to higher education institutions and training centers, influencing women's ability to gain necessary qualifications.",
+ "default_dimension_weighting": 0.2,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Access to Financial Facilities",
+ "guid": "6d4561c3-be2c-43f2-a077-a7c267064fe3",
+ "indicators": [
+ {
+ "indicator": "Location of Banks and other FF",
+ "id": "Banks_Location",
+ "output_filename": "FIF_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "400, 800, 1200, 2000, 3000",
+ "use_multi_buffer_point": 1,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "cc080fdb-b57a-4fb6-9868-0afb610684bd"
+ }
+ ],
+ "dimension_weighting": 0.2,
+ "id": "access_to_financial_facilities",
+ "output_filename": "access_to_financial_facilities",
+ "description": "Access to Financial Facilities focuses on the proximity of banks and financial institutions, which is essential for women\u2019s economic empowerment and ability to access credit.",
+ "default_dimension_weighting": 0.2,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ }
+ ],
+ "analysis_weighting": 0.0,
+ "description": "The Accessibility Dimension evaluates women\u2019s daily mobility by examining their access to essential services. Levels of enablement for work access in this dimension are determined by service areas, which represent the geographic zones that facilities like childcare, supermarkets, universities, banks, and clinics can serve based on proximity. The nearer these facilities are to where women live, the more supportive and enabling the environment becomes for their participation in the workforce.",
+ "id": "accessibility",
+ "output_filename": "Accessibility_score",
+ "default_analysis_weighting": 0.33333,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Place Characterization",
+ "guid": "d3d8bded-dabc-4762-b0ff-fd0508343819",
+ "factors": [
+ {
+ "name": "Active Transport",
+ "guid": "390f5c16-9840-4988-bcb3-d68dae19703d",
+ "indicators": [
+ {
+ "indicator": "Location of street crossings",
+ "id": "Street_Crossing_Location",
+ "output_filename": "AT_Crosswalks_output",
+ "description": "",
+ "default_factor_weighting": 0.25,
+ "factor_weighting": 0.25,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 1,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "12e98d92-ae96-4f46-a5f1-6563d97a2692"
+ },
+ {
+ "indicator": "Location of cycle paths",
+ "id": "Cycle_Paths_Location",
+ "output_filename": "AT_Cycle_Paths_output",
+ "description": "",
+ "default_factor_weighting": 0.25,
+ "factor_weighting": 0.25,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 1,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "3d3e239b-3fa6-46bb-abdf-b7fb747e8272"
+ },
+ {
+ "indicator": "Location of footpaths",
+ "id": "Footpaths_Location",
+ "output_filename": "AT_Pathways_output",
+ "description": "",
+ "default_factor_weighting": 0.25,
+ "factor_weighting": 0.25,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 1,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "7eeb6b1e-f304-46f8-a3a4-74b25097e4a5"
+ },
+ {
+ "indicator": "Block Layout",
+ "id": "Block_Layout",
+ "output_filename": "AT_Block_Lengths_output",
+ "description": "",
+ "default_factor_weighting": 0.25,
+ "factor_weighting": 0.25,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 1,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "c1dfcfdc-4f30-4d5b-bd9b-21d2f98148c4"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "active_transport",
+ "output_filename": "AT_output",
+ "description": "Active Transport refers to the presence of walkable environments and cycling infrastructure, as women often rely on walking or cycling for their daily commutes and errands.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Safety",
+ "guid": "16c9034b-08db-4319-914e-8d28592c473d",
+ "indicators": [
+ {
+ "indicator": "Street lights/Nigthttime lights",
+ "id": "Street_Lights",
+ "output_filename": "SAF_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 100,
+ "use_index_score": 1,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 1,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 1,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 1,
+ "analysis_mode": "Do Not Use",
+ "guid": "1ebfa0a0-582f-4456-8c6d-7fd6c10ef46e"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "safety",
+ "output_filename": "safety",
+ "description": "Safety addresses the perceived security of public spaces, evaluated through the availability of adequate lighting, which affects women\u2019s ability to move freely, seek employment, and access essential services.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "FCV",
+ "guid": "365fb3cf-4106-4f59-a975-b637ed2bab71",
+ "indicators": [
+ {
+ "indicator": "ACLED data (Violence Estimated Events)",
+ "id": "FCV",
+ "output_filename": "FCV_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 5000,
+ "use_single_buffer_point": 1,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 1,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "4121693a-4454-4aba-8ef0-75e8bbda18ed"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "fcv",
+ "output_filename": "fcv",
+ "description": "Fragility, Conflict, and Violence (FCV) considers the frequency of events related to political unrest, conflict, and violence in a region, which can increase women\u2019s vulnerability and limit their access to employment and essential services.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Education",
+ "guid": "9d9443fc-9fe3-4d29-a060-26532087d17b",
+ "indicators": [
+ {
+ "indicator": "percentage of the labor force comprising women with university degrees",
+ "id": "Education",
+ "output_filename": "EDU_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 100,
+ "use_index_score": 1,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 1,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "0d1d75ea-c532-4383-86ea-0df524a39cc2"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "education",
+ "output_filename": "education",
+ "description": "Education refers to the proportion of women in a region who have attained higher education, particularly in the specific field of analysis, serving as an indicator of societal attitudes towards women working in that sector.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Digital Inclusion",
+ "guid": "1f54b37f-c680-4060-a81b-781d492d4c82",
+ "indicators": [
+ {
+ "indicator": "Individuals using the Internet (% of population)",
+ "id": "Digital_Inclusion",
+ "output_filename": "DIG_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 100,
+ "use_index_score": 1,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 1,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "1de8776b-224c-4799-8418-83906cc1ab39"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "digital_inclusion",
+ "output_filename": "digital_inclusion",
+ "description": "Digital Inclusion assesses the presence of digital infrastructure in a specific location, which is essential for women to pursue job opportunities, access training band education opportunities, and use financial services.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Environmental Hazards",
+ "guid": "f2870f72-2f2c-4dcc-ba3f-aa51cde7f36d",
+ "indicators": [
+ {
+ "indicator": "Fire Hazards",
+ "id": "Fire",
+ "output_filename": "ENV_Fires_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 1,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "4e2a7af0-7b74-4a16-8d1e-7c62bea7719a"
+ },
+ {
+ "indicator": "Flood Hazards",
+ "id": "Flood",
+ "output_filename": "ENV_Floods_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 1,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "5d1c9f67-f007-4f6c-97d4-040e24eb081d"
+ },
+ {
+ "indicator": "Landslide",
+ "id": "Landslide",
+ "output_filename": "ENV_Landslides_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 1,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "7464d39c-484f-4bf6-9cab-83d30ce84125"
+ },
+ {
+ "indicator": "Tropical Cyclone",
+ "id": "Cyclone",
+ "output_filename": "ENV_Cyclones_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 1,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "41f656c3-9bf7-42c5-9572-139a3e229d7a"
+ },
+ {
+ "indicator": "Drought",
+ "id": "Drought",
+ "output_filename": "ENV_Drought_output",
+ "description": "",
+ "default_factor_weighting": 0.2,
+ "factor_weighting": 0.2,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 0,
+ "use_single_buffer_point": 0,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 1,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "41adb08b-4bf8-4e5d-8dc3-20d3f5374d78"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "environmental_hazards",
+ "output_filename": "environmental_hazards",
+ "description": "Environmental Hazards relate to the impact of environmental risks, such as floods, droughts, landslides, fires, and extreme weather events, which can disrupt job stability, particularly for women in vulnerable sectors.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ },
+ {
+ "name": "Water sanitation",
+ "guid": "44e22a0e-bc17-486e-8e2c-9652cfe2f42e",
+ "indicators": [
+ {
+ "indicator": "Water points (OSM), catch basins, water valves and fire hydrants",
+ "id": "Water_Sanitation",
+ "output_filename": "WAS_output",
+ "description": "",
+ "default_factor_weighting": 1.0,
+ "factor_weighting": 1.0,
+ "index_score": 0,
+ "use_index_score": 0,
+ "default_multi_buffer_distances": "0,0,0",
+ "use_multi_buffer_point": 0,
+ "default_single_buffer_distance": 1000,
+ "use_single_buffer_point": 1,
+ "use_classify_polygon_into_classes": 0,
+ "use_classify_safety_polygon_into_classes": 0,
+ "use_csv_to_point_layer": 0,
+ "use_polygon_per_cell": 0,
+ "use_polyline_per_cell": 0,
+ "use_point_per_cell": 0,
+ "use_nighttime_lights": 0,
+ "use_environmental_hazards": 0,
+ "use_street_lights": 0,
+ "analysis_mode": "Do Not Use",
+ "guid": "31be7faa-7c48-4e77-b9b6-bf8fa562c7ef"
+ }
+ ],
+ "dimension_weighting": 0.142857142857143,
+ "id": "water_sanitation",
+ "output_filename": "water_sanitation",
+ "description": "Water and Sanitation concerns the availability of clean water and sanitation facilities, affecting women\u2019s time allocation and capacity to engage in employment.",
+ "default_dimension_weighting": 0.142857142857143,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ }
+ ],
+ "analysis_weighting": 0.0,
+ "description": "The Place-Characterization Dimension refers to the social, environmental, and infrastructural attributes of geographical locations, such as walkability, safety, and vulnerability to natural hazards. Unlike the Accessibility Dimension, these factors do not involve mobility but focus on the inherent characteristics of a place that influence women\u2019s ability to participate in the workforce.",
+ "id": "place_characterization",
+ "output_filename": "Place_score",
+ "default_analysis_weighting": 0.333333,
+ "analysis_mode": "",
+ "result": "",
+ "execution_start_time": "",
+ "result_file": "",
+ "execution_end_time": ""
+ }
+ ],
+ "result": "analysis_aggregation Workflow Completed",
+ "result_file": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/_combined.vrt",
+ "execution_start_time": "2024-12-18T23:36:00.070532",
+ "execution_end_time": "2024-12-18T23:36:00.912866",
+ "error": "",
+ "error_file": null,
+ "aggregation_layer": null,
+ "aggregation_layer_name": "",
+ "aggregation_layer_source": "",
+ "aggregation_layer_provider_type": "",
+ "aggregation_layer_crs": "",
+ "aggregation_layer_wkb_type": "",
+ "aggregation_layer_id": "",
+ "aggregation_shapefile": "",
+ "population_layer": null,
+ "population_layer_name": "population",
+ "population_layer_source": "/home/timlinux/dev/python/GEEST2/test/test_data/wee_score/population/population.tif",
+ "population_layer_provider_type": "gdal",
+ "population_layer_crs": "EPSG:32620",
+ "population_layer_wkb_type": "",
+ "population_layer_id": "population_c608de24_709a_4ad5_a451_12d344147a79",
+ "population_shapefile": "",
+ "point_mask_layer": null,
+ "point_mask_layer_name": "",
+ "point_mask_layer_source": "",
+ "point_mask_layer_provider_type": "",
+ "point_mask_layer_crs": "",
+ "point_mask_layer_wkb_type": "",
+ "point_mask_layer_id": "",
+ "point_mask_shapefile": "",
+ "polygon_mask_layer": null,
+ "polygon_mask_layer_name": "",
+ "polygon_mask_layer_source": "",
+ "polygon_mask_layer_provider_type": "",
+ "polygon_mask_layer_crs": "",
+ "polygon_mask_layer_wkb_type": "",
+ "polygon_mask_layer_id": "",
+ "polygon_mask_shapefile": "",
+ "raster_mask_layer": null,
+ "raster_mask_layer_name": "",
+ "raster_mask_layer_source": "",
+ "raster_mask_layer_provider_type": "",
+ "raster_mask_layer_crs": "",
+ "raster_mask_layer_wkb_type": "",
+ "raster_mask_layer_id": "",
+ "raster_mask_shapefile": "",
+ "analysis_mode": "analysis_aggregation"
+}
\ No newline at end of file
diff --git a/test/test_data/wee_score/population/clipped_0.tif b/test/test_data/wee_score/population/clipped_0.tif
new file mode 100644
index 0000000..25f4d4f
Binary files /dev/null and b/test/test_data/wee_score/population/clipped_0.tif differ
diff --git a/test/test_data/wee_score/population/clipped_0.tif.aux.xml b/test/test_data/wee_score/population/clipped_0.tif.aux.xml
new file mode 100644
index 0000000..93d38c0
--- /dev/null
+++ b/test/test_data/wee_score/population/clipped_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 1
+ 3
+ 2
+ 0.81649658092773
+ 41.67
+
+
+
diff --git a/test/test_data/wee_score/population/clipped_population.vrt b/test/test_data/wee_score/population/clipped_population.vrt
new file mode 100644
index 0000000..558838b
--- /dev/null
+++ b/test/test_data/wee_score/population/clipped_population.vrt
@@ -0,0 +1,16 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5530000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+ -9999
+ Gray
+
+ clipped_0.tif
+ 1
+
+
+
+ -9999
+
+
+
diff --git a/test/test_data/wee_score/population/population.asc b/test/test_data/wee_score/population/population.asc
new file mode 100644
index 0000000..58081b6
--- /dev/null
+++ b/test/test_data/wee_score/population/population.asc
@@ -0,0 +1,10 @@
+ncols 4
+nrows 4
+xllcorner 715000.0
+yllcorner 1548000.0
+cellsize 1000.0
+NODATA_value -9999
+1 1 1 1
+1 2 2 2
+2 2 3 3
+3 3 3 -9999
diff --git a/test/test_data/wee_score/population/population.asc.aux.xml b/test/test_data/wee_score/population/population.asc.aux.xml
new file mode 100644
index 0000000..e1f2d89
--- /dev/null
+++ b/test/test_data/wee_score/population/population.asc.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 1
+ 3
+ 2.0714285714286
+ 0.79859570624992
+ 87.5
+
+
+
diff --git a/test/test_data/wee_score/population/population.qml b/test/test_data/wee_score/population/population.qml
new file mode 100644
index 0000000..085c205
--- /dev/null
+++ b/test/test_data/wee_score/population/population.qml
@@ -0,0 +1,156 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ None
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/population/population.tif.aux.xml b/test/test_data/wee_score/population/population.tif.aux.xml
new file mode 100644
index 0000000..262d826
--- /dev/null
+++ b/test/test_data/wee_score/population/population.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 1
+ 3
+ 2
+ 0.81649658092773
+ 93.75
+
+
+
diff --git a/test/test_data/wee_score/population/reclassified_0.tif b/test/test_data/wee_score/population/reclassified_0.tif
new file mode 100644
index 0000000..602b21a
Binary files /dev/null and b/test/test_data/wee_score/population/reclassified_0.tif differ
diff --git a/test/test_data/wee_score/population/reclassified_0.tif.aux.xml b/test/test_data/wee_score/population/reclassified_0.tif.aux.xml
new file mode 100644
index 0000000..f1e1aa6
--- /dev/null
+++ b/test/test_data/wee_score/population/reclassified_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 2
+ 3
+ 2.5
+ 0.5
+ 20.41
+
+
+
diff --git a/test/test_data/wee_score/population/reclassified_population.qml b/test/test_data/wee_score/population/reclassified_population.qml
new file mode 100644
index 0000000..562f528
--- /dev/null
+++ b/test/test_data/wee_score/population/reclassified_population.qml
@@ -0,0 +1,156 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ None
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/population/reclassified_population.vrt b/test/test_data/wee_score/population/reclassified_population.vrt
new file mode 100644
index 0000000..83e608d
--- /dev/null
+++ b/test/test_data/wee_score/population/reclassified_population.vrt
@@ -0,0 +1,16 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5540000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+ 0
+ Gray
+
+ reclassified_0.tif
+ 1
+
+
+
+ 0
+
+
+
diff --git a/test/test_data/wee_score/population/resampled_0.tif b/test/test_data/wee_score/population/resampled_0.tif
new file mode 100644
index 0000000..748e25f
Binary files /dev/null and b/test/test_data/wee_score/population/resampled_0.tif differ
diff --git a/test/test_data/wee_score/population/resampled_0.tif.aux.xml b/test/test_data/wee_score/population/resampled_0.tif.aux.xml
new file mode 100644
index 0000000..5dd8906
--- /dev/null
+++ b/test/test_data/wee_score/population/resampled_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 1
+ 3
+ 2
+ 0.81649658092773
+ 30.61
+
+
+
diff --git a/test/test_data/wee_score/population/resampled_population.vrt b/test/test_data/wee_score/population/resampled_population.vrt
new file mode 100644
index 0000000..fa66a7d
--- /dev/null
+++ b/test/test_data/wee_score/population/resampled_population.vrt
@@ -0,0 +1,16 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5540000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+ -9999
+ Gray
+
+ resampled_0.tif
+ 1
+
+
+
+ -9999
+
+
+
diff --git a/test/test_data/wee_score/study_area/combined_mask.vrt b/test/test_data/wee_score/study_area/combined_mask.vrt
new file mode 100644
index 0000000..56f173c
--- /dev/null
+++ b/test/test_data/wee_score/study_area/combined_mask.vrt
@@ -0,0 +1,20 @@
+
+ PROJCS["WGS 84 / UTM zone 20N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-63],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32620"]]
+ 7.1400000000000000e+05, 1.0000000000000000e+03, 0.0000000000000000e+00, 1.5540000000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+03
+
+ 0
+ Palette
+
+
+
+
+
+ none_part0.tif
+ 1
+
+
+
+ 0
+
+
+
diff --git a/test/test_data/wee_score/study_area/none_part0.tif b/test/test_data/wee_score/study_area/none_part0.tif
new file mode 100644
index 0000000..ab7395e
Binary files /dev/null and b/test/test_data/wee_score/study_area/none_part0.tif differ
diff --git a/test/test_data/wee_score/study_area/study_area.gpkg b/test/test_data/wee_score/study_area/study_area.gpkg
new file mode 100644
index 0000000..3d66394
Binary files /dev/null and b/test/test_data/wee_score/study_area/study_area.gpkg differ
diff --git a/test/test_data/wee_score/study_area/study_area.gpkg-shm b/test/test_data/wee_score/study_area/study_area.gpkg-shm
new file mode 100644
index 0000000..fe9ac28
Binary files /dev/null and b/test/test_data/wee_score/study_area/study_area.gpkg-shm differ
diff --git a/test/test_data/wee_score/study_area/study_area.gpkg-wal b/test/test_data/wee_score/study_area/study_area.gpkg-wal
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_data/wee_score/wee.asc b/test/test_data/wee_score/wee.asc
new file mode 100644
index 0000000..28f0674
--- /dev/null
+++ b/test/test_data/wee_score/wee.asc
@@ -0,0 +1,10 @@
+ncols 4
+nrows 4
+xllcorner 715000.0
+yllcorner 1548000.0
+cellsize 1000.0
+NODATA_value -9999
+1 2 3 4
+5 1 2 3
+4 5 1 2
+3 4 5 -9999
diff --git a/test/test_data/wee_score/wee.qml b/test/test_data/wee_score/wee.qml
new file mode 100644
index 0000000..09ef9b8
--- /dev/null
+++ b/test/test_data/wee_score/wee.qml
@@ -0,0 +1,176 @@
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ None
+ WholeRaster
+ Estimated
+ 0.02
+ 0.98
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resamplingFilter
+
+ 0
+
diff --git a/test/test_data/wee_score/wee.tif.aux.xml b/test/test_data/wee_score/wee.tif.aux.xml
new file mode 100644
index 0000000..5d7c379
--- /dev/null
+++ b/test/test_data/wee_score/wee.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 1
+ 5
+ 3
+ 1.4142135623731
+ 93.75
+
+
+
diff --git a/test/test_data/wee_score/wee_masked_0.tif b/test/test_data/wee_score/wee_masked_0.tif
new file mode 100644
index 0000000..6cd7f43
Binary files /dev/null and b/test/test_data/wee_score/wee_masked_0.tif differ
diff --git a/test/test_data/wee_score/wee_masked_0.tif.aux.xml b/test/test_data/wee_score/wee_masked_0.tif.aux.xml
new file mode 100644
index 0000000..9875ba0
--- /dev/null
+++ b/test/test_data/wee_score/wee_masked_0.tif.aux.xml
@@ -0,0 +1,11 @@
+
+
+
+ 5
+ 5
+ 5
+ 0
+ 100
+
+
+
diff --git a/test/test_data/wee_score/wee_score.qgz b/test/test_data/wee_score/wee_score.qgz
new file mode 100644
index 0000000..d8ed6cf
Binary files /dev/null and b/test/test_data/wee_score/wee_score.qgz differ
diff --git a/test/test_data/wee_score/womens_economic_empowerment_-_wee_score_aggregated_0.tif b/test/test_data/wee_score/womens_economic_empowerment_-_wee_score_aggregated_0.tif
new file mode 100644
index 0000000..bac1857
Binary files /dev/null and b/test/test_data/wee_score/womens_economic_empowerment_-_wee_score_aggregated_0.tif differ
diff --git a/test/test_population_raster_processor.py b/test/test_population_raster_processor.py
index cee8a19..df69a5d 100644
--- a/test/test_population_raster_processor.py
+++ b/test/test_population_raster_processor.py
@@ -38,12 +38,12 @@ def test_population_raster_processing(self):
Tests the PopulationRasterProcessingTask for expected behavior.
"""
task = PopulationRasterProcessingTask(
- name="Test Population Raster Processing",
population_raster_path=self.input_raster_path,
study_area_gpkg_path=self.gpkg_path,
- output_dir=self.output_directory,
- crs=QgsCoordinateReferenceSystem("EPSG:32620"),
+ working_directory=self.output_directory,
+ target_crs=QgsCoordinateReferenceSystem("EPSG:32620"),
force_clear=True,
+ cell_size_m=100,
)
result = task.run()
diff --git a/test/test_study_area_processing_task.py b/test/test_study_area_processing_task.py
index d877006..1d1fabb 100644
--- a/test/test_study_area_processing_task.py
+++ b/test/test_study_area_processing_task.py
@@ -53,7 +53,6 @@ def setUp(self):
def test_initialization(self):
"""Test initialization of the task."""
task = StudyAreaProcessingTask(
- name="Test Task",
layer=self.layer,
field_name=self.field_name,
cell_size_m=self.cell_size_m,
@@ -73,7 +72,6 @@ def test_initialization(self):
def test_calculate_utm_zone(self):
"""Test UTM zone calculation."""
task = StudyAreaProcessingTask(
- name="Test Task",
layer=self.layer,
field_name=self.field_name,
cell_size_m=self.cell_size_m,
@@ -91,7 +89,6 @@ def test_calculate_utm_zone(self):
def test_process_study_area(self):
"""Test processing of study area features."""
task = StudyAreaProcessingTask(
- name="Test Task",
layer=self.layer,
field_name=self.field_name,
cell_size_m=self.cell_size_m,
@@ -115,7 +112,6 @@ def test_process_study_area(self):
def test_process_singlepart_geometry(self):
"""Test processing of singlepart geometry."""
task = StudyAreaProcessingTask(
- name="Test Task",
layer=self.layer,
field_name=self.field_name,
cell_size_m=self.cell_size_m,
@@ -147,7 +143,6 @@ def test_process_singlepart_geometry(self):
def test_grid_aligned_bbox(self):
"""Test grid alignment of bounding boxes."""
task = StudyAreaProcessingTask(
- name="Test Task",
layer=self.layer,
field_name=self.field_name,
cell_size_m=self.cell_size_m,
@@ -170,7 +165,6 @@ def test_grid_aligned_bbox(self):
def test_create_raster_vrt(self):
"""Test creation of a VRT from raster masks."""
task = StudyAreaProcessingTask(
- name="Test Task",
layer=self.layer,
field_name=self.field_name,
cell_size_m=self.cell_size_m,
diff --git a/test/test_wee_score_processor.py b/test/test_wee_score_processor.py
new file mode 100644
index 0000000..4e7aeda
--- /dev/null
+++ b/test/test_wee_score_processor.py
@@ -0,0 +1,43 @@
+import os
+import unittest
+from qgis.core import (
+ QgsVectorLayer,
+ QgsProcessingContext,
+ QgsFeedback,
+)
+from geest.core.tasks import (
+ StudyAreaProcessingTask,
+) # Adjust the import path as necessary
+from utilities_for_testing import prepare_fixtures
+from geest.core.algorithms import WEEScoreProcessingTask
+
+
+class TestWEEScoreProcessingTask(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ """Set up shared resources for the test suite."""
+
+ cls.test_data_directory = prepare_fixtures()
+ cls.working_directory = os.path.join(cls.test_data_directory, "wee_score")
+
+ cls.context = QgsProcessingContext()
+ cls.feedback = QgsFeedback()
+
+ def setUp(self):
+ self.task = WEEScoreProcessingTask(
+ # geest_raster_path=f"{self.working_directory}/wee_masked_0.tif",
+ # pop_raster_path=f"{self.working_directory}/population/reclassified_0.tif",
+ study_area_gpkg_path=f"{self.working_directory}/study_area/study_area.gpkg",
+ working_directory=f"{self.working_directory}",
+ target_crs=None,
+ force_clear=True,
+ )
+
+ def test_initialization(self):
+ self.assertTrue(self.task.output_dir.endswith("wee_score"))
+ self.assertEqual(self.task.target_crs.authid(), "EPSG:32620")
+
+ def test_run_task(self):
+ result = self.task.run()
+ self.assertTrue(result, msg=f"Wee score failed in {self.working_directory}")