00001 #ifndef CAJUN_KML_PARSER_H
00002 #define CAJUN_KML_PARSER_H
00003
00004
00005
00006
00007
00008 #include <map>
00009 #include <list>
00010 #include <string>
00011 #include <vector>
00012 #include <cmath>
00013 #include <fstream>
00014 #include <iostream>
00015 #include <libxml/parser.h>
00016 #include <libxml/tree.h>
00017
00018 #include "proj_util.H"
00019 #include "rndf.H"
00020
00021 #define D2R (M_PI / 180)
00022
00023 #define MAX_OBSTACLE_AREAS 25
00024 namespace cajun
00025 {
00026 class rndf_builder_t;
00027 }
00028
00029 namespace cajun
00030 {
00031 class kmlWP{
00032 public:
00033 double lat_;
00034 double lon_;
00035 bool operator== (kmlWP const &k_) const
00036 {
00037 double lat_diff = lat_ - k_.lat_;
00038 double lon_diff = lon_ - k_.lon_;
00039 if(lat_diff < 0)
00040 lat_diff *= -1;
00041 if(lon_diff < 0)
00042 lon_diff *= -1;
00043
00044 return lat_diff < 0.000001 &&
00045 lon_diff < 0.000001;
00046 }
00047 };
00048
00049 class anno_point_t
00050 {
00051 public:
00052 anno_point_t(){};
00053 anno_point_t(std::string n, kmlWP p):name(n), point(p){};
00054 std::string name;
00055 kmlWP point;
00056 };
00057
00058
00059 class kml_laneb_t
00060 {
00061 public:
00062 kml_laneb_t();
00063 kml_laneb_t(std::string name_);
00064
00065 std::string getName();
00066 void addlaneb_point(std::vector<kmlWP> _points);
00067 unsigned* startID();
00068 unsigned* endID();
00069 std::vector<kmlWP> getlaneb_points();
00070
00071 private:
00072 std::string name;
00073 std::vector<kmlWP> laneb_points;
00074 unsigned start_id[3];
00075 unsigned end_id[3];
00076 };
00077
00078
00079
00080 class kml_obstacle_t
00081 {
00082 public:
00083 kml_obstacle_t(){};
00084 kml_obstacle_t(std::string name, proj_t *proj_);
00085
00086 void add_obstacle(std::vector<kmlWP> obs);
00087 void dump_obstacles(std::ofstream &o);
00088
00089 private:
00090 std::string area_name;
00091 unsigned int num_obstacles;
00092 proj_t *m_proj;
00093 std::vector< std::vector<kmlWP> > obst_list;
00094 };
00095
00096
00097 class kml_parser_t
00098 {
00099 public:
00100 kml_parser_t(std::string const &path_, rndf_builder_t *builder_, proj_t *proj_);
00101
00102 bool parse(std::string map_file);
00103 bool build_lb_files();
00104 bool build_obs_files();
00105 bool build_anno_files();
00106 std::vector<kml_laneb_t> getlaneb();
00107 bool cleanup();
00108
00109 protected:
00110
00111 rndf_builder_t *m_builder;
00112 proj_t *m_proj;
00113
00114 std::ofstream out_file;
00115 std::vector<kml_laneb_t> laneb;
00116
00117 unsigned m_segment_count;
00118 unsigned m_lane_count;
00119 unsigned m_checkpoint_counter;
00120
00121 xmlDocPtr m_doc;
00122 xmlNodePtr DocumentNode;
00123
00124 unsigned int num_obstacle_areas;
00125 std::string obstacle_area_names[MAX_OBSTACLE_AREAS];
00126 kml_obstacle_t obstacle_area_list[MAX_OBSTACLE_AREAS];
00127
00128 std::multimap<std::string, std::string> exit_entrymap;
00129
00130 std::list<anno_point_t> exitPoints;
00131 std::list<anno_point_t> entryPoints;
00132 std::list<anno_point_t> stopPoints;
00133 std::list<anno_point_t> cpPoints;
00134
00135 std::map<std::string, rndf_t::waypoint_id_t> m_name2entry;
00136
00137 std::map<rndf_t::waypoint_id_t, std::string> m_exit2name;
00138 std::map<rndf_t::waypoint_id_t, std::string> m_stop2name;
00139 std::map<rndf_t::waypoint_id_t, std::string> m_cp2name;
00140
00141 void parse_mapfile(std::string mfile);
00142 void populate_anno_lists();
00143 void populateLists(xmlNodePtr start_node);
00144 void find_anno_matches(kmlWP c,unsigned wp_id[3] );
00145
00146 xmlNodePtr getNextElement(xmlNodePtr node, char* node_name);
00147
00148 xmlNodePtr getLaneBoundaryFolder(xmlNodePtr start_node);
00149 xmlNodePtr getObstacleFolder(xmlNodePtr start_node);
00150 xmlNodePtr getAnnotationsFolder(xmlNodePtr start_node);
00151
00152 xmlNodePtr getSegmentsNode(xmlNodePtr start_node);
00153 int howManySegments(xmlNodePtr root_seg_node);
00154 int howManyLanes(xmlNodePtr lane_node);
00155 void processAllSegments(xmlNodePtr root_seg_node, bool preprocess);
00156 void processSegment(xmlNodePtr seg_node, bool preprocess);
00157 void processLane(xmlNodePtr p_node, bool preprocess);
00158 bool isLane(xmlNodePtr start_node);
00159
00160 xmlNodePtr getZonesNode(xmlNodePtr start_node);
00161 int howManyZones(xmlNodePtr root_zone_node);
00162 int howManySpots(xmlNodePtr zone_node);
00163 void processAllZones(xmlNodePtr root_zone_node, bool preprocess);
00164 void processZone(xmlNodePtr zone_node, bool preprocess);
00165 void processPerimeter(xmlNodePtr perm_node, bool preprocess);
00166 void processSpot(xmlNodePtr spot_node, bool preprocess);
00167 bool isPerimeter(xmlNodePtr pm_node);
00168 bool isSpot(xmlNodePtr pm_node);
00169
00170 void processLaneBoundary(xmlNodePtr lb_node);
00171 void processLaneBoundaryLine(xmlNodePtr lb_node);
00172
00173 void processObstacle(xmlNodePtr obs_node);
00174 void addObstacle(std::string area_name, std::vector<kmlWP> obs);
00175 void dumpObstacles();
00176
00177 void processAnnotations(xmlNodePtr anno_node);
00178
00179 kmlWP processPoint(xmlNodePtr p_node);
00180 std::vector<kmlWP> processLine(xmlNodePtr l_node);
00181 std::vector<kmlWP> processPolygon(xmlNodePtr poly_node);
00182 std::vector<kmlWP> getPolygonCoord(xmlNodePtr poly_node);
00183 std::vector<kmlWP> processCoord(xmlChar* c);
00184
00185
00186 xmlNodePtr getNodeByName(xmlNodePtr start_node,xmlChar* node_name);
00187
00188 xmlChar* getName(xmlNodePtr start_node);
00189 xmlChar* getDescription(xmlNodePtr start_node);
00190 bool isVisible(xmlNodePtr start_node);
00191 bool isPoint(xmlNodePtr p_node);
00192 bool isLine(xmlNodePtr l_node);
00193 bool isPolygon(xmlNodePtr pl_node);
00194
00195 };
00196 };
00197 #endif