geographiclib 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +12 -0
  3. data/LICENSE +24 -0
  4. data/ext/geographiclib/Accumulator.cpp +23 -0
  5. data/ext/geographiclib/AlbersEqualArea.cpp +445 -0
  6. data/ext/geographiclib/AzimuthalEquidistant.cpp +41 -0
  7. data/ext/geographiclib/CassiniSoldner.cpp +89 -0
  8. data/ext/geographiclib/CircularEngine.cpp +96 -0
  9. data/ext/geographiclib/DMS.cpp +381 -0
  10. data/ext/geographiclib/Ellipsoid.cpp +125 -0
  11. data/ext/geographiclib/EllipticFunction.cpp +512 -0
  12. data/ext/geographiclib/GARS.cpp +122 -0
  13. data/ext/geographiclib/GeoCoords.cpp +175 -0
  14. data/ext/geographiclib/Geocentric.cpp +172 -0
  15. data/ext/geographiclib/Geodesic.cpp +1908 -0
  16. data/ext/geographiclib/GeodesicExact.cpp +927 -0
  17. data/ext/geographiclib/GeodesicExactC4.cpp +7879 -0
  18. data/ext/geographiclib/GeodesicLine.cpp +321 -0
  19. data/ext/geographiclib/GeodesicLineExact.cpp +289 -0
  20. data/ext/geographiclib/GeographicLib/Accumulator.hpp +184 -0
  21. data/ext/geographiclib/GeographicLib/AlbersEqualArea.hpp +312 -0
  22. data/ext/geographiclib/GeographicLib/AzimuthalEquidistant.hpp +139 -0
  23. data/ext/geographiclib/GeographicLib/CassiniSoldner.hpp +204 -0
  24. data/ext/geographiclib/GeographicLib/CircularEngine.hpp +195 -0
  25. data/ext/geographiclib/GeographicLib/Config.h +12 -0
  26. data/ext/geographiclib/GeographicLib/Constants.hpp +387 -0
  27. data/ext/geographiclib/GeographicLib/DMS.hpp +370 -0
  28. data/ext/geographiclib/GeographicLib/Ellipsoid.hpp +534 -0
  29. data/ext/geographiclib/GeographicLib/EllipticFunction.hpp +692 -0
  30. data/ext/geographiclib/GeographicLib/GARS.hpp +143 -0
  31. data/ext/geographiclib/GeographicLib/GeoCoords.hpp +544 -0
  32. data/ext/geographiclib/GeographicLib/Geocentric.hpp +267 -0
  33. data/ext/geographiclib/GeographicLib/Geodesic.hpp +970 -0
  34. data/ext/geographiclib/GeographicLib/GeodesicExact.hpp +862 -0
  35. data/ext/geographiclib/GeographicLib/GeodesicLine.hpp +701 -0
  36. data/ext/geographiclib/GeographicLib/GeodesicLineExact.hpp +667 -0
  37. data/ext/geographiclib/GeographicLib/Geohash.hpp +180 -0
  38. data/ext/geographiclib/GeographicLib/Geoid.hpp +472 -0
  39. data/ext/geographiclib/GeographicLib/Georef.hpp +160 -0
  40. data/ext/geographiclib/GeographicLib/Gnomonic.hpp +206 -0
  41. data/ext/geographiclib/GeographicLib/GravityCircle.hpp +301 -0
  42. data/ext/geographiclib/GeographicLib/GravityModel.hpp +520 -0
  43. data/ext/geographiclib/GeographicLib/LambertConformalConic.hpp +313 -0
  44. data/ext/geographiclib/GeographicLib/LocalCartesian.hpp +236 -0
  45. data/ext/geographiclib/GeographicLib/MGRS.hpp +355 -0
  46. data/ext/geographiclib/GeographicLib/MagneticCircle.hpp +178 -0
  47. data/ext/geographiclib/GeographicLib/MagneticModel.hpp +347 -0
  48. data/ext/geographiclib/GeographicLib/Math.hpp +920 -0
  49. data/ext/geographiclib/GeographicLib/NormalGravity.hpp +350 -0
  50. data/ext/geographiclib/GeographicLib/OSGB.hpp +249 -0
  51. data/ext/geographiclib/GeographicLib/PolarStereographic.hpp +150 -0
  52. data/ext/geographiclib/GeographicLib/PolygonArea.hpp +288 -0
  53. data/ext/geographiclib/GeographicLib/Rhumb.hpp +589 -0
  54. data/ext/geographiclib/GeographicLib/SphericalEngine.hpp +376 -0
  55. data/ext/geographiclib/GeographicLib/SphericalHarmonic.hpp +354 -0
  56. data/ext/geographiclib/GeographicLib/SphericalHarmonic1.hpp +281 -0
  57. data/ext/geographiclib/GeographicLib/SphericalHarmonic2.hpp +315 -0
  58. data/ext/geographiclib/GeographicLib/TransverseMercator.hpp +196 -0
  59. data/ext/geographiclib/GeographicLib/TransverseMercatorExact.hpp +254 -0
  60. data/ext/geographiclib/GeographicLib/UTMUPS.hpp +421 -0
  61. data/ext/geographiclib/GeographicLib/Utility.hpp +612 -0
  62. data/ext/geographiclib/Geohash.cpp +102 -0
  63. data/ext/geographiclib/Geoid.cpp +509 -0
  64. data/ext/geographiclib/Georef.cpp +135 -0
  65. data/ext/geographiclib/Gnomonic.cpp +85 -0
  66. data/ext/geographiclib/GravityCircle.cpp +129 -0
  67. data/ext/geographiclib/GravityModel.cpp +360 -0
  68. data/ext/geographiclib/LambertConformalConic.cpp +456 -0
  69. data/ext/geographiclib/LocalCartesian.cpp +62 -0
  70. data/ext/geographiclib/MGRS.cpp +461 -0
  71. data/ext/geographiclib/MagneticCircle.cpp +52 -0
  72. data/ext/geographiclib/MagneticModel.cpp +269 -0
  73. data/ext/geographiclib/Math.cpp +63 -0
  74. data/ext/geographiclib/NormalGravity.cpp +262 -0
  75. data/ext/geographiclib/OSGB.cpp +167 -0
  76. data/ext/geographiclib/PolarStereographic.cpp +108 -0
  77. data/ext/geographiclib/PolygonArea.cpp +204 -0
  78. data/ext/geographiclib/Rhumb.cpp +383 -0
  79. data/ext/geographiclib/SphericalEngine.cpp +477 -0
  80. data/ext/geographiclib/TransverseMercator.cpp +603 -0
  81. data/ext/geographiclib/TransverseMercatorExact.cpp +464 -0
  82. data/ext/geographiclib/UTMUPS.cpp +296 -0
  83. data/ext/geographiclib/Utility.cpp +61 -0
  84. data/ext/geographiclib/extconf.rb +3 -0
  85. data/ext/geographiclib/geographiclib.cpp +62 -0
  86. data/lib/geographiclib.rb +20 -0
  87. metadata +140 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * \file Georef.hpp
