Commit 1b6de8fd authored by Claude Paroz's avatar Claude Paroz
Browse files

[1.10.x] Fixed #26775 -- Supported dim=3 geography fields

Thanks François-Xavier Thomas for the report.
Backport of 8ba44ecd from master.
parent d3b9c499
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -268,18 +268,19 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
        """
        if f.geom_type == '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.
        # 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)' % (geom_type, f.srid)
        else:
            return 'geometry(%s,%d)' % (geom_type, f.srid)

    def get_distance(self, f, dist_val, lookup_type, handle_spheroid=True):
+1 −0
Original line number Diff line number Diff line
@@ -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):
+7 −3
Original line number Diff line number Diff line
@@ -91,7 +91,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
@@ -129,9 +131,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):
        """