1
#include "com/ubuntu/location/position.h"
6
namespace cul = com::ubuntu::location;
8
cul::Position::Position() : fields{Flags("000"), wgs84::Latitude{}, wgs84::Longitude{}, wgs84::Altitude{}}
12
cul::Position::Position(
13
const cul::wgs84::Latitude& latitude,
14
const cul::wgs84::Longitude& longitude)
15
: fields{Flags("011"), latitude, longitude, wgs84::Altitude{}}
19
cul::Position::Position(
20
const cul::wgs84::Latitude& latitude,
21
const cul::wgs84::Longitude& longitude,
22
const cul::wgs84::Altitude& altitude)
23
: fields{Flags{"111"}, latitude, longitude, altitude}
27
bool cul::Position::operator==(const cul::Position& rhs) const
29
return fields.latitude == rhs.fields.latitude && fields.longitude == rhs.fields.longitude && fields.altitude == rhs.fields.altitude;
32
bool cul::Position::operator!=(const cul::Position& rhs) const
34
return !(fields.latitude == rhs.fields.latitude && fields.longitude == rhs.fields.longitude && fields.altitude == rhs.fields.altitude);
37
const cul::Position::Flags& cul::Position::flags() const
42
bool cul::Position::has_latitude() const
44
return fields.flags.test(latitude_flag);
47
cul::Position& cul::Position::latitude(const cul::wgs84::Latitude& lat)
49
fields.flags.set(latitude_flag);
50
fields.latitude = lat;
54
const cul::wgs84::Latitude& cul::Position::latitude() const
56
return fields.latitude;
59
bool cul::Position::has_longitude() const
61
return fields.flags.test(longitude_flag);
64
cul::Position& cul::Position::longitude(const cul::wgs84::Longitude& lon)
66
fields.flags.set(longitude_flag);
67
fields.longitude = lon;
71
const cul::wgs84::Longitude& cul::Position::longitude() const
73
return fields.longitude;
76
bool cul::Position::has_altitude() const
78
return fields.flags.test(altitude_flag);
81
cul::Position& cul::Position::altitude(const cul::wgs84::Altitude& alt)
83
fields.flags.set(altitude_flag);
84
fields.altitude = alt;
88
const cul::wgs84::Altitude& cul::Position::altitude() const
90
return fields.altitude;
93
std::ostream& cul::operator<<(std::ostream& out, const cul::Position& position)
95
out << "Position(" << position.latitude() << ", " << position.longitude() << ", " << position.altitude() << ")";
99
cul::units::Quantity<cul::units::Length> cul::haversine_distance(const cul::Position& p1, const cul::Position& p2)
101
static const units::Quantity<units::Length> radius_of_earth {6371 * units::kilo* units::Meters};
102
auto dLat = p2.latitude() - p1.latitude();
103
auto dLon = p2.longitude() - p1.longitude();
105
std::pow(units::sin(dLat.value/2.), 2) +
106
std::pow(units::sin(dLon.value/2.), 2) * units::cos(p1.latitude().value) * units::cos(p2.latitude().value);
108
auto c = 2. * std::atan2(std::sqrt(a), std::sqrt(1.-a));
109
return radius_of_earth * c;
b'\\ No newline at end of file'