mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #26415 -- Allowed deleting nodata value on GDALBands.
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							a7c813ba04
						
					
				
				
					commit
					f1db8c36e9
				
			| @@ -62,6 +62,10 @@ get_band_ds = voidptr_output(std_call('GDALGetBandDataset'), [c_void_p]) | ||||
| get_band_datatype = int_output(std_call('GDALGetRasterDataType'), [c_void_p]) | ||||
| get_band_nodata_value = double_output(std_call('GDALGetRasterNoDataValue'), [c_void_p, POINTER(c_int)]) | ||||
| set_band_nodata_value = void_output(std_call('GDALSetRasterNoDataValue'), [c_void_p, c_double]) | ||||
| if GDAL_VERSION >= (2, 1): | ||||
|     delete_band_nodata_value = void_output(std_call('GDALDeleteRasterNoDataValue'), [c_void_p]) | ||||
| else: | ||||
|     delete_band_nodata_value = None | ||||
| get_band_statistics = void_output( | ||||
|     std_call('GDALGetRasterStatistics'), | ||||
|     [ | ||||
|   | ||||
| @@ -151,9 +151,14 @@ class GDALBand(GDALBase): | ||||
|         """ | ||||
|         Sets the nodata value for this band. | ||||
|         """ | ||||
|         if not isinstance(value, (int, float)): | ||||
|             raise ValueError('Nodata value must be numeric.') | ||||
|         capi.set_band_nodata_value(self._ptr, value) | ||||
|         if value is None: | ||||
|             if not capi.delete_band_nodata_value: | ||||
|                 raise ValueError('GDAL >= 2.1 required to delete nodata values.') | ||||
|             capi.delete_band_nodata_value(self._ptr) | ||||
|         elif not isinstance(value, (int, float)): | ||||
|             raise ValueError('Nodata value must be numeric or None.') | ||||
|         else: | ||||
|             capi.set_band_nodata_value(self._ptr, value) | ||||
|         self._flush() | ||||
|  | ||||
|     def datatype(self, as_string=False): | ||||
|   | ||||
| @@ -1456,10 +1456,18 @@ blue. | ||||
|         to mark pixels that are not valid data. Such pixels should generally not | ||||
|         be displayed, nor contribute to analysis operations. | ||||
|  | ||||
|         To delete an existing "no data" value, set this property to ``None`` | ||||
|         (requires GDAL ≥ 2.1). | ||||
|  | ||||
|         .. versionchanged:: 1.9 | ||||
|  | ||||
|             This property can now be set as well. | ||||
|  | ||||
|         .. versionchanged:: 1.10 | ||||
|  | ||||
|             The "no data" value can now be deleted by setting the | ||||
|             ``nodata_value`` attribute to ``None``. | ||||
|  | ||||
|     .. method:: datatype(as_string=False) | ||||
|  | ||||
|         The data type contained in the band, as an integer constant between 0 | ||||
|   | ||||
| @@ -48,6 +48,7 @@ import unittest | ||||
| from django.contrib.gis.gdal import HAS_GDAL | ||||
| from django.contrib.gis.gdal.error import GDALException | ||||
| from django.contrib.gis.shortcuts import numpy | ||||
| from django.test import SimpleTestCase | ||||
| from django.utils import six | ||||
| from django.utils._os import upath | ||||
|  | ||||
| @@ -302,7 +303,7 @@ class GDALRasterTests(unittest.TestCase): | ||||
|  | ||||
|  | ||||
| @unittest.skipUnless(HAS_GDAL, "GDAL is required") | ||||
| class GDALBandTests(unittest.TestCase): | ||||
| class GDALBandTests(SimpleTestCase): | ||||
|     def setUp(self): | ||||
|         self.rs_path = os.path.join(os.path.dirname(upath(__file__)), | ||||
|                                '../data/rasters/raster.tif') | ||||
| @@ -467,3 +468,18 @@ class GDALBandTests(unittest.TestCase): | ||||
|             'bands': [{'data': [0], 'nodata_value': 0}], | ||||
|         }) | ||||
|         self.assertEqual(rsmem.bands[0].statistics(), (None, None, None, None)) | ||||
|  | ||||
|     def test_band_delete_nodata(self): | ||||
|         rsmem = GDALRaster({ | ||||
|             'srid': 4326, | ||||
|             'width': 1, | ||||
|             'height': 1, | ||||
|             'bands': [{'data': [0], 'nodata_value': 1}], | ||||
|         }) | ||||
|         if GDAL_VERSION < (2, 1): | ||||
|             msg = 'GDAL >= 2.1 required to delete nodata values.' | ||||
|             with self.assertRaisesMessage(ValueError, msg): | ||||
|                 rsmem.bands[0].nodata_value = None | ||||
|         else: | ||||
|             rsmem.bands[0].nodata_value = None | ||||
|             self.assertIsNone(rsmem.bands[0].nodata_value) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user