Fixed #26775 -- Supported dim=3 geography fields
Thanks François-Xavier Thomas for the report.
This commit is contained in:
parent
b45852c263
commit
8ba44ecda0
|
@ -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:
|
|
||||||
if f.srid != 4326:
|
|
||||||
raise NotImplementedError('PostGIS only supports geography columns with an SRID of 4326.')
|
|
||||||
|
|
||||||
return 'geography(%s,%d)' % (f.geom_type, f.srid)
|
|
||||||
else:
|
|
||||||
# Type-based geometries.
|
# Type-based geometries.
|
||||||
# TODO: Support 'M' extension.
|
# TODO: Support 'M' extension.
|
||||||
if f.dim == 3:
|
if f.dim == 3:
|
||||||
geom_type = f.geom_type + 'Z'
|
geom_type = f.geom_type + 'Z'
|
||||||
else:
|
else:
|
||||||
geom_type = f.geom_type
|
geom_type = f.geom_type
|
||||||
|
if f.geography:
|
||||||
|
if f.srid != 4326:
|
||||||
|
raise NotImplementedError('PostGIS only supports geography columns with an SRID of 4326.')
|
||||||
|
|
||||||
|
return 'geography(%s,%d)' % (geom_type, f.srid)
|
||||||
|
else:
|
||||||
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):
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
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):
|
||||||
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):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue