~sil2100/location-service/gps-arm64

« back to all changes in this revision

Viewing changes to src/location_service/com/ubuntu/location/position.cpp

  • Committer: Thomas Voß
  • Date: 2013-05-28 14:20:45 UTC
  • Revision ID: thomas.voss@canonical.com-20130528142045-kq5umqdmm4o53vwk
Initial push.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "com/ubuntu/location/position.h"
 
2
 
 
3
#include <bitset>
 
4
#include <ostream>
 
5
 
 
6
namespace cul = com::ubuntu::location;
 
7
 
 
8
cul::Position::Position() : fields{Flags("000"), wgs84::Latitude{}, wgs84::Longitude{}, wgs84::Altitude{}}
 
9
{
 
10
}
 
11
 
 
12
cul::Position::Position(
 
13
    const cul::wgs84::Latitude& latitude,
 
14
    const cul::wgs84::Longitude& longitude)
 
15
        : fields{Flags("011"), latitude, longitude, wgs84::Altitude{}}
 
16
{
 
17
}          
 
18
 
 
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}
 
24
{
 
25
}
 
26
 
 
27
bool cul::Position::operator==(const cul::Position& rhs) const
 
28
{
 
29
    return fields.latitude == rhs.fields.latitude && fields.longitude == rhs.fields.longitude && fields.altitude == rhs.fields.altitude;
 
30
}
 
31
 
 
32
bool cul::Position::operator!=(const cul::Position& rhs) const
 
33
{
 
34
    return !(fields.latitude == rhs.fields.latitude && fields.longitude == rhs.fields.longitude && fields.altitude == rhs.fields.altitude);
 
35
}
 
36
 
 
37
const cul::Position::Flags& cul::Position::flags() const
 
38
{
 
39
    return fields.flags;
 
40
}
 
41
 
 
42
bool cul::Position::has_latitude() const
 
43
{
 
44
    return fields.flags.test(latitude_flag);
 
45
}
 
46
 
 
47
cul::Position& cul::Position::latitude(const cul::wgs84::Latitude& lat)
 
48
{
 
49
    fields.flags.set(latitude_flag);
 
50
    fields.latitude = lat;
 
51
    return *this;
 
52
}
 
53
 
 
54
const cul::wgs84::Latitude& cul::Position::latitude() const
 
55
{
 
56
    return fields.latitude;
 
57
}
 
58
 
 
59
bool cul::Position::has_longitude() const
 
60
{
 
61
    return fields.flags.test(longitude_flag);
 
62
}
 
63
 
 
64
cul::Position& cul::Position::longitude(const cul::wgs84::Longitude& lon)
 
65
{
 
66
    fields.flags.set(longitude_flag);
 
67
    fields.longitude = lon;
 
68
    return *this;
 
69
}
 
70
 
 
71
const cul::wgs84::Longitude& cul::Position::longitude() const
 
72
{
 
73
    return fields.longitude;
 
74
}
 
75
 
 
76
bool cul::Position::has_altitude() const
 
77
{
 
78
    return fields.flags.test(altitude_flag);
 
79
}
 
80
 
 
81
cul::Position& cul::Position::altitude(const cul::wgs84::Altitude& alt)
 
82
{
 
83
    fields.flags.set(altitude_flag);
 
84
    fields.altitude = alt;
 
85
    return *this;
 
86
}
 
87
 
 
88
const cul::wgs84::Altitude& cul::Position::altitude() const
 
89
{
 
90
    return fields.altitude;
 
91
}
 
92
 
 
93
std::ostream& cul::operator<<(std::ostream& out, const cul::Position& position)
 
94
{
 
95
    out << "Position(" << position.latitude() << ", " << position.longitude() << ", " << position.altitude() << ")";
 
96
    return out;
 
97
}
 
98
 
 
99
cul::units::Quantity<cul::units::Length> cul::haversine_distance(const cul::Position& p1, const cul::Position& p2)
 
100
{
 
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();
 
104
    auto a =
 
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);
 
107
 
 
108
    auto c = 2. * std::atan2(std::sqrt(a), std::sqrt(1.-a));
 
109
    return radius_of_earth * c;
 
110
}
 
 
b'\\ No newline at end of file'