egml_core/model/geometry/primitives/
polygon.rs

1use crate::model::base::Gml;
2use crate::model::geometry::{DirectPosition, Envelope, LinearRing};
3use crate::operations::geometry::Geometry;
4use crate::operations::surface::Surface;
5use crate::Error;
6use nalgebra::Isometry3;
7use rayon::prelude::*;
8
9#[derive(Debug, Clone, PartialEq)]
10pub struct Polygon {
11    pub gml: Gml,
12    pub exterior: LinearRing,
13    pub interior: Vec<LinearRing>,
14}
15
16impl Polygon {
17    pub fn new(gml: Gml, exterior: LinearRing, interior: Vec<LinearRing>) -> Result<Self, Error> {
18        Ok(Self {
19            gml,
20            exterior,
21            interior,
22        })
23    }
24
25    pub fn get_envelope(&self) -> Envelope {
26        self.exterior.envelope()
27    }
28}
29
30impl Geometry for Polygon {
31    fn points(&self) -> Vec<&DirectPosition> {
32        let mut all_points = Vec::new();
33        all_points.extend(self.exterior.points());
34
35        for ring in &self.interior {
36            all_points.extend(ring.points().iter());
37        }
38
39        all_points
40    }
41
42    fn apply_transform(&mut self, m: &Isometry3<f64>) {
43        self.exterior.apply_transform(m);
44
45        self.interior.par_iter_mut().for_each(|p| {
46            p.apply_transform(m);
47        });
48    }
49}
50
51impl Surface for Polygon {
52    fn outer_boundary_points(&self) -> Vec<&DirectPosition> {
53        self.exterior.outer_boundary_points()
54    }
55}