mirror of
https://github.com/django/django.git
synced 2025-07-04 09:49: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:
parent
5fd838c4dc
commit
09ee2359cf
@ -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
|
||||||
|
|
||||||
|
@ -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.')
|
||||||
|
|
||||||
|
55
django/contrib/gis/utils/wkt.py
Normal file
55
django/contrib/gis/utils/wkt.py
Normal 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)])
|
Loading…
x
Reference in New Issue
Block a user