diff --git a/CHANGES.md b/CHANGES.md index ea5842adf..ae3861f9d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,10 @@ - +- Add `gdal::vector::geometry_type_to_name` + + - + ## 0.12 - Bump Rust edition to 2021 diff --git a/src/vector/geometry.rs b/src/vector/geometry.rs index 5a8de3dc1..bec35889b 100644 --- a/src/vector/geometry.rs +++ b/src/vector/geometry.rs @@ -1,7 +1,7 @@ use std::cell::RefCell; use std::ffi::CString; use std::fmt::{self, Debug}; -use std::ptr::null_mut; +use std::ptr::{null, null_mut}; use libc::{c_char, c_double, c_int, c_void}; @@ -437,11 +437,18 @@ impl PartialEq for Geometry { impl Eq for Geometry {} +pub fn geometry_type_to_name(ty: OGRwkbGeometryType::Type) -> String { + let rv = unsafe { gdal_sys::OGRGeometryTypeToName(ty) }; + // If the type is invalid, OGRGeometryTypeToName returns a valid string anyway. + assert!(rv != null()); + _string(rv) +} + #[cfg(test)] mod tests { use crate::spatial_ref::SpatialRef; - use super::Geometry; + use super::{geometry_type_to_name, Geometry}; #[test] #[allow(clippy::float_cmp)] @@ -540,4 +547,14 @@ mod tests { ); assert!(buffered.area() > 10.0); } + + #[test] + pub fn test_geometry_type_to_name() { + assert_eq!( + geometry_type_to_name(::gdal_sys::OGRwkbGeometryType::wkbLineString), + "Line String" + ); + // We don't care what it returns when passed an invalid value, just that it doesn't crash. + geometry_type_to_name(4372521); + } } diff --git a/src/vector/mod.rs b/src/vector/mod.rs index 3dbe64e81..be94a79ca 100644 --- a/src/vector/mod.rs +++ b/src/vector/mod.rs @@ -27,7 +27,7 @@ pub mod sql; pub use defn::{Defn, Field, FieldIterator}; pub use feature::{Feature, FieldValue, FieldValueIterator}; pub use gdal_sys::{OGRFieldType, OGRwkbGeometryType}; -pub use geometry::Geometry; +pub use geometry::{geometry_type_to_name, Geometry}; pub use layer::{FeatureIterator, FieldDefn, Layer, LayerCaps}; pub use ops::GeometryIntersection;