1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
extern crate alloc;
use alloc::vec::Vec;
/// Importing necessary types (equivalent to importing from 'values')
use crate::values::*;
/// A BBOX is defined in lon-lat space and helps with zooming motion to
/// see the entire line or polygon
#[derive(Debug, PartialEq)]
pub struct BBox {
    /// left most longitude (WG) or S (S2)
    pub left: f64,
    /// bottom most latitude (WG) or T (S2)
    pub bottom: f64,
    /// right most longitude (WG) or T (S2)
    pub right: f64,
    /// top most latitude (WG) or S (S2)
    pub top: f64,
}
/// A BBOX is defined in lon-lat space and helps with zooming motion to
/// see the entire 3D line or polygon
#[derive(Debug, PartialEq)]
pub struct BBox3D {
    /// left most longitude (WG) or S (S2)
    pub left: f64,
    /// bottom most latitude (WG) or T (S2)
    pub bottom: f64,
    /// right most longitude (WG) or T (S2)
    pub right: f64,
    /// top most latitude (WG) or S (S2)
    pub top: f64,
    /// front most height (WG) or T (S2)
    /// generic height is relative to the surface of the earth in meters
    pub front: f64,
    /// back most height (WG) or T (S2)
    /// generic height is relative to the surface of the earth in meters
    pub back: f64,
}
/// BBox or BBox3D
#[derive(Debug, PartialEq)]
pub enum BBOX {
    /// 2D bounding box
    BBox(BBox),
    /// 3D bounding box
    BBox3D(BBox3D),
}
/// Definition of a Point. May represent WebMercator Lon-Lat or S2Geometry S-T
pub type Point = (f64, f64);
/// Definition of a MultiPoint
pub type MultiPoint = Vec<Point>;
/// Definition of a LineString
pub type LineString = Vec<Point>;
/// Definition of a MultiLineString
pub type MultiLineString = Vec<LineString>;
/// Definition of a Polygon
pub type Polygon = Vec<Vec<Point>>;
/// Definition of a MultiPolygon
pub type MultiPolygon = Vec<Polygon>;
/// Definition of a 3D Point. May represent WebMercator Lon-Lat or S2Geometry S-T with a z-value
pub type Point3D = (f64, f64, f64);
/// Definition of a 3D MultiPoint
pub type MultiPoint3D = Vec<Point3D>;
/// Definition of a 3D LineString
pub type LineString3D = Vec<Point3D>;
/// Definition of a 3D MultiLineString
pub type MultiLineString3D = Vec<LineString3D>;
/// Definition of a 3D Polygon
pub type Polygon3D = Vec<Vec<Point3D>>;
/// Definition of a 3D MultiPolygon
pub type MultiPolygon3D = Vec<Polygon3D>;
/// All possible geometry shapes
#[derive(Debug, PartialEq)]
pub enum Geometry {
    /// Point Shape
    Point(PointGeometry),
    /// MultiPoint Shape
    MultiPoint(MultiPointGeometry),
    /// LineString Shape
    LineString(LineStringGeometry, Option<LineStringMValues>),
    /// MultiLineString Shape
    MultiLineString(MultiLineStringGeometry, Option<MultiLineStringMValues>),
    /// Polygon Shape
    Polygon(PolygonGeometry, Option<PolygonMValues>),
    /// MultiPolygon Shape
    MultiPolygon(MultiPolygonGeometry, Option<MultiPolygonMValues>),
    /// Point3D Shape
    Point3D(Point3DGeometry),
    /// MultiPoint3D Shape
    MultiPoint3D(MultiPoint3DGeometry),
    /// LineString3D Shape
    LineString3D(LineString3DGeometry, Option<LineStringMValues>),
    /// MultiLineString3D Shape
    MultiLineString3D(MultiLineString3DGeometry, Option<MultiLineStringMValues>),
    /// Polygon3D Shape
    Polygon3D(Polygon3DGeometry, Option<PolygonMValues>),
    /// MultiPolygon3D Shape
    MultiPolygon3D(MultiPolygon3DGeometry, Option<MultiPolygonMValues>),
}
/// BaseGeometry is the a generic geometry type
#[derive(Debug, PartialEq)]
pub struct BaseGeometry<G = Geometry, M = MValues, B = BBOX> {
    /// The geometry shape
    pub coordinates: G,
    /// The M-Values shape
    pub m_values: Option<M>,
    /// The BBox shape
    pub bbox: Option<B>,
}
/// PointGeometry is a point
pub type PointGeometry = BaseGeometry<Point, MValue, BBox>;
/// MultiPointGeometry contains multiple points
pub type MultiPointGeometry = BaseGeometry<MultiPoint, MValue, BBox>;
/// LineStringGeometry is a line
pub type LineStringGeometry = BaseGeometry<LineString, LineStringMValues, BBox>;
/// MultiLineStringGeometry contains multiple lines
pub type MultiLineStringGeometry = BaseGeometry<MultiLineString, MultiLineStringMValues, BBox>;
/// PolygonGeometry is a polygon with potential holes
pub type PolygonGeometry = BaseGeometry<Polygon, PolygonMValues, BBox>;
/// MultiPolygonGeometry is a polygon with multiple polygons with their own potential holes
pub type MultiPolygonGeometry = BaseGeometry<MultiPolygon, MultiPolygonMValues, BBox>;
/// Point3DGeometry is a 3D point
pub type Point3DGeometry = BaseGeometry<Point3D, MValue, BBox3D>;
/// MultiPoint3DGeometry contains multiple 3D points
pub type MultiPoint3DGeometry = BaseGeometry<MultiPoint3D, MValue, BBox3D>;
/// LineString3DGeometry is a 3D line
pub type LineString3DGeometry = BaseGeometry<LineString3D, LineStringMValues, BBox3D>;
/// MultiLineString3DGeometry contains multiple 3D lines
pub type MultiLineString3DGeometry = BaseGeometry<MultiLineString3D, MultiLineStringMValues, BBox3D>;
/// Polygon3DGeometry is a 3D polygon with potential holes
pub type Polygon3DGeometry = BaseGeometry<Polygon3D, PolygonMValues, BBox3D>;
/// MultiPolygon3DGeometry is a 3D polygon with multiple polygons with their own potential holes
pub type MultiPolygon3DGeometry = BaseGeometry<MultiPolygonMValues, MultiPolygonMValues, BBox3D>;