3 #include "../Constants.h"
9 namespace albers_equal_area {
11 namespace constants = ::applications::exahype2::swe;
23 inline auto forward(
const auto lon,
const auto lat) {
24 constexpr
auto lon0 = constants::aeaLon0;
25 constexpr
auto lat0 = constants::aeaLat0;
26 constexpr
auto stdParallel1 = constants::aeaStdParallel1;
27 constexpr
auto stdParallel2 = constants::aeaStdParallel2;
28 constexpr
auto R = constants::aeaEarthRadius;
30 constexpr
auto toRad = M_PI / 180.0;
32 constexpr
auto stdParallel1Rad = stdParallel1 * toRad;
33 constexpr
auto stdParallel2Rad = stdParallel2 * toRad;
34 constexpr
auto lat0Rad = lat0 * toRad;
35 constexpr
auto lon0Rad = lon0 * toRad;
37 const auto lonRad = lon * toRad;
38 const auto latRad = lat * toRad;
40 static const auto n = (std::sin(stdParallel1Rad) + std::sin(stdParallel2Rad)) / 2;
41 static const auto C = (std::cos(stdParallel1Rad) * std::cos(stdParallel1Rad))
42 + (2 * n * std::sin(stdParallel1Rad));
43 static const auto p0 = R * std::sqrt(C - (2 * n * std::sin(lat0Rad))) / n;
45 const auto p = R * std::sqrt(C - (2 * n * std::sin(latRad))) / n;
46 const auto theta = n * (lonRad - lon0Rad);
48 const auto x =
p * std::sin(theta);
49 const auto y = p0 - (
p * std::cos(theta));
51 return std::pair{
x,
y};
65 constexpr
auto lon0 = constants::aeaLon0;
66 constexpr
auto lat0 = constants::aeaLat0;
67 constexpr
auto stdParallel1 = constants::aeaStdParallel1;
68 constexpr
auto stdParallel2 = constants::aeaStdParallel2;
69 constexpr
auto R = constants::aeaEarthRadius;
71 constexpr
auto toRad = M_PI / 180.0;
73 constexpr
auto stdParallel1Rad = stdParallel1 * toRad;
74 constexpr
auto stdParallel2Rad = stdParallel2 * toRad;
75 constexpr
auto lat0Rad = lat0 * toRad;
76 constexpr
auto lon0Rad = lon0 * toRad;
78 static const auto n = (std::sin(stdParallel1Rad) + std::sin(stdParallel2Rad)) / 2;
79 static const auto C = (std::cos(stdParallel1Rad) * std::cos(stdParallel1Rad))
80 + (2 * n * std::sin(stdParallel1Rad));
81 static const auto p0 = R * std::sqrt(C - (2 * n * std::sin(lat0Rad))) / n;
83 const auto p = std::sqrt((
x *
x) + ((p0 -
y) * (p0 -
y)));
84 const auto theta = std::atan2(
x, p0 -
y);
86 const auto lat = std::asin((C - ((
p * n / R) * (
p * n / R))) / (2 * n));
87 const auto lon = lon0Rad + (theta / n);
89 return std::pair{lon / toRad, lat / toRad};
auto forward(const auto lon, const auto lat)
Projects geographic coordinates (longitude, latitude) onto a planar surface using the Albers Equal-Ar...
auto inverse(const auto x, const auto y)
Inverts the spherical Albers Equal-Area Conic projection and returns the geographic coordinates (long...