diff --git a/src/proj.rs b/src/proj.rs index a24e64b3..fd64b37c 100644 --- a/src/proj.rs +++ b/src/proj.rs @@ -6,14 +6,15 @@ use proj_sys::{ proj_context_destroy, proj_context_errno, proj_context_get_url_endpoint, proj_context_is_network_enabled, proj_context_set_search_paths, proj_context_set_url_endpoint, proj_create, proj_create_crs_to_crs, proj_destroy, proj_errno_string, proj_get_area_of_use, - proj_grid_cache_set_enable, proj_info, proj_normalize_for_visualization, proj_pj_info, - proj_trans, proj_trans_array, proj_trans_bounds, PJconsts, PJ_AREA, PJ_CONTEXT, PJ_COORD, - PJ_DIRECTION_PJ_FWD, PJ_DIRECTION_PJ_INV, PJ_INFO, PJ_LPZT, PJ_XYZT, + proj_get_id_auth_name, proj_get_id_code, proj_grid_cache_set_enable, proj_info, + proj_normalize_for_visualization, proj_pj_info, proj_trans, proj_trans_array, + proj_trans_bounds, PJconsts, PJ, PJ_AREA, PJ_CONTEXT, PJ_COORD, PJ_DIRECTION_PJ_FWD, + PJ_DIRECTION_PJ_INV, PJ_INFO, PJ_LPZT, PJ_XYZT, }; use std::{ convert, ffi, fmt::{self, Debug}, - str, + ptr, str, }; #[cfg(feature = "network")] @@ -592,6 +593,28 @@ impl Proj { transform_epsg(ctx, from, to, area) } + /// Return Authority code for Proj + /// + /// # Safety + /// This method contains unsafe code. + pub fn id_code(&self) -> Result<&str, str::Utf8Error> { + let pj = self.c_proj as *const PJ; + let c_char = unsafe { proj_get_id_code(pj, 0) }; + let c_str = unsafe { CStr::from_ptr(c_char) }; + c_str.to_str() + } + + /// Return Authority Name for Proj + /// + /// # Safety + /// This method contains unsafe code. + pub fn id_auth_name(&self) -> Result<&str, str::Utf8Error> { + let pj = self.c_proj as *const PJ; + let c_char = unsafe { proj_get_id_auth_name(pj, 0) }; + let c_str = unsafe { CStr::from_ptr(c_char) }; + c_str.to_str() + } + /// Set the bounding box of the area of use /// /// This bounding box will be used to specify the area of use @@ -1484,4 +1507,16 @@ mod test { assert_eq!(area.north, 84.73); assert!(name.contains("Europe")); } + #[test] + fn test_id_code() { + let proj = Proj::new("EPSG:3035").unwrap(); + let code = proj.id_code().unwrap(); + assert_eq!(code, "3035") + } + #[test] + fn test_id_auth_name() { + let proj = Proj::new("EPSG:3035").unwrap(); + let auth_name = proj.id_auth_name().unwrap(); + assert_eq!(auth_name, "EPSG") + } }