Kaydet (Commit) 8ba44ecd authored tarafından Claude Paroz's avatar Claude Paroz

Fixed #26775 -- Supported dim=3 geography fields

Thanks François-Xavier Thomas for the report.
üst b45852c2
...@@ -268,18 +268,19 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations): ...@@ -268,18 +268,19 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
""" """
if f.geom_type == 'RASTER': if f.geom_type == 'RASTER':
return 'raster' return 'raster'
elif f.geography:
# Type-based geometries.
# TODO: Support 'M' extension.
if f.dim == 3:
geom_type = f.geom_type + 'Z'
else:
geom_type = f.geom_type
if f.geography:
if f.srid != 4326: if f.srid != 4326:
raise NotImplementedError('PostGIS only supports geography columns with an SRID of 4326.') raise NotImplementedError('PostGIS only supports geography columns with an SRID of 4326.')
return 'geography(%s,%d)' % (f.geom_type, f.srid) return 'geography(%s,%d)' % (geom_type, f.srid)
else: else:
# Type-based geometries.
# TODO: Support 'M' extension.
if f.dim == 3:
geom_type = f.geom_type + 'Z'
else:
geom_type = f.geom_type
return 'geometry(%s,%d)' % (geom_type, f.srid) return 'geometry(%s,%d)' % (geom_type, f.srid)
def get_distance(self, f, dist_val, lookup_type, handle_spheroid=True): def get_distance(self, f, dist_val, lookup_type, handle_spheroid=True):
......
...@@ -19,6 +19,7 @@ class NamedModel(models.Model): ...@@ -19,6 +19,7 @@ class NamedModel(models.Model):
class City3D(NamedModel): class City3D(NamedModel):
point = models.PointField(dim=3) point = models.PointField(dim=3)
pointg = models.PointField(dim=3, geography=True)
class Interstate2D(NamedModel): class Interstate2D(NamedModel):
......
...@@ -85,7 +85,9 @@ class Geo3DLoadingHelper(object): ...@@ -85,7 +85,9 @@ class Geo3DLoadingHelper(object):
def _load_city_data(self): def _load_city_data(self):
for name, pnt_data in city_data: for name, pnt_data in city_data:
City3D.objects.create(name=name, point=Point(*pnt_data, srid=4326)) City3D.objects.create(
name=name, point=Point(*pnt_data, srid=4326), pointg=Point(*pnt_data, srid=4326),
)
def _load_polygon_data(self): def _load_polygon_data(self):
bbox_wkt, bbox_z = bbox_data bbox_wkt, bbox_z = bbox_data
...@@ -122,9 +124,11 @@ class Geo3DTest(Geo3DLoadingHelper, TestCase): ...@@ -122,9 +124,11 @@ class Geo3DTest(Geo3DLoadingHelper, TestCase):
self._load_city_data() self._load_city_data()
for name, pnt_data in city_data: for name, pnt_data in city_data:
city = City3D.objects.get(name=name) city = City3D.objects.get(name=name)
z = pnt_data[2] # Testing both geometry and geography fields
self.assertTrue(city.point.hasz) self.assertTrue(city.point.hasz)
self.assertEqual(z, city.point.z) self.assertTrue(city.pointg.hasz)
self.assertEqual(city.point.z, pnt_data[2])
self.assertEqual(city.pointg.z, pnt_data[2])
def test_3d_polygons(self): def test_3d_polygons(self):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment