egml_core/lib.rs
1//! Core primitives and operations for processing GML (Geography Markup Language) data.
2//!
3//! `egml-core` implements a subset of [ISO 19136 GML 3.2](https://www.ogc.org/standards/gml)
4//! focused on 3-D geometry. It provides the geometry model, bounding-box computations,
5//! triangulation, and distance queries needed to work with GML-based datasets.
6//!
7//! # Module overview
8//!
9//! | Module | Contents |
10//! |--------|----------|
11//! | [`model::base`] | Root GML types: [`AbstractGml`](model::base::AbstractGml), [`Id`](model::base::Id) |
12//! | [`model::basic_types`] | Primitive GML scalar types: [`Code`](model::basic_types::Code), [`Measure`](model::basic_types::Measure) |
13//! | [`model::feature`] | Abstract GML feature class |
14//! | [`model::geometry`] | Full geometry hierarchy: primitives, aggregates, and complexes |
15//! | [`util::plane`] | Plane in R³ — point + unit normal |
16//! | [`util::triangulate`] | Earcut-based polygon triangulation |
17//!
18//! # Geometry hierarchy
19//!
20//! ```text
21//! AbstractGeometry
22//! └── AbstractGeometricPrimitive
23//! ├── Point
24//! ├── AbstractCurve → LineString
25//! ├── AbstractSurface → Surface, TriangulatedSurface, Polygon, Triangle
26//! └── AbstractSolid → Solid
27//! AbstractGeometricAggregate
28//! ├── MultiCurve
29//! └── MultiSurface
30//! CompositeSurface
31//! ```
32//!
33//! # Quick-start example
34//!
35//! ```rust
36//! use egml_core::model::geometry::DirectPosition;
37//! use egml_core::model::geometry::primitives::LinearRing;
38//! use egml_core::model::geometry::Envelope;
39//!
40//! let pts = vec![
41//! DirectPosition::new(0.0, 0.0, 0.0).unwrap(),
42//! DirectPosition::new(1.0, 0.0, 0.0).unwrap(),
43//! DirectPosition::new(1.0, 1.0, 0.0).unwrap(),
44//! DirectPosition::new(0.0, 1.0, 0.0).unwrap(),
45//! ];
46//! let ring = LinearRing::new(pts).unwrap();
47//! let envelope = Envelope::from_points(ring.points()).unwrap();
48//! assert!(envelope.size_x() > 0.0);
49//! ```
50
51mod error;
52pub mod model;
53pub mod resolver;
54pub mod util;
55
56#[doc(inline)]
57pub use error::Error;