summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/django/contrib/gis/utils/srs.py')
-rw-r--r--lib/python2.7/site-packages/django/contrib/gis/utils/srs.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py b/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py
new file mode 100644
index 0000000..fe2f291
--- /dev/null
+++ b/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py
@@ -0,0 +1,80 @@
+from django.contrib.gis.gdal import SpatialReference
+
+def add_srs_entry(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None,
+ database=None):
+ """
+ This function takes a GDAL SpatialReference system and adds its information
+ to the `spatial_ref_sys` table of the spatial backend. Doing this enables
+ database-level spatial transformations for the backend. Thus, this utility
+ is useful for adding spatial reference systems not included by default with
+ the backend -- for example, the so-called "Google Maps Mercator Projection"
+ is excluded in PostGIS 1.3 and below, and the following adds it to the
+ `spatial_ref_sys` table:
+
+ >>> from django.contrib.gis.utils import add_srs_entry
+ >>> add_srs_entry(900913)
+
+ Keyword Arguments:
+ auth_name:
+ This keyword may be customized with the value of the `auth_name` field.
+ Defaults to 'EPSG'.
+
+ auth_srid:
+ This keyword may be customized with the value of the `auth_srid` field.
+ Defaults to the SRID determined by GDAL.
+
+ ref_sys_name:
+ For SpatiaLite users only, sets the value of the `ref_sys_name` field.
+ Defaults to the name determined by GDAL.
+
+ database:
+ The name of the database connection to use; the default is the value
+ of `django.db.DEFAULT_DB_ALIAS` (at the time of this writing, it's value
+ is 'default').
+ """
+ from django.db import connections, DEFAULT_DB_ALIAS
+ if not database:
+ database = DEFAULT_DB_ALIAS
+ connection = connections[database]
+
+ if not hasattr(connection.ops, 'spatial_version'):
+ raise Exception('The `add_srs_entry` utility only works '
+ 'with spatial backends.')
+ if connection.ops.oracle or connection.ops.mysql:
+ raise Exception('This utility does not support the '
+ 'Oracle or MySQL spatial backends.')
+ SpatialRefSys = connection.ops.spatial_ref_sys()
+
+ # If argument is not a `SpatialReference` instance, use it as parameter
+ # to construct a `SpatialReference` instance.
+ if not isinstance(srs, SpatialReference):
+ srs = SpatialReference(srs)
+
+ if srs.srid is None:
+ raise Exception('Spatial reference requires an SRID to be '
+ 'compatible with the spatial backend.')
+
+ # Initializing the keyword arguments dictionary for both PostGIS
+ # and SpatiaLite.
+ kwargs = {'srid' : srs.srid,
+ 'auth_name' : auth_name,
+ 'auth_srid' : auth_srid or srs.srid,
+ 'proj4text' : srs.proj4,
+ }
+
+ # Backend-specific fields for the SpatialRefSys model.
+ if connection.ops.postgis:
+ kwargs['srtext'] = srs.wkt
+ if connection.ops.spatialite:
+ kwargs['ref_sys_name'] = ref_sys_name or srs.name
+
+ # Creating the spatial_ref_sys model.
+ try:
+ # Try getting via SRID only, because using all kwargs may
+ # differ from exact wkt/proj in database.
+ sr = SpatialRefSys.objects.using(database).get(srid=srs.srid)
+ except SpatialRefSys.DoesNotExist:
+ sr = SpatialRefSys.objects.using(database).create(**kwargs)
+
+# Alias is for backwards-compatibility purposes.
+add_postgis_srs = add_srs_entry