pub type Tags = ::flat_map::FlatMap<String, String>;
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Copy)]
pub struct NodeId(pub i64);
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Copy)]
pub struct WayId(pub i64);
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Copy)]
pub struct RelationId(pub i64);
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Copy)]
pub enum OsmId {
Node(NodeId),
Way(WayId),
Relation(RelationId),
}
impl OsmId {
pub fn is_node(&self) -> bool {
match *self {
OsmId::Node(_) => true,
_ => false
}
}
pub fn is_way(&self) -> bool {
match *self {
OsmId::Way(_) => true,
_ => false
}
}
pub fn is_relation(&self) -> bool {
match *self {
OsmId::Relation(_) => true,
_ => false
}
}
}
#[derive(Debug, PartialEq, PartialOrd, Clone)]
pub enum OsmObj {
Node(Node),
Way(Way),
Relation(Relation),
}
impl OsmObj {
pub fn tags(&self) -> &Tags {
match *self {
OsmObj::Node(ref node) => &node.tags,
OsmObj::Way(ref way) => &way.tags,
OsmObj::Relation(ref rel) => &rel.tags,
}
}
pub fn id(&self) -> OsmId {
match *self {
OsmObj::Node(ref node) => OsmId::Node(node.id),
OsmObj::Way(ref way) => OsmId::Way(way.id),
OsmObj::Relation(ref rel) => OsmId::Relation(rel.id),
}
}
pub fn is_node(&self) -> bool {
self.node().is_some()
}
pub fn is_way(&self) -> bool {
self.way().is_some()
}
pub fn is_relation(&self) -> bool {
self.relation().is_some()
}
pub fn node(&self) -> Option<&Node> {
match *self {
OsmObj::Node(ref n) => Some(n),
_ => None
}
}
pub fn way(&self) -> Option<&Way> {
match *self {
OsmObj::Way(ref w) => Some(w),
_ => None
}
}
pub fn relation(&self) -> Option<&Relation> {
match *self {
OsmObj::Relation(ref r) => Some(r),
_ => None
}
}
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
pub struct Node {
pub id: NodeId,
pub tags: Tags,
pub decimicro_lat: i32,
pub decimicro_lon: i32,
}
impl Node {
pub fn lat(&self) -> f64 {
self.decimicro_lat as f64 * 1e-7
}
pub fn lon(&self) -> f64 {
self.decimicro_lon as f64 * 1e-7
}
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
pub struct Way {
pub id: WayId,
pub tags: Tags,
pub nodes: Vec<NodeId>,
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
pub struct Ref {
pub member: OsmId,
pub role: String,
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
pub struct Relation {
pub id: RelationId,
pub tags: Tags,
pub refs: Vec<Ref>,
}
impl ::std::convert::From<NodeId> for OsmId {
fn from(n: NodeId) -> Self {
OsmId::Node(n)
}
}
impl ::std::convert::From<WayId> for OsmId {
fn from(w: WayId) -> Self {
OsmId::Way(w)
}
}
impl ::std::convert::From<RelationId> for OsmId {
fn from(r: RelationId) -> Self {
OsmId::Relation(r)
}
}
impl ::std::convert::From<Node> for OsmObj {
fn from(n: Node) -> Self {
OsmObj::Node(n)
}
}
impl ::std::convert::From<Way> for OsmObj {
fn from(w: Way) -> Self {
OsmObj::Way(w)
}
}
impl ::std::convert::From<Relation> for OsmObj {
fn from(r: Relation) -> Self {
OsmObj::Relation(r)
}
}