PageRenderTime 143ms CodeModel.GetById 70ms app.highlight 5ms RepoModel.GetById 65ms app.codeStats 0ms

/django/contrib/gis/utils/srs.py

https://code.google.com/p/mango-py/
Python | 77 lines | 71 code | 1 blank | 5 comment | 0 complexity | bbef03d1a2042116540864b016ad5f67 MD5 | raw file
 1from django.contrib.gis.gdal import SpatialReference
 2from django.db import connections, DEFAULT_DB_ALIAS
 3
 4def add_srs_entry(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None,
 5                  database=DEFAULT_DB_ALIAS):
 6    """
 7    This function takes a GDAL SpatialReference system and adds its information
 8    to the `spatial_ref_sys` table of the spatial backend.  Doing this enables
 9    database-level spatial transformations for the backend.  Thus, this utility
10    is useful for adding spatial reference systems not included by default with
11    the backend -- for example, the so-called "Google Maps Mercator Projection"
12    is excluded in PostGIS 1.3 and below, and the following adds it to the
13    `spatial_ref_sys` table:
14
15    >>> from django.contrib.gis.utils import add_srs_entry
16    >>> add_srs_entry(900913)
17
18    Keyword Arguments:
19     auth_name:
20       This keyword may be customized with the value of the `auth_name` field.
21       Defaults to 'EPSG'.
22
23     auth_srid:
24       This keyword may be customized with the value of the `auth_srid` field.
25       Defaults to the SRID determined by GDAL.
26
27     ref_sys_name:
28       For SpatiaLite users only, sets the value of the the `ref_sys_name` field.
29       Defaults to the name determined by GDAL.
30
31     database:
32      The name of the database connection to use; the default is the value
33      of `django.db.DEFAULT_DB_ALIAS` (at the time of this writing, it's value
34      is 'default').
35    """
36    connection = connections[database]
37    if not hasattr(connection.ops, 'spatial_version'):
38        raise Exception('The `add_srs_entry` utility only works '
39                        'with spatial backends.')
40    if connection.ops.oracle or connection.ops.mysql:
41        raise Exception('This utility does not support the '
42                        'Oracle or MySQL spatial backends.')
43    SpatialRefSys = connection.ops.spatial_ref_sys()
44
45    # If argument is not a `SpatialReference` instance, use it as parameter
46    # to construct a `SpatialReference` instance.
47    if not isinstance(srs, SpatialReference):
48        srs = SpatialReference(srs)
49
50    if srs.srid is None:
51        raise Exception('Spatial reference requires an SRID to be '
52                        'compatible with the spatial backend.')
53
54    # Initializing the keyword arguments dictionary for both PostGIS
55    # and SpatiaLite.
56    kwargs = {'srid' : srs.srid,
57              'auth_name' : auth_name,
58              'auth_srid' : auth_srid or srs.srid,
59              'proj4text' : srs.proj4,
60              }
61
62    # Backend-specific fields for the SpatialRefSys model.
63    if connection.ops.postgis:
64        kwargs['srtext'] = srs.wkt
65    if connection.ops.spatialite:
66        kwargs['ref_sys_name'] = ref_sys_name or srs.name
67
68    # Creating the spatial_ref_sys model.
69    try:
70        # Try getting via SRID only, because using all kwargs may
71        # differ from exact wkt/proj in database.
72        sr = SpatialRefSys.objects.get(srid=srs.srid)
73    except SpatialRefSys.DoesNotExist:
74        sr = SpatialRefSys.objects.create(**kwargs)
75
76# Alias is for backwards-compatibility purposes.
77add_postgis_srs = add_srs_entry