Opened 2 days ago

Last modified 40 hours ago

#36058 assigned Cleanup/optimization

Improve SpatialRefSysMixin.srs error reporting and efficiency

Reported by: Arnaldo Govene Owned by: Arnaldo Govene
Component: GIS Version: 5.1
Severity: Normal Keywords:
Cc: Arnaldo Govene Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The srs property in the SpatialRefSysMixin class has several issues that can be addressed to improve code efficiency, maintainability, and adherence to best practices. The following points highlight the concerns:

1. Recursive Calls:
The property uses return self.srs within the try blocks. This introduces recursion, which could lead to stack overflow in edge cases or unexpected behavior. The recursive call to self.srs results in the function calling itself indefinitely, leading to a potential infinite loop.

Current Code:

try:
    self._srs = gdal.SpatialReference(self.wkt)
    return self.srs  # Recursive call
except Exception as e:
    msg = e

2. Error Handling:
The msg variable is overwritten in the second try block without being utilized after the first block, making error reporting ambiguous. This results in the final error message only reflecting the second exception, losing context from the first one.

Current Code:

try:
    self._srs = gdal.SpatialReference(self.wkt)
    return self.srs
except Exception as e:
    msg = e  # First exception caught

try:
    self._srs = gdal.SpatialReference(self.proj4text)
    return self.srs
except Exception as e:
    msg = e  # Second exception overwrites the first

Proposal:

1. Remove Recursive Calls:
Replace return self.srs with return self._srs.clone() fo avoid recursion and improve clarity.

Refactored Code:

if hasattr(self, "_srs"):
    return self._srs.clone()  # Return the clone of the cached object

2. Improve Error Reporting:
Capture and differentiate between errors raised during the initialization from WKT and PROJ.4. Ensure that both error messages are included in the final exception for better clarity and debugging.

Refactored Code:

try:
    self._srs = gdal.SpatialReference(self.wkt)
    return self._srs.clone()
except Exception as e:
    wkt_error = f"Error initializing from WKT: {str(e)}"

try:
    self._srs = gdal.SpatialReference(self.proj4text)
    return self._srs.clone()
except Exception as e:
    proj4_error = f"Error initializing from PROJ.4: {str(e)}"

raise Exception(f"Could not get OSR SpatialReference. WKT Error: {wkt_error} | PROJ.4 Error: {proj4_error}")

Expected Outcome:

  • By removing recursion and directly returning a cloned object, we avoid unnecessary function calls and improve performance.
  • With differentiated error messages, it becomes easier to diagnose issues with the WKT or PROJ.4 initialization.

Change History (2)

comment:1 by Sarah Boyce, 2 days ago

Summary: Refactor SpatialRefSysMixin.srs Property for Improved Efficiency and ClarityImprove SpatialRefSysMixin.srs error reporting and efficiency
Triage Stage: UnreviewedAccepted

Thank you, agree the error overwrite could be improved, the caching logic is also due a refresh

comment:2 by Arnaldo Govene, 40 hours ago

Owner: set to Arnaldo Govene
Note: See TracTickets for help on using tickets.
Back to Top