mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.10.x] Fixed #26775 -- Supported dim=3 geography fields
Thanks François-Xavier Thomas for the report.
Backport of 8ba44ecda0 from master.
			
			
This commit is contained in:
		| @@ -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): | ||||
|   | ||||
| @@ -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): | ||||
|   | ||||
| @@ -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): | ||||
|         """ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user