#34302: SpatialReference.srid incorrectly assumes first AUTHORITY value to be
projection SRID
------------------------------+----------------------------------------
     Reporter:  Stefan Brand  |                    Owner:  Stefan Brand
         Type:  Bug           |                   Status:  assigned
    Component:  GIS           |                  Version:  dev
     Severity:  Normal        |               Resolution:
     Keywords:                |             Triage Stage:  Accepted
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+----------------------------------------
Changes (by Stefan Brand):

 * owner:  nobody => Stefan Brand
 * status:  new => assigned


Comment:

 While applying the change, I got a failing test. It turns out that
 GeoDjango has a different behaviour than the GDAL Python bindings.

 Compare:

 {{{
 #!python
 from django.contrib.gis.gdal import SpatialReference
 from osgeo import ogr

 WEB_MERCATOR = """PROJCS["WGS 84 / Pseudo-Mercator",
     GEOGCS["WGS 84",
         DATUM["WGS_1984",
             SPHEROID["WGS 84",6378137,298.257223563,
                 AUTHORITY["EPSG","7030"]],
             AUTHORITY["EPSG","6326"]],
         PRIMEM["Greenwich",0,
             AUTHORITY["EPSG","8901"]],
         UNIT["degree",0.0174532925199433,
             AUTHORITY["EPSG","9122"]],
         AUTHORITY["EPSG","4326"]],
     PROJECTION["Mercator_1SP"],
     PARAMETER["central_meridian",0],
     PARAMETER["scale_factor",1],
     PARAMETER["false_easting",0],
     PARAMETER["false_northing",0],
     UNIT["metre",1,
         AUTHORITY["EPSG","9001"]],
     AXIS["Easting",EAST],
     AXIS["Northing",NORTH],
     EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0
 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"],
     AUTHORITY["EPSG","3857"]]"""


 geodjango_srs = SpatialReference(WEB_MERCATOR)
 geodjango_srs.validate()  # raises for invalid SRS
 print(geodjango_srs.attr_value("AUTHORITY", 1))
 print(geodjango_srs.auth_code(target=None))

 ogr_srs = ogr.osr.SpatialReference(WEB_MERCATOR)
 if ogr_srs.Validate(): raise
 print(ogr_srs.GetAttrValue("AUTHORITY", 1))
 print(ogr_srs.GetAuthorityCode(None))
 }}}


 > 3857
 > None
 > 3857
 > 3857

 The reason is that
 
[https://github.com/django/django/blob/fd21f82aa82b0d75a161f618ef944ebe0923e0ab/django/utils/encoding.py#L91-L108
 `django/utils/force_bytes`] turns `None` into the byte string `b'None'`.
 Since `ctypes.c_char_p` also accepts `None`, we can bypass `force_bytes`
 if `target is None`.

 I will do some more testing and push a patch tomorrow.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34302#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018631ae42f0-e18c30fa-0007-44e1-abd5-e314e9b7e28f-000000%40eu-central-1.amazonses.com.

Reply via email to