web/lib/django/contrib/gis/utils/srs.py
author ymh <ymh.work@gmail.com>
Wed, 20 Jan 2010 01:06:59 +0100
changeset 1 ebaad720f88b
parent 0 0d40e90630ef
child 29 cc9b7e14412b
permissions -rw-r--r--
hgignore and some hg files

def add_postgis_srs(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None):
    """
    This function takes a GDAL SpatialReference system and adds its
    information to the PostGIS `spatial_ref_sys` table -- enabling
    spatial transformations with PostGIS.  This is handy for adding
    spatial reference systems not included by default with PostGIS.
    For example, the following adds the so-called "Google Maps Mercator
    Projection" (available in GDAL 1.5):

    >>> add_postgis_srs(SpatialReference(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.
    """
    from django.contrib.gis.db.backend import SpatialBackend
    from django.contrib.gis.models import SpatialRefSys
    from django.contrib.gis.gdal import SpatialReference

    if SpatialBackend.oracle or SpatialBackend.mysql:
        raise Exception('This utility not supported on Oracle or MySQL spatial backends.')

    if not isinstance(srs, SpatialReference):
        srs = SpatialReference(srs)

    if srs.srid is None:
        raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.')

    # 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 keyword settings.
    if SpatialBackend.postgis: kwargs['srtext'] = srs.wkt
    if SpatialBackend.spatialite: kwargs['ref_sys_name'] = ref_sys_name or srs.name

    # Creating the spatial_ref_sys model.
    sr, created = SpatialRefSys.objects.get_or_create(**kwargs)