From b6db8603df49562574cb4ed5f73b83cdee1aeac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Dr=C3=B6nner?= Date: Sun, 18 Dec 2016 20:31:07 +0100 Subject: [PATCH 1/2] - moved ffi to a new crate: gdal-sys. - added a cargo workspace. --- Cargo.toml | 6 +++++- gdal-sys/Cargo.toml | 7 +++++++ {src/raster => gdal-sys/src}/gdal.rs | 0 {src/raster => gdal-sys/src}/gdal_enums.rs | 0 gdal-sys/src/lib.rs | 8 ++++++++ {src/vector => gdal-sys/src}/ogr.rs | 0 src/lib.rs | 1 + src/raster/mod.rs | 13 +++++++------ src/vector/mod.rs | 3 ++- 9 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 gdal-sys/Cargo.toml rename {src/raster => gdal-sys/src}/gdal.rs (100%) rename {src/raster => gdal-sys/src}/gdal_enums.rs (100%) create mode 100644 gdal-sys/src/lib.rs rename {src/vector => gdal-sys/src}/ogr.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index dcf95e64..5bf2d481 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,5 +8,9 @@ repository = "https://github.com/georust/rust-gdal" documentation = "https://georust.github.io/rust-gdal/" [dependencies] -libc = "0.2.13" +libc = "0.2.13" geo = "0.0.5" +gdal-sys = { path = "gdal-sys", version = "0.1.0"} + +[workspace] +members = ["gdal-sys"] diff --git a/gdal-sys/Cargo.toml b/gdal-sys/Cargo.toml new file mode 100644 index 00000000..2858ebbe --- /dev/null +++ b/gdal-sys/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "gdal-sys" +version = "0.1.0" +authors = ["Johannes Drönner "] + +[dependencies] +libc = "0.2.13" \ No newline at end of file diff --git a/src/raster/gdal.rs b/gdal-sys/src/gdal.rs similarity index 100% rename from src/raster/gdal.rs rename to gdal-sys/src/gdal.rs diff --git a/src/raster/gdal_enums.rs b/gdal-sys/src/gdal_enums.rs similarity index 100% rename from src/raster/gdal_enums.rs rename to gdal-sys/src/gdal_enums.rs diff --git a/gdal-sys/src/lib.rs b/gdal-sys/src/lib.rs new file mode 100644 index 00000000..a6ede785 --- /dev/null +++ b/gdal-sys/src/lib.rs @@ -0,0 +1,8 @@ +extern crate libc; + +// gdal modules +pub mod gdal; +pub mod gdal_enums; + +// OGR modules +pub mod ogr; \ No newline at end of file diff --git a/src/vector/ogr.rs b/gdal-sys/src/ogr.rs similarity index 100% rename from src/vector/ogr.rs rename to gdal-sys/src/ogr.rs diff --git a/src/lib.rs b/src/lib.rs index 9c5dcbf8..395715ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,7 @@ extern crate libc; extern crate geo; +extern crate gdal_sys; pub use version::version_info; diff --git a/src/raster/mod.rs b/src/raster/mod.rs index 30a8adf0..073118aa 100644 --- a/src/raster/mod.rs +++ b/src/raster/mod.rs @@ -2,16 +2,17 @@ pub use raster::dataset::{Dataset, Buffer, ByteBuffer}; pub use raster::driver::Driver; -pub use raster::warp::reproject; -pub use raster::rasterband::{RasterBand}; +pub use raster::warp::reproject; +pub use raster::rasterband::{RasterBand}; + +use gdal_sys::gdal; +pub use gdal_sys::gdal_enums; -mod gdal; mod types; -mod gdal_enums; pub mod dataset; pub mod driver; -pub mod warp; -pub mod rasterband; +pub mod warp; +pub mod rasterband; #[cfg(test)] mod tests; diff --git a/src/vector/mod.rs b/src/vector/mod.rs index ac9b9f05..2bcbf3af 100644 --- a/src/vector/mod.rs +++ b/src/vector/mod.rs @@ -23,12 +23,13 @@ pub use vector::defn::{Defn, FieldIterator, Field}; pub use vector::feature::{Feature, FieldValue}; pub use vector::geometry::Geometry; +use gdal_sys::ogr; + /// Convert object to a GDAL geometry. pub trait ToGdal { fn to_gdal(&self) -> Geometry; } -mod ogr; mod driver; mod dataset; mod layer; From 184091a22f7769cac0d470cbc212faea5bc7d2d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Dr=C3=B6nner?= Date: Fri, 23 Dec 2016 20:23:46 +0100 Subject: [PATCH 2/2] Removed "use gdal_sys::gdal;" and "use gdal_sys::ogr;" from module. Both are now directly included where needed. --- src/raster/dataset.rs | 69 ++++++++++++++++++++------------------- src/raster/driver.rs | 4 +-- src/raster/mod.rs | 1 - src/raster/rasterband.rs | 3 +- src/raster/warp.rs | 3 +- src/vector/dataset.rs | 3 +- src/vector/defn.rs | 2 +- src/vector/driver.rs | 3 +- src/vector/feature.rs | 2 +- src/vector/gdal_to_geo.rs | 3 +- src/vector/geo_to_gdal.rs | 3 +- src/vector/geometry.rs | 2 +- src/vector/layer.rs | 3 +- src/vector/mod.rs | 2 -- 14 files changed, 54 insertions(+), 49 deletions(-) diff --git a/src/raster/dataset.rs b/src/raster/dataset.rs index 64bb26bb..8488c38d 100644 --- a/src/raster/dataset.rs +++ b/src/raster/dataset.rs @@ -2,12 +2,13 @@ use libc::{c_int, c_double, c_void}; use std::ffi::CString; use std::path::Path; use utils::_string; -use raster::{gdal, Driver, RasterBand}; +use raster::{Driver, RasterBand}; use raster::driver::_register_drivers; -use raster::gdal_enums::{GDALAccess, GDALDataType}; +use raster::gdal_enums::{GDALAccess, GDALDataType}; use raster::types::GdalType; use gdal_major_object::MajorObject; use metadata::Metadata; +use gdal_sys::gdal; pub type GeoTransform = [c_double; 6]; @@ -16,13 +17,13 @@ pub struct Dataset { } impl MajorObject for Dataset { - unsafe fn gdal_object_ptr(&self) -> *const c_void { + unsafe fn gdal_object_ptr(&self) -> *const c_void { self.c_dataset } } impl Metadata for Dataset {} - + impl Drop for Dataset { fn drop(&mut self) { unsafe { gdal::GDALClose(self.c_dataset); } @@ -48,22 +49,22 @@ impl Dataset { pub unsafe fn _c_ptr(&self) -> *const c_void { return self.c_dataset; - } - - - pub fn rasterband<'a>(&'a self, band_index: isize) -> Option> { - unsafe { - let c_band = gdal::GDALGetRasterBand(self.c_dataset, band_index as c_int); - if c_band.is_null() { - return None; - } - Some(RasterBand::_with_c_ptr(c_band, self)) - } - } - - pub fn size(&self) -> (usize, usize) { - let size_x = unsafe { gdal::GDALGetRasterXSize(self.c_dataset) } as usize; - let size_y = unsafe { gdal::GDALGetRasterYSize(self.c_dataset) } as usize; + } + + + pub fn rasterband<'a>(&'a self, band_index: isize) -> Option> { + unsafe { + let c_band = gdal::GDALGetRasterBand(self.c_dataset, band_index as c_int); + if c_band.is_null() { + return None; + } + Some(RasterBand::_with_c_ptr(c_band, self)) + } + } + + pub fn size(&self) -> (usize, usize) { + let size_x = unsafe { gdal::GDALGetRasterXSize(self.c_dataset) } as usize; + let size_y = unsafe { gdal::GDALGetRasterYSize(self.c_dataset) } as usize; return (size_x, size_y); } @@ -132,11 +133,11 @@ impl Dataset { true => None, false => Some(Dataset{c_dataset: c_dataset}), }; - } - - pub fn band_type(&self, band_index: isize) -> Option { - self.rasterband(band_index).map(|band| band.band_type()) - } + } + + pub fn band_type(&self, band_index: isize) -> Option { + self.rasterband(band_index).map(|band| band.band_type()) + } /// Read a 'Buffer' from a 'Dataset'. /// # Arguments @@ -149,7 +150,7 @@ impl Dataset { window: (isize, isize), window_size: (usize, usize), size: (usize, usize) - ) -> Option + ) -> Option { self.read_raster_as::( band_index, @@ -165,10 +166,10 @@ impl Dataset { pub fn read_full_raster_as( &self, band_index: isize, - ) -> Option> + ) -> Option> { - self.rasterband(band_index).map(|band| band.read_band_as()) - } + self.rasterband(band_index).map(|band| band.read_band_as()) + } /// Read a 'Buffer' from a 'Dataset'. T implements 'GdalType' /// # Arguments @@ -182,9 +183,9 @@ impl Dataset { window: (isize, isize), window_size: (usize, usize), size: (usize, usize), - ) -> Option> + ) -> Option> { - self.rasterband(band_index).map(|band| band.read_as(window, window_size, size)) + self.rasterband(band_index).map(|band| band.read_as(window, window_size, size)) } /// Write a 'Buffer' into a 'Dataset'. @@ -199,9 +200,9 @@ impl Dataset { window_size: (usize, usize), buffer: Buffer ) { - self.rasterband(band_index).expect("Invalid RasterBand").write(window, window_size, buffer) + self.rasterband(band_index).expect("Invalid RasterBand").write(window, window_size, buffer) } - + } pub struct Buffer { @@ -215,4 +216,4 @@ impl Buffer { } } -pub type ByteBuffer = Buffer; +pub type ByteBuffer = Buffer; diff --git a/src/raster/driver.rs b/src/raster/driver.rs index 2ba9dfbd..318aade1 100644 --- a/src/raster/driver.rs +++ b/src/raster/driver.rs @@ -2,11 +2,11 @@ use libc::{c_int, c_void}; use std::ffi::CString; use std::sync::{Once, ONCE_INIT}; use utils::_string; -use raster::{gdal, Dataset}; +use raster::{Dataset}; use raster::types::GdalType; use gdal_major_object::MajorObject; use metadata::Metadata; - +use gdal_sys::gdal; static START: Once = ONCE_INIT; static mut registered_drivers: bool = false; diff --git a/src/raster/mod.rs b/src/raster/mod.rs index 073118aa..30042a19 100644 --- a/src/raster/mod.rs +++ b/src/raster/mod.rs @@ -5,7 +5,6 @@ pub use raster::driver::Driver; pub use raster::warp::reproject; pub use raster::rasterband::{RasterBand}; -use gdal_sys::gdal; pub use gdal_sys::gdal_enums; mod types; diff --git a/src/raster/rasterband.rs b/src/raster/rasterband.rs index 06136b40..232cc32b 100644 --- a/src/raster/rasterband.rs +++ b/src/raster/rasterband.rs @@ -1,9 +1,10 @@ use libc::{c_int, c_void}; -use raster::{gdal, Dataset, Buffer}; +use raster::{Dataset, Buffer}; use raster::types::{GdalType}; use raster::gdal_enums; use gdal_major_object::MajorObject; use metadata::Metadata; +use gdal_sys::gdal; pub struct RasterBand<'a> { c_rasterband: *const c_void, diff --git a/src/raster/warp.rs b/src/raster/warp.rs index 7d9775d2..3daa22bd 100644 --- a/src/raster/warp.rs +++ b/src/raster/warp.rs @@ -1,7 +1,8 @@ use libc::c_double; use std::ptr::null; -use raster::{gdal, Dataset}; +use raster::{Dataset}; use raster::gdal_enums::GDALResampleAlg; +use gdal_sys::gdal; pub fn reproject(src: &Dataset, dst: &Dataset) { let rv = unsafe { diff --git a/src/vector/dataset.rs b/src/vector/dataset.rs index 28281ab2..8faa7071 100644 --- a/src/vector/dataset.rs +++ b/src/vector/dataset.rs @@ -2,10 +2,11 @@ use std::ffi::CString; use std::path::Path; use std::ptr::null; use libc::{c_int, c_void}; -use vector::{ogr, Layer}; +use vector::{Layer}; use vector::driver::_register_drivers; use gdal_major_object::MajorObject; use metadata::Metadata; +use gdal_sys::ogr; /// Vector dataset /// diff --git a/src/vector/defn.rs b/src/vector/defn.rs index 7075be07..ee29f8c0 100644 --- a/src/vector/defn.rs +++ b/src/vector/defn.rs @@ -1,6 +1,6 @@ use libc::{c_int, c_void}; use utils::_string; -use vector::ogr; +use gdal_sys::ogr; /// Layer definition /// diff --git a/src/vector/driver.rs b/src/vector/driver.rs index 7cc32a2d..2cc87766 100644 --- a/src/vector/driver.rs +++ b/src/vector/driver.rs @@ -3,7 +3,8 @@ use std::ptr::null; use std::sync::{Once, ONCE_INIT}; use std::path::Path; use libc::{c_void}; -use vector::{ogr, Dataset}; +use vector::{Dataset}; +use gdal_sys::ogr; static START: Once = ONCE_INIT; diff --git a/src/vector/feature.rs b/src/vector/feature.rs index 3fd82d60..281b1447 100644 --- a/src/vector/feature.rs +++ b/src/vector/feature.rs @@ -2,7 +2,7 @@ use std::ffi::CString; use libc::{c_void}; use vector::Defn; use utils::_string; -use vector::ogr; +use gdal_sys::ogr; use vector::geometry::Geometry; diff --git a/src/vector/gdal_to_geo.rs b/src/vector/gdal_to_geo.rs index ac1a108f..1c063e07 100644 --- a/src/vector/gdal_to_geo.rs +++ b/src/vector/gdal_to_geo.rs @@ -1,5 +1,6 @@ -use vector::{Geometry, ogr}; +use vector::{Geometry}; use geo; +use gdal_sys::ogr; impl geo::ToGeo for Geometry { fn to_geo(&self) -> geo::Geometry { diff --git a/src/vector/geo_to_gdal.rs b/src/vector/geo_to_gdal.rs index becabf9b..7358a73c 100644 --- a/src/vector/geo_to_gdal.rs +++ b/src/vector/geo_to_gdal.rs @@ -1,6 +1,7 @@ use libc::c_int; -use vector::{Geometry, ToGdal, ogr}; +use vector::{Geometry, ToGdal}; use geo; +use gdal_sys::ogr; impl ToGdal for geo::Point { fn to_gdal(&self) -> Geometry { diff --git a/src/vector/geometry.rs b/src/vector/geometry.rs index a0eefef9..109d9b77 100644 --- a/src/vector/geometry.rs +++ b/src/vector/geometry.rs @@ -3,7 +3,7 @@ use libc::{c_char, c_int, c_double, c_void}; use std::ffi::CString; use std::cell::RefCell; use utils::_string; -use vector::ogr; +use gdal_sys::ogr; /// OGR Geometry pub struct Geometry { diff --git a/src/vector/layer.rs b/src/vector/layer.rs index 8e29d8d8..d413fff4 100644 --- a/src/vector/layer.rs +++ b/src/vector/layer.rs @@ -1,9 +1,10 @@ use std::ptr::null; use libc::{c_void}; -use vector::{ogr, Feature, Geometry}; +use vector::{Feature, Geometry}; use vector::defn::Defn; use gdal_major_object::MajorObject; use metadata::Metadata; +use gdal_sys::ogr; /// Layer in a vector dataset /// diff --git a/src/vector/mod.rs b/src/vector/mod.rs index 2bcbf3af..89d82602 100644 --- a/src/vector/mod.rs +++ b/src/vector/mod.rs @@ -23,8 +23,6 @@ pub use vector::defn::{Defn, FieldIterator, Field}; pub use vector::feature::{Feature, FieldValue}; pub use vector::geometry::Geometry; -use gdal_sys::ogr; - /// Convert object to a GDAL geometry. pub trait ToGdal { fn to_gdal(&self) -> Geometry;