# Changes ## Unreleased ## 0.17.1 ### Added - Added `Buffer::width` and `Buffer::height` ([#550](https://github.com/georust/gdal/pull/550)) ### Fixed - Fixed incorrect bounds check in `Buffer` indexing ([#550](https://github.com/georust/gdal/pull/550)) ## 0.17 - Added pre-built bindings for GDAL 3.9 - - Added `Rasterband::fill` - - Added `Dataset::rasterbands`. - - Added `no_data_value_u64`, `set_no_data_value_u64`, `no_data_value_i64` and `set_no_data_value_i64` to `RasterBand`. - - **Breaking** Removed `RasterCreationOption`and replaced usages of `[RasterCreationOption]` with `RasterCreationOptions`, a type alias for `CplStringList`. - - Add `DriverIterator` format to iterate through drivers, as well as `DriverManager::all()` method that provides the iterator. - - **Breaking**: `Feature::set_field_xxx` now take `&mut self` - - **Breaking**: Drop support for GDAL 2.x - - Added `DriverManager::get_output_driver_for_dataset_name` and `DriverManager::get_output_drivers_for_dataset_name` for the ability to auto detect compatible `Driver`(s) for writing data. - - Added `Feature::unset_field` - - Added ability to convert between `Buffer` and `ndarray::Array2`. - Implemented `IntoIterator`, `Index` and `IndexMut` for `Buffer`. - **Breaking**: `Buffer::size` is now private and accessed via `Buffer::shape(). - **Breaking**: `Buffer::data` is now private and accessed via `Buffer::data(). - **Breaking**: Removed `Rasterband::read_as_array`, changed signature of `Rasterband::read_block` to return a `Buffer`. - **Breaking**: `Rasterband::write` and `Rasterband::write_block` now require a `&mut Buffer` to handle possible case of drivers temporarily mutating input buffer. - - Implemented `Feature::set_field_null` - - - **Breaking**: Changed a number of APIs using `isize` when `usize` is semantically more appropriate: `Driver::create.*`, `Rasterband::overview`, `Dataset::{layer|into_layer|layer_count}`. - - Created `enum AxisMappingStrategy` for `OSRAxisMappingStrategy` ordinals. - **Breaking**: `SpatialRef::{set_}axis_mapping_strategy` use `AxisMappingStrategy` instead of `gdal_sys::OSRAxisMappingStrategy::Type`. - - Defers the `gdal_i.lib` missing message until after the `pkg-config` check and outputs `pkg-config` metadata in case of a static build. - - Added `RasterBand::write_block`. - - `RasterBand::read_block` now checks that the requested type matches the band type. - - Added `Geometry::difference`. - - Added support for digital elevation model raster processing: `aspect`, `color_relief`, `hillshade`, `roughness`, `slope`, `terrain_ruggedness_index`, `topographic_position_index`. - - Added pre-built bindings for GDAL 3.8 - - Added `{Display|FromStr} for ResampleAlg` and `ResampleAlg::iter`. - - **Breaking**: Replaced `TryFrom<&[(&str, &str); N]> for CslStringList` with `impl FromIterator for CslStringList`, `impl FromIterator for CslStringList` and `impl<'a> FromIterator<&'a str> for CslStringList` - Added `Extend for CslStringList`, and `CslStringList::merge` - - **Breaking**: `SpatialRef::set_axis_mapping_strategy` now takes `&mut self` - - **Breaking**: `Dataset::raster_count` now returns an `usize` and `Dataset::rasterband` now takes `usize` instead of `isize` - - **Breaking**: `CslStringListIterator` returns a `CslStringListEntry` instead of `(String, String)` in order to differentiate between `key=value` entries vs `flag` entries. - **Breaking**: `CslStringList::fetch_name_value` returns `Option` instead of `Result>`, better reflecting the semantics of GDAL C API. - Added `CslStringList::get_field`, `CslStringList::find_string`, `CslStringList::partial_find_string`, `CslStringList::find_string_case_sensitive`, `CslStringList::into_ptr`, `CslStringList::add_name_value`. - - **Breaking**: `ExtendedDataType` no longer implements `Clone`, `PartialEq` and `Eq` - - **Breaking**: Moved `LayerIterator`, `LayerOptions` and `Transaction` to `crate::vector` - - Accessors `MajorObject::gdal_object_ptr` and `Dataset::c_dataset()` are no longer marked as `unsafe` (only using these is unsafe in idiomatic Rust) - - Fixed build script error with development GDAL versions - - Added raster histogram methods (setter and getter) - Getter: - Setter: ## 0.16 - **Breaking**: `Dataset::close` now consumes `self` - - `Gcp` and `GcpRef` are now public - - Fixed build error with GDAL 3.1 - - Added `Geometry::flatten_to_2d` - ## 0.15 - **Breaking**: `RasterBand::actual_block_size` now takes two `usize` offsets instead of `(isize, isize)` - - Added `GDT_Int8` support - - Added `Dataset::close`, changed `Dataset::flush_cache` to be fallible - - Added `SpatialRef::semi_major`, `semi_minor`, `set_proj_param`, `get_proj_param`, `get_proj_param_or_default`, `set_attr_value`, `get_attr_value` and `geog_cs`. - - Added `Dataset::gcp_projection`, `Dataset::gcps`, `Dataset::set_gcps` APIs - - Added pre-built bindings for GDAL 3.7 - - Added `SpatialRef::to_projjson` - - Added `Geometry::length` - - Added `Geometry::union` - - Added `Geometry::from_gml` - - Added `CoordTransform::new_with_options` and `CoordTransformOptions` - - Set the link flag of gdal-sys to "libgdal". Emit the libgdal version via cargo:version_number. Remove wrong build-dependency on gdal-sys and remove docs_rs workaround. - - Added `Geometry::from_geojson` - - Added `CslStringList::add_string` - - **Possibly breaking**: Set MSRV to 1.58. - - Added a `TryFrom` array implementation for `CslStringList` - - Added `Rasterband::c_rasterband` to obtain the raw C pointer to `GDALRasterBandH` - - **Breaking**: `Feature::geometry` returns an `Option<&Geometry>` instead of `&Geometry`. Calls to `Feature::geometry` will no longer panic. - - **Breaking**: `RasterBand::band_type` returns the `GdalDataType` enum instead of `GDALDataType::Type` ordinal. Fixes [#333](https://github.com/georust/gdal/issues/333) - - The default features of the `chrono` dependency are now disabled - - Added prebuilt bindings for GDAL 3.6 (released 6 November 2022). - - **Breaking**: `Layer::spatial_ref` returns `Option` instead of `Result`, thereby better reflecting the semantics documented in the [C++ API](https://gdal.org/doxygen/classOGRLayer.html#a75c06b4993f8eb76b569f37365cd19ab) - - Exposed various functions on `Geometry`: `make_valid`, `geometry_name`, and `point_count`. - - Exposed `read_arrow_stream` on `Layer` to access OGR's columnar reading API. - - Exposed spatial predicates over `Geometry`: `intersects`, `contains`, `disjoint`, `touches`, `crosses`, `within`, and `overlaps`. - - Added `Geometry::envelope` and `Geometry::envelope_3d`. - - Added support for getting the `SpatialRef` of embedded ground control points (GCPs) via `Dataset::gcp_spatial_ref`. - ## 0.14 - Added new content to `README.md` and the root docs. - - Fixed a crash in `Group::dimensions` and `MDArray::dimensions` when no dimensions exist - - Added a more ergonomic means of accessing GDAL version properties - - Provided access to `gdal-sys` discriminant values in `ResampleAlg` enum. - - **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`. - - Added quality-of-life features to `CslStringList`: `len`, `is_empty`, `Debug` and `Iterator` implementations. - - Added ability to set color table for bands with palette color interpretation. Added ability to create a color ramp (interpolated) color table. - - Added a wrapper for the `DriverManager` - - Added `GdalDataType` to provide access to metadata and supporting routines around `GDALDataType` ordinals. - **Breaking**: `GDALDataType` is no longer `pub use` in `gdal::raster`, as `GdalType` and `GdalDataType` sufficiently cover use cases in safe code. Still accessible via `gdal_sys::GDALDataType`. - - Added `Metadata` iterator. - ## 0.13 - Add prebuilt bindings for GDAL 3.5 - - **Breaking**: Add `gdal::vector::OwnedLayer`, `gdal::vector::LayerAccess` and `gdal::vector::layer::OwnedFeatureIterator`. This requires importing `gdal::vector::LayerAccess` for using most vector layer methods. - https://github.com/georust/gdal/pull/238 - **Breaking**: `SpatialRef::from_c_obj` is now unsafe. - https://github.com/georust/gdal/pull/267 - **Breaking**: Rename `Driver::get` to `Driver::get_by_name`, add `Driver::get(usize)` and `Driver::count` - - Implemented wrapper for `OGR_L_SetFeature` - - Add `programs::raster::build_vrt` - Add `GeoTransformEx` extension trait with `apply` and `invert` - - Add `gdal::vector::geometry_type_to_name` and `gdal::vector::field_type_to_name` - - - Add `gdal::raster::rasterband::RasterBand::unit` as wrapper for `GDALGetRasterUnitType` - - Add `gdal::vsi::read_dir` function. - - Add a `ColorTable` struct and `RasterBand::color_table` method - - Add `GeometryRef<'a>` to reference owned nested geometry in a lifetime-safe way. - - Add support for MDArray API - - Add `gdal::srs::CoordTransform::transform_bounds` as wrapper for `OCTTransformBounds` for GDAL 3.4 - - Add `Feature::set_field_*_list` functions for list field types - - Deprecate `Transaction::dataset` and `Transaction::dataset_mut`. Add `Deref` and `DerefMut` implementations instead. - - Add methods to access raster masks and get raster mask flags. (`open_mask_band`, `create_mask_band`, and `mask_flags`). - - Remove `PartialEq` from `GdalError` - - Prevent SIGGEGV when reading a string array on an MD Array that is not of type string. - - Added `Geometry::to_geo` method for GDAL to geo-types Geometry conversions. - - Add `Rasterband::set_scale` and `Rasterband::set_offset` methods - - Added program wrapper for `GDALMultiDimTranslate` - - Test that `GdalError` is `Send` - - Allow reading `Dimension`s from `Group`s in multimensional `Dataset`s. - - Added wrapper methods for `GDALGetRasterStatistics`, `GDALComputeRasterMinMax` and `GDALMDArrayGetStatistics`. - - Added a workaround in multi-dim tests to not access files multiple times - ## 0.12 - Bump Rust edition to 2021 - Add prebuild bindings for GDAL 3.4 - ## 0.11 - Remove the `datetime` feature - - Add `cpl::CslStringList` - - Make `gdal::rasters::OptimizeMode` public - - Added `rename` and `delete` to `gdal::Driver` - - **Breaking**: File paths must now implement `AsRef` - ## 0.8 - 0.10 - Update types to fix build on ppc64le. - - Upgrade `semver` to 1.0 and trim gdal version output in `build.rs`. - - **Breaking**: Make `set_attribute_filter` and `clear_attribute_filter` take `&mut self` - - **Breaking**: Drop pre-build bindings for GDAL versions < 2.4. The bindgen feature can be used to generate bindings for older versions. - Fix memory leaks reported by Valgrind. This required re-generation of the pre-build bindings. - - **Breaking**: Implement `TryFrom` instead of `From` to convert from gdal geometries to `geo-types`. This avoids a possible panic on unsupported geometries and returns an error instead. - Add `Feature::c_feature` that returns the OGR feature handle. - - Add wrapper for `OGR_G_Buffer`. - Add support for raster dataset creation options. A new struct (`RasterCreationOption`) and function (`driver.create_with_band_type_with_options()`) are now available for this. - ```rust let driver = Driver::get_by_name("GTiff").unwrap(); let options = &[ RasterCreationOption { key: "COMPRESS", value: "LZW", }, RasterCreationOption { key: "TILED", value: "YES", }, ]; let mut dataset = driver .create_with_band_type_with_options::("testing.tif", 2048, 2048, 1, options) .unwrap(); ``` - **Breaking**: Add support to select a resampling algorithm when reading a raster - Now, it is necessary to provide a `Option` when reading a raster. If `None`, it uses `ResampleAlg::NearestNeighbour` which was the default behavior. - **Breaking**: Make `Layer::features` iterator reset to beginning, and borrow mutably. - closes - **Breaking**: [Enforce borrow semantics](https://github.com/georust/gdal/pull/161) on methods of `Dataset`, `RasterBand`, and `Layer`. 1. Methods that do not modify the underlying structure take `&self`. 1. Methods that modify the underlying structure take `&mut self`. ```rust let ds = Dataset::open(...); // ds need not be mutable to open layer let mut band = ds.rasterband(1)?; // band needs to be mutable to set no-data value band.set_no_data_value(0.0)?; ``` - **Breaking**: Upgrade to `ndarray 0.15` - - Implement wrapper for `OGR_L_TestCapability` - - **Breaking**: Use `DatasetOptions` to pass as `Dataset::open_ex` parameters and add support for extended open flags. ```rust use gdal::{ Dataset, DatasetOptions } let dataset = Dataset::open_ex( "roads.geojson", DatasetOptions { open_flags: GdalOpenFlags::GDAL_OF_UPDATE|GdalOpenFlags::GDAL_OF_VECTOR, ..DatasetOptions::default() } ) .unwrap(); ``` `GDALAccess` values are supported using [`From`] implementation ```rust Dataset::open_ex( "roads.geojson", DatasetOptions { open_flags: GDALAccess::GA_Update.into(), ..DatasetOptions::default() }, ) .unwrap(); ``` - Add more functions to SpatialRef implementation - - **Breaking**: Change `Feature::field` return type from `Result` to `Result>`. Fields can be null. Before this change, if a field was null, the value returned was the default value for the underlying type. However, this made it impossible to distinguish between null fields and legitimate values which happen to be default value, for example, an Integer field that is absent (null) from a 0, which can be a valid value. After this change, if a field is null, `None` is returned, rather than the default value. If you happened to rely on this behavior, you can fix your code by explicitly choosing a default value when the field is null. For example, if you had this before: ```rust let str_var = feature.field("string_field")? .into_string() .unwrap(); ``` You could maintain the old behavior with: ```rust use gdal::vector::FieldValue; let str_var = feature.field("string_field")? .unwrap_or(FieldValue::StringValue("".into())) .into_string() .unwrap(); ``` - - Fixed potential race condition wrt. GDAL driver initialization - - Add basic support to read overviews - Added a `Dataset::build_overviews` method - - BREAKING: update geo-types to 0.7.0. geo-types Coordinate now implement `Debug` - - Deprecated `SpatialRef::get_axis_mapping_strategy` - migrate to `SpatialRef::axis_mapping_strategy` instead. - Add support for reading and setting rasterband colour interpretations - - Add `Geometry::from_wkb` and `Geometry::wkb` functions to convert from/to Well-Known Binary - - Fixed memory leak in `Geometry::from_wkt` - - **Breaking**: Changed `Dataset::create_layer` to take a new `LayerOptions` struct instead of separate arguments. Before: ```rust ds.create_layer("roads", None, wkbLineString) ``` After (all fields have usable default values): ```rust use gdal::LayerOptions; ds.create_layer(LayerOptions { name: "roads", ty: wkbLineString, ..Default::default() }); ``` This change also removed `Dataset::create_layer_blank()`. Use `Dataset::create_layer(Default::default())` instead. - - Wrapper functions for `OGR_F_GetFieldAs…` methods - - Wrapper functions for `OGR_L_SetAttributeFilter` and `OGR_L_SetSpatialFilterRect` - - Wrappers for `CPLSetThreadLocalConfigOption` and `CPLGetThreadLocalConfigOption` - - Wrappers for `VSIFileFromMemBuffer`, `VSIUnlink` and `VSIGetMemFileBuffer` - - Add `set_description` to the `Metadata` trait - - Wrappers for `GDALRasterizeGeometries` provided in a new `rasters::rasterize` function - - Added `set_error_handler` and `remove_error_handler` to the config module that wraps `CPLSetErrorHandlerEx` - - **Breaking**: Changed `Dataset::create_copy` to take a slice of `RasterCreationOption`s which was previously not included. - Before: ```rust dataset.create_copy(&driver, "output_file"); ``` After: ```rust dataset.create_copy(&driver, "output_file", &[]); ``` ## 0.7.1 - fix docs.rs build for gdal-sys - ## 0.6.0 - 0.7.0 - Dataset layer iteration and FieldValue types - https://github.com/georust/gdal/pull/126 - Fix i8 ptr instead of c_char ptr passed to OSRImportFromESRI() - - Rename spatial_reference to spatial_ref - - Replace get_extent force flag by get_extent and try_get_extent - - Add support for transactions on datasets - - Add feature_count{,\_force} and implement Iterator::size_hint - - Replace failure with thiserror - - Ability to read into preallocated slice for rasterband - - Datasets are Send (requires GDAL >= 2.3) - - User GDALOpenEx - - GDAL 2.0 conform structure / drop GDAL 1.x - - Inplace functions use mutable refs - - Detect GDAL version at build time / remove version features - - Add support for delaunay_triangulation and simplify functions - - Add support for 3d points - - Additional metadata retrieval options - - Support for GDAL 3 in CI - - Support for Integer64 - - Geometry Intersection trait - - Rust 2018 - - support for date and time fields - - Prebuild bindings - - Support for ndarray - ## 0.5.0 - [Bump geo-types from 0.3 -> 0.4](https://github.com/georust/gdal/pull/71) - [Allow reading block-size of Rasters](https://github.com/georust/gdal/pull/67) - [Add prebuilt-bindings GDAL 2.3 and GDAL 2.4](https://github.com/georust/gdal/pull/69) - [Make GdalType trait public](https://github.com/georust/gdal/pull/66) - [RasterBand to Ndarray, with failure](https://github.com/georust/gdal/pull/68) ## 0.4.0 - [Migrate to the `geo-types` crate](https://github.com/georust/gdal/pull/60) - [Replace `error-chain` with `failure`](https://github.com/georust/gdal/pull/58) - [Use `bindgen` to generate the low-level bindings](https://github.com/georust/gdal/pull/55) ## 0.3.0 - [Add support for creating a SpatialRef from a esri "wkt" definition](https://github.com/georust/gdal/pull/37) - [Travis now uses GDAL 2.x](https://github.com/georust/gdal/pull/36) - [API extensions](https://github.com/georust/gdal/pull/35) - [Extend the existing possibilities of writing ogr datasets](https://github.com/georust/gdal/pull/31) - [Allow to transform ogr geometries to other SRS](https://github.com/georust/gdal/pull/29) - [Move ffi into a seperate crate](https://github.com/georust/gdal/pull/26) - [Added rasterband.rs and moved all band functions](https://github.com/georust/gdal/pull/24) ## 0.2.1 - [First version of metadata handling](https://github.com/georust/gdal/pull/21)