Skip to main content

proj4rs/
units.rs

1//!
2//! Predefined units for conversion
3//!
4
5#[derive(Debug, Copy, Clone)]
6pub struct UnitDefn {
7    pub name: &'static str,
8    pub to_meter: f64,
9}
10
11macro_rules! unit {
12    ($name:expr, $display:expr, $comment:expr, $to_meter:expr) => {
13        UnitDefn {
14            name: $name,
15            to_meter: $to_meter,
16        }
17    };
18}
19
20pub const METER: UnitDefn = unit!("m", "1", "Meter", 1.0);
21
22pub const DEGREES: &str = "degrees";
23
24mod constants {
25    use super::*;
26    /// Static units table
27    /// id, to_meter, display to_meter value, comment, to_meter
28    #[rustfmt::skip]
29    pub const UNITS: [UnitDefn;21] = [
30        unit!("km",      "1000",                 "Kilometer",                    1000.0),
31        unit!("m",       "1",                    "Meter",                        1.0),
32        unit!("dm",      "1/10",                 "Decimeter",                    0.1),
33        unit!("cm",      "1/100",                "Centimeter",                   0.01),
34        unit!("mm",      "1/1000",               "Millimeter",                   0.001),
35        unit!("kmi",     "1852",                 "International Nautical Mile",  1852.0),
36        unit!("in",      "0.0254",               "International Inch",           0.0254),
37        unit!("ft",      "0.3048",               "International Foot",           0.3048),
38        unit!("yd",      "0.9144",               "International Yard",           0.9144),
39        unit!("mi",      "1609.344",             "International Statute Mile",   1609.344),
40        unit!("fath",    "1.8288",               "International Fathom",         1.8288),
41        unit!("ch",      "20.1168",              "International Chain",          20.1168),
42        unit!("link",    "0.201168",             "International Link",           0.201168),
43        unit!("us-in",   "1/39.37",              "U.S. Surveyor's Inch",         100./3937.0),
44        unit!("us-ft",   "0.304800609601219",    "U.S. Surveyor's Foot",         1200./3937.0),
45        unit!("us-yd",   "0.914401828803658",    "U.S. Surveyor's Yard",         3600./3937.0),
46        unit!("us-ch",   "20.11684023368047",    "U.S. Surveyor's Chain",        79200./3937.0),
47        unit!("us-mi",   "1609.347218694437",    "U.S. Surveyor's Statute Mile", 6336000./3937.0),
48        unit!("ind-yd",  "0.91439523",           "Indian Yard",                  0.91439523),
49        unit!("ind-ft",  "0.30479841",           "Indian Foot",                  0.30479841),
50        unit!("ind-ch",  "20.11669506",          "Indian Chain",                 20.11669506),
51    ];
52}
53
54pub fn from_value(to_meter: f64) -> UnitDefn {
55    UnitDefn { name: "", to_meter }
56}
57
58/// Return the unit definition
59pub fn find_units(name: &str) -> Option<UnitDefn> {
60    constants::UNITS
61        .iter()
62        .find(|d| d.name.eq_ignore_ascii_case(name))
63        .copied()
64}