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 )
# 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 , 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 |
comment:7 by , 6 days ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Summary: | error GDAL_ERROR 1: b'PROJ: proj_create_from_database: crs not found' with custom CRS in spatial_ref_sys → Make SpatialReference support for non EPSG Coordinate systems (ESRI, OGC, USER) |
Type: | Bug → New 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.
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.