Add all coordinate type
This commit is contained in:
parent
df0b688a3c
commit
67cf26202d
46
spatial-coordinate-systems/src/all.rs
Normal file
46
spatial-coordinate-systems/src/all.rs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
dd,
|
||||||
|
dmm,
|
||||||
|
dms,
|
||||||
|
plus, //xpin
|
||||||
|
utm,
|
||||||
|
Coordinate,
|
||||||
|
Error,
|
||||||
|
LatLon,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Coordinates {
|
||||||
|
pub latlon: LatLon,
|
||||||
|
|
||||||
|
pub dd: dd::Coordinate,
|
||||||
|
pub dms: dms::Coordinate,
|
||||||
|
pub dmm: dmm::Coordinate,
|
||||||
|
pub utm: utm::Coordinate,
|
||||||
|
// pub xpin: xpin::Xpin,
|
||||||
|
pub plus: plus::Coordinate,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<LatLon> for Coordinates {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn try_from(latlon: LatLon) -> Result<Self, Self::Error> {
|
||||||
|
Ok(Self {
|
||||||
|
latlon,
|
||||||
|
dd: dd::Coordinate::try_from(latlon)?,
|
||||||
|
dms: dms::Coordinate::try_from(latlon)?,
|
||||||
|
dmm: dmm::Coordinate::try_from(latlon)?,
|
||||||
|
utm: utm::Coordinate::try_from(latlon)?,
|
||||||
|
plus: plus::Coordinate::try_from(latlon)?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Coordinates {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(i: &str) -> Result<Self, Self::Err> {
|
||||||
|
Self::try_from(LatLon::from(&Coordinate::from_str(i)?))
|
||||||
|
}
|
||||||
|
}
|
@ -1,14 +1,15 @@
|
|||||||
use std::{fmt, str::FromStr};
|
use std::{fmt, str::FromStr};
|
||||||
|
pub mod all;
|
||||||
mod common;
|
mod common;
|
||||||
pub mod dd;
|
pub mod dd;
|
||||||
pub mod dmm;
|
pub mod dmm;
|
||||||
pub mod dms;
|
pub mod dms;
|
||||||
mod error;
|
|
||||||
pub mod latlon;
|
pub mod latlon;
|
||||||
pub mod plus;
|
pub mod plus;
|
||||||
pub mod utm;
|
pub mod utm;
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
// pub mod xpin;
|
// pub mod xpin;
|
||||||
|
mod error;
|
||||||
|
|
||||||
use nom::{
|
use nom::{
|
||||||
branch::alt,
|
branch::alt,
|
||||||
@ -210,10 +211,10 @@ impl fmt::Display for Coordinate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl FromStr for Coordinate {
|
impl FromStr for Coordinate {
|
||||||
type Err = ();
|
type Err = Error;
|
||||||
|
|
||||||
fn from_str(i: &str) -> Result<Self, Self::Err> {
|
fn from_str(i: &str) -> Result<Self, Self::Err> {
|
||||||
Self::parse(i).map_err(|_| ()).map(|(_, ret)| ret)
|
Self::parse(i).map(|(_, ret)| ret).map_err(Into::into)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ impl From<spatial_coordinate_systems::CoordinateType> for CoordinateType {
|
|||||||
spatial_coordinate_systems::CoordinateType::DMS => Self::DMS,
|
spatial_coordinate_systems::CoordinateType::DMS => Self::DMS,
|
||||||
spatial_coordinate_systems::CoordinateType::DMM => Self::DMM,
|
spatial_coordinate_systems::CoordinateType::DMM => Self::DMM,
|
||||||
spatial_coordinate_systems::CoordinateType::UTM => Self::UTM,
|
spatial_coordinate_systems::CoordinateType::UTM => Self::UTM,
|
||||||
// spatial_coordinate_systems::CoordinateType::Xpin => Self::Xpin ,
|
// spatial_coordinate_systems::CoordinateType::Xpin => Self::Xpin,
|
||||||
spatial_coordinate_systems::CoordinateType::Plus => Self::Plus,
|
spatial_coordinate_systems::CoordinateType::Plus => Self::Plus,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,7 +79,7 @@ impl EncodedAddress {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|e| e.to_string())?,
|
.map_err(|e| e.to_string())?,
|
||||||
)
|
)
|
||||||
.map_err(|()| String::from("Could not convert xpin to address"))
|
.map_err(|e| e.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get an encoded address from a latitude/longitude
|
/// Get an encoded address from a latitude/longitude
|
||||||
@ -88,7 +88,7 @@ impl EncodedAddress {
|
|||||||
console_error_panic_hook::set_once();
|
console_error_panic_hook::set_once();
|
||||||
|
|
||||||
let src_coords = Coordinate::from_str(i)
|
let src_coords = Coordinate::from_str(i)
|
||||||
.map_err(|()| format!("Could not parse str as a coordinate {i:?}"))?;
|
.map_err(|e| format!("Could not parse str {i:?} as a coordinate {e:?}"))?;
|
||||||
|
|
||||||
// TODO: Remove the clone here
|
// TODO: Remove the clone here
|
||||||
let latlon = LatLon::from(&src_coords);
|
let latlon = LatLon::from(&src_coords);
|
||||||
@ -98,7 +98,7 @@ impl EncodedAddress {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|e| e.to_string())?,
|
.map_err(|e| e.to_string())?,
|
||||||
)
|
)
|
||||||
.map_err(|()| String::from("Could not convert xpin to address"))?;
|
.map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
ret.src_coords_repr = src_coords.to_string();
|
ret.src_coords_repr = src_coords.to_string();
|
||||||
ret.src_coords_type = src_coords.get_type().into();
|
ret.src_coords_type = src_coords.get_type().into();
|
||||||
@ -114,22 +114,23 @@ impl EncodedAddress {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.map_err(|e| e.to_string())?,
|
.map_err(|e| e.to_string())?,
|
||||||
)
|
)
|
||||||
.map_err(|()| String::from("Could not convert xpin to address"))
|
.map_err(|e| e.to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<&'_ Address<'_>> for EncodedAddress {
|
impl TryFrom<&'_ Address<'_>> for EncodedAddress {
|
||||||
type Error = ();
|
type Error = String;
|
||||||
|
|
||||||
fn try_from(addr: &Address) -> Result<Self, Self::Error> {
|
fn try_from(addr: &Address) -> Result<Self, Self::Error> {
|
||||||
console_error_panic_hook::set_once();
|
console_error_panic_hook::set_once();
|
||||||
|
|
||||||
let (lat, lon) = addr.as_lat_lon();
|
let (lat, lon) = addr.as_lat_lon();
|
||||||
let src_coords = Coordinate::from_str(&format!("{}, {}", lat, lon))?;
|
// TODO: Do not allocate a string here
|
||||||
|
let src_coords =
|
||||||
|
Coordinate::from_str(&format!("{}, {}", lat, lon)).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
address: addr.to_string(),
|
address: addr.to_string(),
|
||||||
// TODO: Do not use formatting here
|
|
||||||
lat_lon: Box::new([lat, lon]),
|
lat_lon: Box::new([lat, lon]),
|
||||||
src_coords_repr: src_coords.to_string(),
|
src_coords_repr: src_coords.to_string(),
|
||||||
src_coords_type: src_coords.get_type().into(),
|
src_coords_type: src_coords.get_type().into(),
|
||||||
|
Loading…
Reference in New Issue
Block a user