Opened 7 days ago
Last modified 6 days ago
#36001 closed New feature
error GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found' with custom CRS in spatial_ref_sys — at Version 6
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 )
# 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 (6)
comment:1 by , 7 days ago
Description: | modified (diff) |
---|
comment:2 by , 7 days ago
Description: | modified (diff) |
---|
comment:3 by , 7 days ago
Description: | modified (diff) |
---|
comment:4 by , 7 days ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:5 by , 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 , 6 days ago
Description: | modified (diff) |
---|---|
Resolution: | invalid |
Status: | closed → new |
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 ownSpatialReference
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.