Author: jbronn Date: 2010-01-28 20:20:58 -0600 (Thu, 28 Jan 2010) New Revision: 12349
Modified: django/trunk/django/contrib/gis/db/backends/base.py django/trunk/django/contrib/gis/db/backends/oracle/operations.py django/trunk/django/contrib/gis/db/backends/postgis/operations.py django/trunk/django/contrib/gis/db/models/manager.py django/trunk/django/contrib/gis/db/models/query.py django/trunk/django/contrib/gis/tests/geoapp/models.py django/trunk/django/contrib/gis/tests/geoapp/tests.py Log: Added `reverse` and `force_rhr` methods to `GeoQuerySet`. Refs #12416. Modified: django/trunk/django/contrib/gis/db/backends/base.py =================================================================== --- django/trunk/django/contrib/gis/db/backends/base.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/db/backends/base.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -50,6 +50,7 @@ perimeter3d = False point_on_surface = False polygonize = False + reverse = False scale = False snap_to_grid = False sym_difference = False Modified: django/trunk/django/contrib/gis/db/backends/oracle/operations.py =================================================================== --- django/trunk/django/contrib/gis/db/backends/oracle/operations.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/db/backends/oracle/operations.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -88,6 +88,7 @@ num_points = 'SDO_UTIL.GETNUMVERTICES' perimeter = length point_on_surface = 'SDO_GEOM.SDO_POINTONSURFACE' + reverse = 'SDO_UTIL.REVERSE_LINESTRING' sym_difference = 'SDO_GEOM.SDO_XOR' transform = 'SDO_CS.TRANSFORM' union = 'SDO_GEOM.SDO_UNION' Modified: django/trunk/django/contrib/gis/db/backends/postgis/operations.py =================================================================== --- django/trunk/django/contrib/gis/db/backends/postgis/operations.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/db/backends/postgis/operations.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -252,6 +252,7 @@ self.envelope = prefix + 'Envelope' self.extent = prefix + 'Extent' self.extent3d = prefix + 'Extent3D' + self.force_rhr = prefix + 'ForceRHR' self.geohash = GEOHASH self.geojson = GEOJSON self.gml = prefix + 'AsGML' @@ -268,6 +269,7 @@ self.perimeter3d = prefix + 'Perimeter3D' self.point_on_surface = prefix + 'PointOnSurface' self.polygonize = prefix + 'Polygonize' + self.reverse = prefix + 'Reverse' self.scale = prefix + 'Scale' self.snap_to_grid = prefix + 'SnapToGrid' self.svg = prefix + 'AsSVG' Modified: django/trunk/django/contrib/gis/db/models/manager.py =================================================================== --- django/trunk/django/contrib/gis/db/models/manager.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/db/models/manager.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -36,6 +36,9 @@ def extent3d(self, *args, **kwargs): return self.get_query_set().extent3d(*args, **kwargs) + def force_rhr(self, *args, **kwargs): + return self.get_query_set().force_rhr(*args, **kwargs) + def geojson(self, *args, **kwargs): return self.get_query_set().geojson(*args, **kwargs) @@ -69,6 +72,9 @@ def point_on_surface(self, *args, **kwargs): return self.get_query_set().point_on_surface(*args, **kwargs) + def reverse(self, *args, **kwargs): + return self.get_query_set().reverse(*args, **kwargs) + def scale(self, *args, **kwargs): return self.get_query_set().scale(*args, **kwargs) Modified: django/trunk/django/contrib/gis/db/models/query.py =================================================================== --- django/trunk/django/contrib/gis/db/models/query.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/db/models/query.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -2,7 +2,7 @@ from django.db.models.query import QuerySet, Q, ValuesQuerySet, ValuesListQuerySet from django.contrib.gis.db.models import aggregates -from django.contrib.gis.db.models.fields import get_srid_info, GeometryField, PointField +from django.contrib.gis.db.models.fields import get_srid_info, GeometryField, PointField, LineStringField from django.contrib.gis.db.models.sql import AreaField, DistanceField, GeomField, GeoQuery, GeoWhereNode from django.contrib.gis.geometry.backend import Geometry from django.contrib.gis.measure import Area, Distance @@ -119,6 +119,15 @@ """ return self._spatial_aggregate(aggregates.Extent3D, **kwargs) + def force_rhr(self, **kwargs): + """ + Returns a modified version of the Polygon/MultiPolygon in which + all of the vertices follow the Right-Hand-Rule. By default, + this is attached as the `force_rhr` attribute on each element + of the GeoQuerySet. + """ + return self._geom_attribute('force_rhr', **kwargs) + def geojson(self, precision=8, crs=False, bbox=False, **kwargs): """ Returns a GeoJSON representation of the geomtry field in a `geojson` @@ -244,6 +253,16 @@ """ return self._geom_attribute('point_on_surface', **kwargs) + def reverse(self, **kwargs): + """ + Reverses the coordinate order of the geometry, and attaches as a + `reverse` attribute on each element of this GeoQuerySet. + """ + s = {'select_field' : GeomField(),} + if connections[self.db].ops.oracle: + s['geo_field_type'] = LineStringField + return self._spatial_attribute('reverse', s, **kwargs) + def scale(self, x, y, z=0.0, **kwargs): """ Scales the geometry to a new size by multiplying the ordinates @@ -489,7 +508,8 @@ # Performing setup for the spatial column, unless told not to. if settings.get('setup', True): - default_args, geo_field = self._spatial_setup(att, desc=settings['desc'], field_name=field_name) + default_args, geo_field = self._spatial_setup(att, desc=settings['desc'], field_name=field_name, + geo_field_type=settings.get('geo_field_type', None)) for k, v in default_args.iteritems(): settings['procedure_args'].setdefault(k, v) else: geo_field = settings['geo_field'] Modified: django/trunk/django/contrib/gis/tests/geoapp/models.py =================================================================== --- django/trunk/django/contrib/gis/tests/geoapp/models.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/tests/geoapp/models.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -27,6 +27,12 @@ objects = models.GeoManager() def __unicode__(self): return self.name +class Track(models.Model): + name = models.CharField(max_length=30) + line = models.LineStringField() + objects = models.GeoManager() + def __unicode__(self): return self.name + if not spatialite: class Feature(models.Model): name = models.CharField(max_length=20) Modified: django/trunk/django/contrib/gis/tests/geoapp/tests.py =================================================================== --- django/trunk/django/contrib/gis/tests/geoapp/tests.py 2010-01-29 00:05:33 UTC (rev 12348) +++ django/trunk/django/contrib/gis/tests/geoapp/tests.py 2010-01-29 02:20:58 UTC (rev 12349) @@ -8,7 +8,7 @@ mysql, oracle, postgis, spatialite from django.test import TestCase -from models import Country, City, PennsylvaniaCity, State +from models import Country, City, PennsylvaniaCity, State, Track if not spatialite: from models import Feature, MinusOneSRID @@ -687,6 +687,33 @@ ref = fromstr('MULTIPOLYGON(((12.4 43.87,12.45 43.87,12.45 44.1,12.5 44.1,12.5 43.87,12.45 43.87,12.4 43.87)))') self.failUnless(ref.equals_exact(Country.objects.snap_to_grid(0.05, 0.23, 0.5, 0.17).get(name='San Marino').snap_to_grid, tol)) + @no_mysql + @no_spatialite + def test28_reverse(self): + "Testing GeoQuerySet.reverse()." + coords = [ (-95.363151, 29.763374), (-95.448601, 29.713803) ] + Track.objects.create(name='Foo', line=LineString(coords)) + t = Track.objects.reverse().get(name='Foo') + coords.reverse() + self.assertEqual(tuple(coords), t.reverse.coords) + if oracle: + self.assertRaises(TypeError, State.objects.reverse) + + @no_mysql + @no_oracle + @no_spatialite + def test29_force_rhr(self): + "Testing GeoQuerySet.force_rhr()." + rings = ( ( (0, 0), (5, 0), (0, 5), (0, 0) ), + ( (1, 1), (1, 3), (3, 1), (1, 1) ), + ) + rhr_rings = ( ( (0, 0), (0, 5), (5, 0), (0, 0) ), + ( (1, 1), (3, 1), (1, 3), (1, 1) ), + ) + State.objects.create(name='Foo', poly=Polygon(*rings)) + s = State.objects.force_rhr().get(name='Foo') + self.assertEqual(rhr_rings, s.force_rhr.coords) + from test_feeds import GeoFeedTest from test_regress import GeoRegressionTests from test_sitemaps import GeoSitemapTest -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.