summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2016-06-18 17:10:16 +0200
committerClaude Paroz <claude@2xlibre.net>2016-06-18 21:48:32 +0200
commit8ba44ecda024050c219e7cbc1f16c2d56fa258ac (patch)
tree62dbb5464fe2ac9404ba24484ad01e94f689530b
parentb45852c2631d4f291fb22ef3348065f2a3c2e5e3 (diff)
Fixed #26775 -- Supported dim=3 geography fields
Thanks François-Xavier Thomas for the report.
-rw-r--r--django/contrib/gis/db/backends/postgis/operations.py17
-rw-r--r--tests/gis_tests/geo3d/models.py1
-rw-r--r--tests/gis_tests/geo3d/tests.py10
3 files changed, 17 insertions, 11 deletions
diff --git a/django/contrib/gis/db/backends/postgis/operations.py b/django/contrib/gis/db/backends/postgis/operations.py
index 14ed2d98f3..763f376544 100644
--- a/django/contrib/gis/db/backends/postgis/operations.py
+++ b/django/contrib/gis/db/backends/postgis/operations.py
@@ -268,18 +268,19 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
"""
if f.geom_type == '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:
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:
- # 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)
def get_distance(self, f, dist_val, lookup_type, handle_spheroid=True):
diff --git a/tests/gis_tests/geo3d/models.py b/tests/gis_tests/geo3d/models.py
index e816cb3dad..bcb9e2dc57 100644
--- a/tests/gis_tests/geo3d/models.py
+++ b/tests/gis_tests/geo3d/models.py
@@ -19,6 +19,7 @@ class NamedModel(models.Model):
class City3D(NamedModel):
point = models.PointField(dim=3)
+ pointg = models.PointField(dim=3, geography=True)
class Interstate2D(NamedModel):
diff --git a/tests/gis_tests/geo3d/tests.py b/tests/gis_tests/geo3d/tests.py
index 34ed371d48..f180387aac 100644
--- a/tests/gis_tests/geo3d/tests.py
+++ b/tests/gis_tests/geo3d/tests.py
@@ -85,7 +85,9 @@ class Geo3DLoadingHelper(object):
def _load_city_data(self):
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):
bbox_wkt, bbox_z = bbox_data
@@ -122,9 +124,11 @@ class Geo3DTest(Geo3DLoadingHelper, TestCase):
self._load_city_data()
for name, pnt_data in city_data:
city = City3D.objects.get(name=name)
- z = pnt_data[2]
+ # Testing both geometry and geography fields
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):
"""