use crate::geometry::*;
use geo_types::{Coord, LineString, MultiLineString, MultiPoint, Point, Polygon};
impl<const N: usize> From<EsriCoord<N>> for Coord {
fn from(value: EsriCoord<N>) -> Self {
Coord {
x: value.0[0],
y: value.0[1],
}
}
}
impl From<EsriPoint> for Point {
fn from(value: EsriPoint) -> Self {
Point::new(value.x, value.y)
}
}
impl<const N: usize> From<EsriMultiPoint<N>> for MultiPoint {
fn from(value: EsriMultiPoint<N>) -> Self {
let pnts = value
.points
.into_iter()
.map(|xi| Point::from(Coord::from(xi)))
.collect::<Vec<Point>>();
MultiPoint::new(pnts)
}
}
impl<const N: usize> From<EsriPolyline<N>> for MultiLineString {
fn from(value: EsriPolyline<N>) -> Self {
let lns = value
.paths
.into_iter()
.map(|mli| {
let li_coords = mli
.into_iter()
.map(|ci| Coord::from(ci))
.collect::<Vec<Coord>>();
LineString::new(li_coords)
})
.collect::<Vec<LineString>>();
MultiLineString::new(lns)
}
}
impl<const N: usize> From<EsriPolygon<N>> for Polygon {
fn from(value: EsriPolygon<N>) -> Self {
let lns = value
.rings
.into_iter()
.map(|mli| {
let li_coords = mli
.into_iter()
.map(|ci| Coord::from(ci))
.collect::<Vec<Coord>>();
LineString::new(li_coords)
})
.collect::<Vec<LineString>>();
let mut lns_iter = lns.into_iter();
let ext = lns_iter.next().unwrap();
let ints = lns_iter.collect::<Vec<_>>();
Polygon::new(ext, ints)
}
}