From e6ad9a9315b92eaa856a3a5280e70028c7577ab3 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 7 Sep 2022 09:57:07 -0400 Subject: [PATCH 1/3] Added `Rasterband::set_no_data` accepting `Option`. --- src/raster/rasterband.rs | 23 ++++++++++++++++++++--- src/raster/tests.rs | 2 ++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/raster/rasterband.rs b/src/raster/rasterband.rs index 80c02a37..c15d18c8 100644 --- a/src/raster/rasterband.rs +++ b/src/raster/rasterband.rs @@ -431,12 +431,29 @@ impl<'a> RasterBand<'a> { } /// Set the no data value of this band. + /// + /// See [`set_no_data`](Self::set_no_data) for similar function + /// where _no-data_ can also be deleted. pub fn set_no_data_value(&mut self, no_data: f64) -> Result<()> { - let rv = unsafe { gdal_sys::GDALSetRasterNoDataValue(self.c_rasterband, no_data) }; + self.set_no_data(Some(no_data)) + } + + /// Set the no data state of this band. + /// If `no_data` is `None`, any existing no-data value is deleted. + pub fn set_no_data(&mut self, no_data: Option) -> Result<()> { + let rv = if let Some(no_data) = no_data { + unsafe { gdal_sys::GDALSetRasterNoDataValue(self.c_rasterband, no_data) } + } + else { + unsafe { gdal_sys::GDALDeleteRasterNoDataValue(self.c_rasterband) } + }; + if rv != CPLErr::CE_None { - return Err(_last_cpl_err(rv)); + Err(_last_cpl_err(rv)) + } + else { + Ok(()) } - Ok(()) } /// Returns the color interpretation of this band. diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 9f99c17f..45cda32c 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -559,6 +559,8 @@ fn test_set_no_data_value() { assert_eq!(rasterband.no_data_value(), None); assert!(rasterband.set_no_data_value(1.23).is_ok()); assert_eq!(rasterband.no_data_value(), Some(1.23)); + assert!(rasterband.set_no_data(None).is_ok()); + assert_eq!(rasterband.no_data_value(), None); } #[test] From b53d0f9d5f737938acbee53aa7ca8ba988cfa67c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 7 Sep 2022 10:00:17 -0400 Subject: [PATCH 2/3] Updated changelog --- CHANGES.md | 5 +++++ src/raster/rasterband.rs | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6b45c58a..1cd5f8f7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,11 @@ - +- Added ability to delete no-data when `None` is passed to `RasterBand::set_no_data(&mut self, no_data: Option))` + + - + + ## 0.13 - Add prebuild bindings for GDAL 3.5 diff --git a/src/raster/rasterband.rs b/src/raster/rasterband.rs index c15d18c8..323b8b7e 100644 --- a/src/raster/rasterband.rs +++ b/src/raster/rasterband.rs @@ -443,15 +443,13 @@ impl<'a> RasterBand<'a> { pub fn set_no_data(&mut self, no_data: Option) -> Result<()> { let rv = if let Some(no_data) = no_data { unsafe { gdal_sys::GDALSetRasterNoDataValue(self.c_rasterband, no_data) } - } - else { + } else { unsafe { gdal_sys::GDALDeleteRasterNoDataValue(self.c_rasterband) } }; if rv != CPLErr::CE_None { Err(_last_cpl_err(rv)) - } - else { + } else { Ok(()) } } From 2a5abc31eeca5d5d85fc23780b64b1259385f5b0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 8 Sep 2022 14:36:01 -0400 Subject: [PATCH 3/3] Switched to single `set_no_data_value` method, introducing a breaking change. --- CHANGES.md | 3 ++- src/raster/rasterband.rs | 9 +-------- src/raster/tests.rs | 4 ++-- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1cd5f8f7..8dacd32c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,7 +10,8 @@ - -- Added ability to delete no-data when `None` is passed to `RasterBand::set_no_data(&mut self, no_data: Option))` +- **Breaking** `RasterBand::set_no_data_value` takes `Option` instead of `f64` so that no _no-data_ can be set. + Also makes it symmetric with `RasterBand::no_data_value` which returns `Option`. - diff --git a/src/raster/rasterband.rs b/src/raster/rasterband.rs index 323b8b7e..6cd7ce46 100644 --- a/src/raster/rasterband.rs +++ b/src/raster/rasterband.rs @@ -432,15 +432,8 @@ impl<'a> RasterBand<'a> { /// Set the no data value of this band. /// - /// See [`set_no_data`](Self::set_no_data) for similar function - /// where _no-data_ can also be deleted. - pub fn set_no_data_value(&mut self, no_data: f64) -> Result<()> { - self.set_no_data(Some(no_data)) - } - - /// Set the no data state of this band. /// If `no_data` is `None`, any existing no-data value is deleted. - pub fn set_no_data(&mut self, no_data: Option) -> Result<()> { + pub fn set_no_data_value(&mut self, no_data: Option) -> Result<()> { let rv = if let Some(no_data) = no_data { unsafe { gdal_sys::GDALSetRasterNoDataValue(self.c_rasterband, no_data) } } else { diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 45cda32c..ba67a2a4 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -557,9 +557,9 @@ fn test_set_no_data_value() { let dataset = driver.create("", 20, 10, 1).unwrap(); let mut rasterband = dataset.rasterband(1).unwrap(); assert_eq!(rasterband.no_data_value(), None); - assert!(rasterband.set_no_data_value(1.23).is_ok()); + assert!(rasterband.set_no_data_value(Some(1.23)).is_ok()); assert_eq!(rasterband.no_data_value(), Some(1.23)); - assert!(rasterband.set_no_data(None).is_ok()); + assert!(rasterband.set_no_data_value(None).is_ok()); assert_eq!(rasterband.no_data_value(), None); }