3
+ * \brief Header for GeographicLib::Georef class
4
+ *
5
+ * Copyright (c) Charles Karney (2015) <charles@karney.com> and licensed under
6
+ * the MIT/X11 License. For more information, see
7
+ * http://geographiclib.sourceforge.net/
8
+ **********************************************************************/
9
+
10
+ #if !defined(GEOGRAPHICLIB_GEOREF_HPP)
11
+ #define GEOGRAPHICLIB_GEOREF_HPP 1
12
+
13
+ #include <GeographicLib/Constants.hpp>
14
+
15
+ #if defined(_MSC_VER)
16
+ // Squelch warnings about dll vs string
17
+ # pragma warning (push)
18
+ # pragma warning (disable: 4251)
19
+ #endif
20
+
21
+ namespace GeographicLib {
22
+
23
+ /**
24
+ * \brief Conversions for the World Geographic Reference System (georef)
25
+ *
26
+ * The World Geographic Reference System is described in
27
+ * - https://en.wikipedia.org/wiki/Georef
28
+ * - http://earth-info.nga.mil/GandG/coordsys/grids/georef.pdf
29
+ * .
30
+ * It provides a compact string representation of a geographic area
31
+ * (expressed as latitude and longitude). The classes GARS and Geohash
32
+ * implement similar compact representations.
33
+ *
34
+ * Example of use:
35
+ * \include example-Georef.cpp
36
+ **********************************************************************/
37
+
38
+ class GEOGRAPHICLIB_EXPORT Georef {
39
+ private:
40
+ typedef Math::real real;
41
+ static const std::string digits_;
42
+ static const std::string lontile_;
43
+ static const std::string lattile_;
44
+ static const std::string degrees_;
45
+ enum {
46
+ tile_ = 15, // The size of tile in degrees
47
+ lonorig_ = -180, // Origin for longitude
48
+ latorig_ = -90, // Origin for latitude
49
+ base_ = 10, // Base for minutes
50
+ baselen_ = 4,
51
+ maxprec_ = 11, // approximately equivalent to MGRS class
52
+ maxlen_ = baselen_ + 2 * maxprec_,
53
+ };
54
+ Georef(); // Disable constructor
55
+
56
+ public:
57
+
58
+ /**
59
+ * Convert from geographic coordinates to georef.
60
+ *
61
+ * @param[in] lat latitude of point (degrees).
62
+ * @param[in] lon longitude of point (degrees).
63
+ * @param[in] prec the precision of the resulting georef.
64
+ * @param[out] georef the georef string.
65
+ * @exception GeographicErr if \e lat is not in [&minus;90&deg;,
66
+ * 90&deg;].
67
+ * @exception std::bad_alloc if memory for \e georef can't be allocated.
68
+ *
69
+ * \e prec specifies the precision of \e georef as follows:
70
+ * - \e prec = &minus;1 (min), 15&deg;
71
+ * - \e prec = 0, 1&deg;
72
+ * - \e prec = 1, converted to \e prec = 2
73
+ * - \e prec = 2, 1'
74
+ * - \e prec = 3, 0.1'
75
+ * - \e prec = 4, 0.01'
76
+ * - \e prec = 5, 0.001'
77
+ * - &hellip;
78
+ * - \e prec = 11 (max), 10<sup>&minus;9</sup>'
79
+ *
80
+ * If \e lat or \e lon is NaN, then \e georef is set to "INVALID".
81
+ **********************************************************************/
82
+ static void Forward(real lat, real lon, int prec, std::string& georef);
83
+
84
+ /**
85
+ * Convert from Georef to geographic coordinates.
86
+ *
87
+ * @param[in] georef the Georef.
88
+ * @param[out] lat latitude of point (degrees).
89
+ * @param[out] lon longitude of point (degrees).
90
+ * @param[out] prec the precision of \e georef.
91
+ * @param[in] centerp if true (the default) return the center
92
+ * \e georef, otherwise return the south-west corner.
93
+ * @exception GeographicErr if \e georef is illegal.
94
+ *
95
+ * The case of the letters in \e georef is ignored. \e prec is in the
96
+ * range [&minus;1, 11] and gives the precision of \e georef as follows:
97
+ * - \e prec = &minus;1 (min), 15&deg;
98
+ * - \e prec = 0, 1&deg;
99
+ * - \e prec = 1, not returned
100
+ * - \e prec = 2, 1'
101
+ * - \e prec = 3, 0.1'
102
+ * - \e prec = 4, 0.01'
103
+ * - \e prec = 5, 0.001'
104
+ * - &hellip;
105
+ * - \e prec = 11 (max), 10<sup>&minus;9</sup>'
106
+ *
107
+ * If the first 3 characters of \e georef are "INV", then \e lat and \e lon
108
+ * are set to NaN and \e prec is unchanged.
109
+ **********************************************************************/
110
+ static void Reverse(const std::string& georef, real& lat, real& lon,
111
+ int& prec, bool centerp = true);
112
+
113
+ /**
114
+ * The angular resolution of a Georef.
115
+ *
116
+ * @param[in] prec the precision of the Georef.
117
+ * @return the latitude-longitude resolution (degrees).
118
+ *
119
+ * Internally, \e prec is first put in the range [&minus;1, 11].
120
+ **********************************************************************/
121
+ static Math::real Resolution(int prec) {
122
+ if (prec < 1)
123
+ return real(prec < 0 ? 15 : 1);
124
+ else {
125
+ using std::pow;
126
+ // Treat prec = 1 as 2.
127
+ prec = (std::max)(2, (std::min)(int(maxprec_), prec));
128
+ return 1/(60 * pow(real(base_), prec - 2));
129
+ }
130
+ }
131
+
132
+ /**
133
+ * The Georef precision required to meet a given geographic resolution.
134
+ *
135
+ * @param[in] res the minimum of resolution in latitude and longitude
136
+ * (degrees).
137
+ * @return Georef precision.
138
+ *
139
+ * The returned length is in the range [0, 11].
140
+ **********************************************************************/
141
+ static int Precision(real res) {
142
+ using std::abs; res = abs(res);
143
+ for (int prec = 0; prec < maxprec_; ++prec) {
144
+ if (prec == 1)
145
+ continue;
146
+ if (Resolution(prec) <= res)
147
+ return prec;
148
+ }
149
+ return maxprec_;
150
+ }
151
+
152
+ };
153
+
154
+ } // namespace GeographicLib
155
+
156
+ #if defined(_MSC_VER)
157
+ # pragma warning (pop)
158
+ #endif
159
+
160
+ #endif // GEOGRAPHICLIB_GEOREF_HPP
@@ -0,0 +1,206 @@
1
+ /**
2
+ * \file Gnomonic.hpp
3
+ * \brief Header for GeographicLib::Gnomonic class
4
+ *
5
+ * Copyright (c) Charles Karney (2010-2015) <charles@karney.com> and licensed
6
+ * under the MIT/X11 License. For more information, see
7
+ * http://geographiclib.sourceforge.net/
8
+ **********************************************************************/
9
+
10
+ #if !defined(GEOGRAPHICLIB_GNOMONIC_HPP)
11
+ #define GEOGRAPHICLIB_GNOMONIC_HPP 1
12
+
13
+ #include <GeographicLib/Geodesic.hpp>
14
+ #include <GeographicLib/GeodesicLine.hpp>
15
+ #include <GeographicLib/Constants.hpp>
16
+
17
+ namespace GeographicLib {
18
+
19
+ /**
20
+ * \brief %Gnomonic projection
21
+ *
22
+ * %Gnomonic projection centered at an arbitrary position \e C on the
23
+ * ellipsoid. This projection is derived in Section 8 of
24
+ * - C. F. F. Karney,
25
+ * <a href="https://dx.doi.org/10.1007/s00190-012-0578-z">
26
+ * Algorithms for geodesics</a>,
27
+ * J. Geodesy <b>87</b>, 43--55 (2013);
28
+ * DOI: <a href="https://dx.doi.org/10.1007/s00190-012-0578-z">
29
+ * 10.1007/s00190-012-0578-z</a>;
30
+ * addenda: <a href="http://geographiclib.sourceforge.net/geod-addenda.html">
31
+ * geod-addenda.html</a>.
32
+ * .
33
+ * The projection of \e P is defined as follows: compute the geodesic line
34
+ * from \e C to \e P; compute the reduced length \e m12, geodesic scale \e
35
+ * M12, and &rho; = <i>m12</i>/\e M12; finally \e x = &rho; sin \e azi1; \e
36
+ * y = &rho; cos \e azi1, where \e azi1 is the azimuth of the geodesic at \e
37
+ * C. The Gnomonic::Forward and Gnomonic::Reverse methods also return the
38
+ * azimuth \e azi of the geodesic at \e P and reciprocal scale \e rk in the
39
+ * azimuthal direction. The scale in the radial direction if
40
+ * 1/<i>rk</i><sup>2</sup>.
41
+ *
42
+ * For a sphere, &rho; is reduces to \e a tan(<i>s12</i>/<i>a</i>), where \e
43
+ * s12 is the length of the geodesic from \e C to \e P, and the gnomonic
44
+ * projection has the property that all geodesics appear as straight lines.
45
+ * For an ellipsoid, this property holds only for geodesics interesting the
46
+ * centers. However geodesic segments close to the center are approximately
47
+ * straight.
48
+ *
49
+ * Consider a geodesic segment of length \e l. Let \e T be the point on the
50
+ * geodesic (extended if necessary) closest to \e C the center of the
51
+ * projection and \e t be the distance \e CT. To lowest order, the maximum
52
+ * deviation (as a true distance) of the corresponding gnomonic line segment
53
+ * (i.e., with the same end points) from the geodesic is<br>
54
+ * <br>
55
+ * (<i>K</i>(<i>T</i>) - <i>K</i>(<i>C</i>))
56
+ * <i>l</i><sup>2</sup> \e t / 32.<br>
57
+ * <br>
58
+ * where \e K is the Gaussian curvature.
59
+ *
60
+ * This result applies for any surface. For an ellipsoid of revolution,
61
+ * consider all geodesics whose end points are within a distance \e r of \e
62
+ * C. For a given \e r, the deviation is maximum when the latitude of \e C
63
+ * is 45&deg;, when endpoints are a distance \e r away, and when their
64
+ * azimuths from the center are &plusmn; 45&deg; or &plusmn; 135&deg;.
65
+ * To lowest order in \e r and the flattening \e f, the deviation is \e f
66
+ * (<i>r</i>/2<i>a</i>)<sup>3</sup> \e r.
67
+ *
68
+ * The conversions all take place using a Geodesic object (by default
69
+ * Geodesic::WGS84()). For more information on geodesics see \ref geodesic.
70
+ *
71
+ * <b>CAUTION:</b> The definition of this projection for a sphere is
72
+ * standard. However, there is no standard for how it should be extended to
73
+ * an ellipsoid. The choices are:
74
+ * - Declare that the projection is undefined for an ellipsoid.
75
+ * - Project to a tangent plane from the center of the ellipsoid. This
76
+ * causes great ellipses to appear as straight lines in the projection;
77
+ * i.e., it generalizes the spherical great circle to a great ellipse.
78
+ * This was proposed by independently by Bowring and Williams in 1997.
79
+ * - Project to the conformal sphere with the constant of integration chosen
80
+ * so that the values of the latitude match for the center point and
81
+ * perform a central projection onto the plane tangent to the conformal
82
+ * sphere at the center point. This causes normal sections through the
83
+ * center point to appear as straight lines in the projection; i.e., it
84
+ * generalizes the spherical great circle to a normal section. This was
85
+ * proposed by I. G. Letoval'tsev, Generalization of the gnomonic
86
+ * projection for a spheroid and the principal geodetic problems involved
87
+ * in the alignment of surface routes, Geodesy and Aerophotography (5),
88
+ * 271--274 (1963).
89
+ * - The projection given here. This causes geodesics close to the center
90
+ * point to appear as straight lines in the projection; i.e., it
91
+ * generalizes the spherical great circle to a geodesic.
92
+ *
93
+ * Example of use:
94
+ * \include example-Gnomonic.cpp
95
+ *
96
+ * <a href="GeodesicProj.1.html">GeodesicProj</a> is a command-line utility
97
+ * providing access to the functionality of AzimuthalEquidistant, Gnomonic,
98
+ * and CassiniSoldner.
99
+ **********************************************************************/
100
+
101
+ class GEOGRAPHICLIB_EXPORT Gnomonic {
102
+ private:
103
+ typedef Math::real real;
104
+ real eps0_, eps_;
105
+ Geodesic _earth;
106
+ real _a, _f;
107
+ static const int numit_ = 10;
108
+ public:
109
+
110
+ /**
111
+ * Constructor for Gnomonic.
112
+ *
113
+ * @param[in] earth the Geodesic object to use for geodesic calculations.
114
+ * By default this uses the WGS84 ellipsoid.
115
+ **********************************************************************/
116
+ explicit Gnomonic(const Geodesic& earth = Geodesic::WGS84());
117
+
118
+ /**
119
+ * Forward projection, from geographic to gnomonic.
120
+ *
121
+ * @param[in] lat0 latitude of center point of projection (degrees).
122
+ * @param[in] lon0 longitude of center point of projection (degrees).
123
+ * @param[in] lat latitude of point (degrees).
124
+ * @param[in] lon longitude of point (degrees).
125
+ * @param[out] x easting of point (meters).
126
+ * @param[out] y northing of point (meters).
127
+ * @param[out] azi azimuth of geodesic at point (degrees).
128
+ * @param[out] rk reciprocal of azimuthal scale at point.
129
+ *
130
+ * \e lat0 and \e lat should be in the range [&minus;90&deg;, 90&deg;].
131
+ * The scale of the projection is 1/<i>rk</i><sup>2</sup> in the "radial"
132
+ * direction, \e azi clockwise from true north, and is 1/\e rk in the
133
+ * direction perpendicular to this. If the point lies "over the horizon",
134
+ * i.e., if \e rk &le; 0, then NaNs are returned for \e x and \e y (the
135
+ * correct values are returned for \e azi and \e rk). A call to Forward
136
+ * followed by a call to Reverse will return the original (\e lat, \e lon)
137
+ * (to within roundoff) provided the point in not over the horizon.
138
+ **********************************************************************/
139
+ void Forward(real lat0, real lon0, real lat, real lon,
140
+ real& x, real& y, real& azi, real& rk) const;
141
+
142
+ /**
143
+ * Reverse projection, from gnomonic to geographic.
144
+ *
145
+ * @param[in] lat0 latitude of center point of projection (degrees).
146
+ * @param[in] lon0 longitude of center point of projection (degrees).
147
+ * @param[in] x easting of point (meters).
148
+ * @param[in] y northing of point (meters).
149
+ * @param[out] lat latitude of point (degrees).
150
+ * @param[out] lon longitude of point (degrees).
151
+ * @param[out] azi azimuth of geodesic at point (degrees).
152
+ * @param[out] rk reciprocal of azimuthal scale at point.
153
+ *
154
+ * \e lat0 should be in the range [&minus;90&deg;, 90&deg;]. \e lat will
155
+ * be in the range [&minus;90&deg;, 90&deg;] and \e lon will be in the
156
+ * range [&minus;180&deg;, 180&deg;). The scale of the projection is
157
+ * 1/<i>rk</i><sup>2</sup> in the "radial" direction, \e azi clockwise from
158
+ * true north, and is 1/\e rk in the direction perpendicular to this. Even
159
+ * though all inputs should return a valid \e lat and \e lon, it's possible
160
+ * that the procedure fails to converge for very large \e x or \e y; in
161
+ * this case NaNs are returned for all the output arguments. A call to
162
+ * Reverse followed by a call to Forward will return the original (\e x, \e
163
+ * y) (to roundoff).
164
+ **********************************************************************/
165
+ void Reverse(real lat0, real lon0, real x, real y,
166
+ real& lat, real& lon, real& azi, real& rk) const;
167
+
168
+ /**
169
+ * Gnomonic::Forward without returning the azimuth and scale.
170
+ **********************************************************************/
171
+ void Forward(real lat0, real lon0, real lat, real lon,
172
+ real& x, real& y) const {
173
+ real azi, rk;
174
+ Forward(lat0, lon0, lat, lon, x, y, azi, rk);
175
+ }
176
+
177
+ /**
178
+ * Gnomonic::Reverse without returning the azimuth and scale.
179
+ **********************************************************************/
180
+ void Reverse(real lat0, real lon0, real x, real y,
181
+ real& lat, real& lon) const {
182
+ real azi, rk;
183
+ Reverse(lat0, lon0, x, y, lat, lon, azi, rk);
184
+ }
185
+
186
+ /** \name Inspector functions
187
+ **********************************************************************/
188
+ ///@{
189
+ /**
190
+ * @return \e a the equatorial radius of the ellipsoid (meters). This is
191
+ * the value inherited from the Geodesic object used in the constructor.
192
+ **********************************************************************/
193
+ Math::real MajorRadius() const { return _earth.MajorRadius(); }
194
+
195
+ /**
196
+ * @return \e f the flattening of the ellipsoid. This is the value
197
+ * inherited from the Geodesic object used in the constructor.
198
+ **********************************************************************/
199
+ Math::real Flattening() const { return _earth.Flattening(); }
200
+ ///@}
201
+
202
+ };
203
+
204
+ } // namespace GeographicLib
205
+
206
+ #endif // GEOGRAPHICLIB_GNOMONIC_HPP
@@ -0,0 +1,301 @@
1
+ /**
2
+ * \file GravityCircle.hpp
3
+ * \brief Header for GeographicLib::GravityCircle class
4
+ *
5
+ * Copyright (c) Charles Karney (2011-2015) <charles@karney.com> and licensed
6
+ * under the MIT/X11 License. For more information, see
7
+ * http://geographiclib.sourceforge.net/
8
+ **********************************************************************/
9
+
10
+ #if !defined(GEOGRAPHICLIB_GRAVITYCIRCLE_HPP)
11
+ #define GEOGRAPHICLIB_GRAVITYCIRCLE_HPP 1
12
+
13
+ #include <vector>
14
+ #include <GeographicLib/Constants.hpp>
15
+ #include <GeographicLib/CircularEngine.hpp>
16
+ #include <GeographicLib/GravityModel.hpp>
17
+
18
+ namespace GeographicLib {
19
+
20
+ /**
21
+ * \brief Gravity on a circle of latitude
22
+ *
23
+ * Evaluate the earth's gravity field on a circle of constant height and
24
+ * latitude. This uses a CircularEngine to pre-evaluate the inner sum of the
25
+ * spherical harmonic sum, allowing the values of the field at several
26
+ * different longitudes to be evaluated rapidly.
27
+ *
28
+ * Use GravityModel::Circle to create a GravityCircle object. (The
29
+ * constructor for this class is private.)
30
+ *
31
+ * See \ref gravityparallel for an example of using GravityCircle (together
32
+ * with OpenMP) to speed up the computation of geoid heights.
33
+ *
34
+ * Example of use:
35
+ * \include example-GravityCircle.cpp
36
+ *
37
+ * <a href="Gravity.1.html">Gravity</a> is a command-line utility providing
38
+ * access to the functionality of GravityModel and GravityCircle.
39
+ **********************************************************************/
40
+
41
+ class GEOGRAPHICLIB_EXPORT GravityCircle {
42
+ private:
43
+ typedef Math::real real;
44
+ enum mask {
45
+ NONE = GravityModel::NONE,
46
+ GRAVITY = GravityModel::GRAVITY,
47
+ DISTURBANCE = GravityModel::DISTURBANCE,
48
+ DISTURBING_POTENTIAL = GravityModel::DISTURBING_POTENTIAL,
49
+ GEOID_HEIGHT = GravityModel::GEOID_HEIGHT,
50
+ SPHERICAL_ANOMALY = GravityModel::SPHERICAL_ANOMALY,
51
+ ALL = GravityModel::ALL,
52
+ };
53
+
54
+ unsigned _caps;
55
+ real _a, _f, _lat, _h, _Z, _Px, _invR, _cpsi, _spsi,
56
+ _cphi, _sphi, _amodel, _GMmodel, _dzonal0,
57
+ _corrmult, _gamma0, _gamma, _frot;
58
+ CircularEngine _gravitational, _disturbing, _correction;
59
+
60
+ GravityCircle(mask caps, real a, real f, real lat, real h,
61
+ real Z, real P, real cphi, real sphi,
62
+ real amodel, real GMmodel, real dzonal0, real corrmult,
63
+ real gamma0, real gamma, real frot,
64
+ const CircularEngine& gravitational,
65
+ const CircularEngine& disturbing,
66
+ const CircularEngine& correction)
67
+ : _caps(caps)
68
+ , _a(a)
69
+ , _f(f)
70
+ , _lat(Math::LatFix(lat))
71
+ , _h(h)
72
+ , _Z(Z)
73
+ , _Px(P)
74
+ , _invR(1 / Math::hypot(_Px, _Z))
75
+ , _cpsi(_Px * _invR)
76
+ , _spsi(_Z * _invR)
77
+ , _cphi(cphi)
78
+ , _sphi(sphi)
79
+ , _amodel(amodel)
80
+ , _GMmodel(GMmodel)
81
+ , _dzonal0(dzonal0)
82
+ , _corrmult(corrmult)
83
+ , _gamma0(gamma0)
84
+ , _gamma(gamma)
85
+ , _frot(frot)
86
+ , _gravitational(gravitational)
87
+ , _disturbing(disturbing)
88
+ , _correction(correction)
89
+ {}
90
+
91
+ friend class GravityModel; // GravityModel calls the private constructor
92
+ Math::real W(real slam, real clam,
93
+ real& gX, real& gY, real& gZ) const;
94
+ Math::real V(real slam, real clam,
95
+ real& gX, real& gY, real& gZ) const;
96
+ Math::real InternalT(real slam, real clam,
97
+ real& deltaX, real& deltaY, real& deltaZ,
98
+ bool gradp, bool correct) const;
99
+ public:
100
+ /**
101
+ * A default constructor for the normal gravity. This sets up an
102
+ * uninitialized object which can be later replaced by the
103
+ * GravityModel::Circle.
104
+ **********************************************************************/
105
+ GravityCircle() : _a(-1) {}
106
+
107
+ /** \name Compute the gravitational field
108
+ **********************************************************************/
109
+ ///@{
110
+ /**
111
+ * Evaluate the gravity.
112
+ *
113
+ * @param[in] lon the geographic longitude (degrees).
114
+ * @param[out] gx the easterly component of the acceleration
115
+ * (m s<sup>&minus;2</sup>).
116
+ * @param[out] gy the northerly component of the acceleration
117
+ * (m s<sup>&minus;2</sup>).
118
+ * @param[out] gz the upward component of the acceleration
119
+ * (m s<sup>&minus;2</sup>); this is usually negative.
120
+ * @return \e W the sum of the gravitational and centrifugal potentials.
121
+ *
122
+ * The function includes the effects of the earth's rotation.
123
+ **********************************************************************/
124
+ Math::real Gravity(real lon, real& gx, real& gy, real& gz) const;
125
+
126
+ /**
127
+ * Evaluate the gravity disturbance vector.
128
+ *
129
+ * @param[in] lon the geographic longitude (degrees).
130
+ * @param[out] deltax the easterly component of the disturbance vector
131
+ * (m s<sup>&minus;2</sup>).
132
+ * @param[out] deltay the northerly component of the disturbance vector
133
+ * (m s<sup>&minus;2</sup>).
134
+ * @param[out] deltaz the upward component of the disturbance vector
135
+ * (m s<sup>&minus;2</sup>).
136
+ * @return \e T the corresponding disturbing potential.
137
+ **********************************************************************/
138
+ Math::real Disturbance(real lon, real& deltax, real& deltay, real& deltaz)
139
+ const;
140
+
141
+ /**
142
+ * Evaluate the geoid height.
143
+ *
144
+ * @param[in] lon the geographic longitude (degrees).
145
+ * @return \e N the height of the geoid above the reference ellipsoid
146
+ * (meters).
147
+ *
148
+ * Some approximations are made in computing the geoid height so that the
149
+ * results of the NGA codes are reproduced accurately. Details are given
150
+ * in \ref gravitygeoid.
151
+ **********************************************************************/
152
+ Math::real GeoidHeight(real lon) const;
153
+
154
+ /**
155
+ * Evaluate the components of the gravity anomaly vector using the
156
+ * spherical approximation.
157
+ *
158
+ * @param[in] lon the geographic longitude (degrees).
159
+ * @param[out] Dg01 the gravity anomaly (m s<sup>&minus;2</sup>).
160
+ * @param[out] xi the northerly component of the deflection of the vertical
161
+ * (degrees).
162
+ * @param[out] eta the easterly component of the deflection of the vertical
163
+ * (degrees).
164
+ *
165
+ * The spherical approximation (see Heiskanen and Moritz, Sec 2-14) is used
166
+ * so that the results of the NGA codes are reproduced accurately.
167
+ * approximations used here. Details are given in \ref gravitygeoid.
168
+ **********************************************************************/
169
+ void SphericalAnomaly(real lon, real& Dg01, real& xi, real& eta)
170
+ const;
171
+
172
+ /**
173
+ * Evaluate the components of the acceleration due to gravity and the
174
+ * centrifugal acceleration in geocentric coordinates.
175
+ *
176
+ * @param[in] lon the geographic longitude (degrees).
177
+ * @param[out] gX the \e X component of the acceleration
178
+ * (m s<sup>&minus;2</sup>).
179
+ * @param[out] gY the \e Y component of the acceleration
180
+ * (m s<sup>&minus;2</sup>).
181
+ * @param[out] gZ the \e Z component of the acceleration
182
+ * (m s<sup>&minus;2</sup>).
183
+ * @return \e W = \e V + &Phi; the sum of the gravitational and
184
+ * centrifugal potentials (m<sup>2</sup> s<sup>&minus;2</sup>).
185
+ **********************************************************************/
186
+ Math::real W(real lon, real& gX, real& gY, real& gZ) const {
187
+ real slam, clam;
188
+ Math::sincosd(lon, slam, clam);
189
+ return W(slam, clam, gX, gY, gZ);
190
+ }
191
+
192
+ /**
193
+ * Evaluate the components of the acceleration due to gravity in geocentric
194
+ * coordinates.
195
+ *
196
+ * @param[in] lon the geographic longitude (degrees).
197
+ * @param[out] GX the \e X component of the acceleration
198
+ * (m s<sup>&minus;2</sup>).
199
+ * @param[out] GY the \e Y component of the acceleration
200
+ * (m s<sup>&minus;2</sup>).
201
+ * @param[out] GZ the \e Z component of the acceleration
202
+ * (m s<sup>&minus;2</sup>).
203
+ * @return \e V = \e W - &Phi; the gravitational potential
204
+ * (m<sup>2</sup> s<sup>&minus;2</sup>).
205
+ **********************************************************************/
206
+ Math::real V(real lon, real& GX, real& GY, real& GZ) const {
207
+ real slam, clam;
208
+ Math::sincosd(lon, slam, clam);
209
+ return V(slam, clam, GX, GY, GZ);
210
+ }
211
+
212
+ /**
213
+ * Evaluate the components of the gravity disturbance in geocentric
214
+ * coordinates.
215
+ *
216
+ * @param[in] lon the geographic longitude (degrees).
217
+ * @param[out] deltaX the \e X component of the gravity disturbance
218
+ * (m s<sup>&minus;2</sup>).
219
+ * @param[out] deltaY the \e Y component of the gravity disturbance
220
+ * (m s<sup>&minus;2</sup>).
221
+ * @param[out] deltaZ the \e Z component of the gravity disturbance
222
+ * (m s<sup>&minus;2</sup>).
223
+ * @return \e T = \e W - \e U the disturbing potential (also called the
224
+ * anomalous potential) (m<sup>2</sup> s<sup>&minus;2</sup>).
225
+ **********************************************************************/
226
+ Math::real T(real lon, real& deltaX, real& deltaY, real& deltaZ)
227
+ const {
228
+ real slam, clam;
229
+ Math::sincosd(lon, slam, clam);
230
+ return InternalT(slam, clam, deltaX, deltaY, deltaZ, true, true);
231
+ }
232
+
233
+ /**
234
+ * Evaluate disturbing potential in geocentric coordinates.
235
+ *
236
+ * @param[in] lon the geographic longitude (degrees).
237
+ * @return \e T = \e W - \e U the disturbing potential (also called the
238
+ * anomalous potential) (m<sup>2</sup> s<sup>&minus;2</sup>).
239
+ **********************************************************************/
240
+ Math::real T(real lon) const {
241
+ real slam, clam, dummy;
242
+ Math::sincosd(lon, slam, clam);
243
+ return InternalT(slam, clam, dummy, dummy, dummy, false, true);
244
+ }
245
+
246
+ ///@}
247
+
248
+ /** \name Inspector functions
249
+ **********************************************************************/
250
+ ///@{
251
+ /**
252
+ * @return true if the object has been initialized.
253
+ **********************************************************************/
254
+ bool Init() const { return _a > 0; }
255
+
256
+ /**
257
+ * @return \e a the equatorial radius of the ellipsoid (meters). This is
258
+ * the value inherited from the GravityModel object used in the
259
+ * constructor.
260
+ **********************************************************************/
261
+ Math::real MajorRadius() const
262
+ { return Init() ? _a : Math::NaN(); }
263
+
264
+ /**
265
+ * @return \e f the flattening of the ellipsoid. This is the value
266
+ * inherited from the GravityModel object used in the constructor.
267
+ **********************************************************************/
268
+ Math::real Flattening() const
269
+ { return Init() ? _f : Math::NaN(); }
270
+
271
+ /**
272
+ * @return the latitude of the circle (degrees).
273
+ **********************************************************************/
274
+ Math::real Latitude() const
275
+ { return Init() ? _lat : Math::NaN(); }
276
+
277
+ /**
278
+ * @return the height of the circle (meters).
279
+ **********************************************************************/
280
+ Math::real Height() const
281
+ { return Init() ? _h : Math::NaN(); }
282
+
283
+ /**
284
+ * @return \e caps the computational capabilities that this object was
285
+ * constructed with.
286
+ **********************************************************************/
287
+ unsigned Capabilities() const { return _caps; }
288
+
289
+ /**
290
+ * @param[in] testcaps a set of bitor'ed GravityModel::mask values.
291
+ * @return true if the GravityCircle object has all these capabilities.
292
+ **********************************************************************/
293
+ bool Capabilities(unsigned testcaps) const {
294
+ return (_caps & testcaps) == testcaps;
295
+ }
296
+ ///@}
297
+ };
298
+
299
+ } // namespace GeographicLib
300
+
301
+ #endif // GEOGRAPHICLIB_GRAVITYCIRCLE_HPP