Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

gis: Added the `precision_wkt` utility; `add_postgis_srs` may now tak…

…e WKT/PROJ.4 strings and integer SRIDs.

git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@7547 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 09ee2359cff52c46f197fc02edb7690bd13e1c47 1 parent 5fd838c
@jbronn jbronn authored
View
2  django/contrib/gis/utils/__init__.py
@@ -21,3 +21,5 @@
HAS_GEOIP = False
from django.contrib.gis.utils.srs import add_postgis_srs
+from django.contrib.gis.utils.wkt import precision_wkt
+
View
5 django/contrib/gis/utils/srs.py
@@ -1,3 +1,5 @@
+from django.contrib.gis.gdal import SpatialReference
+
def add_postgis_srs(srs):
"""
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
+ if not isinstance(srs, SpatialReference):
+ srs = SpatialReference(srs)
+
if srs.srid is None:
raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.')
View
55 django/contrib/gis/utils/wkt.py
@@ -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)])
Please sign in to comment.
Something went wrong with that request. Please try again.