Skip to content

Commit fb08a73

Browse files
authored
Merge pull request #181 from osundwajeff/fix-unbound-error-ookla
Fix unbound error
2 parents c8c84ac + c488d72 commit fb08a73

File tree

6 files changed

+54
-18
lines changed

6 files changed

+54
-18
lines changed

config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"author": "Kartoza for and with The World Bank",
1919
"email": "info@kartoza.com, gost@worldbank.org",
2020
"description": "Gender Enabling Environments Spatial Tool",
21-
"version": "1.2.3",
21+
"version": "1.2.4",
2222
"changelog": "* Added OOKLA Downloader\\n* Added GHSL Downloader \\n* Added variable distance ACLED Buffer. \\* Fix analysis report.",
2323
"server": false
2424
}

geest/core/osm_downloaders/osm_data_downloader_base.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -294,20 +294,20 @@ def process_line_response(self) -> None:
294294
# )
295295
# pipeline = transform.coordinateOperation().projString()
296296

297-
# log_message(f"Proj4 operation: {pipeline}")
298-
processing.run(
297+
result = processing.run(
299298
"native:reprojectlayer",
300299
{
301300
"INPUT": f"{self.output_path}|layername={self.filename}_4326",
302301
"TARGET_CRS": self.output_crs,
303302
"CONVERT_CURVED_GEOMETRIES": False,
304-
# "OPERATION": "+proj=pipeline +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=utm +zone=36 +ellps=WGS84",
305-
# The proj4 pipeline string is only available in QGIS >= 3.26
306-
# "OPERATION": pipeline,
307303
"OUTPUT": f"ogr:dbname='{self.output_path}' table=\"{self.filename}\" (geom)", # noqa E231
308304
},
309305
)
310-
self.feedback.setProgress(100) # Set progress complete
306+
307+
if not (result and "OUTPUT" in result):
308+
raise RuntimeError(f"Failed to reproject OSM data to {self.output_crs.authid()}")
309+
310+
self.feedback.setProgress(100)
311311

312312
total_end = time.perf_counter()
313313
log_message(f"GeoPackage written to: {self.output_path} table: {self.filename}") # noqa E231

geest/core/workflows/index_score_with_ookla_workflow.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,13 @@ def _process_features_for_area(
174174

175175
if not final_geom or final_geom.isEmpty():
176176
log_message(f"No Ookla coverage in area {index} after intersection, skipping rasterization.")
177-
else:
178-
scored_layer = self.create_scored_boundary_layer(
179-
clip_area=final_geom,
180-
index=index,
181-
)
177+
return None
178+
179+
# Create scored layer only if we have valid geometry
180+
scored_layer = self.create_scored_boundary_layer(
181+
clip_area=final_geom,
182+
index=index,
183+
)
182184
self.progressChanged.emit(60.0) # We just use nominal intervals for progress
183185

184186
# Rasterize

geest/core/workflows/osm_transport_polyline_per_cell_workflow.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,19 @@ def __init__(
6767
level=Qgis.Warning,
6868
)
6969
layer_path = self.attributes.get("osm_transport_polyline_per_cell_layer_source", None)
70+
7071
if not layer_path:
7172
log_message(
72-
"No points layer found in osm_transport_polyline_per_cell_layer_source.",
73+
"No osm_transport_polyline_per_cell_layer_source found, trying road_network_layer_path.",
7374
tag="Geest",
7475
level=Qgis.Warning,
7576
)
76-
return False
77+
layer_path = self.attributes.get("road_network_layer_path", None)
78+
79+
if not layer_path:
80+
error_msg = "No transport layer found. Please configure a data source or download the active transport network."
81+
log_message(error_msg, tag="Geest", level=Qgis.Critical)
82+
raise ValueError(error_msg)
7783

7884
self.features_layer = QgsVectorLayer(layer_path, "OSM Transport Layer", "ogr")
7985

geest/gui/geest_dock.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ def __init__(self, parent: Optional[QWidget] = None, json_file: Optional[str] =
186186
self.stacked_widget.setCurrentIndex(ROAD_NETWORK_PANEL),
187187
self.road_network_widget.set_working_directory(self.create_project_widget.working_dir),
188188
self.road_network_widget.set_reference_layer(self.create_project_widget.reference_layer()),
189-
self.road_network_widget.set_crs(self.create_project_widget.crs()),
189+
self.road_network_widget.set_crs(
190+
self.create_project_widget.crs(working_directory=self.create_project_widget.working_dir)
191+
),
190192
][
191193
-1
192194
] # The [-1] ensures the lambda returns the last value
@@ -362,7 +364,7 @@ def on_panel_changed(self, index: int) -> None:
362364
log_message(f"Setting road network panel working directory to: {working_directory}")
363365
self.road_network_widget.set_working_directory(working_directory)
364366
self.road_network_widget.set_reference_layer(self.create_project_widget.reference_layer())
365-
self.road_network_widget.set_crs(self.create_project_widget.crs())
367+
self.road_network_widget.set_crs(self.create_project_widget.crs(working_directory=working_directory))
366368
elif index == TREE_PANEL:
367369
log_message("Switched to Tree panel")
368370
# self.tree_widget.set_working_directory(self.setup_widget.working_dir)

geest/gui/panels/create_project_panel.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,34 @@ def reference_layer(self):
294294
"""Get the admin boundary reference layer."""
295295
return self.layer_combo.currentLayer()
296296

297-
def crs(self):
298-
"""Get the crs for the Geest project."""
297+
def crs(self, working_directory=None):
298+
"""Get the crs for the Geest project.
299+
300+
If study area already exists, return its CRS.
301+
Otherwise, calculate CRS from the boundary layer.
302+
303+
Args:
304+
working_directory: Optional working directory path. If not provided, uses self.working_dir
305+
"""
306+
# Use provided working_directory, otherwise fall back to self.working_dir
307+
work_dir = working_directory or self.working_dir
308+
309+
# First, try to get CRS from existing study area
310+
if work_dir and os.path.exists(work_dir):
311+
study_area_gpkg = os.path.join(work_dir, "study_area", "study_area.gpkg")
312+
if os.path.exists(study_area_gpkg):
313+
try:
314+
study_area_layer = QgsVectorLayer(
315+
f"{study_area_gpkg}|layername=study_area_polygons", "study_area", "ogr"
316+
)
317+
if study_area_layer.isValid():
318+
crs = study_area_layer.crs()
319+
self.crs_label.setText(f"CRS: {crs.authid()}")
320+
return crs
321+
except Exception as e:
322+
log_message(f"Could not load study area CRS: {e}", level=Qgis.Warning)
323+
324+
# If no study area exists yet, calculate CRS from boundary layer
299325
crs = None
300326
if self.use_boundary_crs.isChecked():
301327
log_message("Using boundary CRS")

0 commit comments

Comments
 (0)