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 |