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.

Reply via email to