web/lib/django/contrib/gis/utils/srs.py
changeset 38 77b6da96e6f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/contrib/gis/utils/srs.py	Wed Jun 02 18:57:35 2010 +0200
@@ -0,0 +1,77 @@
+from django.contrib.gis.gdal import SpatialReference
+from django.db import connections, DEFAULT_DB_ALIAS
+
+def add_srs_entry(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None,
+                  database=DEFAULT_DB_ALIAS):
+    """
+    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 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').
+    """
+    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.get(srid=srs.srid)
+    except SpatialRefSys.DoesNotExist:
+        sr = SpatialRefSys.objects.create(**kwargs)
+
+# Alias is for backwards-compatibility purposes.
+add_postgis_srs = add_srs_entry