#![cfg_attr(not(feature = "std"), no_std)]
#![warn(missing_debug_implementations)]
#![doc(html_logo_url = "https://raw.githubusercontent.com/georust/meta/master/logo/logo.png")]
extern crate alloc;
use core::fmt::Debug;
use num_traits::{Float, Num, NumCast};
#[cfg(feature = "serde")]
#[macro_use]
extern crate serde;
#[cfg(test)]
#[macro_use]
extern crate approx;
#[deprecated(since = "0.7.0", note = "use `CoordFloat` or `CoordNum` instead")]
pub trait CoordinateType: Num + Copy + NumCast + PartialOrd + Debug {}
#[allow(deprecated)]
impl<T: Num + Copy + NumCast + PartialOrd + Debug> CoordinateType for T {}
#[allow(deprecated)]
pub trait CoordNum: CoordinateType + Debug {}
#[allow(deprecated)]
impl<T: CoordinateType + Debug> CoordNum for T {}
pub trait CoordFloat: CoordNum + Float {}
impl<T: CoordNum + Float> CoordFloat for T {}
pub mod geometry;
pub use geometry::*;
pub use geometry::line_string::PointsIter;
#[allow(deprecated)]
pub use geometry::rect::InvalidRectCoordinatesError;
mod error;
pub use error::Error;
#[macro_use]
mod macros;
#[macro_use]
mod wkt_macro;
#[cfg(feature = "arbitrary")]
mod arbitrary;
#[cfg(any(
feature = "rstar_0_8",
feature = "rstar_0_9",
feature = "rstar_0_10",
feature = "rstar_0_11",
feature = "rstar_0_12"
))]
#[doc(hidden)]
pub mod private_utils;
mod debug;
#[doc(hidden)]
pub mod _alloc {
pub use ::alloc::vec;
}
#[allow(unused, non_camel_case_types, missing_debug_implementations)]
mod deprecated_feature_flags {
#[cfg_attr(
not(feature = "__allow_deprecated_features"),
deprecated(
since = "0.7.18",
note = "The `use-rstar` feature has been renamed to simply `rstar`. Use the `rstar` feature instead."
)
)]
pub struct UseRstar;
#[cfg_attr(
not(feature = "__allow_deprecated_features"),
deprecated(
since = "0.7.18",
note = "The `use-rstar_0_8` feature has been renamed to simply `rstar_0_8`. Use the `rstar_0_8` feature instead."
)
)]
pub struct UseRstar_0_8;
#[cfg_attr(
not(feature = "__allow_deprecated_features"),
deprecated(
since = "0.7.18",
note = "The `use-rstar_0_9` feature has been renamed to simply `rstar_0_9`. Use the `rstar_0_9` feature instead."
)
)]
pub struct UseRstar_0_9;
#[cfg_attr(
not(feature = "__allow_deprecated_features"),
deprecated(
since = "0.7.18",
note = "The `use-rstar_0_10` feature has been renamed to simply `rstar_0_10`. Use the `rstar_0_10` feature instead."
)
)]
pub struct UseRstar_0_10;
#[cfg_attr(
not(feature = "__allow_deprecated_features"),
deprecated(
since = "0.7.18",
note = "The `use-rstar_0_11` feature has been renamed to simply `rstar_0_11`. Use the `rstar_0_11` feature instead."
)
)]
pub struct UseRstar_0_11;
#[cfg_attr(
not(feature = "__allow_deprecated_features"),
deprecated(
since = "0.7.18",
note = "The `use-rstar_0_12` feature has been renamed to simply `rstar_0_12`. Use the `rstar_0_12` feature instead."
)
)]
pub struct UseRstar_0_12;
}
#[cfg(feature = "use-rstar")]
pub use deprecated_feature_flags::UseRstar;
#[cfg(feature = "use-rstar_0_8")]
pub use deprecated_feature_flags::UseRstar_0_8;
#[cfg(feature = "use-rstar_0_9")]
pub use deprecated_feature_flags::UseRstar_0_9;
#[cfg(feature = "use-rstar_0_10")]
pub use deprecated_feature_flags::UseRstar_0_10;
#[cfg(feature = "use-rstar_0_11")]
pub use deprecated_feature_flags::UseRstar_0_11;
#[cfg(feature = "use-rstar_0_12")]
pub use deprecated_feature_flags::UseRstar_0_12;
#[cfg(test)]
mod tests {
use alloc::vec;
use super::*;
use core::convert::TryFrom;
#[test]
fn type_test() {
let c = coord! {
x: 40.02f64,
y: 116.34,
};
let p = Point::from(c);
let Point(c2) = p;
assert_eq!(c, c2);
assert_relative_eq!(c.x, c2.x);
assert_relative_eq!(c.y, c2.y);
let p: Point<f32> = (0f32, 1f32).into();
assert_relative_eq!(p.x(), 0.);
assert_relative_eq!(p.y(), 1.);
}
#[test]
fn convert_types() {
let p: Point<f32> = Point::new(0., 0.);
let p1 = p;
let g: Geometry<f32> = p.into();
let p2 = Point::try_from(g).unwrap();
assert_eq!(p1, p2);
}
#[test]
fn polygon_new_test() {
let exterior = LineString::new(vec![
coord! { x: 0., y: 0. },
coord! { x: 1., y: 1. },
coord! { x: 1., y: 0. },
coord! { x: 0., y: 0. },
]);
let interiors = vec![LineString::new(vec![
coord! { x: 0.1, y: 0.1 },
coord! { x: 0.9, y: 0.9 },
coord! { x: 0.9, y: 0.1 },
coord! { x: 0.1, y: 0.1 },
])];
let p = Polygon::new(exterior.clone(), interiors.clone());
assert_eq!(p.exterior(), &exterior);
assert_eq!(p.interiors(), &interiors[..]);
}
#[test]
fn iters() {
let _: MultiPoint<_> = vec![(0., 0.), (1., 2.)].into();
let _: MultiPoint<_> = vec![(0., 0.), (1., 2.)].into_iter().collect();
let mut l1: LineString<_> = vec![(0., 0.), (1., 2.)].into();
assert_eq!(l1[1], coord! { x: 1., y: 2. }); let _: LineString<_> = vec![(0., 0.), (1., 2.)].into_iter().collect();
l1[0] = coord! { x: 1., y: 1. };
assert_eq!(l1, vec![(1., 1.), (1., 2.)].into());
}
#[test]
fn test_coordinate_types() {
let p: Point<u8> = Point::new(0, 0);
assert_eq!(p.x(), 0u8);
let p: Point<i64> = Point::new(1_000_000, 0);
assert_eq!(p.x(), 1_000_000i64);
}
#[cfg(feature = "rstar_0_8")]
#[test]
fn line_test() {
use rstar_0_8::primitives::Line as RStarLine;
use rstar_0_8::{PointDistance, RTreeObject};
let rl = RStarLine::new(Point::new(0.0, 0.0), Point::new(5.0, 5.0));
let l = Line::new(coord! { x: 0.0, y: 0.0 }, coord! { x: 5., y: 5. });
assert_eq!(rl.envelope(), l.envelope());
assert_relative_eq!(26.0, rl.distance_2(&Point::new(4.0, 10.0)));
assert_relative_eq!(25.999999999999996, l.distance_2(&Point::new(4.0, 10.0)));
}
#[cfg(feature = "rstar_0_9")]
#[test]
fn line_test_0_9() {
use rstar_0_9::primitives::Line as RStarLine;
use rstar_0_9::{PointDistance, RTreeObject};
let rl = RStarLine::new(Point::new(0.0, 0.0), Point::new(5.0, 5.0));
let l = Line::new(coord! { x: 0.0, y: 0.0 }, coord! { x: 5., y: 5. });
assert_eq!(rl.envelope(), l.envelope());
assert_relative_eq!(26.0, rl.distance_2(&Point::new(4.0, 10.0)));
assert_relative_eq!(25.999999999999996, l.distance_2(&Point::new(4.0, 10.0)));
}
#[cfg(feature = "rstar_0_10")]
#[test]
fn line_test_0_10() {
use rstar_0_10::primitives::Line as RStarLine;
use rstar_0_10::{PointDistance, RTreeObject};
let rl = RStarLine::new(Point::new(0.0, 0.0), Point::new(5.0, 5.0));
let l = Line::new(coord! { x: 0.0, y: 0.0 }, coord! { x: 5., y: 5. });
assert_eq!(rl.envelope(), l.envelope());
assert_relative_eq!(26.0, rl.distance_2(&Point::new(4.0, 10.0)));
assert_relative_eq!(25.999999999999996, l.distance_2(&Point::new(4.0, 10.0)));
}
#[cfg(feature = "rstar_0_11")]
#[test]
fn line_test_0_11() {
use rstar_0_11::primitives::Line as RStarLine;
use rstar_0_11::{PointDistance, RTreeObject};
let rl = RStarLine::new(Point::new(0.0, 0.0), Point::new(5.0, 5.0));
let l = Line::new(coord! { x: 0.0, y: 0.0 }, coord! { x: 5., y: 5. });
assert_eq!(rl.envelope(), l.envelope());
assert_relative_eq!(26.0, rl.distance_2(&Point::new(4.0, 10.0)));
assert_relative_eq!(25.999999999999996, l.distance_2(&Point::new(4.0, 10.0)));
}
#[cfg(feature = "rstar_0_12")]
#[test]
fn line_test_0_12() {
use rstar_0_12::primitives::Line as RStarLine;
use rstar_0_12::{PointDistance, RTreeObject};
let rl = RStarLine::new(Point::new(0.0, 0.0), Point::new(5.0, 5.0));
let l = Line::new(coord! { x: 0.0, y: 0.0 }, coord! { x: 5., y: 5. });
assert_eq!(rl.envelope(), l.envelope());
assert_relative_eq!(26.0, rl.distance_2(&Point::new(4.0, 10.0)));
assert_relative_eq!(25.999999999999996, l.distance_2(&Point::new(4.0, 10.0)));
}
#[test]
fn test_rects() {
let r = Rect::new(coord! { x: -1., y: -1. }, coord! { x: 1., y: 1. });
let p: Polygon<_> = r.into();
assert_eq!(
p,
Polygon::new(
vec![(-1., -1.), (1., -1.), (1., 1.), (-1., 1.), (-1., -1.)].into(),
vec![]
)
);
}
}