geographiclib 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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