/django/contrib/gis/utils/srs.py
Python | 77 lines | 71 code | 1 blank | 5 comment | 0 complexity | bbef03d1a2042116540864b016ad5f67 MD5 | raw file
Possible License(s): BSD-3-Clause
- 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