diff options
Diffstat (limited to 'lib/python2.7/site-packages/django/contrib/gis/utils/srs.py')
-rw-r--r-- | lib/python2.7/site-packages/django/contrib/gis/utils/srs.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py b/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py new file mode 100644 index 0000000..fe2f291 --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/gis/utils/srs.py @@ -0,0 +1,80 @@ +from django.contrib.gis.gdal import SpatialReference + +def add_srs_entry(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None, + database=None): + """ + 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 `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'). + """ + from django.db import connections, DEFAULT_DB_ALIAS + if not database: + database = DEFAULT_DB_ALIAS + 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.using(database).get(srid=srs.srid) + except SpatialRefSys.DoesNotExist: + sr = SpatialRefSys.objects.using(database).create(**kwargs) + +# Alias is for backwards-compatibility purposes. +add_postgis_srs = add_srs_entry |