summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2016-12-16 03:36:18 +0600
committerTim Graham <timograham@gmail.com>2016-12-15 16:36:18 -0500
commit4884472447db11c57405edd5bdff36a171decd28 (patch)
tree03c635b03172c09247c57a9c512edc2eb0b7d451 /django
parent8ab8a8910c6f9382610cba5b06ac5c110d52b4b2 (diff)
Fixed #27576 -- Made get_srid_info() fallback to GDAL if SpatialRefSys is unavailable.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/gis/db/models/fields.py33
1 files changed, 17 insertions, 16 deletions
diff --git a/django/contrib/gis/db/models/fields.py b/django/contrib/gis/db/models/fields.py
index 4ded5b1b4e..8dc272aaa4 100644
--- a/django/contrib/gis/db/models/fields.py
+++ b/django/contrib/gis/db/models/fields.py
@@ -1,8 +1,11 @@
+from collections import defaultdict
+
from django.contrib.gis import forms, gdal
from django.contrib.gis.db.models.lookups import (
RasterBandTransform, gis_lookups,
)
from django.contrib.gis.db.models.proxy import SpatialProxy
+from django.contrib.gis.gdal import SpatialReference
from django.contrib.gis.gdal.error import GDALException
from django.contrib.gis.geometry.backend import Geometry, GeometryException
from django.core.exceptions import ImproperlyConfigured
@@ -14,7 +17,7 @@ from django.utils.translation import ugettext_lazy as _
# Local cache of the spatial_ref_sys table, which holds SRID data for each
# spatial database alias. This cache exists so that the database isn't queried
# for SRID info each time a distance query is constructed.
-_srid_cache = {}
+_srid_cache = defaultdict(dict)
def get_srid_info(srid, connection):
@@ -29,21 +32,21 @@ def get_srid_info(srid, connection):
# The SpatialRefSys model for the spatial backend.
SpatialRefSys = connection.ops.spatial_ref_sys()
except NotImplementedError:
- # No `spatial_ref_sys` table in spatial backend (e.g., MySQL).
- return None, None, None
-
- if connection.alias not in _srid_cache:
- # Initialize SRID dictionary for database if it doesn't exist.
- _srid_cache[connection.alias] = {}
+ SpatialRefSys = None
- if srid not in _srid_cache[connection.alias]:
- # Use `SpatialRefSys` model to query for spatial reference info.
- sr = SpatialRefSys.objects.using(connection.alias).get(srid=srid)
- units, units_name = sr.units
- spheroid = SpatialRefSys.get_spheroid(sr.wkt)
- _srid_cache[connection.alias][srid] = (units, units_name, spheroid)
+ alias, get_srs = (
+ (connection.alias, lambda srid: SpatialRefSys.objects.using(connection.alias).get(srid=srid).srs)
+ if SpatialRefSys else
+ (None, SpatialReference)
+ )
+ if srid not in _srid_cache[alias]:
+ srs = get_srs(srid)
+ units, units_name = srs.units
+ sphere_name = srs['spheroid']
+ spheroid = 'SPHEROID["%s",%s,%s]' % (sphere_name, srs.semi_major, srs.inverse_flattening)
+ _srid_cache[alias][srid] = (units, units_name, spheroid)
- return _srid_cache[connection.alias][srid]
+ return _srid_cache[alias][srid]
class GeoSelectFormatMixin(object):
@@ -149,8 +152,6 @@ class BaseSpatialField(Field):
system that uses non-projected units (e.g., latitude/longitude).
"""
units_name = self.units_name(connection)
- # Some backends like MySQL cannot determine units name. In that case,
- # test if srid is 4326 (WGS84), even if this is over-simplification.
return units_name.lower() in self.geodetic_units if units_name else self.srid == 4326
def get_placeholder(self, value, compiler, connection):