Opened 7 days ago

Closed 6 days ago

#36001 closed New feature (wontfix)

Make SpatialReference support for non EPSG Coordinate systems (ESRI, OGC, USER)

Reported by: Alex Owned by:
Component: GIS Version: 4.2
Severity: Normal Keywords: gdal, proj4, postgis
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Alex)

# update in comment below
https://code.djangoproject.com/ticket/36001#comment:5

Hi
situation with custom CRS in geodjango.

context: Debian GNU/Linux 12 (bookworm), Postgresql 16.6, Python 3.11.2, Postgis 3.4.2, GDAL 3.6.2, PROJ 9.1.1, Django 4.2.11, DRF 3.5.11, [DRF-GIS]https://github.com/openwisp/django-rest-framework-gis 1.0

Objects with geometry in DB creates with no problem with this class

from django.contrib.gis.db import models

class Location(models.Model):
   ...
    c_geom = models.GeometryCollectionField(srid=300001)
   ...

gdalsrsinfo works as expected

gdalsrsinfo 'USER:300001'
PROJ.4 : +proj=tmerc ...

projinfo also works fine

projinfo 'USER:300001' 
PROJ.4 : +proj=tmerc ...

python manage.py shell is correct

from osgeo import osr
sk = osr.SpatialReference()
sk.SetFromUserInput('USER:300001')
0
print(sk)
PROJCS... 

but app always throws errors when fetch and create objects via API (in admin.site - ok, no errors)

def create(self, validated_data):
        if "SRID=300001;" in str(self.validated_data["geom"]):
            logger.info("*"*60)
            logger.info(f"validated_data geom with USER:300001: {self.validated_data['geom']}")
            logger.info(f"geom srid: {self.validated_data['geom'].srid}")
            from osgeo import osr
            sk = osr.SpatialReference()
            sk.SetFromUserInput('USER:300001') # <- here same error: GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found'
            logger.info(f"SpatialReference: {sk}")
            logger.info("*"*60)

error.log

************************************************************
validated_data geom with USER:300001: SRID=300001;GEOMETRYCOLLECTION Z (POINT Z (83721.138 59266.787 101.09))
geom srid: 300001
GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found'
SpatialReference: 
************************************************************
GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found'
GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found'
...

if request one object via API, Django send 8 email with this error. odd

Change History (7)

comment:1 by Alex, 7 days ago

Description: modified (diff)

comment:2 by Alex, 7 days ago

Description: modified (diff)

comment:3 by Alex, 7 days ago

Description: modified (diff)

comment:4 by Claude Paroz, 7 days ago

Resolution: invalid
Status: newclosed

At this stage, I think you didn't provide enough information showing that Django is at fault. Moreover you are using osgeo SpatialReference while Django has its own SpatialReference in gdal.srs.

I would suggest you present your issue to the Django Forum under https://forum.djangoproject.com/c/internals/geodjango/13. You could always reopen this ticket if you find the problem comes from Django.

comment:5 by Alex, 6 days ago

You could always reopen this ticket if you find the problem comes from Django.

Yes, it's Django bug

i've patch file srs.py from line 72 https://github.com/django/django/blob/6f38697f90a14f1450a71c1e40aea0f5df7dca86/django/contrib/gis/gdal/srs.py#L72
like that

        elif isinstance(srs_input, str):
            try:
                # If SRID is a string, e.g., '4326', then make acceptable
                # as user input.
                logger.info(f"DJANGO HACK: just view srs_input: {srs_input}")
                if srs_input == '300001' or srs_input == 'USER:300001' or srs_input == 300001:
                    logger.info(f"DJANGO HACK: 300001")
                    srs_input = "USER:300001"
                else:
                    srid = int(srs_input)
                    srs_input = "EPSG:%d" % srid
            except ValueError:
                pass
        elif isinstance(srs_input, int):
            # EPSG integer code was input.
            logger.info(f"DJANGO HACK: just view srs_input: {srs_input}")
            if srs_input == 300001:
                srs_type = "user"
            else:
                srs_type = "epsg"

and as result - errors gone

INFO 2024-12-12 15:45:49,385 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 4326
INFO 2024-12-12 15:45:49,386 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 300001
INFO 2024-12-12 15:45:49,386 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 300001
INFO 2024-12-12 15:45:49,389 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 4326
INFO 2024-12-12 15:45:49,389 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 4326
INFO 2024-12-12 15:45:49,389 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 300001
INFO 2024-12-12 15:45:49,390 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 300001
INFO 2024-12-12 15:45:49,393 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 4326
INFO 2024-12-12 15:45:49,393 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 4326
INFO 2024-12-12 15:45:49,393 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 300001
INFO 2024-12-12 15:45:49,394 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 300001
INFO 2024-12-12 15:46:25,476 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 4326
INFO 2024-12-12 15:46:25,476 srs 2558856 139853388865600 DJANGO HACK: just view srs_input: 3857

conclusion

Django not allow to work with non EPSG Coordinate systems, at all (ESRI, OGC, USER and other domains - good luck)

comment:6 by Alex, 6 days ago

Description: modified (diff)
Resolution: invalid
Status: closednew

comment:7 by Sarah Boyce, 6 days ago

Resolution: wontfix
Status: newclosed
Summary: error GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found' with custom CRS in spatial_ref_sysMake SpatialReference support for non EPSG Coordinate systems (ESRI, OGC, USER)
Type: BugNew feature

I don't believe it is documented that it supports these: SpatialReference. So I feel this is a feature request to extend support.

The recommended path forward when requesting features is to first propose and discuss the idea with the community and gain consensus that this is a desired change. To do that, please consider starting a new conversation on the Django Forum, where you'll reach a broader audience and receive additional feedback.

I'll close the ticket for now, but if the community agrees with this proposal, please return to this ticket and reference the forum discussion so we can re-open it. For more information, please refer to the documented guidelines for requesting features.

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