web/lib/django/contrib/gis/utils/srs.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     1 def add_postgis_srs(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None):
     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):
     2     """
     6     """
     3     This function takes a GDAL SpatialReference system and adds its
     7     This function takes a GDAL SpatialReference system and adds its information
     4     information to the PostGIS `spatial_ref_sys` table -- enabling
     8     to the `spatial_ref_sys` table of the spatial backend.  Doing this enables
     5     spatial transformations with PostGIS.  This is handy for adding
     9     database-level spatial transformations for the backend.  Thus, this utility
     6     spatial reference systems not included by default with PostGIS.
    10     is useful for adding spatial reference systems not included by default with
     7     For example, the following adds the so-called "Google Maps Mercator
    11     the backend -- for example, the so-called "Google Maps Mercator Projection"
     8     Projection" (available in GDAL 1.5):
    12     is excluded in PostGIS 1.3 and below, and the following adds it to the
       
    13     `spatial_ref_sys` table:
     9 
    14 
    10     >>> add_postgis_srs(SpatialReference(900913))
    15     >>> from django.contrib.gis.utils import add_srs_entry
       
    16     >>> add_srs_entry(900913)
    11 
    17 
    12     Keyword Arguments:
    18     Keyword Arguments:
    13      auth_name: This keyword may be customized with the value of the
    19      auth_name:
    14                 `auth_name` field.  Defaults to 'EPSG'.
    20        This keyword may be customized with the value of the `auth_name` field.
       
    21        Defaults to 'EPSG'.
    15 
    22 
    16      auth_srid: This keyword may be customized with the value of the
    23      auth_srid:
    17                 `auth_srid` field.  Defaults to the SRID determined
    24        This keyword may be customized with the value of the `auth_srid` field.
    18                 by GDAL.
    25        Defaults to the SRID determined by GDAL.
    19 
    26 
    20      ref_sys_name: For SpatiaLite users only, sets the value of the
    27      ref_sys_name:
    21                    the `ref_sys_name` field.  Defaults to the name
    28        For SpatiaLite users only, sets the value of the the `ref_sys_name` field.
    22                    determined by GDAL.
    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').
    23     """
    35     """
    24     from django.contrib.gis.db.backend import SpatialBackend
    36     connection = connections[database]
    25     from django.contrib.gis.models import SpatialRefSys
    37     if not hasattr(connection.ops, 'spatial_version'):
    26     from django.contrib.gis.gdal import SpatialReference
    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()
    27 
    44 
    28     if SpatialBackend.oracle or SpatialBackend.mysql:
    45     # If argument is not a `SpatialReference` instance, use it as parameter
    29         raise Exception('This utility not supported on Oracle or MySQL spatial backends.')
    46     # to construct a `SpatialReference` instance.
    30 
       
    31     if not isinstance(srs, SpatialReference):
    47     if not isinstance(srs, SpatialReference):
    32         srs = SpatialReference(srs)
    48         srs = SpatialReference(srs)
    33 
    49 
    34     if srs.srid is None:
    50     if srs.srid is None:
    35         raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.')
    51         raise Exception('Spatial reference requires an SRID to be '
       
    52                         'compatible with the spatial backend.')
    36 
    53 
    37     # Initializing the keyword arguments dictionary for both PostGIS and SpatiaLite.
    54     # Initializing the keyword arguments dictionary for both PostGIS
       
    55     # and SpatiaLite.
    38     kwargs = {'srid' : srs.srid,
    56     kwargs = {'srid' : srs.srid,
    39               'auth_name' : auth_name,
    57               'auth_name' : auth_name,
    40               'auth_srid' : auth_srid or srs.srid,
    58               'auth_srid' : auth_srid or srs.srid,
    41               'proj4text' : srs.proj4,
    59               'proj4text' : srs.proj4,
    42               }
    60               }
    43 
    61 
    44     # Backend-specific keyword settings.
    62     # Backend-specific fields for the SpatialRefSys model.
    45     if SpatialBackend.postgis: kwargs['srtext'] = srs.wkt
    63     if connection.ops.postgis:
    46     if SpatialBackend.spatialite: kwargs['ref_sys_name'] = ref_sys_name or srs.name
    64         kwargs['srtext'] = srs.wkt
       
    65     if connection.ops.spatialite:
       
    66         kwargs['ref_sys_name'] = ref_sys_name or srs.name
    47 
    67 
    48     # Creating the spatial_ref_sys model.
    68     # Creating the spatial_ref_sys model.
    49     sr, created = SpatialRefSys.objects.get_or_create(**kwargs)
    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