|
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 |