You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
385 lines
16 KiB
385 lines
16 KiB
#ifndef AIRMAP_AIRSPACE_H_ |
|
#define AIRMAP_AIRSPACE_H_ |
|
|
|
#include <airmap/geometry.h> |
|
#include <airmap/optional.h> |
|
#include <airmap/rule.h> |
|
#include <airmap/timestamp.h> |
|
|
|
#include <cstdint> |
|
#include <iosfwd> |
|
#include <map> |
|
#include <string> |
|
#include <vector> |
|
|
|
namespace airmap { |
|
|
|
/// Airspace groups together general information about an airspace and |
|
/// in-depth information providing more details. |
|
class Airspace { |
|
public: |
|
/// Airport bundles up properties further describing an |
|
/// airspace around an airport. |
|
struct Airport { |
|
/// Runway describes an individual runway of an airport. |
|
struct Runway { |
|
std::string name; ///< Commn name assigned to the runway in the context of a specific airport. |
|
float length; ///< Lenght of the runway in [m]. |
|
float bearing; ///< Bearing of the runway in [°]. |
|
}; |
|
|
|
/// Use enumerates all known usage types for |
|
/// an airport. |
|
enum class Use { |
|
public_ ///< The airport is available for public use. |
|
}; |
|
|
|
std::string iata; ///< IATA code of the airport. |
|
std::string icao; ///< ICAO code of the airport. |
|
bool paved{false}; ///< True if the airport features paved runways. |
|
std::string phone; ///< The phone number of the airport (typically the tower). |
|
bool tower{false}; ///< True if the airport features a tower. |
|
std::vector<Runway> runways; ///< Collection of runways available at the airport. |
|
float elevation{0.f}; ///< The elevation of the airport in [m]. |
|
float longest_runway{0.f}; ///< The lenght of th longest runway in [m]. |
|
bool instrument_approach_procedure{false}; ///< True if the airport features equipment supporting an IAP. |
|
Use use{Use::public_}; ///< Types of use offered by the airport. |
|
}; |
|
|
|
/// ControlledAirspace bundles up properties describing |
|
/// a controlled airspace. |
|
struct ControlledAirspace { |
|
std::string airspace_classification; ///< The classification of the ControlledAirspace. |
|
}; |
|
|
|
/// SpecialUseAirspace bundles up properties describing |
|
/// a special use airspace. |
|
struct SpecialUseAirspace { |
|
/// Type enumerates all known special-purpose types. |
|
enum class Type {}; |
|
Type type; ///< The type of the SpecialUseAirspace. |
|
}; |
|
|
|
/// TemporaryFlightRestriction describes an airspace that |
|
/// modelling a temporary restriction of the airspace. |
|
struct TemporaryFlightRestriction { |
|
/// Type enumerates all known types of temporary flight restrictions. |
|
enum class Type {}; |
|
std::string url; ///< The URL providing further information about the temporary flight restriction. |
|
Type type; ///< The type of the temporary flight restriction. |
|
std::string reason; ///< The reason for the temporary flight restriction. |
|
}; |
|
|
|
/// Wildfire describes an airspace around a wildfire. |
|
struct Wildfire { |
|
std::string effective_date; |
|
}; |
|
|
|
/// Park describes an airspace over a park. |
|
struct Park {}; |
|
/// Prison describes an airspace over a prison. |
|
struct Prison {}; |
|
/// School describes an airspace over a school. |
|
struct School {}; |
|
/// Hospital describes an airspace over a hospital. |
|
struct Hospital {}; |
|
/// Fire describes an airspace over a fire. |
|
struct Fire {}; |
|
/// Emergency describes an airspace over an emergency situation. |
|
struct Emergency {}; |
|
|
|
/// Heliport describes an airspace around a heliport. |
|
struct Heliport { |
|
/// Usage enumerates all known usages of a heliport. |
|
enum class Usage {}; |
|
std::string faa_id; ///< The FAA id of the heliport. |
|
std::string phone; ///< The phone number of the heliport. |
|
Usage usage; ///< The usages supported by the heliport. |
|
}; |
|
|
|
/// PowerPlant describes the airspace around a power plant. |
|
struct PowerPlant { |
|
std::string technology; ///< The technology used by the power plant. |
|
std::uint64_t code; ///< Official number of the power plant. |
|
}; |
|
|
|
/// RelatedGeometry bundles up a geometry related to an airspace. |
|
struct RelatedGeometry { |
|
std::string id; ///< The unique id of the geometry in the context of AirMap. |
|
Geometry geometry; ///< The actual geometry. |
|
}; |
|
|
|
/// Enumerates all known airspace types. |
|
enum class Type { |
|
invalid = 0, |
|
airport = 1 << 0, |
|
controlled_airspace = 1 << 1, |
|
special_use_airspace = 1 << 2, |
|
tfr = 1 << 3, |
|
wildfire = 1 << 4, |
|
park = 1 << 5, |
|
power_plant = 1 << 6, |
|
heliport = 1 << 7, |
|
prison = 1 << 8, |
|
school = 1 << 9, |
|
hospital = 1 << 10, |
|
fire = 1 << 11, |
|
emergency = 1 << 12, |
|
all = airport | controlled_airspace | special_use_airspace | tfr | wildfire | park | power_plant | heliport | |
|
prison | school | hospital | fire | emergency |
|
}; |
|
|
|
using Id = std::string; |
|
|
|
/// @cond |
|
Airspace(); |
|
Airspace(const Airspace &rhs); |
|
~Airspace(); |
|
Airspace &operator=(const Airspace &rhs); |
|
bool operator==(const Airspace &rhs) const; |
|
bool operator!=(const Airspace &rhs) const; |
|
/// @endcond |
|
|
|
/// id returns an immutable reference to the unique idd |
|
/// of this airspace. |
|
const Id &id() const; |
|
/// set_id adjusts the unique id of this airspace to id. |
|
void set_id(const Id &id); |
|
|
|
/// name returns an immutable reference to the |
|
/// human-readable name of this airspace. |
|
const std::string &name() const; |
|
/// set_name adjusts the name of this airspace to name. |
|
void set_name(const std::string &name); |
|
|
|
/// type returns the Type of this airspace instance. |
|
Type type() const; |
|
|
|
/// country returns an immutable reference to the name of the country |
|
/// that the airspace belongs to. |
|
const std::string &country() const; |
|
/// set_country adjusts the name of the country that this airspace instance belongs to. |
|
void set_country(const std::string &country); |
|
|
|
/// state returns an immutable reference to the name of the state |
|
/// that the airspace belongs to. |
|
const std::string &state() const; |
|
/// set_state adjusts the name of the state that this airspace instance belongs to. |
|
void set_state(const std::string &state); |
|
|
|
/// city returns an immutable reference to the name of the city |
|
/// that the airspace belongs to. |
|
const std::string &city() const; |
|
/// set_city adjusts the name of the city that this airspace instance belongs to. |
|
void set_city(const std::string &city); |
|
|
|
/// last_updated returns an immutable reference to the timestamp of the last update |
|
/// to this airspace instance. |
|
const Timestamp &last_updated() const; |
|
/// set_last_updated adjusts the timestamp of the last update to this airspace to |
|
/// 'timestamp'. |
|
void set_last_updated(const Timestamp ×tamp); |
|
|
|
/// geometry returns an immutable reference to the geometry of this airspace instance. |
|
const Geometry &geometry() const; |
|
/// set_geometry adjusts the geometry of this airspace instance to 'geometry'. |
|
void set_geometry(const Geometry &geometry); |
|
|
|
/// related_geometries returns an immutable reference to all geometries associated with |
|
/// this airspace instance. |
|
const std::map<std::string, RelatedGeometry> &related_geometries() const; |
|
/// set_related_geometries adjusts the geometries associated with this airspace instance |
|
/// to 'geometry'. |
|
void set_related_geometries(const std::map<std::string, RelatedGeometry> &geometries); |
|
|
|
/// rules returns an immutable reference to the rules applying to this airspace instance. |
|
const std::vector<Rule> &rules() const; |
|
/// set_rules adjusts the rules applying to this airspace instance to 'rules. |
|
void set_rules(const std::vector<Rule> &rules); |
|
|
|
/// details_for_airport returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Airport &details_for_airport() const; |
|
/// details_for_airport returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Airport &details_for_airport(); |
|
|
|
/// details_for_controlled_airspace returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const ControlledAirspace &details_for_controlled_airspace() const; |
|
/// details_for_controlled_airspace returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
ControlledAirspace &details_for_controlled_airspace(); |
|
|
|
/// details_for_emergency returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Emergency &details_for_emergency() const; |
|
/// details_for_emergency returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Emergency &details_for_emergency(); |
|
|
|
/// details_for_fire returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Fire &details_for_fire() const; |
|
/// details_for_fire returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Fire &details_for_fire(); |
|
|
|
/// details_for_heliport returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Heliport &details_for_heliport() const; |
|
/// details_for_heliport returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Heliport &details_for_heliport(); |
|
|
|
/// details_for_hospital returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Hospital &details_for_hospital() const; |
|
/// details_for_hospital returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Hospital &details_for_hospital(); |
|
|
|
/// details_for_park returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Park &details_for_park() const; |
|
/// details_for_park returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Park &details_for_park(); |
|
|
|
/// details_for_power_plant returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const PowerPlant &details_for_power_plant() const; |
|
/// details_for_power_plant returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
PowerPlant &details_for_power_plant(); |
|
|
|
/// details_for_prison returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Prison &details_for_prison() const; |
|
/// details_for_prison returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
Prison &details_for_prison(); |
|
|
|
/// details_for_school returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const School &details_for_school() const; |
|
/// details_for_school returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
School &details_for_school(); |
|
|
|
/// details_for_special_use_airspace returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const SpecialUseAirspace &details_for_special_use_airspace() const; |
|
/// details_for_special_use_airspace returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
SpecialUseAirspace &details_for_special_use_airspace(); |
|
|
|
/// details_for_temporary_flight_restriction returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const TemporaryFlightRestriction &details_for_temporary_flight_restriction() const; |
|
/// details_for_temporary_flight_restriction returns a mutable reference to the details |
|
/// further describing this airspace instance. |
|
TemporaryFlightRestriction &details_for_temporary_flight_restriction(); |
|
|
|
/// details_for_wildfire returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
const Wildfire &details_for_wildfire() const; |
|
/// details_for_wildfire returns an immutable reference to the details |
|
/// further describing this airspace instance. |
|
Wildfire &details_for_wildfire(); |
|
|
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Airspace &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Airport &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const ControlledAirspace &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const SpecialUseAirspace &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const TemporaryFlightRestriction &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Wildfire &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Park &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const PowerPlant &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Heliport &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Prison &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const School &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Hospital &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Fire &detail); |
|
/// set_details adjusts the details of this airspace instance to 'detail'. |
|
void set_details(const Emergency &detail); |
|
|
|
private: |
|
struct Invalid {}; |
|
|
|
union Details { |
|
Details(); |
|
~Details(); |
|
|
|
Invalid invalid; |
|
Airport airport; |
|
ControlledAirspace controlled_airspace; |
|
Emergency emergency; |
|
Fire fire; |
|
Heliport heliport; |
|
Hospital hospital; |
|
Park park; |
|
PowerPlant power_plant; |
|
Prison prison; |
|
School school; |
|
SpecialUseAirspace special_use_airspace; |
|
TemporaryFlightRestriction tfr; |
|
Wildfire wildfire; |
|
}; |
|
|
|
void reset(); |
|
|
|
Id id_; |
|
std::string name_; |
|
Type type_; |
|
std::string country_; // TODO(tvoss): Investigate constraints on country names. |
|
std::string state_; // TODO(tvoss): Investigate constraints on state names. |
|
std::string city_; |
|
Timestamp last_updated_; |
|
Geometry geometry_; |
|
std::map<std::string, RelatedGeometry> related_geometries_; |
|
std::vector<Rule> rules_; |
|
Details details_; |
|
}; |
|
|
|
/// @cond |
|
bool operator==(const Airspace::RelatedGeometry &lhs, const Airspace::RelatedGeometry &rhs); |
|
bool operator==(const Airspace::Airport &lhs, const Airspace::Airport &rhs); |
|
bool operator==(const Airspace::Airport::Runway &lhs, const Airspace::Airport::Runway &rhs); |
|
bool operator==(const Airspace::ControlledAirspace &lhs, const Airspace::ControlledAirspace &rhs); |
|
bool operator==(const Airspace::SpecialUseAirspace &lhs, const Airspace::SpecialUseAirspace &rhs); |
|
bool operator==(const Airspace::TemporaryFlightRestriction &lhs, const Airspace::TemporaryFlightRestriction &rhs); |
|
bool operator==(const Airspace::Wildfire &lhs, const Airspace::Wildfire &rhs); |
|
bool operator==(const Airspace::Park &lhs, const Airspace::Park &rhs); |
|
bool operator==(const Airspace::Prison &lhs, const Airspace::Prison &rhs); |
|
bool operator==(const Airspace::School &lhs, const Airspace::School &rhs); |
|
bool operator==(const Airspace::Hospital &lhs, const Airspace::Hospital &rhs); |
|
bool operator==(const Airspace::Fire &lhs, const Airspace::Fire &rhs); |
|
bool operator==(const Airspace::Emergency &lhs, const Airspace::Emergency &rhs); |
|
bool operator==(const Airspace::Heliport &lhs, const Airspace::Heliport &rhs); |
|
bool operator==(const Airspace::PowerPlant &lhs, const Airspace::PowerPlant &rhs); |
|
|
|
Airspace::Type operator~(Airspace::Type); |
|
Airspace::Type operator|(Airspace::Type, Airspace::Type); |
|
Airspace::Type operator&(Airspace::Type, Airspace::Type); |
|
|
|
std::ostream &operator<<(std::ostream &, const Airspace &); |
|
std::ostream &operator<<(std::ostream &, Airspace::Type); |
|
/// @endcond |
|
|
|
} // namespace airmap |
|
|
|
#endif // AIRMAP_AIRSPACE_H_
|
|
|