|
29
|
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): |
|
0
|
6 |
""" |
|
29
|
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: |
|
0
|
14 |
|
|
29
|
15 |
>>> from django.contrib.gis.utils import add_srs_entry |
|
|
16 |
>>> add_srs_entry(900913) |
|
0
|
17 |
|
|
|
18 |
Keyword Arguments: |
|
29
|
19 |
auth_name: |
|
|
20 |
This keyword may be customized with the value of the `auth_name` field. |
|
|
21 |
Defaults to 'EPSG'. |
|
0
|
22 |
|
|
29
|
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. |
|
0
|
30 |
|
|
29
|
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'). |
|
0
|
35 |
""" |
|
29
|
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() |
|
0
|
44 |
|
|
29
|
45 |
# If argument is not a `SpatialReference` instance, use it as parameter |
|
|
46 |
# to construct a `SpatialReference` instance. |
|
0
|
47 |
if not isinstance(srs, SpatialReference): |
|
|
48 |
srs = SpatialReference(srs) |
|
|
49 |
|
|
|
50 |
if srs.srid is None: |
|
29
|
51 |
raise Exception('Spatial reference requires an SRID to be ' |
|
|
52 |
'compatible with the spatial backend.') |
|
0
|
53 |
|
|
29
|
54 |
# Initializing the keyword arguments dictionary for both PostGIS |
|
|
55 |
# and SpatiaLite. |
|
0
|
56 |
kwargs = {'srid' : srs.srid, |
|
|
57 |
'auth_name' : auth_name, |
|
|
58 |
'auth_srid' : auth_srid or srs.srid, |
|
|
59 |
'proj4text' : srs.proj4, |
|
|
60 |
} |
|
|
61 |
|
|
29
|
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 |
|
0
|
67 |
|
|
|
68 |
# Creating the spatial_ref_sys model. |
|
29
|
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 |