Author: jbronn
Date: 2010-03-29 11:48:38 -0500 (Mon, 29 Mar 2010)
New Revision: 12877

Modified:
   django/branches/releases/1.1.X/django/contrib/gis/gdal/geometries.py
   django/branches/releases/1.1.X/django/contrib/gis/gdal/geomtype.py
   django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_ds.py
   django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_geom.py
   
django/branches/releases/1.1.X/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
Log:
[1.1.X] `OGRGeomType` now recognizes 2.5D types, and removes need for 
unnecessary workaround in `Layer.geom_type`; corrected geometry type in test 
VRT file. Refs #11433.

Backport of r11739 from trunk.


Modified: django/branches/releases/1.1.X/django/contrib/gis/gdal/geometries.py
===================================================================
--- django/branches/releases/1.1.X/django/contrib/gis/gdal/geometries.py        
2010-03-29 16:41:29 UTC (rev 12876)
+++ django/branches/releases/1.1.X/django/contrib/gis/gdal/geometries.py        
2010-03-29 16:48:38 UTC (rev 12877)
@@ -214,13 +214,7 @@
     @property
     def geom_type(self):
         "Returns the Type for this Geometry."
-        try:
-            return OGRGeomType(capi.get_geom_type(self.ptr))
-        except OGRException:
-            # VRT datasources return an invalid geometry type
-            # number, but a valid name -- we'll try that instead.
-            # See: http://trac.osgeo.org/gdal/ticket/2491
-            return OGRGeomType(capi.get_geom_name(self.ptr))
+        return OGRGeomType(capi.get_geom_type(self.ptr))
 
     @property
     def geom_name(self):
@@ -684,4 +678,11 @@
                6 : MultiPolygon,
                7 : GeometryCollection,
                101: LinearRing,
+               1 + OGRGeomType.wkb25bit : Point,
+               2 + OGRGeomType.wkb25bit : LineString,
+               3 + OGRGeomType.wkb25bit : Polygon,
+               4 + OGRGeomType.wkb25bit : MultiPoint,
+               5 + OGRGeomType.wkb25bit : MultiLineString,
+               6 + OGRGeomType.wkb25bit : MultiPolygon,
+               7 + OGRGeomType.wkb25bit : GeometryCollection,
                }

Modified: django/branches/releases/1.1.X/django/contrib/gis/gdal/geomtype.py
===================================================================
--- django/branches/releases/1.1.X/django/contrib/gis/gdal/geomtype.py  
2010-03-29 16:41:29 UTC (rev 12876)
+++ django/branches/releases/1.1.X/django/contrib/gis/gdal/geomtype.py  
2010-03-29 16:48:38 UTC (rev 12877)
@@ -4,6 +4,8 @@
 class OGRGeomType(object):
     "Encapulates OGR Geometry Types."
 
+    wkb25bit = -2147483648
+
     # Dictionary of acceptable OGRwkbGeometryType s and their string names.
     _types = {0 : 'Unknown',
               1 : 'Point',
@@ -15,6 +17,13 @@
               7 : 'GeometryCollection',
               100 : 'None',
               101 : 'LinearRing',
+              1 + wkb25bit: 'Point25D',
+              2 + wkb25bit: 'LineString25D',
+              3 + wkb25bit: 'Polygon25D',
+              4 + wkb25bit: 'MultiPoint25D',
+              5 + wkb25bit : 'MultiLineString25D',
+              6 + wkb25bit : 'MultiPolygon25D',
+              7 + wkb25bit : 'GeometryCollection25D',
               }
     # Reverse type dictionary, keyed by lower-case of the name.
     _str_types = dict([(v.lower(), k) for k, v in _types.items()])
@@ -68,7 +77,7 @@
     @property
     def django(self):
         "Returns the Django GeometryField for this OGR Type."
-        s = self.name
+        s = self.name.replace('25D', '')
         if s in ('LinearRing', 'None'):
             return None
         elif s == 'Unknown':

