void handleOsmData(XmlElement& osmRoot, XmapTree& xmapTree) { for ( XmlElement item = osmRoot.getChild(); !item.isEmpty(); ++item ) { if (item == T::name()) { T obj(item); handle(obj,xmapTree); } } }
int main(int argc, const char* argv[]) { try { Timer timer; const char* symbolFileName = "./symbols.xmap"; const char* rulesFileName = "./rules.xml"; const char* inOsmFileName = "./in.osm"; const char* outXmapFileName = "./out.xmap"; if (argc > 1) { for (int i = 1; i < argc; ++i) { if (std::string(argv[i]) == "-i") { inOsmFileName = argv[++i]; checkFileName(inOsmFileName,argv[0]); } else if (std::string(argv[i]) == "-o") { outXmapFileName = argv[++i]; checkFileName(outXmapFileName,argv[0]); } else if (std::string(argv[i]) == "-s") { symbolFileName = argv[++i]; checkFileName(symbolFileName,argv[0]); } else if (std::string(argv[i]) == "-r") { rulesFileName = argv[++i]; checkFileName(rulesFileName,argv[0]); } else if (std::string(argv[i]) == "--help" || std::string(argv[i]) == "-h" || std::string(argv[i]) == "help") { printUsage(argv[0]); return 0; } else { printUsage(argv[0]); throw Error("Unknown option '" + std::string(argv[i]) + "'"); } } } info("Using files:"); info("\t* input OSM file - " + std::string(inOsmFileName)); info("\t* output XMAP file - " + std::string(outXmapFileName)); info("\t* symbol set XMAP file - " + std::string(symbolFileName)); info("\t* rules file - " + std::string(rulesFileName)); XmlTree inXmapDoc(symbolFileName); XmlElement inXmapRoot = inXmapDoc.getChild("map"); XmlTree inOsmDoc(inOsmFileName); XmlElement inOsmRoot = inOsmDoc.getChild("osm"); const double min_supported_version = 0.5; const double max_supported_version = 0.6; double version = inOsmRoot.getAttribute<double>("version"); if (version < min_supported_version || version > max_supported_version) { throw Error("OSM data version %.1f isn't supported" + std::to_string(version)); } XmlElement bounds = inOsmRoot.getChild("bounds"); if (bounds.isEmpty()) { throw Error("No bounds"); } double x = bounds.getAttribute<double>("minlon") + bounds.getAttribute<double>("maxlon"); x /= 2; double y = bounds.getAttribute<double>("minlat") + bounds.getAttribute<double>("maxlat"); y /= 2; Coords geographic_ref_point(x,y); Georeferencing georef(inXmapRoot, geographic_ref_point); Main::transform = CoordsTransform(georef); SymbolIdByCodeMap symbolIds(inXmapRoot); Main::rules = Rules(rulesFileName,symbolIds); osmToXmap(inOsmRoot,outXmapFileName,symbolFileName,georef); info("\nExecution time: " + std::to_string(timer.getCurTime()) + " sec."); } /* catch (const char * msg) { std::cerr << "ERROR: " << msg << std::endl; } */ catch (std::exception& error) { std::cerr << "ERROR: " << error.what() << std::endl; return 1; } }