1
0
mirror of https://github.com/django/django.git synced 2025-07-03 17:29:12 +00:00

gis: Added the precision_wkt utility; add_postgis_srs may now take WKT/PROJ.4 strings and integer SRIDs.

git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@7547 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Justin Bronn 2008-05-22 21:52:03 +00:00
parent 5fd838c4dc
commit 09ee2359cf
3 changed files with 62 additions and 0 deletions

View File

@ -21,3 +21,5 @@ except:
HAS_GEOIP = False HAS_GEOIP = False
from django.contrib.gis.utils.srs import add_postgis_srs from django.contrib.gis.utils.srs import add_postgis_srs
from django.contrib.gis.utils.wkt import precision_wkt

View File

@ -1,3 +1,5 @@
from django.contrib.gis.gdal import SpatialReference
def add_postgis_srs(srs): def add_postgis_srs(srs):
""" """
This function takes a GDAL SpatialReference system and adds its This function takes a GDAL SpatialReference system and adds its
@ -14,6 +16,9 @@ def add_postgis_srs(srs):
""" """
from django.contrib.gis.models import SpatialRefSys from django.contrib.gis.models import SpatialRefSys
if not isinstance(srs, SpatialReference):
srs = SpatialReference(srs)
if srs.srid is None: if srs.srid is None:
raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.') raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.')

View File

@ -0,0 +1,55 @@
"""
Utilities for manipulating Geometry WKT.
"""
def precision_wkt(geom, prec):
"""
Returns WKT text of the geometry according to the given precision (an
integer or a string). If the precision is an integer, then the decimal
places of coordinates WKT will be truncated to that number:
>>> pnt = Point(5, 23)
>>> pnt.wkt
'POINT (5.0000000000000000 23.0000000000000000)'
>>> precision(geom, 1)
'POINT (5.0 23.0)'
If the precision is a string, it must be valid Python format string
(e.g., '%20.7f') -- thus, you should know what you're doing.
"""
if isinstance(prec, int):
num_fmt = '%%.%df' % prec
elif isinstance(prec, basestring):
num_fmt = prec
else:
raise TypeError
# TODO: Support 3D geometries.
coord_fmt = ' '.join([num_fmt, num_fmt])
def formatted_coords(coords):
return ','.join([coord_fmt % c[:2] for c in coords])
def formatted_poly(poly):
return ','.join(['(%s)' % formatted_coords(r) for r in poly])
def formatted_geom(g):
gtype = str(g.geom_type).upper()
yield '%s(' % gtype
if gtype == 'POINT':
yield formatted_coords((g.coords,))
elif gtype in ('LINESTRING', 'LINEARRING'):
yield formatted_coords(g.coords)
elif gtype in ('POLYGON', 'MULTILINESTRING'):
yield formatted_poly(g)
elif gtype == 'MULTIPOINT':
yield formatted_coords(g.coords)
elif gtype == 'MULTIPOLYGON':
yield ','.join(['(%s)' % formatted_poly(p) for p in g])
elif gtype == 'GEOMETRYCOLLECTION':
yield ','.join([''.join([wkt for wkt in formatted_geom(child)]) for child in g])
else:
raise TypeError
yield ')'
return ''.join([wkt for wkt in formatted_geom(geom)])