Opened 5 weeks ago

Closed 25 hours ago

#36058 closed Cleanup/optimization (fixed)

Refactoring SpatialRefSysMixin.srs for efficiency and better error handling

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

Description (last modified by Arnaldo Govene)

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.

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. 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.

2. Raplace Manual Caching with @cached_propert and Remove Recursive Calls:
To further optimize the srs property, replace the manual caching mechanism with @cached_property. This simplifies the code while retaining the benefits of caching, which is particularly important given the computational cost of creating a gdal.SpatialReference object.

Refactored Code:

from django.utils.functional import cached_property

class SpatialRefSysMixin:

    @cached_property
    def srs(self):
        """
        Return a GDAL SpatialReference object.
        """
        try:
            return gdal.SpatialReference(self.wkt)
        except Exception as e:
            wkt_error = f"Error initializing from WKT: {str(e)}"

        try:
            return gdal.SpatialReference(self.proj4text)
        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}")

Rationale for Using cached_property:

  • Caches the computationally expensive creation of gdal.SpatialReference, improving efficiency for repeated access.
  • Removes manual caching logic, making the code cleaner and easier to maintain.
  • Ideal for mostly static spatial reference data, avoiding unnecessary recomputation.

Forum discussion: https://forum.djangoproject.com/t/caching-strategy-for-spatialrefsysmixin-srs/37634/3

Change History (8)

comment:1 by Sarah Boyce, 5 weeks 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, 5 weeks ago

Owner: set to Arnaldo Govene

comment:3 by Arnaldo Govene, 4 weeks ago

Description: modified (diff)
Summary: Improve SpatialRefSysMixin.srs error reporting and efficiencyRefactoring SpatialRefSysMixin.srs for efficiency and better error handling

comment:4 by Arnaldo Govene, 4 weeks ago

Description: modified (diff)

comment:5 by Arnaldo Govene, 4 weeks ago

Has patch: set

comment:6 by Sarah Boyce, 2 weeks ago

Needs tests: set

comment:7 by Sarah Boyce, 2 days ago

Needs tests: unset
Triage Stage: AcceptedReady for checkin

comment:8 by Sarah Boyce <42296566+sarahboyce@…>, 25 hours ago

Resolution: fixed
Status: assignedclosed

In 8ff1399:

Fixed #36058 -- Refactored SpatialRefSysMixin.srs to use cached_property.

Replaced manual caching complexity with cached_property for efficiency.
Enhanced error handling with distinct messages for WKT and PROJ.4.

Thanks to Sarah Boyce for the suggestions.

Note: See TracTickets for help on using tickets.
Back to Top