source: subversion/applications/lib/ccoord/LatLng.cpp @ 34562

Last change on this file since 34562 was 2097, checked in by nick, 13 years ago

updated libosm

File size: 2.4 KB
Line 
1#include "LatLng.h"
2#include "OSRef.h"
3#include "util.h"
4#include "RefEll.h"
5#include <cmath>
6
7// Based on Jonathan Stott's JCoord.
8// Licenced under the GNU GPL.
9
10OSRef LatLng::toOSRef()
11  {
12    RefEll airy1830 (6377563.396, 6356256.909);
13    double OSGB_F0 = 0.9996012717;
14    double N0 = -100000.0;
15    double E0 = 400000.0;
16    double phi0 = toRadians(49.0);
17    double lambda0 = toRadians(-2.0);
18    double a = airy1830.getMaj();
19    double b = airy1830.getMin();
20    double eSquared = airy1830.getEcc();
21    double phi = toRadians(getLat());
22    double lambda = toRadians(getLng());
23    double E = 0.0;
24    double N = 0.0;
25    double n = (a - b) / (a + b);
26    double v =
27        a * OSGB_F0 * pow(1.0 - eSquared * sinSquared(phi), -0.5);
28    double rho =
29        a * OSGB_F0 * (1.0 - eSquared)
30            * pow(1.0 - eSquared * sinSquared(phi), -1.5);
31    double etaSquared = (v / rho) - 1.0;
32    double M =
33        (b * OSGB_F0)
34            * (((1 + n + ((5.0 / 4.0) * n * n) + ((5.0 / 4.0) * n * n * n)) * (phi - phi0))
35                - (((3 * n) + (3 * n * n) + ((21.0 / 8.0) * n * n * n))
36                    * sin(phi - phi0) * cos(phi + phi0))
37                + ((((15.0 / 8.0) * n * n) + ((15.0 / 8.0) * n * n * n))
38                    * sin(2.0 * (phi - phi0)) * 
39                    cos(2.0 * (phi + phi0))) - (((35.0 / 24.0) * n * n * n)
40                * sin(3.0 * (phi - phi0)) * cos(3.0 * (phi + phi0))));
41    double I = M + N0;
42    double II = (v / 2.0) * sin(phi) * cos(phi);
43    double III =
44        (v / 24.0) * sin(phi) * pow(cos(phi), 3.0)
45            * (5.0 - tanSquared(phi) + (9.0 * etaSquared));
46    double IIIA =
47        (v / 720.0)
48            * sin(phi)
49            * pow(cos(phi), 5.0)
50            * (61.0 - (58.0 * tanSquared(phi)) + pow(tan(phi),
51                4.0));
52    double IV = v * cos(phi);
53    double V =
54        (v / 6.0) * pow(cos(phi), 3.0)
55            * ((v / rho) - tanSquared(phi));
56    double VI =
57        (v / 120.0)
58            * pow(cos(phi), 5.0)
59            * (5.0 - (18.0 * tanSquared(phi))
60                + (pow(tan(phi), 4.0)) + (14 * etaSquared) - (58 * 
61                tanSquared(phi) * etaSquared));
62
63    N =
64        I + (II * pow(lambda - lambda0, 2.0))
65            + (III * pow(lambda - lambda0, 4.0))
66            + (IIIA * pow(lambda - lambda0, 6.0));
67    E =
68        E0 + (IV * (lambda - lambda0)) + (V * pow(lambda - lambda0, 3.0))
69            + (VI * pow(lambda - lambda0, 5.0));
70
71    return OSRef(E, N);
72  }
Note: See TracBrowser for help on using the repository browser.