Modified: 
django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_ds.py
===================================================================
--- django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_ds.py     
2010-03-29 16:41:29 UTC (rev 12876)
+++ django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_ds.py     
2010-03-29 16:48:38 UTC (rev 12877)
@@ -25,7 +25,7 @@
                   
srs_wkt='GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]',
                   field_values={'dbl' : [float(i) for i in range(1, 6)], 'int' 
: range(1, 6), 'str' : [str(i) for i in range(1, 6)]},
                   fids=range(5)),
-           TestDS('test_vrt', ext='vrt', nfeat=3, nfld=3, geom='POINT', 
gtype=1, driver='VRT',
+           TestDS('test_vrt', ext='vrt', nfeat=3, nfld=3, geom='POINT', 
gtype='Point25D', driver='VRT',
                   fields={'POINT_X' : OFTString, 'POINT_Y' : OFTString, 'NUM' 
: OFTString}, # VRT uses CSV, which all types are OFTString.
                   extent=(1.0, 2.0, 100.0, 523.5), # Min/Max from CSV
                   field_values={'POINT_X' : ['1.0', '5.0', '100.0'], 'POINT_Y' 
: ['2.0', '23.0', '523.5'], 'NUM' : ['5', '17', '23']},

Modified: 
django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_geom.py
===================================================================
--- django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_geom.py   
2010-03-29 16:41:29 UTC (rev 12876)
+++ django/branches/releases/1.1.X/django/contrib/gis/gdal/tests/test_geom.py   
2010-03-29 16:48:38 UTC (rev 12877)
@@ -46,6 +46,13 @@
         self.assertEqual(0, gt.num)
         self.assertEqual('Unknown', gt.name)
 
+    def test00b_geomtype_25d(self):
+        "Testing OGRGeomType object with 25D types."
+        wkb25bit = OGRGeomType.wkb25bit
+        self.failUnless(OGRGeomType(wkb25bit + 1) == 'Point25D')
+        self.failUnless(OGRGeomType('MultiLineString25D') == (5 + wkb25bit))
+        self.assertEqual('GeometryCollectionField', 
OGRGeomType('GeometryCollection25D').django)
+
     def test01a_wkt(self):
         "Testing WKT output."
         for g in wkt_out:
@@ -418,6 +425,17 @@
         xmax, ymax = max(x), max(y)
         self.assertEqual((xmin, ymin, xmax, ymax), poly.extent)
 
+    def test16_25D(self):
+        "Testing 2.5D geometries."
+        pnt_25d = OGRGeometry('POINT(1 2 3)')
+        self.assertEqual('Point25D', pnt_25d.geom_type.name)
+        self.assertEqual(3.0, pnt_25d.z)
+        self.assertEqual(3, pnt_25d.coord_dim)
+        ls_25d = OGRGeometry('LINESTRING(1 1 1,2 2 2,3 3 3)')
+        self.assertEqual('LineString25D', ls_25d.geom_type.name)
+        self.assertEqual([1.0, 2.0, 3.0], ls_25d.z)
+        self.assertEqual(3, ls_25d.coord_dim)
+
 def suite():
     s = unittest.TestSuite()
     s.addTest(unittest.makeSuite(OGRGeomTest))

Modified: 
django/branches/releases/1.1.X/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
===================================================================
--- 
django/branches/releases/1.1.X/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
  2010-03-29 16:41:29 UTC (rev 12876)
+++ 
django/branches/releases/1.1.X/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
  2010-03-29 16:48:38 UTC (rev 12877)
@@ -1,7 +1,7 @@
 <OGRVRTDataSource>
 <OGRVRTLayer name="test_vrt">
 <SrcDataSource relativeToVRT="1">test_vrt.csv</SrcDataSource>
-<GeometryType>wkbPoint</GeometryType>
+<GeometryType>wkbPoint25D</GeometryType>
 <GeometryField encoding="PointFromColumns" x="POINT_X" y="POINT_Y" z="NUM"/>
 </OGRVRTLayer>
 </OGRVRTDataSource>
\ No newline at end of file

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to