stac_extensions/
projection.rs1use super::Extension;
4use geojson::Geometry;
5use serde::{Deserialize, Serialize};
6use serde_json::{Map, Value};
7
8#[derive(Debug, Serialize, Deserialize, Default, PartialEq, Clone)]
10pub struct Projection {
11 #[serde(skip_serializing_if = "Option::is_none")]
13 pub code: Option<String>,
14
15 #[serde(skip_serializing_if = "Option::is_none")]
18 pub wkt2: Option<String>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
23 pub projjson: Option<Map<String, Value>>,
24
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub geometry: Option<Geometry>,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub bbox: Option<Vec<f64>>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub centroid: Option<Centroid>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub shape: Option<Vec<usize>>,
40
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub transform: Option<Vec<f64>>,
44}
45
46#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
48pub struct Centroid {
49 pub lat: f64,
51
52 pub lon: f64,
54}
55
56impl Projection {
57 pub fn is_empty(&self) -> bool {
68 serde_json::to_value(self)
69 .map(|v| v == Value::Object(Default::default()))
70 .unwrap_or(true)
71 }
72}
73
74impl Extension for Projection {
75 const IDENTIFIER: &'static str =
76 "https://stac-extensions.github.io/projection/v2.0.0/schema.json";
77 const PREFIX: &'static str = "proj";
78}
79
80#[cfg(test)]
81mod tests {
82 use super::Projection;
83 use crate::{Extensions, Item};
84
85 #[test]
86 fn example() {
87 let item: Item =
88 stac::read("examples/extensions-collection/proj-example/proj-example.json").unwrap();
89 let projection = item.extension::<Projection>().unwrap();
90 assert_eq!(projection.code.unwrap(), "EPSG:32614");
91 }
92}