Files
app
exalted
venv
bin
lib
python3.8
site-packages
Django-3.0.5.dist-info
__pycache__
asgiref
asgiref-3.2.7.dist-info
django
__pycache__
apps
bin
conf
contrib
__pycache__
admin
admindocs
auth
contenttypes
flatpages
gis
__pycache__
admin
db
forms
gdal
geoip2
geos
locale
management
serializers
sitemaps
static
templates
utils
__pycache__
__init__.py
layermapping.py
ogrinfo.py
ogrinspect.py
srs.py
__init__.py
apps.py
feeds.py
geometry.py
measure.py
ptr.py
shortcuts.py
views.py
humanize
messages
postgres
redirects
sessions
sitemaps
sites
staticfiles
syndication
__init__.py
core
db
dispatch
forms
http
middleware
template
templatetags
test
urls
utils
views
__init__.py
__main__.py
shortcuts.py
pip
pip-20.0.2.dist-info
pkg_resources
psycopg2
psycopg2-2.8.5.dist-info
pytz
pytz-2019.3.dist-info
setuptools
setuptools-46.1.3.dist-info
sqlparse
sqlparse-0.3.1.dist-info
wheel
wheel-0.34.2.dist-info
_virtualenv.pth
_virtualenv.py
easy_install.py
pip-20.0.2.virtualenv
setuptools-46.1.3.virtualenv
wheel-0.34.2.virtualenv
pyvenv.cfg
manage.py
2020-04-11 13:03:48 +01:00

77 lines
2.9 KiB
Python

from django.contrib.gis.gdal import SpatialReference
from django.db import DEFAULT_DB_ALIAS, connections
def add_srs_entry(srs, auth_name='EPSG', auth_srid=None, ref_sys_name=None,
database=None):
"""
Take a GDAL SpatialReference system and add 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:
>>> from django.contrib.gis.utils import add_srs_entry
>>> add_srs_entry(3857)
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, its value
is 'default').
"""
database = database or 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 not connection.features.supports_add_srs_entry:
raise Exception('This utility does not support your database backend.')
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.
srs_field_names = {f.name for f in SpatialRefSys._meta.get_fields()}
if 'srtext' in srs_field_names:
kwargs['srtext'] = srs.wkt
if 'ref_sys_name' in srs_field_names:
# SpatiaLite specific
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.
SpatialRefSys.objects.using(database).get(srid=srs.srid)
except SpatialRefSys.DoesNotExist:
SpatialRefSys.objects.using(database).create(**kwargs)