#ifndef OSM_H #define OSM_H #include #include #include #include #include struct bounds { double w,s,e,n; bounds() { w=-180; s=-90; e=180; n=90; } bounds(double w, double s, double e, double n ) { this->w = w; this->s = s; this->e = e; this->n = n; } }; class polygon_types { public: std::vector > ptypes; polygon_types() { ptypes.push_back(std::pair("natural","wood")); ptypes.push_back(std::pair("natural","water")); ptypes.push_back(std::pair("natural","heath")); ptypes.push_back(std::pair("natural","marsh")); ptypes.push_back(std::pair ("landuse","forest")); ptypes.push_back(std::pair ("landuse","industrial")); } }; struct osm_item { long id; std::map keyvals; virtual std::string to_string(); }; struct osm_node: public osm_item { double lat, lon; std::string to_string(); }; struct osm_way: public osm_item { std::vector nodes; std::string to_string(); bounds get_bounds(); bool is_polygon(); static polygon_types ptypes; }; class osm_dataset { private: int next_item_mode; enum {Node, Way }; std::vector::iterator node_i; std::vector::iterator way_i; std::vector nodes; std::vector ways; public: osm_dataset() { node_i=nodes.begin(); way_i=ways.begin(); next_item_mode=Node; } osm_dataset(const char* name) { node_i=nodes.begin(); way_i=ways.begin(); next_item_mode=Node; load(name); } bool load(const char* name,const std::string& parser="libxml2"); ~osm_dataset(); void add_node(osm_node* n) { nodes.push_back(n); } void add_way(osm_way* w) { ways.push_back(w); } std::string to_string(); bounds get_bounds(); std::set get_keys(); void rewind_nodes() { node_i=nodes.begin(); } void rewind_ways() { way_i=ways.begin(); } void rewind() { rewind_nodes(); rewind_ways(); next_item_mode=Node; } osm_node * next_node(); osm_way * next_way(); osm_item * next_item(); bool current_item_is_node() { return next_item_mode==Node; } bool current_item_is_way() { return next_item_mode==Way; } }; #endif // OSM_H