Skip to content

Commit ba82983

Browse files
authored
Merge pull request #4 from nilspenzel/geojson_test_data_pull_request
geojson test data and basic error handling for geojson reading
2 parents 3513bf2 + 909190f commit ba82983

12 files changed

+608
-3
lines changed

Cargo.lock

+143-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,7 @@ tracing = "0.1.40"
2525
tracing-subscriber = "0.3.18"
2626
anyhow = "1.0.79"
2727
reqwest = "0.11.24"
28+
geo = "0.28.0"
29+
geojson = "0.24.1"
2830
chrono = "0.4.10"
2931
readonly = "=0.2.8"

src/backend/geo_from_str.rs

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
use geo::MultiPolygon;
2+
use geojson::{GeoJson, Geometry};
3+
4+
pub fn multi_polygon_from_str(s: &str) -> Result<MultiPolygon, geojson::Error> {
5+
let geojson: GeoJson = s.parse()?;
6+
Geometry::try_from(geojson).and_then(MultiPolygon::try_from)
7+
}
8+
9+
pub fn point_from_str(s: &str) -> Result<geo::Point, geojson::Error> {
10+
let geojson: GeoJson = s.parse()?;
11+
Geometry::try_from(geojson).and_then(geo::Point::try_from)
12+
}
13+
14+
#[cfg(test)]
15+
mod test {
16+
use crate::{
17+
backend::geo_from_str::point_from_str,
18+
constants::geojson_strings::{bautzen, bautzen_ost, bautzen_west, geo_points, gorlitz},
19+
};
20+
use geo::Contains;
21+
22+
use super::multi_polygon_from_str;
23+
24+
#[test]
25+
fn test_non_matching_geo_types() {
26+
assert!(multi_polygon_from_str(geo_points::P1_BAUTZEN_OST).is_err());
27+
assert!(point_from_str(bautzen::BAUTZEN).is_err());
28+
assert!(multi_polygon_from_str("").is_err());
29+
assert!(point_from_str("").is_err());
30+
}
31+
32+
#[test]
33+
fn test_matching_geo_types() {
34+
assert!(point_from_str(geo_points::P1_BAUTZEN_OST).is_ok());
35+
assert!(point_from_str(geo_points::P2_BAUTZEN_OST).is_ok());
36+
assert!(point_from_str(geo_points::P3_BAUTZEN_OST).is_ok());
37+
assert!(point_from_str(geo_points::P4_BAUTZEN_OST).is_ok());
38+
assert!(point_from_str(geo_points::P1_BAUTZEN_WEST).is_ok());
39+
assert!(point_from_str(geo_points::P2_BAUTZEN_WEST).is_ok());
40+
assert!(point_from_str(geo_points::P3_BAUTZEN_WEST).is_ok());
41+
assert!(point_from_str(geo_points::P4_BAUTZEN_WEST).is_ok());
42+
assert!(point_from_str(geo_points::P1_GORLITZ).is_ok());
43+
assert!(point_from_str(geo_points::P2_GORLITZ).is_ok());
44+
assert!(point_from_str(geo_points::P3_GORLITZ).is_ok());
45+
assert!(point_from_str(geo_points::P4_GORLITZ).is_ok());
46+
assert!(point_from_str(geo_points::P1_OUTSIDE).is_ok());
47+
assert!(point_from_str(geo_points::P2_OUTSIDE).is_ok());
48+
assert!(point_from_str(geo_points::P3_OUTSIDE).is_ok());
49+
assert!(point_from_str(geo_points::P4_OUTSIDE).is_ok());
50+
51+
assert!(multi_polygon_from_str(bautzen::BAUTZEN).is_ok());
52+
assert!(multi_polygon_from_str(bautzen_ost::BAUTZEN_OST).is_ok());
53+
assert!(multi_polygon_from_str(bautzen_west::BAUTZEN_WEST).is_ok());
54+
assert!(multi_polygon_from_str(gorlitz::GORLITZ).is_ok());
55+
}
56+
57+
#[test]
58+
fn test_points_in_correct_zones() {
59+
let test_points = geo_points::TestPoints::new();
60+
let bautzen = multi_polygon_from_str(bautzen::BAUTZEN).unwrap();
61+
let bautzen_ost = multi_polygon_from_str(bautzen_ost::BAUTZEN_OST).unwrap();
62+
let bautzen_west = multi_polygon_from_str(bautzen_west::BAUTZEN_WEST).unwrap();
63+
let gorlitz = multi_polygon_from_str(gorlitz::GORLITZ).unwrap();
64+
for p in test_points.bautzen_ost {
65+
assert!(bautzen.contains(&p));
66+
assert!(bautzen_ost.contains(&p));
67+
assert!(!bautzen_west.contains(&p));
68+
assert!(!gorlitz.contains(&p));
69+
}
70+
for p in test_points.bautzen_west {
71+
assert!(bautzen.contains(&p));
72+
assert!(!bautzen_ost.contains(&p));
73+
assert!(bautzen_west.contains(&p));
74+
assert!(!gorlitz.contains(&p));
75+
}
76+
for p in test_points.gorlitz {
77+
assert!(!bautzen.contains(&p));
78+
assert!(!bautzen_ost.contains(&p));
79+
assert!(!bautzen_west.contains(&p));
80+
assert!(gorlitz.contains(&p));
81+
}
82+
for p in test_points.outside {
83+
assert!(!bautzen.contains(&p));
84+
assert!(!bautzen_ost.contains(&p));
85+
assert!(!bautzen_west.contains(&p));
86+
assert!(!gorlitz.contains(&p));
87+
}
88+
}
89+
}

src/backend/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
pub mod interval;
1+
pub mod geo_from_str;
2+
pub mod interval;
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
pub const BAUTZEN: &str = r#"{
2+
"type": "MultiPolygon",
3+
"coordinates": [
4+
[
5+
[
6+
[
7+
13.831272405973152,
8+
51.384721226222695
9+
],
10+
[
11+
13.885790650743473,
12+
51.06302754778335
13+
],
14+
[
15+
14.498895386907066,
16+
51.01781386412796
17+
],
18+
[
19+
14.707724379195014,
20+
51.17907288799512
21+
],
22+
[
23+
14.478860526041302,
24+
51.333227543818964
25+
],
26+
[
27+
14.448538288046507,
28+
51.54395622742064
29+
],
30+
[
31+
14.137128736967696,
32+
51.54623512022985
33+
],
34+
[
35+
13.831272405973152,
36+
51.384721226222695
37+
]
38+
]
39+
]
40+
]
41+
}"#;

0 commit comments

Comments
 (0)