web/lib/django/contrib/gis/utils/srs.py
changeset 38 77b6da96e6f1
equal deleted inserted replaced
37:8d941af65caf 38:77b6da96e6f1
       
     1 from django.contrib.gis.gdal import SpatialReference
       
     2 from django.db import connections, DEFAULT_DB_ALIAS
       
     3 
       
     4 def 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.
       
    77 add_postgis_srs = add_srs_entry