#ifndef GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAESP_H #define GERMANAIRLINESVA_FILE_SIMDATA_SIMDATAESP_H #include #include #include #include #include #include #include "geodata.hpp" #include "simdata/gate.hpp" #include "simdata/runway.hpp" #include "util.hpp" namespace germanairlinesva { namespace file { namespace simdata { inline int scan( const std::string runwaysFile, const std::string gatesFile, const std::string logFile, std::map, std::vector>> &airports) { std::ifstream runways(runwaysFile); if (!runways.good()) { return 1; } std::ifstream gates(gatesFile); if (!gates.good()) { runways.close(); return 2; } std::ofstream log(logFile, std::fstream::trunc); if (!log.good()) { runways.close(); gates.close(); return 3; } std::string line; std::string *currentIcao = nullptr; std::map> tmpAirportGates; std::map> tmpAirportRunways; std::vector tmpGates; std::vector tmpRunways; int apCount = 0; int validCount = 0; log << " " << runwaysFile << std::endl; while (std::getline(runways, line)) { std::vector fields = utilities::split(line, ','); // New ICAO if (currentIcao != nullptr && *currentIcao != fields[0]) { tmpAirportRunways[*currentIcao] = tmpRunways; tmpRunways = std::vector(); apCount++; } currentIcao = new std::string(fields[0]); int desig = std::stoi(fields[1]); std::string designator; switch (desig % 10) { case 0: designator = std::to_string(desig / 10); break; case 1: designator = std::to_string(desig / 10) + " L"; break; case 2: designator = std::to_string(desig / 10) + " R"; break; case 3: designator = std::to_string(desig / 10) + " C"; break; } if (desig < 100) { designator = "0" + designator; } struct utilities::geodata::point start = {std::stod(fields[2]), std::stod(fields[3])}; tmpRunways.emplace_back( designator, start, utilities::geodata::toMetre(std::stod(fields[8])), utilities::geodata::toMetre(std::stod(fields[6])), std::stod(fields[5]) + std::stod(fields[9])); log << "\t " << line << std::endl; } currentIcao = nullptr; while (std::getline(gates, line)) { std::vector fields = utilities::split(line, ','); // New ICAO if (currentIcao != nullptr && *currentIcao != fields[0]) { tmpAirportGates[*currentIcao] = tmpGates; tmpGates = std::vector(); } currentIcao = new std::string(fields[0]); double width = std::stod(fields[5]); tmpGates.emplace_back(fields[1] + fields[2], std::stod(fields[3]), std::stod(fields[4]), width > 0 ? width : 20); log << "\t " << line << std::endl; } for (const auto &pair : tmpAirportRunways) { std::string icao = pair.first; if (!tmpAirportGates[icao].empty() && !pair.second.empty()) { airports[icao] = {tmpAirportGates[icao], pair.second}; log << "\t " << icao << " committed" << std::endl; validCount++; } else { log << "\t " << icao << " had no gates or runways" << std::endl; } } log << " " << apCount << " airports found, of which " << validCount << " are valid" << std::endl; return 0; } } // namespace simdata } // namespace file } // namespace germanairlinesva #endif